Merge
authorChloe Laisne <chloe.laisne@gmail.com>
Sun, 16 Oct 2016 23:19:57 +0530
changeset 339 766af1228b05
parent 338 4a3899b6a7ed (current diff)
parent 330 8a29098c8273 (diff)
child 340 f0f3888734bb
Merge
cms/app-client/app/controllers/application.js
cms/app-client/app/services/constants.js
cms/app-client/app/templates/components/notice-component.hbs
cms/app-client/app/templates/components/player-component.hbs
cms/app-client/app/templates/components/playlist-component.hbs
--- a/.hgignore	Sun Oct 16 22:23:31 2016 +0530
+++ b/.hgignore	Sun Oct 16 23:19:57 2016 +0530
@@ -35,6 +35,7 @@
 ^server/src/public/css
 ^server/src/public/js/vendor
 ^server/src/public/fonts
+^server/src/public/corpus-app
 ^server/bo_client/.dir-locals.el$
 ^server/bo_client/.projectile$
 ^server/bo_client/node_modules
--- a/build/build_rpm.sh	Sun Oct 16 22:23:31 2016 +0530
+++ b/build/build_rpm.sh	Sun Oct 16 23:19:57 2016 +0530
@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 
-pushd /vagrant/root/var/www/corpusdelaparole/corpus/
+pushd /vagrant/root/var/www/corpusdelaparole/corpus-back/
 echo "---> Launching composer"
 php composer.phar install --ignore-platform-reqs -o
 echo "---> Composer done"
--- a/cms/app-client/README.md	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/README.md	Sun Oct 16 23:19:57 2016 +0530
@@ -7,16 +7,11 @@
 
 You will need the following things properly installed on your computer.
 
-* [Git](http://git-scm.com/)
 * [Node.js](http://nodejs.org/) (with NPM)
-* [Bower](http://bower.io/)
-* [Ember CLI](http://www.ember-cli.com/)
 * [PhantomJS](http://phantomjs.org/)
 
 ## Installation
 
-* `git clone <repository-url>` this repository
-* change into the new directory
 * `npm install`
 * `bower install`
 
--- a/cms/app-client/app/adapters/application.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/app/adapters/application.js	Sun Oct 16 23:19:57 2016 +0530
@@ -9,11 +9,13 @@
 
 export default RESTAdapter.extend({
 
-    namespace: ENV.rootURL.replace(/\/$/,"")+'/api/v1',
+    namespace: (ENV.APP.backRootURL || ENV.rootURL).replace(/\/$/,"")+'/api/v1',
 
     buildURL: function(modelName, id) {
         if(modelName === 'transcript') {
-            return this.urlPrefix() + '/documents/' + id + '/' + modelName;
+            return this.urlPrefix() + '/documents/' + encodeURIComponent(encodeURIComponent(id)) + '/' + modelName;
+        } else if (modelName === 'document' && id) {
+            return this.urlPrefix() + '/documents/' + encodeURIComponent(encodeURIComponent(id)) ;
         }
         return this._super(...arguments);
     },
--- a/cms/app-client/app/components/discourses-component.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/app/components/discourses-component.js	Sun Oct 16 23:19:57 2016 +0530
@@ -18,9 +18,10 @@
 
     didRender: function() {
         var self = this;
-        var baseURL = ENV.rootURL.replace(/\/$/,"")+'/api/v1/stats';
+        var baseURL = (ENV.APP.backRootURL || ENV.rootURL).replace(/\/$/,"")+'/api/v1/stats';
 
-        d3.json(baseURL + "/discourses", function(discourses) {
+        d3.json(baseURL + "/discourses", function(data) {
+            var discourses = data['discourses'];
             var array = Object.keys(discourses).map(function (key) { return discourses[key].count; });
             var oldMin = Math.min(...array),
                 oldMax = Math.max(...array);
--- a/cms/app-client/app/components/visu-langues.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/app/components/visu-langues.js	Sun Oct 16 23:19:57 2016 +0530
@@ -15,13 +15,14 @@
 
     didInsertElement: function(){
         var self = this;
-        var baseurl = ENV.rootURL.replace(/\/$/,"")+'/api/v1';
+        var baseurl = (ENV.APP.backRootURL || ENV.rootURL).replace(/\/$/,"")+'/api/v1';
 
-        d3.json(baseurl+"/stats/languages", function(languages) {
+        d3.json(baseurl+"/stats/languages", function(data) {
             var margin = { top: 30, right: 0, bottom: 0, left: 0 };
             var width = Ember.$('#' + self.get('elementId')).width();
             var height = Ember.$('#' + self.get('elementId')).height() - margin.top - margin.bottom;
 
+            var languages = data['languages'];
             var array = Object.keys(languages).map(function (key) { return languages[key]; });
             var oldMin = Math.min(...array),
                 oldMax = Math.max(...array);
@@ -75,6 +76,8 @@
                 d._children = d.children;
                 if(d.children) {
                     d.value = d.children.reduce(function(p, v) { return p + accumulate(v); }, 0);
+                } else if (d.values) {
+                    d.value = d.values.reduce(function(p, v) { return p + (languages[v] ? languages[v] : 0); }, 0);
                 } else {
                     d.value = languages[d.id] ? languages[d.id] : 0;
                 }
@@ -88,10 +91,14 @@
                         function getCount(node, count = 0) {
                             var c = languages[node.id];
                             if(typeof c === 'undefined') {
-                                node._children.forEach(function(child) {
-                                    count = getCount(child, count);
-                                });
-                                return count;
+                              if(node._children) {
+                                  node._children.forEach(function(child) {
+                                      count = getCount(child, count);
+                                  });
+                              } else if(node.values) {
+                                  count = node.values.reduce(function(p, v) { return p + (languages[v] ? languages[v] : 0); }, count);
+                              }
+                              return count;
                             } else {
                                 return count + c;
                             }
--- a/cms/app-client/app/controllers/application.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/app/controllers/application.js	Sun Oct 16 23:19:57 2016 +0530
@@ -9,9 +9,9 @@
     }),
 
     queryParams: ['location', 'date', 'notice', {
-        language: 'langue',
-        discourse: 'discours',
-        theme: 'thematique'
+        language: 'language',
+        discourse: 'discourse',
+        theme: 'theme'
     }],
 
     date: [],
@@ -71,7 +71,7 @@
             }
         });
         if(!this.arraysEqual(this.get('date').toArray(), intervals)) {
-            this.set('date', intervals);    
+            this.set('date', intervals);
         }
     }),
 
@@ -93,14 +93,14 @@
         return true;
     },
 
-    
+
 
     itemObserver: Ember.observer('player.item', function() {
         var self = this;
         this.store.findRecord('document', this.get('player').get('item'), { reload: true }).then(function(model){
             self.get('player').set('model', model);
             if (self.get('player').get('model').get('transcript')) {
-                self.store.findRecord('transcript', encodeURIComponent(self.get('player').get('item'))).then(function(model) {
+                self.store.findRecord('transcript', self.get('player').get('item')).then(function(model) {
                     self.get('player').set('transcript', model);
                 });
             } else {
@@ -122,7 +122,7 @@
     }),
     noticeModelObserver: Ember.observer('noticeModel', function() {
         if (!this.get('noticeModel')) {
-            this.set('notice', null); 
+            this.set('notice', null);
         }
     }),
 
--- a/cms/app-client/app/models/document.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/app/models/document.js	Sun Oct 16 23:19:57 2016 +0530
@@ -7,7 +7,7 @@
     uri: DS.attr('string'),
     issued: DS.attr('date'),
     title: DS.attr('string'),
-    language: DS.attr('string'),
+    languages: DS.attr({ defaultValue: function() { return []; } }),
     publisher: DS.attr('string'),
     transcript_url: DS.attr('string'),
     transcript: DS.attr({ defaultValue: function() { return {}; } }),
--- a/cms/app-client/app/serializers/geostat.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/app/serializers/geostat.js	Sun Oct 16 23:19:57 2016 +0530
@@ -4,7 +4,7 @@
 
     normalizeResponse: function(store, primaryModelClass, payload) {
         var data = [];
-        Object.keys(payload).forEach(function(key) {
+        Object.keys(payload['geostats']).forEach(function(key) {
             data.push({
                 'id': key,
                 'type': 'geostat',
@@ -18,4 +18,4 @@
         };
     }
 
-});
\ No newline at end of file
+});
--- a/cms/app-client/app/serializers/theme.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/app/serializers/theme.js	Sun Oct 16 23:19:57 2016 +0530
@@ -4,13 +4,14 @@
 
     normalizeResponse: function(store, primaryModelClass, payload) {
         var data = [];
-        Object.keys(payload).forEach(function(key) {
+        var themes = payload['themes'];
+        Object.keys(themes).forEach(function(key) {
             data.push({
                 'id': key,
                 'type': 'theme',
                 'attributes': {
-                    'label': payload[key].label,
-                    'count': payload[key].count
+                    'label': themes[key].label,
+                    'count': themes[key].count
                 }
             });
         });
@@ -19,4 +20,4 @@
         };
     }
 
-});
\ No newline at end of file
+});
--- a/cms/app-client/app/services/constants.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/app/services/constants.js	Sun Oct 16 23:19:57 2016 +0530
@@ -83,8 +83,9 @@
 };
 
 const LANGUAGES_TREEMAP = {
- "name": "Global",
- "children": [
+//  "id": "corpus-global",
+  "name": "Global",
+  "children": [
   {
     "id": "http://lexvo.org/id/iso639-3/fra",
     "name": "Français",
@@ -107,15 +108,17 @@
   },
   {
     "id": "http://lexvo.org/id/iso639-3/und",
-    "name": "Undetermined",
+    "name": "Indéterminée",
   },
   {
+    "id": "corpus-regionals",
     "name": "Langues régionales",
     // (franccomtois,wallon, champenois, picard, normand, gallo,poitevin-saintongeais [dans ses deux variétés : poitevinet saintongeais], lorrain, bourguignon-morvandiau)
     "children": [
       {
-        "id": "http://lexvo.org/id/iso639-3/pcd",
+        "id": "corpus-oil",
         "name": "Langues d'oïl",
+        "values": ["http://lexvo.org/id/iso639-3/pcd",]
       },
       {
         "id": "http://lexvo.org/id/iso639-3/frp",
@@ -126,21 +129,23 @@
         "name": "Corse",
       },
       {
-        "name": "Les Creoles",
+        "id": "corpus-creoles",
+        "name": "Les Créoles",
         "children": [
           {
             "id": "http://lexvo.org/id/iso639-3/rcf",
-            "name": "Creole de la Réunion",
+            "name": "Créole de la Réunion",
           },
           {
             "id": "http://lexvo.org/id/iso639-3/gcf",
-            "name": "Creole de la Guadeloupe",
+            "name": "Créole de la Guadeloupe",
           }
         ]
       }
     ]
   },
   {
+    "id": "corpus-non-territorials",
     "name": "Langues non territoriales",
     "children": [
       {
@@ -178,6 +183,7 @@
     ]
   },
   {
+    "id": "corpus-guyane",
     "name": "Guyane",
     "children": [
       {
@@ -207,6 +213,7 @@
     ]
   },
   {
+    "id": "corpus-mayotte",
     "name": "Mayotte",
     "children": [
       {
@@ -220,6 +227,7 @@
     ]
   },
   {
+    "id": "corpus-polynesia",
     "name": "Polynésie française",
     "children": [
       {
@@ -229,6 +237,7 @@
     ]
   },
   {
+    "id": "corpus-wallis-futuna",
     "name": "Wallis et Futuna",
     "children": [
       {
@@ -242,6 +251,7 @@
     ]
   },
   {
+    "id": "corpus-new-caledonia",
     "name": "Nouvelle-Calédonie",
     "children": [
       {
--- a/cms/app-client/app/templates/components/notice-component.hbs	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/app/templates/components/notice-component.hbs	Sun Oct 16 23:19:57 2016 +0530
@@ -13,7 +13,7 @@
 </tr>
 <tr>
 	<td class="title">Langue</td>
-	<td><span class="action" {{action 'addLanguageFilter' item.language}}>{{ doc-language url=item.language class="language"}}</span><a href="{{item.language}}" target="_blank" class="fa fa-share-square">Share</a></td>
+	<td>{{#each item.languages as |lang index|}}{{if index ", "}}<span class="action" {{action 'addLanguageFilter' lang}}>{{ doc-language url=lang class="language"}}</span><a href="{{lang}}" target="_blank" class="fa fa-share-square">Share</a>{{/each}}</td>
 </tr>
 <tr>
 	<td class="title">Sujet{{#if (if-operator item.computedSubjects.length '>' 1)}}s{{/if}}</td>
--- a/cms/app-client/app/templates/components/player-component.hbs	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/app/templates/components/player-component.hbs	Sun Oct 16 23:19:57 2016 +0530
@@ -28,7 +28,7 @@
 	<div class="meta">
 		<p>
 			<span title="{{ item.title }}" class="title"><span>{{ item.title }}</span></span>
-			{{doc-language class="language" url=item.language}}
+      {{#each model.languages as |lang index|}}{{if index ", "}}{{doc-language url=lang class="language"}}{{/each}}
 		</p>
 		<p>
 			<span title="{{item.publishers_disp}}" class="author"><span>{{item.publishers_disp}}</span></span>
--- a/cms/app-client/app/templates/components/playlist-component.hbs	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/app/templates/components/playlist-component.hbs	Sun Oct 16 23:19:57 2016 +0530
@@ -26,7 +26,7 @@
                 <span class="title">{{ document.title }}</span>
             </p>
             <span class="author">{{document.publishers_disp}}</span>
-            {{doc-language class="language" url=document.language}}
+            {{#each model.languages as |lang index|}}{{if index ", "}}{{doc-language url=lang class="language"}}{{/each}}
         </div>
     </li>
     {{/each}}
--- a/cms/app-client/app/templates/tabs/detail.hbs	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/app/templates/tabs/detail.hbs	Sun Oct 16 23:19:57 2016 +0530
@@ -4,7 +4,7 @@
   </div>
   <div class="notice-body">
     <p><b>Titre </b>{{model.title}}</p>
-    <p><b>Langue </b>{{doc-language url=model.language}}</p>
+    <p><b>Langue </b>{{#each model.languages as |lang index|}}{{if index ", "}}{{doc-language url=lang}}{{/each}}</p>
     <p><b>Enregistré le </b>{{model.modified}}</p>
     <p><b>Interviewer </b>{{model.publishers_disp}}</p>
     <p><b>Description </b>{{model.description}}</p>
--- a/cms/app-client/config/environment.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/config/environment.js	Sun Oct 16 23:19:57 2016 +0530
@@ -14,13 +14,12 @@
             }
         },
         APP: {
-            baseStatic: ''
+            backRootURL: '/corpus/',
             // Here you can pass flags/options to your application instance
             // when it is created
         }
     };
     if (environment === 'development') {
-        ENV.APP.baseStatic = '';
         ENV.contentSecurityPolicy = {
             'default-src': "'none'",
             'script-src': "'self' *",
@@ -37,9 +36,13 @@
         ENV.APP.LOG_ACTIVE_GENERATION = false;
         ENV.APP.LOG_VIEW_LOOKUPS = false;
         ENV.APP.rootElement = '#ember-testing';
+        ENV.APP.backRootURL = '/';
     }
+
     if (environment === 'production') {
-        ENV.APP.baseStatic = '/modules/corpus/app-client/';
+        ENV.rootURL = '/corpus-app/';
+        ENV.APP.backRootURL = '/corpus-back/';
     }
+
     return ENV;
-};
\ No newline at end of file
+};
--- a/cms/app-client/mirage/config.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/mirage/config.js	Sun Oct 16 23:19:57 2016 +0530
@@ -13,7 +13,7 @@
     */
     // this.urlPrefix = '';    // make this `http://localhost:8080`, for example, if your API is on a different server
     // this.namespace = '';    // make this `api`, for example, if your API is namespaced
-    this.namespace = ENV.rootURL.replace(/\/$/,'')+'/api/v1';
+    this.namespace = (ENV.APP.backRootURL || ENV.rootURL).replace(/\/$/,'')+'/api/v1';
     // this.timing = 400;      // delay for each request, automatically set to 0 during testing
 
     this.get('/documents', function({ documents }) {
@@ -21,12 +21,12 @@
     });
 
     this.get('/documents/:id', ({documents}, request) => {
-        let id = decodeURIComponent(request.params.id);
+        let id = decodeURIComponent(decodeURIComponent(request.params.id));
         return documents.find(id);
     });
 
     this.get('/documents/:id/transcript',  ({transcripts}, request) => {
-        let id = decodeURIComponent(request.params.id);
+        let id = decodeURIComponent(decodeURIComponent(request.params.id));
         return transcripts.find(id).transcript;
     });
 
@@ -44,7 +44,7 @@
         var langIds = decodeURIComponent(request.params.ids);
         var resMap = _.reduce(langIds.split(','), function(res, id) {
             var fullId = id;
-            if(!_.startsWith(fullId, constants.LEXVO_BASE_URL)) {
+            if(!_.startsWith(fullId, constants.LEXVO_BASE_URL) && !_.startsWith(fullId, constants.LANGUAGES_NODE_PREFIX)) {
                 fullId = constants.LEXVO_BASE_URL + id;
             }
             var lexvoRes = lexvos.find(fullId);
--- a/cms/app-client/mirage/fixtures/documents.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/mirage/fixtures/documents.js	Sun Oct 16 23:19:57 2016 +0530
@@ -3,7 +3,7 @@
     "id": "11280.100/crdo-UVE_MOCIKA_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-UVE_MOCIKA_SOUND",
     "title": "The two hermit crabs and the coconut crab",
-    "language": "http://lexvo.org/id/iso639-3/uve",
+    "languages": [ "http://lexvo.org/id/iso639-3/uve" ],
     "modified": "2002-02-20",
     "issued": "2010-10-23T00:08:27+02:00",
     "publishers": [
@@ -82,7 +82,7 @@
     "id": "11280.100/crdo-CFPP2000_11_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-CFPP2000_11_SOUND",
     "title": "Entretien de Louise Liotard et de Jeane Mallet 1",
-    "language": "http://lexvo.org/id/iso639-3/fra",
+    "languages": [ "http://lexvo.org/id/iso639-3/fra" ],
     "modified": "2013-04-23T21:40:30+02:00",
     "issued": "2013-04-23T21:40:30+02:00",
     "publishers": [
@@ -274,7 +274,7 @@
     "id": "11280.100/crdo-FRA_PK_IV_10_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-FRA_PK_IV_10_SOUND",
     "title": "Le jour des petits (B)",
-    "language": "http://lexvo.org/id/iso639-3/fra",
+    "languages": ["http://lexvo.org/id/iso639-3/fra"],
     "modified": "2007-11-06",
     "issued": "2010-10-27T10:41:51+02:00",
     "publishers": [
@@ -534,7 +534,7 @@
     "id": "11280.100/crdo-FSL-CUC023_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-FSL-CUC023_SOUND",
     "title": "Corpus LS-Colin sur plusieurs genres discursifs (Josette Bouchauveau et Henri Attia)",
-    "language": "http://lexvo.org/id/iso639-3/fra",
+    "languages": ["http://lexvo.org/id/iso639-3/fra", "http://lexvo.org/id/iso639-3/fsl"],
     "modified": "2008-06-14",
     "issued": "2015-02-03T21:13:34+01:00",
     "publishers": [
@@ -791,7 +791,7 @@
     "id": "11280.100/crdo-NEE_KHIAAK_KO_AK_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-NEE_KHIAAK_KO_AK_SOUND",
     "title": "Tale of the hen and the rooster",
-    "language": "http://lexvo.org/id/iso639-3/fra",
+    "languages": ["http://lexvo.org/id/iso639-3/fra", "http://lexvo.org/id/iso639-3/nee"],
     "modified": "2004-12-09",
     "issued": "2010-10-26T19:21:17+02:00",
     "publishers": [
@@ -892,7 +892,7 @@
     "id": "11280.100/crdo-ESLO1_ENT_047",
     "uri": "https://hdl.handle.net/11280.100/crdo-ESLO1_ENT_047",
     "title": "ESLO1: entretien 047",
-    "language": "http://lexvo.org/id/iso639-3/fra",
+    "languages": ["http://lexvo.org/id/iso639-3/fra"],
     "modified": "2014-11-04",
     "issued": "2014-12-05T15:05:08+01:00",
     "publishers": [
@@ -1026,7 +1026,7 @@
     "id": "11280.100/crdo-09-CAYCHAX_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-09-CAYCHAX_SOUND",
     "title": "ALLOc : Caychax : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:16:38+02:00",
     "issued": "2010-10-25T18:16:38+02:00",
     "publishers": [
@@ -1148,7 +1148,7 @@
     "id": "11280.100/crdo-09-DUN_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-09-DUN_SOUND",
     "title": "ALLOc : Dun : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:18:23+02:00",
     "issued": "2010-10-25T18:18:23+02:00",
     "publishers": [
@@ -1270,7 +1270,7 @@
     "id": "11280.100/crdo-09-LABASTIDE-DE-LORDAT_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-09-LABASTIDE-DE-LORDAT_SOUND",
     "title": "ALLOc : La Bastide-de-Lordat : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:20:08+02:00",
     "issued": "2010-10-25T18:20:08+02:00",
     "publishers": [
@@ -1392,7 +1392,7 @@
     "id": "11280.100/crdo-09-LOUBENS_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-09-LOUBENS_SOUND",
     "title": "ALLOc : Loubens : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:21:23+02:00",
     "issued": "2010-10-25T18:21:23+02:00",
     "publishers": [
@@ -1514,7 +1514,7 @@
     "id": "11280.100/crdo-09-MERENS-LES-VALS_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-09-MERENS-LES-VALS_SOUND",
     "title": "ALLOc : Mérens-les-Vals : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:22:24+02:00",
     "issued": "2010-10-25T18:22:24+02:00",
     "publishers": [
@@ -1636,7 +1636,7 @@
     "id": "11280.100/crdo-09-MONTSEGUR_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-09-MONTSEGUR_SOUND",
     "title": "ALLOc : Montségur : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:23:14+02:00",
     "issued": "2010-10-25T18:23:14+02:00",
     "publishers": [
@@ -1758,7 +1758,7 @@
     "id": "11280.100/crdo-09-PRAYOLS_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-09-PRAYOLS_SOUND",
     "title": "ALLOc : Prayols : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:24:06+02:00",
     "issued": "2010-10-25T18:24:06+02:00",
     "publishers": [
@@ -1870,7 +1870,7 @@
     "id": "11280.100/crdo-09-QUERIGUT_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-09-QUERIGUT_SOUND",
     "title": "ALLOc : Quérigut : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:24:56+02:00",
     "issued": "2010-10-25T18:24:56+02:00",
     "publishers": [
@@ -1992,7 +1992,7 @@
     "id": "11280.100/crdo-09-SIGUER_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-09-SIGUER_SOUND",
     "title": "ALLOc : Siguer : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:25:51+02:00",
     "issued": "2010-10-25T18:25:51+02:00",
     "publishers": [
@@ -2114,7 +2114,7 @@
     "id": "11280.100/crdo-09-ST-MARTIN-D-OYDES_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-09-ST-MARTIN-D-OYDES_SOUND",
     "title": "ALLOc : Saint-Martin-d'Oydes : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:26:22+02:00",
     "issued": "2010-10-25T18:26:22+02:00",
     "publishers": [
@@ -2236,7 +2236,7 @@
     "id": "11280.100/crdo-09-SURBA_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-09-SURBA_SOUND",
     "title": "ALLOc : Surba : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:26:42+02:00",
     "issued": "2010-10-25T18:26:42+02:00",
     "publishers": [
@@ -2358,7 +2358,7 @@
     "id": "11280.100/crdo-11-GRAMAZIE_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-11-GRAMAZIE_SOUND",
     "title": "ALLOc : Gramazie : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:27:39+02:00",
     "issued": "2010-10-25T18:27:39+02:00",
     "publishers": [
@@ -2480,7 +2480,7 @@
     "id": "11280.100/crdo-11-MOLLEVILLE_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-11-MOLLEVILLE_SOUND",
     "title": "ALLOc : Molleville : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:28:06+02:00",
     "issued": "2010-10-25T18:28:06+02:00",
     "publishers": [
@@ -2602,7 +2602,7 @@
     "id": "11280.100/crdo-11-PUIVERT_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-11-PUIVERT_SOUND",
     "title": "ALLOc : Puivert : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:28:40+02:00",
     "issued": "2010-10-25T18:28:40+02:00",
     "publishers": [
@@ -2724,7 +2724,7 @@
     "id": "11280.100/crdo-11-RIBOUISSE_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-11-RIBOUISSE_SOUND",
     "title": "ALLOc : Ribouisse : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:29:32+02:00",
     "issued": "2010-10-25T18:29:32+02:00",
     "publishers": [
@@ -2846,7 +2846,7 @@
     "id": "11280.100/crdo-11-SONNAC-SUR-L-HERS_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-11-SONNAC-SUR-L-HERS_SOUND",
     "title": "ALLOc : Sonnac-sur-l'Hers : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:29:56+02:00",
     "issued": "2010-10-25T18:29:56+02:00",
     "publishers": [
@@ -2963,7 +2963,7 @@
     "id": "11280.100/crdo-11-ST-MARTIN-LALANDE_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-11-ST-MARTIN-LALANDE_SOUND",
     "title": "ALLOc : Saint-Martin-Lalande : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:30:27+02:00",
     "issued": "2010-10-25T18:30:27+02:00",
     "publishers": [
@@ -3085,7 +3085,7 @@
     "id": "11280.100/crdo-12-AUZITS_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-12-AUZITS_SOUND",
     "title": "ALLOc : Auzits : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:31:22+02:00",
     "issued": "2010-10-25T18:31:22+02:00",
     "publishers": [
@@ -3207,7 +3207,7 @@
     "id": "11280.100/crdo-12-JOUELS_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-12-JOUELS_SOUND",
     "title": "ALLOc : Jouels : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:31:21+02:00",
     "issued": "2010-10-25T18:31:21+02:00",
     "publishers": [
@@ -3329,7 +3329,7 @@
     "id": "11280.100/crdo-12-LACASSAGNE_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-12-LACASSAGNE_SOUND",
     "title": "ALLOc : Lacassagne : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:31:43+02:00",
     "issued": "2010-10-25T18:31:43+02:00",
     "publishers": [
@@ -3453,7 +3453,7 @@
     "id": "11280.100/crdo-12-LANUEJOULS_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-12-LANUEJOULS_SOUND",
     "title": "ALLOc : Lanuéjouls : Parabole",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:32:16+02:00",
     "issued": "2010-10-25T18:32:16+02:00",
     "publishers": [
@@ -3575,7 +3575,7 @@
     "id": "11280.100/crdo-12-MARNAC1LEX_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-12-MARNAC1LEX_SOUND",
     "title": "ALLOc : Marnac",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:33:17+02:00",
     "issued": "2010-10-25T18:33:17+02:00",
     "publishers": [
@@ -3684,7 +3684,7 @@
     "id": "11280.100/crdo-12-MARNAC2LEX_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-12-MARNAC2LEX_SOUND",
     "title": "ALLOc : Marnac-2",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:33:43+02:00",
     "issued": "2010-10-25T18:33:43+02:00",
     "publishers": [
@@ -3793,7 +3793,7 @@
     "id": "11280.100/crdo-12-MARNAC3LEX_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-12-MARNAC3LEX_SOUND",
     "title": "ALLOc : Marnac-3",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:33:51+02:00",
     "issued": "2010-10-25T18:33:51+02:00",
     "publishers": [
@@ -3902,7 +3902,7 @@
     "id": "11280.100/crdo-12-MARNAC4MORPHO_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-12-MARNAC4MORPHO_SOUND",
     "title": "ALLOc : Marnac-4",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:34:19+02:00",
     "issued": "2010-10-25T18:34:19+02:00",
     "publishers": [
@@ -4011,7 +4011,7 @@
     "id": "11280.100/crdo-12-MARNAC5MORPHO_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-12-MARNAC5MORPHO_SOUND",
     "title": "ALLOc : Marnac-5",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:35:45+02:00",
     "issued": "2010-10-25T18:35:45+02:00",
     "publishers": [
@@ -4120,7 +4120,7 @@
     "id": "11280.100/crdo-12-MAYRAN1LEX_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-12-MAYRAN1LEX_SOUND",
     "title": "ALLOc : Mayran",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:36:22+02:00",
     "issued": "2010-10-25T18:36:22+02:00",
     "publishers": [
@@ -4249,7 +4249,7 @@
     "id": "11280.100/crdo-12-MAYRAN2LEX_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-12-MAYRAN2LEX_SOUND",
     "title": "ALLOc : Mayran",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:36:52+02:00",
     "issued": "2010-10-25T18:36:52+02:00",
     "publishers": [
@@ -4378,7 +4378,7 @@
     "id": "11280.100/crdo-12-MAYRAN3LEX_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-12-MAYRAN3LEX_SOUND",
     "title": "ALLOc : Mayran-3",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:36:54+02:00",
     "issued": "2010-10-25T18:36:54+02:00",
     "publishers": [
@@ -4507,7 +4507,7 @@
     "id": "11280.100/crdo-12-MAYRAN4LEX_SOUND",
     "uri": "https://hdl.handle.net/11280.100/crdo-12-MAYRAN4LEX_SOUND",
     "title": "ALLOc : Mayran-4",
-    "language": "http://lexvo.org/id/iso639-3/oci",
+    "languages": ["http://lexvo.org/id/iso639-3/oci"],
     "modified": "2010-10-25T18:37:07+02:00",
     "issued": "2010-10-25T18:37:07+02:00",
     "publishers": [
@@ -4632,4 +4632,4 @@
       ]
     }
   }
-];
\ No newline at end of file
+];
--- a/cms/app-client/mirage/fixtures/lexvos.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/mirage/fixtures/lexvos.js	Sun Oct 16 23:19:57 2016 +0530
@@ -39,5 +39,15 @@
     { 'id': "http://lexvo.org/id/iso639-3/aji", 'name': "ajië" },
     { 'id': "http://lexvo.org/id/iso639-3/ita", 'name': "italien" },
     { 'id': "http://lexvo.org/id/iso639-3/kdk", 'name': "numee" },
-    { 'id': "http://lexvo.org/id/iso639-3/nua", 'name': "yuaga" }
+    { 'id': "http://lexvo.org/id/iso639-3/nua", 'name': "yuaga" },
+    { 'id': "corpus-global", 'name': "global" },
+    { 'id': "corpus-regionals", 'name': "langues régionales" },
+    { 'id': "corpus-oil", 'name': "langues d'oïl" },
+    { 'id': "corpus-creoles", 'name': "les créoles" },
+    { 'id': "corpus-non-territorials", 'name': "langues non territoriales" },
+    { 'id': "corpus-guyane", 'name': "Guyane" },
+    { 'id': "corpus-mayotte", 'name': "Mayotte" },
+    { 'id': "corpus-polynesia", 'name': "Polynésie française" },
+    { 'id': "corpus-wallis-futuna", 'name': "Wallis et Futuna" },
+    { 'id': "corpus-new-caledonia", 'name': "Nouvelle-Calédonie" },
 ];
--- a/cms/app-client/mirage/serializers/datestat.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/mirage/serializers/datestat.js	Sun Oct 16 23:19:57 2016 +0530
@@ -4,6 +4,6 @@
 
 export default JSONAPISerializer.extend({
     serialize(response) {
-        return _(response.models).map((dateinfo) => { return [dateinfo.id, dateinfo.count];}).object().value();
+        return {'datestats': _(response.models).map((dateinfo) => { return [dateinfo.id, dateinfo.count];}).object().value()};
     }
 });
--- a/cms/app-client/mirage/serializers/discourse.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/mirage/serializers/discourse.js	Sun Oct 16 23:19:57 2016 +0530
@@ -4,6 +4,6 @@
 
 export default JSONAPISerializer.extend({
     serialize(response) {
-        return _(response.models).map((discourse) => { return [discourse.id, {count: discourse.count, label: discourse.label}];}).object().value();
+        return { 'discourses' : _(response.models).map((discourse) => { return [discourse.id, {count: discourse.count, label: discourse.label}];}).object().value()};
     }
 });
--- a/cms/app-client/mirage/serializers/geostat.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/mirage/serializers/geostat.js	Sun Oct 16 23:19:57 2016 +0530
@@ -5,6 +5,6 @@
 export default JSONAPISerializer.extend({
     serialize(response, request) {
     	var map = response.models.find(map => map.id === request.queryParams['area']);
-        return _(map && map.areas || {}).map((geostat) => { return [geostat.id, geostat.count];}).object().value();
+        return {'geostats': _(map && map.areas || {}).map((geostat) => { return [geostat.id, geostat.count];}).object().value()};
     }
 });
--- a/cms/app-client/mirage/serializers/language.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/mirage/serializers/language.js	Sun Oct 16 23:19:57 2016 +0530
@@ -4,6 +4,6 @@
 
 export default JSONAPISerializer.extend({
     serialize(response) {
-        return _(response.models).map((lang) => { return [lang.id, lang.count];}).object().value();
+        return {'languages' : _(response.models).map((lang) => { return [lang.id, lang.count];}).object().value()};
     }
 });
--- a/cms/app-client/mirage/serializers/sparse-document.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/mirage/serializers/sparse-document.js	Sun Oct 16 23:19:57 2016 +0530
@@ -1,17 +1,20 @@
 // mirage/serializers/blog-post.js
 import BaseSerializer from './application';
 import _ from 'lodash';
+import utils from './utils';
 
 export default BaseSerializer.extend({
     attrs: ['id', 'title', 'language', 'url', 'issued', 'modified', 'publishers', 'mediaArray', 'transcript'],
 
     serialize(response, request) {
 
-        console.log(request, response);
         // This is how to call super, as Mirage borrows [Backbone's implementation of extend](http://backbonejs.org/#Model-extend)
         let json = BaseSerializer.prototype.serialize.apply(this, arguments);
 
-        json['documents'] = _.map(json['documents'], function(doc) {
+        let page = Math.max(parseInt(request.queryParams.page || 1) - 1, 0);
+        let perPage = parseInt(request.queryParams.perpage || 100);
+
+        json['documents'] = _.map(_.slice(json['documents'], page*perPage, (page+1)*perPage), function(doc) {
             let res = _.omit(doc, ['publishers', 'mediaArray', 'transcript']);
             res['publisher'] = doc['publishers'].join(', ');
             res['duration_ms'] = doc['mediaArray']?doc['mediaArray'][_(Object.keys(doc['mediaArray'])).first()]['extent_ms']:0;
@@ -19,7 +22,43 @@
             return res;
         });
 
+        let meta = {
+          total: response.models.length,
+          per_page: perPage,
+          current_page: page+1,
+          last_page: Math.floor(response.models.length/perPage)+1,
+          from: page*perPage + 1,
+          to: Math.min((page+1)*perPage, response.models.length),
+          prev_page_url: null,
+          next_page_url: null
+        };
+
+        let urlParts = utils.parseUri(request.url);
+
+        if(page>0) {
+          let prevUrlParts = _.clone(urlParts);
+          prevUrlParts.queryKey.page = page;
+          meta.prev_page_url = utils.mergeUri(prevUrlParts);
+        }
+
+        if(page<(meta.last_page-1)) {
+          let nextUrlParts = _.clone(urlParts);
+          nextUrlParts.queryKey.page = page+2;
+          meta.next_page_url = utils.mergeUri(nextUrlParts);
+        }
+
+        json['meta'] = meta;
+
         return json;
     }
 
 });
+
+// total	3373
+// per_page	15
+// current_page	1
+// last_page	225
+// next_page_url	"http://localhost:8000/api/v1/documents?page=2"
+// prev_page_url
+// from	1
+// to	15
--- a/cms/app-client/mirage/serializers/theme.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/cms/app-client/mirage/serializers/theme.js	Sun Oct 16 23:19:57 2016 +0530
@@ -30,7 +30,7 @@
         } else {
             array = response.models;
         }
-        return _(array).map((theme) => { return [theme.id, {count: theme.count, label: theme.label}];}).object().value();
+        return { 'themes': _(array).map((theme) => { return [theme.id, {count: theme.count, label: theme.label}];}).object().value() };
     }
 
 });
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/app-client/mirage/serializers/utils.js	Sun Oct 16 23:19:57 2016 +0530
@@ -0,0 +1,58 @@
+// taken from http://blog.stevenlevithan.com/archives/parseuri
+// parseUri 1.2.2
+// (c) Steven Levithan <stevenlevithan.com>
+// MIT License
+import _ from 'lodash';
+
+const PARSEURI_DEFAULT_OPTIONS = {
+  strictMode: false,
+  key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
+  q: {
+    name:   "queryKey",
+    parser: /(?:^|&)([^&=]*)=?([^&]*)/g
+  },
+  parser: {
+    strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
+    loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
+  }
+};
+
+export default {
+  parseUri : function (str, options) {
+    var o = _.defaultsDeep(options || {}, PARSEURI_DEFAULT_OPTIONS);
+    var	m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
+        uri = {},
+        i   = 14;
+
+    while (i--) { uri[o.key[i]] = m[i] || ""; }
+
+    uri[o.q.name] = {};
+    uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
+      if ($1) { uri[o.q.name][$1] = $2; }
+    });
+
+    return uri;
+  },
+  mergeUri : function(uriParts) {
+    let res = "";
+    if(uriParts.protocol) {
+      res += uriParts.protocol+":";
+    }
+    if(uriParts.host) {
+      res += "//" + uriParts.host;
+    }
+    if(uriParts.port) {
+      res += ":" + uriParts.port;
+    }
+    if(uriParts.path) {
+      res += uriParts.path;
+    }
+    if(uriParts.queryKey) {
+      res += "?" + _.map(uriParts.queryKey, function(v,k) {
+        return k + "=" + v;
+      }).join("&");
+    }
+
+    return res;
+  }
+};
--- a/common/corpus-common-addon/addon/services/resolver-service.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/common/corpus-common-addon/addon/services/resolver-service.js	Sun Oct 16 23:19:57 2016 +0530
@@ -2,103 +2,115 @@
 import _ from 'lodash';
 import store from 'corpus-common-addon/utils/store';
 
+const DEFAULT_DEBOUNCE = 10;
+
 export default Ember.Service.extend({
 
-    promises: null,
-    queryRegister: null,
+  promises: null,
+  queryRegister: null,
 
-    storeKeyBase: null,
-    apiPath: null,
-    resDocRoot: null,
+  storeKeyBase: null,
+  apiPath: null,
+  resDocRoot: null,
 
-    processId: function(id) { return id; },
-
-    getReturnDictKey: function(id) { return id; },
+  processId: function (id) {
+    return id;
+  },
 
-    init() {
-        this._super(...arguments);
-        this.set('promises', []);
-        this.set('queryRegister',{});
-        this.doQuery = _.debounce(this._doQuery,10);
-    },
+  getReturnDictKey: function (id) {
+    return id;
+  },
 
-    env: function() {
-        return Ember.getOwner(this).resolveRegistration('config:environment');
-    },
+  init(...args) {
+    this._super(...args);
+    this.set('promises', []);
+    this.set('queryRegister', {});
+    this.doQuery = _.debounce(this._doQuery, DEFAULT_DEBOUNCE);
+  },
+
+  env: function () {
+    return Ember.getOwner(this).resolveRegistration('config:environment');
+  },
 
 
-    _getStoreKey: function(id) {
-        return this.storeKeyBase+':'+id;
-    },
+  _getStoreKey: function (id) {
+    return this.storeKeyBase + ':' + id;
+  },
+
+  _doQuery: function () {
+    const queryRegister = this.get('queryRegister');
+
+    this.set('queryRegister', {});
 
-    _doQuery: function() {
-        var queryRegister = this.get('queryRegister');
-        this.set('queryRegister', {});
-        var ids = Object.keys(queryRegister).join(',');
-        if(!ids) {
-            _.each(queryRegister, (resolve_reject) => {
-                resolve_reject[0]({});
-            });
-        }
-        Ember.$.ajax({
-            //TODO Configuration ?
-            url: this.env().rootURL.replace(/\/$/,'') + this.apiPath +ids,
+    const ids = Object.keys(queryRegister).join(',');
 
-            success: (itemDoc) => {
-                _.each(queryRegister, (resolve_reject) => {
-                    resolve_reject[0](itemDoc[this.resDocRoot]);
-                });
-            },
-            error: (req, status, error) => {
-                _.each(queryRegister, (resolve_reject) => {
-                    resolve_reject[1](status + ':' + error);
-                });
-
-            }
-        });
-    },
+    if (!ids) {
+      _.each(queryRegister, resolveReject=> {
+        resolveReject[0]({});
+      });
+    }
+    Ember.$.ajax({
+      // TODO Configuration ?
+      url: this.env().APP.backRootURL.replace(/\/$/, '') + this.apiPath + ids,
 
-    // make the query for the name.
-    // return a Promise
-    queryName: function(id) {
-        var queryRegister = this.get('queryRegister');
-        return new Ember.RSVP.Promise(function(resolve, reject) {
-            queryRegister[id] = [resolve, reject];
-            this.doQuery(this);
-        }.bind(this));
-    },
+      success: itemDoc=> {
+        _.each(queryRegister, resolveReject=> {
+          resolveReject[0](itemDoc[this.resDocRoot]);
+        });
+      },
+      error: (req, status, error)=> {
+        _.each(queryRegister, resolveReject=> {
+          resolveReject[1](status + ':' + error);
+        });
 
-    getName: function(id) {
-
-        if(!id) {
-            return new Ember.RSVP.Promise(function(resolve/*, reject*/) {
-                resolve('');
-            });
-        }
-
-        var objectId = this.processId(id);
+      }
+    });
+  },
 
-        var namePromise = null;
-
-        var storeKey = this._getStoreKey(id);
-        var name = store.get(storeKey);
+  // make the query for the name.
+  // return a Promise
+  queryName: function (id) {
+    const queryRegister = this.get('queryRegister');
 
-        if( name !== null) {
-            namePromise = new Ember.RSVP.Promise(function(resolve/*, reject*/) {
-                resolve(name);
-            });
-        } else if ( storeKey in this.get('promises')) {
-            namePromise = this.get('promises')[storeKey];
-        } else {
-            //TODO: handle error !!!
-            namePromise = this.queryName(objectId)
-                .then(function(names) {
-                    delete this.get('promises')[storeKey];
-                    return store.set(storeKey, names[this.getReturnDictKey(objectId)]);
-                }.bind(this));
-            this.get('promises')[storeKey] = namePromise;
-        }
-        return namePromise;
+    return new Ember.RSVP.Promise(function (resolve, reject) {
+      queryRegister[id] = [resolve, reject];
+      this.doQuery(this);
+    }.bind(this));
+  },
+
+  getName: function (id) {
+
+    if (!id) {
+      return new Ember.RSVP.Promise(function (resolve/* , reject*/) {
+        resolve('');
+      });
     }
 
+    const objectId = this.processId(id);
+
+    let namePromise = null;
+
+    const storeKey = this._getStoreKey(id);
+    const name = store.get(storeKey);
+
+    if (name !== null) {
+      namePromise = new Ember.RSVP.Promise(function (resolve/* , reject*/) {
+        resolve(name);
+      });
+    } else if (storeKey in this.get('promises')) {
+      namePromise = this.get('promises')[storeKey];
+    } else {
+      // handle error !!!
+      namePromise = this.queryName(objectId)
+        .then(function (names) {
+          Reflect.deleteProperty(this.get('promises'), storeKey);
+
+          return store.set(storeKey, names[this.getReturnDictKey(objectId)]);
+        }.bind(this));
+      this.get('promises')[storeKey] = namePromise;
+    }
+
+    return namePromise;
+  }
+
 });
--- a/common/corpus-common-addon/addon/utils/constants.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/common/corpus-common-addon/addon/utils/constants.js	Sun Oct 16 23:19:57 2016 +0530
@@ -1,6 +1,8 @@
 
 export const LEXVO_BASE_URL = 'http://lexvo.org/id/iso639-3/';
 
+export const LANGUAGES_NODE_PREFIX = 'corpus-';
+
 export const VIAF_BASE_URL = 'http://viaf.org/viaf/';
 
 export const BNF_BASE_URL = 'http://data.bnf.fr/';
--- a/common/corpus-common-addon/app/services/bnf-resolver.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/common/corpus-common-addon/app/services/bnf-resolver.js	Sun Oct 16 23:19:57 2016 +0530
@@ -4,31 +4,34 @@
 
 export default ResolverService.extend({
 
-    storeKeyBase: 'bnf',
-    apiPath:  '/api/v1/resolvers/bnf/',
-    resDocRoot: 'bnfids',
+  storeKeyBase: 'bnf',
+  apiPath: '/api/v1/resolvers/bnf/',
+  resDocRoot: 'bnfids',
 
-    init() {
-        this._super(...arguments);
-        console.log("BNF", this);
-    },
+  init(...args) {
+    this._super(...args);
+  },
+
+  processId: function (id) {
+    let bnfId = id;
 
-    processId: function(id) {
-        var bnfId = id;
-        if(id.startsWith(constants.BNF_BASE_URL + constants.BNF_ARK_BASE_ID)) {
-            bnfId = id.slice((constants.BNF_BASE_URL + constants.BNF_ARK_BASE_ID).length);
-        }
-        else if (id.startsWith(constants.BNF_ARK_BASE_URL + constants.BNF_ARK_BASE_ID)) {
-            bnfId = id.slice((constants.BNF_ARK_BASE_URL + constants.BNF_ARK_BASE_ID).length);
-        }
-        else if (id.startsWith(constants.BNF_ARK_BASE_ID)) {
-            bnfId = id.slice(constants.BNF_ARK_BASE_ID.length);
-        }
-        return bnfId;
-    },
+    if (id.startsWith(constants.BNF_BASE_URL + constants.BNF_ARK_BASE_ID)) {
+      bnfId = id.slice((constants.BNF_BASE_URL + constants.BNF_ARK_BASE_ID).length);
+    } else if (id.startsWith(constants.BNF_ARK_BASE_URL + constants.BNF_ARK_BASE_ID)) {
+      bnfId = id.slice((constants.BNF_ARK_BASE_URL + constants.BNF_ARK_BASE_ID).length);
+    } else if (id.startsWith(constants.BNF_ARK_BASE_ID)) {
+      bnfId = id.slice(constants.BNF_ARK_BASE_ID.length);
+    }
 
-    getReturnDictKey: function(id) { return constants.BNF_ARK_BASE_ID+id; },
+    return bnfId;
+  },
 
-    getLabel: function(id) { return this.getName(id); }
+  getReturnDictKey: function (id) {
+    return constants.BNF_ARK_BASE_ID + id;
+  },
+
+  getLabel: function (id) {
+    return this.getName(id);
+  }
 
 });
--- a/common/corpus-common-addon/lib/commands/dl-fixtures.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/common/corpus-common-addon/lib/commands/dl-fixtures.js	Sun Oct 16 23:19:57 2016 +0530
@@ -78,7 +78,7 @@
     },
     dl_documents_ids: function(commandOptions, rawArgs, ui) {
 
-        var nextPageUrl = commandOptions.url;
+        var nextPageUrl = commandOptions.url+"?sort=_graph";
         var pageIndex = 1;
         var ids = commandOptions.extra?_.map(commandOptions.extra.split(','), function(id) { return { id: id};}):[];
 
@@ -96,7 +96,7 @@
                         err.res = res;
                         return deferred.reject(err);
                     }
-                    nextPageUrl = body.next_page_url;
+                    nextPageUrl = body.meta.next_page_url;
                     pageIndex++;
 
                     ids = _.reduce(
--- a/common/corpus-common-addon/tests/dummy/config/environment.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/common/corpus-common-addon/tests/dummy/config/environment.js	Sun Oct 16 23:19:57 2016 +0530
@@ -16,6 +16,7 @@
     APP: {
       // Here you can pass flags/options to your application instance
       // when it is created
+      backRootURL: '/'
     }
   };
 
@@ -30,6 +31,7 @@
   if (environment === 'test') {
     // Testem prefers this...
     ENV.rootURL = '/';
+    ENV.APP.backRootURL = '/';
     ENV.locationType = 'none';
 
     // keep test console output quieter
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dev/README.md	Sun Oct 16 23:19:57 2016 +0530
@@ -0,0 +1,31 @@
+# REMIE Provisioning
+
+## Bootstraping
+
+* Copier ubuntu-bootstrap sur le serveur
+
+* executer le script (sudo): `sudo ./ubuntu-bootstrap.sh`. Ce script installe l'agent puppet et ces dépendances.
+
+* ajouter l'utilisateur courant au groupe `puppet`
+
+## Installation
+* On prépare sur le serveur un répertoire où les fichiers d'installation seron copiés. Par exemple :
+```bash
+sudo mkdir -p /var/lib/puppet/provision && sudo chown puppet:puppet /var/lib/puppet/provision && sudo chmod g+sw /var/lib/puppet/provision
+```
+
+* Copier les fichiers sur le serveur : `rsync --exclude='.git' --exclude='.hg*' -aviuPz provisioning/ <IP serveur>:/var/lib/puppet/provision/`
+
+
+## configuration
+* copier le template de fichier de configuration dans `/etc/puppet/hiera/custom.yaml`.
+```bash
+mkdir -p /etc/puppet/hiera && sudo cp /var/lib/puppet/provision/custom.yaml.tmpl /etc/puppet/hiera/custom.yaml
+```
+
+* complêter le fichier de configuration. Le fichier template contient le minimum de paramêtres nécessaire pour avoir un système fonctionnel.
+* dans le fichiet `/var/lib/puppet/provision/hiera.yaml`, mettre la ligne `  :datadir: "/etc/puppet/hiera"`
+
+
+## execution
+* dans le répertoire `/var/lib/puppet/provision` lancer la commande `sudo puppet apply --debug default.pp --modulepath=modules --hiera_config=hiera.yaml`
--- a/dev/provisioning/modules/sysconfig/manifests/apache.pp	Sun Oct 16 22:23:31 2016 +0530
+++ b/dev/provisioning/modules/sysconfig/manifests/apache.pp	Sun Oct 16 23:19:57 2016 +0530
@@ -65,7 +65,7 @@
     ]
     $corpus_folders = [
         "/var/www/corpusdelaparole",
-        "/var/www/corpusdelaparole/corpus",
+        "/var/www/corpusdelaparole/corpus-back",
         "/var/www/corpusdelaparole/drupal"
     ]
 
--- a/dev/provisioning/modules/sysconfig/manifests/corpus.pp	Sun Oct 16 22:23:31 2016 +0530
+++ b/dev/provisioning/modules/sysconfig/manifests/corpus.pp	Sun Oct 16 23:19:57 2016 +0530
@@ -16,12 +16,12 @@
         notify => Service['httpd']
     }
 
-    file { "/var/www/corpusdelaparole/corpus/.env":
+    file { "/var/www/corpusdelaparole/corpus-back/.env":
         ensure => file,
         owner => 'apache',
         group => 'apache',
         content => template("sysconfig/corpus/local.env.erb"),
-        require=>File["/var/www/corpusdelaparole/corpus"]
+        require=>File["/var/www/corpusdelaparole/corpus-back"]
     }
 
 }
--- a/dev/provisioning/modules/sysconfig/manifests/php.pp	Sun Oct 16 22:23:31 2016 +0530
+++ b/dev/provisioning/modules/sysconfig/manifests/php.pp	Sun Oct 16 23:19:57 2016 +0530
@@ -29,7 +29,7 @@
     augeas { "php_ini/memory_limit":
         lens    => "PHP.lns",
         incl    => "/opt/remi/php56/root/etc/php.ini",
-        changes => "set PHP/memory_limit 128M",
+        changes => "set PHP/memory_limit 512M",
         notify => Service['httpd'],
         require => Package["php56"]
     }->
--- a/dev/provisioning/modules/sysconfig/templates/corpus/corpus_env.conf.erb	Sun Oct 16 22:23:31 2016 +0530
+++ b/dev/provisioning/modules/sysconfig/templates/corpus/corpus_env.conf.erb	Sun Oct 16 23:19:57 2016 +0530
@@ -1,10 +1,10 @@
 SetEnv APP_ENV local
 SetEnv APP_DEBUG false
 SetEnv APP_KEY <%= @corpus_app_key %>
-SetEnv APP_URL http://<%= @vhost %>/corpus/
+SetEnv APP_URL http://<%= @vhost %>/corpus-back/
 
 SetEnv DATABASE_DRIVER mysql
-SetEnv DB_HOST localhost
+SetEnv DB_HOST <%= @db_host %>
 SetEnv DB_DATABASE <%= @db_name %>
 SetEnv DB_USERNAME <%= @db_user %>
 SetEnv DB_PASSWORD <%= @db_pw %>
@@ -21,9 +21,41 @@
 
 SetEnv CORPUSPAROLE_COCOON_RDF_BASE_URI http://cocoon.huma-num.fr/exist/crdo/rdf/
 SetEnv CORPUSPAROLE_COCOON_OAIPMH_URL http://cocoon.huma-num.fr/crdo_servlet/oai-pmh
-SetEnv CORPUSPAROLE_SESAME_BASE_URL http://127.0.0.1:8080/openrdf-sesame
+SetEnv CORPUSPAROLE_SESAME_BASE_URL http://<%= @sesame_host %>:<%= @sesame_port %>/openrdf-sesame
 SetEnv CORPUSPAROLE_SESAME_REPOSITORY corpus
 SetEnv CORPUSPAROLE_SESAME_REPOSITORY_RAW corpus_raw
 SetEnv CORPUSPAROLE_SESAME_LEXVO_REPOSITORY lexvo
 
 SetEnv EASYRDF_HTTP_CLIENT_TIMEOUT 5000
+
+SetEnv ELASTICSEARCH_URL <@= @elasticsearch_host %>:<@= @elasticsearch_port %>
+SetEnv ELASTICSEARCH_LOG_PATH 'logs/elasticsearch.log'
+SetEnv ELASTICSEARCH_INDEX 'corpus'
+SetEnv ELASTICSEARCH_SHARDS 1
+SetEnv ELASTICSEARCH_REPLICAS 1
+
+SetEnv HANDLE_HOST <%= @handle_host %>
+SetEnv HANDLE_PORT <%= @handle_port %>
+SetEnv HANDLE_PREFIX <%= @handle_prefix %>
+SetEnv HANDLE_ADMIN_ID <%= @handle_admin_id %>
+
+SetEnv HANDLE_CERT_OR_PKEY "<%= @handle_cert_or_pkey %>"
+SetEnv HANDLE_PASSWORD <%= @handle_password %>
+
+SetEnv HANDLE_TEST_PREFIX <%= @handle_test_prefix %>
+
+
+SetEnv HANDLE_TEST_CERT "corpusadmpkeycrt.pem"
+SetEnv HANDLE_TEST_CERT_PASSWORD NULL
+SetEnv HANDLE_TEST_CERT_ADMIN_HANDLE "300:<%= @handle_test_prefix %>/CORPUS_ADMIN"
+
+SetEnv HANDLE_TEST_RSA_KEY "corpusadmpriv.pem"
+SetEnv HANDLE_TEST_RSA_PASSWORD NULL
+SetEnv HANDLE_TEST_RSA_ADMIN_HANDLE "300:<%= @handle_test_prefix %>/CORPUS_ADMIN_RSA"
+
+
+SetEnv HANDLE_TEST_DSA_KEY "corpusadmdsapriv.pem"
+SetEnv HANDLE_TEST_DSA_PASSWORD NULL
+SetEnv HANDLE_TEST_DSA_ADMIN_HANDLE "300:<%= @handle_test_prefix %>/CORPUS_ADMIN_DSA"
+
+SetEnv GEONAMES_USERNAME "<%= @geonames-username %>"
--- a/dev/provisioning/modules/sysconfig/templates/corpus/local.env.erb	Sun Oct 16 22:23:31 2016 +0530
+++ b/dev/provisioning/modules/sysconfig/templates/corpus/local.env.erb	Sun Oct 16 23:19:57 2016 +0530
@@ -1,10 +1,10 @@
 APP_ENV=local
 APP_DEBUG=true
 APP_KEY=<%= @corpus_app_key %>
-APP_URL=http://<%= @vhost %>/corpus/
+APP_URL=http://<%= @vhost %>/corpus-back/
 
 DATABASE_DRIVER=mysql
-DB_HOST=localhost
+DB_HOST=<%= @db_host %>
 DB_DATABASE=<%= @db_name %>
 DB_USERNAME=<%= @db_user %>
 DB_PASSWORD=<%= @db_pw %>
@@ -21,9 +21,42 @@
 
 CORPUSPAROLE_COCOON_RDF_BASE_URI=http://cocoon.huma-num.fr/exist/crdo/rdf/
 CORPUSPAROLE_COCOON_OAIPMH_URL=http://cocoon.huma-num.fr/crdo_servlet/oai-pmh
-CORPUSPAROLE_SESAME_BASE_URL=http://172.16.1.6:8080/openrdf-sesame/
+CORPUSPAROLE_SESAME_BASE_URL=http://<%= @sesame_host %>:<%= @sesame_port %>/openrdf-sesame
 CORPUSPAROLE_SESAME_REPOSITORY=corpus
 CORPUSPAROLE_SESAME_REPOSITORY_RAW=corpus_raw
 CORPUSPAROLE_SESAME_LEXVO_REPOSITORY=lexvo
 
 EASYRDF_HTTP_CLIENT_TIMEOUT=5000
+
+ELASTICSEARCH_URL=<@= @elasticsearch_host %>:<@= @elasticsearch_port %>
+ELASTICSEARCH_LOG_PATH='logs/elasticsearch.log'
+ELASTICSEARCH_INDEX='corpus'
+ELASTICSEARCH_SHARDS=1
+ELASTICSEARCH_REPLICAS=1
+
+HANDLE_HOST=<%= @handle_host %>
+HANDLE_PORT=<%= @handle_port %>
+HANDLE_PREFIX=<%= @handle_prefix %>
+HANDLE_ADMIN_ID=<%= @handle_admin_id %>
+
+HANDLE_CERT_OR_PKEY="<%= @handle_cert_or_pkey %>"
+HANDLE_PASSWORD=<%= @handle_password %>
+
+HANDLE_TEST_PREFIX=<%= @handle_test_prefix %>
+
+
+HANDLE_TEST_CERT="corpusadmpkeycrt.pem"
+HANDLE_TEST_CERT_PASSWORD=NULL
+HANDLE_TEST_CERT_ADMIN_HANDLE="300:<%= @handle_test_prefix %>/CORPUS_ADMIN"
+
+HANDLE_TEST_RSA_KEY="corpusadmpriv.pem"
+HANDLE_TEST_RSA_PASSWORD=NULL
+HANDLE_TEST_RSA_ADMIN_HANDLE="300:<%= @handle_test_prefix %>/CORPUS_ADMIN_RSA"
+
+
+HANDLE_TEST_DSA_KEY="corpusadmdsapriv.pem"
+HANDLE_TEST_DSA_PASSWORD=NULL
+HANDLE_TEST_DSA_ADMIN_HANDLE="300:<%= @handle_test_prefix %>/CORPUS_ADMIN_DSA"
+
+GEONAMES_USERNAME="<%= @geonames-username %>"
+
--- a/dev/provisioning/modules/sysconfig/templates/handle/handle_data.sql.sh.erb	Sun Oct 16 22:23:31 2016 +0530
+++ b/dev/provisioning/modules/sysconfig/templates/handle/handle_data.sql.sh.erb	Sun Oct 16 23:19:57 2016 +0530
@@ -35,7 +35,7 @@
 INSERT INTO \`handles\` VALUES ('<%= @hdl_test_prefix %>/<%= @hdl_prefix_admin %>',300,'HS_PUBKEY',0x$handle_admin_pubkey,0,86400,<%= scope.function_time([]) %>,'',1,1,1,0);
 
 
-INSERT INTO \`handles\` VALUES ('<%= @hdl_test_prefix %>/<%= @hdl_prefix_admin %>',200,'HS_VLIST','300:0.NA/<%= @hdl_test_prefix %>; 300:<%= @hdl_test_prefix %>/<%= @hdl_prefix_admin %>; 300:<%= @hdl_test_prefix %>/<%= @hdl_prefix_admin %>_DSA',0,86400,<%= scope.function_time([]) %>,'',1,1,1,0);
+INSERT INTO \`handles\` VALUES ('<%= @hdl_test_prefix %>/<%= @hdl_prefix_admin %>_DSA',200,'HS_VLIST','300:0.NA/<%= @hdl_test_prefix %>; 300:<%= @hdl_test_prefix %>/<%= @hdl_prefix_admin %>; 300:<%= @hdl_test_prefix %>/<%= @hdl_prefix_admin %>_DSA',0,86400,<%= scope.function_time([]) %>,'',1,1,1,0);
 INSERT INTO \`handles\` VALUES ('<%= @hdl_test_prefix %>/<%= @hdl_prefix_admin %>_DSA',300,'HS_PUBKEY',0x$handle_admin_pubkey_dsa,0,86400,<%= scope.function_time([]) %>,'',1,1,1,0);
 
 /*!40000 ALTER TABLE \`handles\` ENABLE KEYS */;
--- a/dev/provisioning/modules/sysconfig/templates/httpd/vhost.conf.erb	Sun Oct 16 22:23:31 2016 +0530
+++ b/dev/provisioning/modules/sysconfig/templates/httpd/vhost.conf.erb	Sun Oct 16 23:19:57 2016 +0530
@@ -10,7 +10,7 @@
   DocumentRoot "/var/www/corpusdelaparole/drupal"
 
   ## Alias declarations for resources outside the DocumentRoot
-  Alias /corpus "/var/www/corpusdelaparole/corpus/public"
+  Alias /corpus-back "/var/www/corpusdelaparole/corpus-back/public"
 
   <Directory "/var/www/corpusdelaparole/drupal">
     AllowOverride all
@@ -18,7 +18,7 @@
   </Directory>
 
 
-  <Directory "/var/www/corpusdelaparole/corpus/public">
+  <Directory "/var/www/corpusdelaparole/corpus-back/public">
     AllowOverride None
     Require all granted
     IncludeOptional /etc/www/corpus_env.con[f]
@@ -28,10 +28,10 @@
       </IfModule>
 
       RewriteEngine On
-      RewriteBase /corpus/
+      RewriteBase /corpus-back/
 
       # Redirect Trailing Slashes...
-      RewriteRule ^(.*)/$ /corpus/$1 [L,R=301]
+      RewriteRule ^(.*)/$ /corpus-back/$1 [L,R=301]
 
       # Handle Front Controller...
       RewriteCond %{REQUEST_FILENAME} !-d
--- a/server/bo_client/app/models/document.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/bo_client/app/models/document.js	Sun Oct 16 23:19:57 2016 +0530
@@ -9,7 +9,7 @@
 
     title: DS.attr('string'),
 
-    language: DS.attr('string'),
+    languages: DS.attr({defaultValue: function() { return []; }}),
 
     publishers: DS.attr({defaultValue: function() { return []; }}),
 
--- a/server/bo_client/app/templates/doc.hbs	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/bo_client/app/templates/doc.hbs	Sun Oct 16 23:19:57 2016 +0530
@@ -22,7 +22,7 @@
                 </div>
                 <div class="col-md-11">
                   <div class="content-title">{{t 'bo.document_language'}}</div>
-                  <div class="content-value">{{doc-language url=model.language}}</div>
+                  <div class="content-value">{{#each model.languages as |lang index|}}{{if index ", "}}{{doc-language url=lang}}{{/each}}</div>
                 </div>
               </div>
               <div class="row">
--- a/server/bo_client/server/fixtures/documents.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/bo_client/server/fixtures/documents.js	Sun Oct 16 23:19:57 2016 +0530
@@ -1,3675 +1,3732 @@
-/* eslint-env node */
-/* eslint quote-props: 0 */
-
 module.exports = [
   {
-    'id': '11280.100/crdo-09-CAYCHAX_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-09-CAYCHAX_SOUND',
-    'title': 'ALLOc : Caychax : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:16:38+02:00',
-    'issued': '2010-10-25T18:16:38+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-09-CAYCHAX_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-09-CAYCHAX_SOUND",
+    "title": "ALLOc : Caychax : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:16:38+02:00",
+    "issued": "2010-10-25T18:16:38+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Alazet, Pierre',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Del Duca, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Alazet, Pierre",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Del Duca, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-CAYCHAX.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-CAYCHAX.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144792_09-CAYCHAX_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144792_09-CAYCHAX_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT03M18S',
-        'extent_ms': 198000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144792.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144792.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT03M18S',
-        'extent_ms': 198000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144792_09-CAYCHAX_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144792_09-CAYCHAX_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT03M18S',
-        'extent_ms': 198000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144792_09-CAYCHAX_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144792_09-CAYCHAX_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT03M18S",
+        "extent_ms": 198000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144792.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144792.wav",
+        "format": "audio/x-wav",
+        "extent": "PT03M18S",
+        "extent_ms": 198000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144792_09-CAYCHAX_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144792_09-CAYCHAX_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT03M18S",
+        "extent_ms": 198000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Caychax',
-        'http://sws.geonames.org/6446897/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Caychax",
+        "http://sws.geonames.org/6446897/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Ariège, Caychax',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Ariège, Caychax",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '42.7925',
-      'longitude': '1.71889'
+      "latitude": "42.7925",
+      "longitude": "1.71889"
     }
   },
   {
-    'id': '11280.100/crdo-09-DUN_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-09-DUN_SOUND',
-    'title': 'ALLOc : Dun : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:18:23+02:00',
-    'issued': '2010-10-25T18:18:23+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-09-DUN_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-09-DUN_SOUND",
+    "title": "ALLOc : Dun : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:18:23+02:00",
+    "issued": "2010-10-25T18:18:23+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Tricoire, Raymonde',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Del Duca, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Tricoire, Raymonde",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Del Duca, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-DUN.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-DUN.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144793_09-DUN_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144793_09-DUN_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT03M07S',
-        'extent_ms': 187000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144793.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144793.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT03M07S',
-        'extent_ms': 187000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144793_09-DUN_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144793_09-DUN_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT03M07S',
-        'extent_ms': 187000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144793_09-DUN_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144793_09-DUN_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT03M07S",
+        "extent_ms": 187000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144793.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144793.wav",
+        "format": "audio/x-wav",
+        "extent": "PT03M07S",
+        "extent_ms": 187000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144793_09-DUN_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144793_09-DUN_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT03M07S",
+        "extent_ms": 187000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Dun_(Ariège)',
-        'http://sws.geonames.org/6426188/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Dun_(Ariège)",
+        "http://sws.geonames.org/6426188/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Ariège, Dun',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Ariège, Dun",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '43.02722',
-      'longitude': '1.79917'
+      "latitude": "43.02722",
+      "longitude": "1.79917"
     }
   },
   {
-    'id': '11280.100/crdo-09-LABASTIDE-DE-LORDAT_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-09-LABASTIDE-DE-LORDAT_SOUND',
-    'title': 'ALLOc : La Bastide-de-Lordat : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:20:08+02:00',
-    'issued': '2010-10-25T18:20:08+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-09-LABASTIDE-DE-LORDAT_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-09-LABASTIDE-DE-LORDAT_SOUND",
+    "title": "ALLOc : La Bastide-de-Lordat : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:20:08+02:00",
+    "issued": "2010-10-25T18:20:08+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Roumieu, Berthe',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Del Duca, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Roumieu, Berthe",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Del Duca, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-LABASTIDE-DE-LORDAT.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-LABASTIDE-DE-LORDAT.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144794_09-LABASTIDE-DE-LORDAT_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144794_09-LABASTIDE-DE-LORDAT_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M46S',
-        'extent_ms': 166000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144794.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144794.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M46S',
-        'extent_ms': 166000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144794_09-LABASTIDE-DE-LORDAT_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144794_09-LABASTIDE-DE-LORDAT_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02M46S',
-        'extent_ms': 166000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144794_09-LABASTIDE-DE-LORDAT_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144794_09-LABASTIDE-DE-LORDAT_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M46S",
+        "extent_ms": 166000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144794.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144794.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M46S",
+        "extent_ms": 166000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144794_09-LABASTIDE-DE-LORDAT_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144794_09-LABASTIDE-DE-LORDAT_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02M46S",
+        "extent_ms": 166000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/La_Bastide-de-Lordat',
-        'http://sws.geonames.org/6618238/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/La_Bastide-de-Lordat",
+        "http://sws.geonames.org/6618238/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Ariège, La Bastide-de-Lordat',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Ariège, La Bastide-de-Lordat",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '43.1442',
-      'longitude': '1.7135'
+      "latitude": "43.1442",
+      "longitude": "1.7135"
     }
   },
   {
-    'id': '11280.100/crdo-09-LOUBENS_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-09-LOUBENS_SOUND',
-    'title': 'ALLOc : Loubens : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:21:23+02:00',
-    'issued': '2010-10-25T18:21:23+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-09-LOUBENS_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-09-LOUBENS_SOUND",
+    "title": "ALLOc : Loubens : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:21:23+02:00",
+    "issued": "2010-10-25T18:21:23+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Faure, Antoinette',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Del Duca, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Faure, Antoinette",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Del Duca, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-LOUBENS.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-LOUBENS.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144795_09-LOUBENS_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144795_09-LOUBENS_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M28S',
-        'extent_ms': 148000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144795.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144795.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M28S',
-        'extent_ms': 148000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144795_09-LOUBENS_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144795_09-LOUBENS_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02M28S',
-        'extent_ms': 148000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144795_09-LOUBENS_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144795_09-LOUBENS_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M28S",
+        "extent_ms": 148000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144795.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144795.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M28S",
+        "extent_ms": 148000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144795_09-LOUBENS_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144795_09-LOUBENS_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02M28S",
+        "extent_ms": 148000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Loubens_(Ariège)',
-        'http://sws.geonames.org/6453612/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Loubens_(Ariège)",
+        "http://sws.geonames.org/6453612/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Ariège, Loubens',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Ariège, Loubens",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '43.0452',
-      'longitude': '1.5461'
+      "latitude": "43.0452",
+      "longitude": "1.5461"
     }
   },
   {
-    'id': '11280.100/crdo-09-MERENS-LES-VALS_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-09-MERENS-LES-VALS_SOUND',
-    'title': 'ALLOc : Mérens-les-Vals : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:22:24+02:00',
-    'issued': '2010-10-25T18:22:24+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-09-MERENS-LES-VALS_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-09-MERENS-LES-VALS_SOUND",
+    "title": "ALLOc : Mérens-les-Vals : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:22:24+02:00",
+    "issued": "2010-10-25T18:22:24+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Laurens, François',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Del Duca, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Laurens, François",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Del Duca, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-MERENS-LES-VALS.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-MERENS-LES-VALS.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144796_09-MERENS-LES-VALS_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144796_09-MERENS-LES-VALS_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M45S',
-        'extent_ms': 165000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144796.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144796.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M45S',
-        'extent_ms': 165000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144796_09-MERENS-LES-VALS_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144796_09-MERENS-LES-VALS_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02M45S',
-        'extent_ms': 165000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144796_09-MERENS-LES-VALS_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144796_09-MERENS-LES-VALS_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M45S",
+        "extent_ms": 165000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144796.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144796.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M45S",
+        "extent_ms": 165000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144796_09-MERENS-LES-VALS_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144796_09-MERENS-LES-VALS_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02M45S",
+        "extent_ms": 165000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Mérens-les-Vals',
-        'http://sws.geonames.org/6615269/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Mérens-les-Vals",
+        "http://sws.geonames.org/6615269/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Ariège, Mérens-les-Vals',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Ariège, Mérens-les-Vals",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '42.65806',
-      'longitude': '1.83611'
+      "latitude": "42.65806",
+      "longitude": "1.83611"
     }
   },
   {
-    'id': '11280.100/crdo-09-MONTSEGUR_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-09-MONTSEGUR_SOUND',
-    'title': 'ALLOc : Montségur : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:23:14+02:00',
-    'issued': '2010-10-25T18:23:14+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-09-MONTSEGUR_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-09-MONTSEGUR_SOUND",
+    "title": "ALLOc : Montségur : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:23:14+02:00",
+    "issued": "2010-10-25T18:23:14+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Couquet, Marius',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Del Duca, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Couquet, Marius",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Del Duca, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-MONTSEGUR.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-MONTSEGUR.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144797_09-MONTSEGUR_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144797_09-MONTSEGUR_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M50S',
-        'extent_ms': 170000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144797.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144797.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M50S',
-        'extent_ms': 170000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144797_09-MONTSEGUR_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144797_09-MONTSEGUR_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02M50S',
-        'extent_ms': 170000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144797_09-MONTSEGUR_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144797_09-MONTSEGUR_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M50S",
+        "extent_ms": 170000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144797.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144797.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M50S",
+        "extent_ms": 170000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144797_09-MONTSEGUR_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144797_09-MONTSEGUR_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02M50S",
+        "extent_ms": 170000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Montségur',
-        'http://sws.geonames.org/6426260/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Montségur",
+        "http://sws.geonames.org/6426260/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Ariège, Montségur',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Ariège, Montségur",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '42.87139',
-      'longitude': '1.83333'
+      "latitude": "42.87139",
+      "longitude": "1.83333"
     }
   },
   {
-    'id': '11280.100/crdo-09-PRAYOLS_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-09-PRAYOLS_SOUND',
-    'title': 'ALLOc : Prayols : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:24:06+02:00',
-    'issued': '2010-10-25T18:24:06+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-09-PRAYOLS_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-09-PRAYOLS_SOUND",
+    "title": "ALLOc : Prayols : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:24:06+02:00",
+    "issued": "2010-10-25T18:24:06+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Laguerre, Aimé',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Del Duca, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Laguerre, Aimé",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Del Duca, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-PRAYOLS.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-PRAYOLS.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144798_09-PRAYOLS_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144798_09-PRAYOLS_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT03M02S',
-        'extent_ms': 182000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144798.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144798.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT03M02S',
-        'extent_ms': 182000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144798_09-PRAYOLS_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144798_09-PRAYOLS_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT03M02S',
-        'extent_ms': 182000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144798_09-PRAYOLS_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144798_09-PRAYOLS_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT03M02S",
+        "extent_ms": 182000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144798.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144798.wav",
+        "format": "audio/x-wav",
+        "extent": "PT03M02S",
+        "extent_ms": 182000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144798_09-PRAYOLS_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144798_09-PRAYOLS_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT03M02S",
+        "extent_ms": 182000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Prayols',
-        'http://sws.geonames.org/6426277/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Prayols",
+        "http://sws.geonames.org/6426277/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Ariège, Prayols',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Ariège, Prayols",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '42.92722',
-      'longitude': '1.62361'
+      "latitude": "42.92722",
+      "longitude": "1.62361"
     }
   },
   {
-    'id': '11280.100/crdo-09-QUERIGUT_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-09-QUERIGUT_SOUND',
-    'title': 'ALLOc : Quérigut : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:24:56+02:00',
-    'issued': '2010-10-25T18:24:56+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-09-QUERIGUT_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-09-QUERIGUT_SOUND",
+    "title": "ALLOc : Quérigut : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:24:56+02:00",
+    "issued": "2010-10-25T18:24:56+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Tichadou, Joseph',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Del Duca, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Tichadou, Joseph",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Del Duca, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-QUERIGUT.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-QUERIGUT.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144799_09-QUERIGUT_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144799_09-QUERIGUT_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M51S',
-        'extent_ms': 171000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144799.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144799.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M51S',
-        'extent_ms': 171000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144799_09-QUERIGUT_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144799_09-QUERIGUT_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02M51S',
-        'extent_ms': 171000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144799_09-QUERIGUT_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144799_09-QUERIGUT_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M51S",
+        "extent_ms": 171000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144799.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144799.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M51S",
+        "extent_ms": 171000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144799_09-QUERIGUT_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144799_09-QUERIGUT_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02M51S",
+        "extent_ms": 171000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Quérigut',
-        'http://sws.geonames.org/6618205/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Quérigut",
+        "http://sws.geonames.org/6618205/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Ariège, Quérigut',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Ariège, Quérigut",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '42.6987',
-      'longitude': '2.0996'
+      "latitude": "42.6987",
+      "longitude": "2.0996"
     }
   },
   {
-    'id': '11280.100/crdo-09-SIGUER_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-09-SIGUER_SOUND',
-    'title': 'ALLOc : Siguer : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:25:51+02:00',
-    'issued': '2010-10-25T18:25:51+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-09-SIGUER_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-09-SIGUER_SOUND",
+    "title": "ALLOc : Siguer : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:25:51+02:00",
+    "issued": "2010-10-25T18:25:51+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Caujolle, Joseph',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Del Duca, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Caujolle, Joseph",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Del Duca, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-SIGUER.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-SIGUER.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144800_09-SIGUER_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144800_09-SIGUER_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M57S',
-        'extent_ms': 177000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144800.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144800.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M57S',
-        'extent_ms': 177000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144800_09-SIGUER_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144800_09-SIGUER_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02M57S',
-        'extent_ms': 177000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144800_09-SIGUER_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144800_09-SIGUER_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M57S",
+        "extent_ms": 177000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144800.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144800.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M57S",
+        "extent_ms": 177000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144800_09-SIGUER_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144800_09-SIGUER_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02M57S",
+        "extent_ms": 177000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Siguer',
-        'http://sws.geonames.org/6426323/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Siguer",
+        "http://sws.geonames.org/6426323/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Ariège, Siguer',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Ariège, Siguer",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '42.76472',
-      'longitude': '1.56556'
+      "latitude": "42.76472",
+      "longitude": "1.56556"
     }
   },
   {
-    'id': '11280.100/crdo-09-ST-MARTIN-D-OYDES_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-09-ST-MARTIN-D-OYDES_SOUND',
-    'title': 'ALLOc : Saint-Martin-d\'Oydes : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:26:22+02:00',
-    'issued': '2010-10-25T18:26:22+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-09-ST-MARTIN-D-OYDES_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-09-ST-MARTIN-D-OYDES_SOUND",
+    "title": "ALLOc : Saint-Martin-d'Oydes : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:26:22+02:00",
+    "issued": "2010-10-25T18:26:22+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Ferriès, Marcel',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Del Duca, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Ferriès, Marcel",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Del Duca, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-ST-MARTIN-D-OYDES.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-ST-MARTIN-D-OYDES.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144801_09-ST-MARTIN-D-OYDES_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144801_09-ST-MARTIN-D-OYDES_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT03M05S',
-        'extent_ms': 185000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144801.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144801.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT03M05S',
-        'extent_ms': 185000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144801_09-ST-MARTIN-D-OYDES_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144801_09-ST-MARTIN-D-OYDES_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT03M05S',
-        'extent_ms': 185000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144801_09-ST-MARTIN-D-OYDES_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144801_09-ST-MARTIN-D-OYDES_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT03M05S",
+        "extent_ms": 185000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144801.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144801.wav",
+        "format": "audio/x-wav",
+        "extent": "PT03M05S",
+        "extent_ms": 185000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144801_09-ST-MARTIN-D-OYDES_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144801_09-ST-MARTIN-D-OYDES_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT03M05S",
+        "extent_ms": 185000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Saint-Martin-d\'Oydes',
-        'http://sws.geonames.org/6426302/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Saint-Martin-d'Oydes",
+        "http://sws.geonames.org/6426302/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Ariège, Saint-Martin-d\'Oydes',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Ariège, Saint-Martin-d'Oydes",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '43.17028',
-      'longitude': '1.49611'
+      "latitude": "43.17028",
+      "longitude": "1.49611"
     }
   },
   {
-    'id': '11280.100/crdo-09-SURBA_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-09-SURBA_SOUND',
-    'title': 'ALLOc : Surba : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:26:42+02:00',
-    'issued': '2010-10-25T18:26:42+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-09-SURBA_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-09-SURBA_SOUND",
+    "title": "ALLOc : Surba : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:26:42+02:00",
+    "issued": "2010-10-25T18:26:42+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Roques, Camille',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Del Duca, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Roques, Camille",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Del Duca, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-SURBA.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-09-SURBA.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144802_09-SURBA_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144802_09-SURBA_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M39S',
-        'extent_ms': 159000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144802.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144802.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M39S',
-        'extent_ms': 159000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144802_09-SURBA_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144802_09-SURBA_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02M39S',
-        'extent_ms': 159000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144802_09-SURBA_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144802_09-SURBA_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M39S",
+        "extent_ms": 159000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144802.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144802.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M39S",
+        "extent_ms": 159000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144802_09-SURBA_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144802_09-SURBA_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02M39S",
+        "extent_ms": 159000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Surba',
-        'http://sws.geonames.org/6426328/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Surba",
+        "http://sws.geonames.org/6426328/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Ariège, Surba',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Ariège, Surba",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '42.85889',
-      'longitude': '1.575'
+      "latitude": "42.85889",
+      "longitude": "1.575"
     }
   },
   {
-    'id': '11280.100/crdo-11-GRAMAZIE_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-11-GRAMAZIE_SOUND',
-    'title': 'ALLOc : Gramazie : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:27:39+02:00',
-    'issued': '2010-10-25T18:27:39+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-11-GRAMAZIE_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-11-GRAMAZIE_SOUND",
+    "title": "ALLOc : Gramazie : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:27:39+02:00",
+    "issued": "2010-10-25T18:27:39+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Léger, Clémence',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'De Lorenzo, Linda',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Léger, Clémence",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "De Lorenzo, Linda",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-11-GRAMAZIE.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-11-GRAMAZIE.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144803_11-GRAMAZIE_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144803_11-GRAMAZIE_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M27S',
-        'extent_ms': 147000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144803.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144803.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M27S',
-        'extent_ms': 147000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144803_11-GRAMAZIE_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144803_11-GRAMAZIE_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02M27S',
-        'extent_ms': 147000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144803_11-GRAMAZIE_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144803_11-GRAMAZIE_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M27S",
+        "extent_ms": 147000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144803.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144803.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M27S",
+        "extent_ms": 147000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144803_11-GRAMAZIE_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144803_11-GRAMAZIE_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02M27S",
+        "extent_ms": 147000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Gramazie',
-        'http://sws.geonames.org/6426695/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Gramazie",
+        "http://sws.geonames.org/6426695/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Aude, Gramazie',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Aude, Gramazie",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '43.13917',
-      'longitude': '2.09694'
+      "latitude": "43.13917",
+      "longitude": "2.09694"
     }
   },
   {
-    'id': '11280.100/crdo-11-MOLLEVILLE_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-11-MOLLEVILLE_SOUND',
-    'title': 'ALLOc : Molleville : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:28:06+02:00',
-    'issued': '2010-10-25T18:28:06+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-11-MOLLEVILLE_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-11-MOLLEVILLE_SOUND",
+    "title": "ALLOc : Molleville : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:28:06+02:00",
+    "issued": "2010-10-25T18:28:06+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Cathala, Auguste',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'De Lorenzo, Linda',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Cathala, Auguste",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "De Lorenzo, Linda",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-11-MOLLEVILLE.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-11-MOLLEVILLE.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144804_11-MOLLEVILLE_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144804_11-MOLLEVILLE_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M53S',
-        'extent_ms': 173000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144804.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144804.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M53S',
-        'extent_ms': 173000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144804_11-MOLLEVILLE_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144804_11-MOLLEVILLE_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02M53S',
-        'extent_ms': 173000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144804_11-MOLLEVILLE_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144804_11-MOLLEVILLE_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M53S",
+        "extent_ms": 173000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144804.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144804.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M53S",
+        "extent_ms": 173000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144804_11-MOLLEVILLE_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144804_11-MOLLEVILLE_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02M53S",
+        "extent_ms": 173000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Molleville',
-        'http://sws.geonames.org/6426753/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Molleville",
+        "http://sws.geonames.org/6426753/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Aude, Molleville',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Aude, Molleville",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '43.31222',
-      'longitude': '1.83417'
+      "latitude": "43.31222",
+      "longitude": "1.83417"
     }
   },
   {
-    'id': '11280.100/crdo-11-PUIVERT_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-11-PUIVERT_SOUND',
-    'title': 'ALLOc : Puivert : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:28:40+02:00',
-    'issued': '2010-10-25T18:28:40+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-11-PUIVERT_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-11-PUIVERT_SOUND",
+    "title": "ALLOc : Puivert : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:28:40+02:00",
+    "issued": "2010-10-25T18:28:40+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Maugard, Marie',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'De Lorenzo, Linda',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Maugard, Marie",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "De Lorenzo, Linda",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-11-PUIVERT.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-11-PUIVERT.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144805_11-PUIVERT_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144805_11-PUIVERT_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M35S',
-        'extent_ms': 155000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144805.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144805.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M35S',
-        'extent_ms': 155000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144805_11-PUIVERT_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144805_11-PUIVERT_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02M35S',
-        'extent_ms': 155000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144805_11-PUIVERT_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144805_11-PUIVERT_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M35S",
+        "extent_ms": 155000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144805.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144805.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M35S",
+        "extent_ms": 155000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144805_11-PUIVERT_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144805_11-PUIVERT_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02M35S",
+        "extent_ms": 155000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Puivert',
-        'http://sws.geonames.org/6426809/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Puivert",
+        "http://sws.geonames.org/6426809/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Aude, Puivert',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Aude, Puivert",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '42.921',
-      'longitude': '2.0474'
+      "latitude": "42.921",
+      "longitude": "2.0474"
     }
   },
   {
-    'id': '11280.100/crdo-11-RIBOUISSE_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-11-RIBOUISSE_SOUND',
-    'title': 'ALLOc : Ribouisse : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:29:32+02:00',
-    'issued': '2010-10-25T18:29:32+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-11-RIBOUISSE_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-11-RIBOUISSE_SOUND",
+    "title": "ALLOc : Ribouisse : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:29:32+02:00",
+    "issued": "2010-10-25T18:29:32+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Dournès, Lucien',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'De Lorenzo, Linda',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Dournès, Lucien",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "De Lorenzo, Linda",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-11-RIBOUISSE.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-11-RIBOUISSE.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144806_11-RIBOUISSE_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144806_11-RIBOUISSE_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT03M11S',
-        'extent_ms': 191000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144806.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144806.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT03M11S',
-        'extent_ms': 191000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144806_11-RIBOUISSE_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144806_11-RIBOUISSE_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT03M11S',
-        'extent_ms': 191000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144806_11-RIBOUISSE_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144806_11-RIBOUISSE_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT03M11S",
+        "extent_ms": 191000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144806.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144806.wav",
+        "format": "audio/x-wav",
+        "extent": "PT03M11S",
+        "extent_ms": 191000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144806_11-RIBOUISSE_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144806_11-RIBOUISSE_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT03M11S",
+        "extent_ms": 191000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Ribouisse',
-        'http://sws.geonames.org/6426816/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Ribouisse",
+        "http://sws.geonames.org/6426816/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Aude, Ribouisse',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Aude, Ribouisse",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '43.1825',
-      'longitude': '1.8975'
+      "latitude": "43.1825",
+      "longitude": "1.8975"
     }
   },
   {
-    'id': '11280.100/crdo-11-SONNAC-SUR-L-HERS_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-11-SONNAC-SUR-L-HERS_SOUND',
-    'title': 'ALLOc : Sonnac-sur-l\'Hers : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:29:56+02:00',
-    'issued': '2010-10-25T18:29:56+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-11-SONNAC-SUR-L-HERS_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-11-SONNAC-SUR-L-HERS_SOUND",
+    "title": "ALLOc : Sonnac-sur-l'Hers : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:29:56+02:00",
+    "issued": "2010-10-25T18:29:56+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Dumons, Marcellin',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'De Lorenzo, Linda',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Dumons, Marcellin",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "De Lorenzo, Linda",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112'
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112"
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-11-SONNAC-SUR-L-HERS.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-11-SONNAC-SUR-L-HERS.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144807_11-SONNAC-SUR-L-HERS_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144807_11-SONNAC-SUR-L-HERS_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M27S',
-        'extent_ms': 147000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144807.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144807.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M27S',
-        'extent_ms': 147000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144807_11-SONNAC-SUR-L-HERS_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144807_11-SONNAC-SUR-L-HERS_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02M27S',
-        'extent_ms': 147000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144807_11-SONNAC-SUR-L-HERS_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144807_11-SONNAC-SUR-L-HERS_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M27S",
+        "extent_ms": 147000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144807.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144807.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M27S",
+        "extent_ms": 147000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144807_11-SONNAC-SUR-L-HERS_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144807_11-SONNAC-SUR-L-HERS_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02M27S",
+        "extent_ms": 147000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Sonnac-sur-l\'Hers',
-        'http://sws.geonames.org/6426874/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Sonnac-sur-l'Hers",
+        "http://sws.geonames.org/6426874/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Aude, Sonnac-sur-l\'Hers',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Aude, Sonnac-sur-l'Hers",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '43.00389',
-      'longitude': '1.99306'
+      "latitude": "43.00389",
+      "longitude": "1.99306"
     }
   },
   {
-    'id': '11280.100/crdo-11-ST-MARTIN-LALANDE_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-11-ST-MARTIN-LALANDE_SOUND',
-    'title': 'ALLOc : Saint-Martin-Lalande : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:30:27+02:00',
-    'issued': '2010-10-25T18:30:27+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-11-ST-MARTIN-LALANDE_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-11-ST-MARTIN-LALANDE_SOUND",
+    "title": "ALLOc : Saint-Martin-Lalande : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:30:27+02:00",
+    "issued": "2010-10-25T18:30:27+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Hugonnet, Pierre',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'De Lorenzo, Linda',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Hugonnet, Pierre",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "De Lorenzo, Linda",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-11-ST-MARTIN-LALANDE.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-11-ST-MARTIN-LALANDE.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144808_11-ST-MARTIN-LALANDE_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144808_11-ST-MARTIN-LALANDE_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT01M59S',
-        'extent_ms': 119000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144808.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144808.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT01M59S',
-        'extent_ms': 119000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144808_11-ST-MARTIN-LALANDE_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144808_11-ST-MARTIN-LALANDE_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT01M59S',
-        'extent_ms': 119000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144808_11-ST-MARTIN-LALANDE_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144808_11-ST-MARTIN-LALANDE_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT01M59S",
+        "extent_ms": 119000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144808.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144808.wav",
+        "format": "audio/x-wav",
+        "extent": "PT01M59S",
+        "extent_ms": 119000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144808_11-ST-MARTIN-LALANDE_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144808_11-ST-MARTIN-LALANDE_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT01M59S",
+        "extent_ms": 119000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Saint-Martin-Lalande',
-        'http://sws.geonames.org/6426853/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Saint-Martin-Lalande",
+        "http://sws.geonames.org/6426853/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Aude, Saint-Martin-Lalande',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Aude, Saint-Martin-Lalande",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '43.29944',
-      'longitude': '2.01944'
+      "latitude": "43.29944",
+      "longitude": "2.01944"
     }
   },
   {
-    'id': '11280.100/crdo-12-AUZITS_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-12-AUZITS_SOUND',
-    'title': 'ALLOc : Auzits : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:31:22+02:00',
-    'issued': '2010-10-25T18:31:22+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-12-AUZITS_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-12-AUZITS_SOUND",
+    "title": "ALLOc : Auzits : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:31:22+02:00",
+    "issued": "2010-10-25T18:31:22+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Constans, André',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Bosc, Marie-Sophie',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Constans, André",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Bosc, Marie-Sophie",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-12-AUZITS.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-12-AUZITS.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144810_12-AUZITS_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144810_12-AUZITS_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT03M19S',
-        'extent_ms': 199000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144810.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144810.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT03M19S',
-        'extent_ms': 199000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144810_12-AUZITS_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144810_12-AUZITS_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT03M19S',
-        'extent_ms': 199000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144810_12-AUZITS_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144810_12-AUZITS_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT03M19S",
+        "extent_ms": 199000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144810.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144810.wav",
+        "format": "audio/x-wav",
+        "extent": "PT03M19S",
+        "extent_ms": 199000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144810_12-AUZITS_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144810_12-AUZITS_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT03M19S",
+        "extent_ms": 199000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Auzits',
-        'http://sws.geonames.org/6447048/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Auzits",
+        "http://sws.geonames.org/6447048/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Aveyron, Auzits',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Aveyron, Auzits",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '44.50694',
-      'longitude': '2.32778'
+      "latitude": "44.50694",
+      "longitude": "2.32778"
     }
   },
   {
-    'id': '11280.100/crdo-12-JOUELS_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-12-JOUELS_SOUND',
-    'title': 'ALLOc : Jouels : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:31:21+02:00',
-    'issued': '2010-10-25T18:31:21+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-12-JOUELS_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-12-JOUELS_SOUND",
+    "title": "ALLOc : Jouels : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:31:21+02:00",
+    "issued": "2010-10-25T18:31:21+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Bayol, Maria',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Bosc, Marie-Sophie',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Bayol, Maria",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Bosc, Marie-Sophie",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-12-JOUELS.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-12-JOUELS.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144809_12-JOUELS_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144809_12-JOUELS_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M33S',
-        'extent_ms': 153000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144809.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144809.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M33S',
-        'extent_ms': 153000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144809_12-JOUELS_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144809_12-JOUELS_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02M33S',
-        'extent_ms': 153000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144809_12-JOUELS_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144809_12-JOUELS_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M33S",
+        "extent_ms": 153000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144809.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144809.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M33S",
+        "extent_ms": 153000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144809_12-JOUELS_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144809_12-JOUELS_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02M33S",
+        "extent_ms": 153000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Sauveterre-de-Rouergue',
-        'http://sws.geonames.org/6427053/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Sauveterre-de-Rouergue",
+        "http://sws.geonames.org/6427053/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Aveyron, Sauveterre-de-Rouergue (Jouels)',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Aveyron, Sauveterre-de-Rouergue (Jouels)",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '44.22056',
-      'longitude': '2.31778'
+      "latitude": "44.22056",
+      "longitude": "2.31778"
     }
   },
   {
-    'id': '11280.100/crdo-12-LACASSAGNE_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-12-LACASSAGNE_SOUND',
-    'title': 'ALLOc : Lacassagne : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:31:43+02:00',
-    'issued': '2010-10-25T18:31:43+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-12-LACASSAGNE_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-12-LACASSAGNE_SOUND",
+    "title": "ALLOc : Lacassagne : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:31:43+02:00",
+    "issued": "2010-10-25T18:31:43+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Andrieu, Honoré',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Bosc, Marie-Sophie',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Andrieu, Honoré",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Bosc, Marie-Sophie",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-12-LACASSAGNE.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-12-LACASSAGNE.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144811_12-LACASSAGNE_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144811_12-LACASSAGNE_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M52S',
-        'extent_ms': 172000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144811.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144811.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M52S',
-        'extent_ms': 172000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144811_12-LACASSAGNE_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144811_12-LACASSAGNE_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02M52S',
-        'extent_ms': 172000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144811_12-LACASSAGNE_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144811_12-LACASSAGNE_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M52S",
+        "extent_ms": 172000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144811.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144811.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M52S",
+        "extent_ms": 172000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144811_12-LACASSAGNE_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144811_12-LACASSAGNE_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02M52S",
+        "extent_ms": 172000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [],
-      'notes': [
+    "geoInfo": {
+      "ref-locs": [],
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'southlimit=41.371582; northlimit=51.092804; eastlimit=9.561556; westlimit=-5.142222',
-          'datatype': 'http://purl.org/dc/terms/Box',
-          'lang': null
+          "value": "southlimit=41.371582; northlimit=51.092804; eastlimit=9.561556; westlimit=-5.142222",
+          "datatype": "http://purl.org/dc/terms/Box",
+          "lang": null
         },
         {
-          'value': 'France, Aveyron, Lacassagne',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Aveyron, Lacassagne",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': null,
-      'longitude': null
+      "latitude": null,
+      "longitude": null
     }
   },
   {
-    'id': '11280.100/crdo-12-LANUEJOULS_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-12-LANUEJOULS_SOUND',
-    'title': 'ALLOc : Lanuéjouls : Parabole',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:32:16+02:00',
-    'issued': '2010-10-25T18:32:16+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-12-LANUEJOULS_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-12-LANUEJOULS_SOUND",
+    "title": "ALLOc : Lanuéjouls : Parabole",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:32:16+02:00",
+    "issued": "2010-10-25T18:32:16+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/56666014',
-        'role': 'http://www.language-archives.org/OLAC/1.1/data_inputter'
-      },
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/51700729',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Garric, Raymond',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Bosc, Marie-Sophie',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/transcriber'
+    "contributors": [
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/56666014",
+        "role": "http://www.language-archives.org/OLAC/1.1/data_inputter"
+      },
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/51700729",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Garric, Raymond",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Bosc, Marie-Sophie",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/transcriber"
       }
     ],
-    'subjects': [
-      'http://ark.bnf.fr/ark:/12148/cb11946662b',
-      'http://ark.bnf.fr/ark:/12148/cb11965628b',
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
-      },
-      'http://ark.bnf.fr/ark:/12148/cb11970755h',
-      'http://ark.bnf.fr/ark:/12148/cb119766112',
-      {
-        'value': 'translating_and_interpreting',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
+    "subjects": [
+      "http://ark.bnf.fr/ark:/12148/cb11946662b",
+      "http://ark.bnf.fr/ark:/12148/cb11965628b",
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
+      },
+      "http://ark.bnf.fr/ark:/12148/cb11970755h",
+      "http://ark.bnf.fr/ark:/12148/cb119766112",
+      {
+        "value": "translating_and_interpreting",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
       }
     ],
-    'transcript': {
-      'url': 'http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-12-LANUEJOULS.xml',
-      'format': 'application/xml',
-      'conforms-to': 'http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive'
+    "transcript": {
+      "url": "http://cocoon.huma-num.fr/exist/crdo/thesoc/oc/crdo-12-LANUEJOULS.xml",
+      "format": "application/xml",
+      "conforms-to": "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive"
     },
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144812_12-LANUEJOULS_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144812_12-LANUEJOULS_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M34S',
-        'extent_ms': 154000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144812.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144812.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02M34S',
-        'extent_ms': 154000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144812_12-LANUEJOULS_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144812_12-LANUEJOULS_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02M34S',
-        'extent_ms': 154000,
-        'master': false
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144812_12-LANUEJOULS_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144812_12-LANUEJOULS_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M34S",
+        "extent_ms": 154000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144812.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144812.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02M34S",
+        "extent_ms": 154000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144812_12-LANUEJOULS_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144812_12-LANUEJOULS_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02M34S",
+        "extent_ms": 154000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Lanuéjouls',
-        'http://sws.geonames.org/6615868/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Lanuéjouls",
+        "http://sws.geonames.org/6615868/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Aveyron, Lanuéjouls',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Aveyron, Lanuéjouls",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '44.4249',
-      'longitude': '2.1608'
+      "latitude": "44.4249",
+      "longitude": "2.1608"
     }
   },
   {
-    'id': '11280.100/crdo-12-MARNAC1LEX_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-12-MARNAC1LEX_SOUND',
-    'title': 'ALLOc : Marnac',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:33:17+02:00',
-    'issued': '2010-10-25T18:33:17+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-12-MARNAC1LEX_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-12-MARNAC1LEX_SOUND",
+    "title": "ALLOc : Marnac",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:33:17+02:00",
+    "issued": "2010-10-25T18:33:17+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/17256845',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Gibily, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Rouchy, Armand',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
+    "contributors": [
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/17256845",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Gibily, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Rouchy, Armand",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
       }
     ],
-    'subjects': [
-      {
-        'value': 'lexicography',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
-      },
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
+    "subjects": [
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
       }
     ],
-    'transcript': null,
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144813_12-MARNAC1LEX_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144813_12-MARNAC1LEX_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT01H05M27S',
-        'extent_ms': 3927000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144813.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144813.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT01H05M27S',
-        'extent_ms': 3927000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144813_12-MARNAC1LEX_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144813_12-MARNAC1LEX_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT01H05M27S',
-        'extent_ms': 3927000,
-        'master': false
+    "transcript": null,
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144813_12-MARNAC1LEX_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144813_12-MARNAC1LEX_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT01H05M27S",
+        "extent_ms": 3927000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144813.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144813.wav",
+        "format": "audio/x-wav",
+        "extent": "PT01H05M27S",
+        "extent_ms": 3927000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144813_12-MARNAC1LEX_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144813_12-MARNAC1LEX_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT01H05M27S",
+        "extent_ms": 3927000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Marnac',
-        'http://sws.geonames.org/6429427/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Marnac",
+        "http://sws.geonames.org/6429427/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Dordogne, Marnac',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Dordogne, Marnac",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '44.83694',
-      'longitude': '1.02583'
+      "latitude": "44.83694",
+      "longitude": "1.02583"
     }
   },
   {
-    'id': '11280.100/crdo-12-MARNAC2LEX_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-12-MARNAC2LEX_SOUND',
-    'title': 'ALLOc : Marnac-2',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:33:43+02:00',
-    'issued': '2010-10-25T18:33:43+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-12-MARNAC2LEX_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-12-MARNAC2LEX_SOUND",
+    "title": "ALLOc : Marnac-2",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:33:43+02:00",
+    "issued": "2010-10-25T18:33:43+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/17256845',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Gibily, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Rouchy, Armand',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
+    "contributors": [
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/17256845",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Gibily, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Rouchy, Armand",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
       }
     ],
-    'subjects': [
-      {
-        'value': 'lexicography',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
-      },
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
+    "subjects": [
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
       }
     ],
-    'transcript': null,
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144814_12-MARNAC2LEX_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144814_12-MARNAC2LEX_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02H08M08S',
-        'extent_ms': 7688000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144814.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144814.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02H08M08S',
-        'extent_ms': 7688000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144814_12-MARNAC2LEX_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144814_12-MARNAC2LEX_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02H08M08S',
-        'extent_ms': 7688000,
-        'master': false
+    "transcript": null,
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144814_12-MARNAC2LEX_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144814_12-MARNAC2LEX_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02H08M08S",
+        "extent_ms": 7688000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144814.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144814.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02H08M08S",
+        "extent_ms": 7688000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144814_12-MARNAC2LEX_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144814_12-MARNAC2LEX_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02H08M08S",
+        "extent_ms": 7688000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Marnac',
-        'http://sws.geonames.org/6429427/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Marnac",
+        "http://sws.geonames.org/6429427/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Dordogne, Marnac',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Dordogne, Marnac",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '44.83694',
-      'longitude': '1.02583'
+      "latitude": "44.83694",
+      "longitude": "1.02583"
     }
   },
   {
-    'id': '11280.100/crdo-12-MARNAC3LEX_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-12-MARNAC3LEX_SOUND',
-    'title': 'ALLOc : Marnac-3',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:33:51+02:00',
-    'issued': '2010-10-25T18:33:51+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-12-MARNAC3LEX_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-12-MARNAC3LEX_SOUND",
+    "title": "ALLOc : Marnac-3",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:33:51+02:00",
+    "issued": "2010-10-25T18:33:51+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/17256845',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Gibily, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Rouchy, Armand',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
+    "contributors": [
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/17256845",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Gibily, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Rouchy, Armand",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
       }
     ],
-    'subjects': [
-      {
-        'value': 'lexicography',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
-      },
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
+    "subjects": [
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
       }
     ],
-    'transcript': null,
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144815_12-MARNAC3LEX_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144815_12-MARNAC3LEX_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT01H56M35S',
-        'extent_ms': 6995000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144815.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144815.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT01H56M35S',
-        'extent_ms': 6995000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144815_12-MARNAC3LEX_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144815_12-MARNAC3LEX_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT01H56M35S',
-        'extent_ms': 6995000,
-        'master': false
+    "transcript": null,
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144815_12-MARNAC3LEX_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144815_12-MARNAC3LEX_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT01H56M35S",
+        "extent_ms": 6995000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144815.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144815.wav",
+        "format": "audio/x-wav",
+        "extent": "PT01H56M35S",
+        "extent_ms": 6995000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144815_12-MARNAC3LEX_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144815_12-MARNAC3LEX_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT01H56M35S",
+        "extent_ms": 6995000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Marnac',
-        'http://sws.geonames.org/6429427/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Marnac",
+        "http://sws.geonames.org/6429427/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Dordogne, Marnac',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Dordogne, Marnac",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '44.83694',
-      'longitude': '1.02583'
+      "latitude": "44.83694",
+      "longitude": "1.02583"
     }
   },
   {
-    'id': '11280.100/crdo-12-MARNAC4MORPHO_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-12-MARNAC4MORPHO_SOUND',
-    'title': 'ALLOc : Marnac-4',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:34:19+02:00',
-    'issued': '2010-10-25T18:34:19+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-12-MARNAC4MORPHO_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-12-MARNAC4MORPHO_SOUND",
+    "title": "ALLOc : Marnac-4",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:34:19+02:00",
+    "issued": "2010-10-25T18:34:19+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/17256845',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Gibily, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Rouchy, Armand',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
+    "contributors": [
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/17256845",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Gibily, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Rouchy, Armand",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
       }
     ],
-    'subjects': [
-      {
-        'value': 'lexicography',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
-      },
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
+    "subjects": [
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
       }
     ],
-    'transcript': null,
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144816_12-MARNAC4MORPHO_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144816_12-MARNAC4MORPHO_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT11M23S',
-        'extent_ms': 683000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144816.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144816.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT11M23S',
-        'extent_ms': 683000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144816_12-MARNAC4MORPHO_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144816_12-MARNAC4MORPHO_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT11M23S',
-        'extent_ms': 683000,
-        'master': false
+    "transcript": null,
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144816_12-MARNAC4MORPHO_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144816_12-MARNAC4MORPHO_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT11M23S",
+        "extent_ms": 683000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144816.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144816.wav",
+        "format": "audio/x-wav",
+        "extent": "PT11M23S",
+        "extent_ms": 683000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144816_12-MARNAC4MORPHO_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144816_12-MARNAC4MORPHO_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT11M23S",
+        "extent_ms": 683000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Marnac',
-        'http://sws.geonames.org/6429427/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Marnac",
+        "http://sws.geonames.org/6429427/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Dordogne, Marnac',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Dordogne, Marnac",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '44.83694',
-      'longitude': '1.02583'
+      "latitude": "44.83694",
+      "longitude": "1.02583"
     }
   },
   {
-    'id': '11280.100/crdo-12-MARNAC5MORPHO_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-12-MARNAC5MORPHO_SOUND',
-    'title': 'ALLOc : Marnac-5',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:35:45+02:00',
-    'issued': '2010-10-25T18:35:45+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-12-MARNAC5MORPHO_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-12-MARNAC5MORPHO_SOUND",
+    "title": "ALLOc : Marnac-5",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:35:45+02:00",
+    "issued": "2010-10-25T18:35:45+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/17256845',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Gibily, Jeanne',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Rouchy, Armand',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
+    "contributors": [
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/17256845",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Gibily, Jeanne",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Rouchy, Armand",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
       }
     ],
-    'subjects': [
-      {
-        'value': 'morphology',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
-      },
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
+    "subjects": [
+      {
+        "value": "morphology",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
       }
     ],
-    'transcript': null,
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144817_12-MARNAC5MORPHO_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144817_12-MARNAC5MORPHO_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT01H02M25S',
-        'extent_ms': 3745000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144817.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144817.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT01H02M25S',
-        'extent_ms': 3745000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144817_12-MARNAC5MORPHO_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144817_12-MARNAC5MORPHO_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT01H02M25S',
-        'extent_ms': 3745000,
-        'master': false
+    "transcript": null,
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144817_12-MARNAC5MORPHO_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144817_12-MARNAC5MORPHO_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT01H02M25S",
+        "extent_ms": 3745000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144817.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144817.wav",
+        "format": "audio/x-wav",
+        "extent": "PT01H02M25S",
+        "extent_ms": 3745000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144817_12-MARNAC5MORPHO_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144817_12-MARNAC5MORPHO_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT01H02M25S",
+        "extent_ms": 3745000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Marnac',
-        'http://sws.geonames.org/6429427/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Marnac",
+        "http://sws.geonames.org/6429427/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Dordogne, Marnac',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Dordogne, Marnac",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '44.83694',
-      'longitude': '1.02583'
+      "latitude": "44.83694",
+      "longitude": "1.02583"
     }
   },
   {
-    'id': '11280.100/crdo-12-MAYRAN1LEX_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-12-MAYRAN1LEX_SOUND',
-    'title': 'ALLOc : Mayran',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:36:22+02:00',
-    'issued': '2010-10-25T18:36:22+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-12-MAYRAN1LEX_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-12-MAYRAN1LEX_SOUND",
+    "title": "ALLOc : Mayran",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:36:22+02:00",
+    "issued": "2010-10-25T18:36:22+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Boutary Jeannette',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Boutary Simon',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Lacombe Ruben',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Solignac Clément',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Solignac Léa',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Solignac Pierre',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
+    "contributors": [
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Boutary Jeannette",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Boutary Simon",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Lacombe Ruben",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Solignac Clément",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Solignac Léa",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Solignac Pierre",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
       }
     ],
-    'subjects': [
-      {
-        'value': 'lexicography',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
-      },
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
+    "subjects": [
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
       }
     ],
-    'transcript': null,
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144818_12-MAYRAN1LEX_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144818_12-MAYRAN1LEX_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT01H26M21S',
-        'extent_ms': 5181000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144818.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144818.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT01H26M21S',
-        'extent_ms': 5181000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144818_12-MAYRAN1LEX_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144818_12-MAYRAN1LEX_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT01H26M21S',
-        'extent_ms': 5181000,
-        'master': false
+    "transcript": null,
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144818_12-MAYRAN1LEX_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144818_12-MAYRAN1LEX_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT01H26M21S",
+        "extent_ms": 5181000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144818.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144818.wav",
+        "format": "audio/x-wav",
+        "extent": "PT01H26M21S",
+        "extent_ms": 5181000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144818_12-MAYRAN1LEX_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144818_12-MAYRAN1LEX_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT01H26M21S",
+        "extent_ms": 5181000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Mayran',
-        'http://sws.geonames.org/6426959/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Mayran",
+        "http://sws.geonames.org/6426959/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Aveyron, Mayran',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Aveyron, Mayran",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '44.38833',
-      'longitude': '2.36361'
+      "latitude": "44.38833",
+      "longitude": "2.36361"
     }
   },
   {
-    'id': '11280.100/crdo-12-MAYRAN2LEX_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-12-MAYRAN2LEX_SOUND',
-    'title': 'ALLOc : Mayran',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:36:52+02:00',
-    'issued': '2010-10-25T18:36:52+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-12-MAYRAN2LEX_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-12-MAYRAN2LEX_SOUND",
+    "title": "ALLOc : Mayran",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:36:52+02:00",
+    "issued": "2010-10-25T18:36:52+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Boutary Jeannette',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Boutary Simon',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Lacombe Ruben',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Solignac Clément',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Solignac Léa',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Solignac Pierre',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
+    "contributors": [
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Boutary Jeannette",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Boutary Simon",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Lacombe Ruben",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Solignac Clément",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Solignac Léa",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Solignac Pierre",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
       }
     ],
-    'subjects': [
-      {
-        'value': 'lexicography',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
-      },
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
+    "subjects": [
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
       }
     ],
-    'transcript': null,
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144819_12-MAYRAN2LEX_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144819_12-MAYRAN2LEX_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02H06M51S',
-        'extent_ms': 7611000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144819.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144819.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02H06M51S',
-        'extent_ms': 7611000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144819_12-MAYRAN2LEX_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144819_12-MAYRAN2LEX_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02H06M51S',
-        'extent_ms': 7611000,
-        'master': false
+    "transcript": null,
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144819_12-MAYRAN2LEX_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144819_12-MAYRAN2LEX_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02H06M51S",
+        "extent_ms": 7611000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144819.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144819.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02H06M51S",
+        "extent_ms": 7611000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144819_12-MAYRAN2LEX_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144819_12-MAYRAN2LEX_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02H06M51S",
+        "extent_ms": 7611000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Mayran',
-        'http://sws.geonames.org/6426959/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Mayran",
+        "http://sws.geonames.org/6426959/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Aveyron, Mayran',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Aveyron, Mayran",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '44.38833',
-      'longitude': '2.36361'
+      "latitude": "44.38833",
+      "longitude": "2.36361"
     }
   },
   {
-    'id': '11280.100/crdo-12-MAYRAN3LEX_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-12-MAYRAN3LEX_SOUND',
-    'title': 'ALLOc : Mayran-3',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:36:54+02:00',
-    'issued': '2010-10-25T18:36:54+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-12-MAYRAN3LEX_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-12-MAYRAN3LEX_SOUND",
+    "title": "ALLOc : Mayran-3",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:36:54+02:00",
+    "issued": "2010-10-25T18:36:54+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Boutary Jeannette',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Boutary Simon',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Lacombe Ruben',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Solignac Clément',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Solignac Léa',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Solignac Pierre',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
+    "contributors": [
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Boutary Jeannette",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Boutary Simon",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Lacombe Ruben",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Solignac Clément",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Solignac Léa",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Solignac Pierre",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
       }
     ],
-    'subjects': [
-      {
-        'value': 'lexicography',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
-      },
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
+    "subjects": [
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
       }
     ],
-    'transcript': null,
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144820_12-MAYRAN3LEX_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144820_12-MAYRAN3LEX_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02H06M57S',
-        'extent_ms': 7617000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144820.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144820.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02H06M57S',
-        'extent_ms': 7617000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144820_12-MAYRAN3LEX_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144820_12-MAYRAN3LEX_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02H06M57S',
-        'extent_ms': 7617000,
-        'master': false
+    "transcript": null,
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144820_12-MAYRAN3LEX_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144820_12-MAYRAN3LEX_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02H06M57S",
+        "extent_ms": 7617000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144820.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144820.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02H06M57S",
+        "extent_ms": 7617000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144820_12-MAYRAN3LEX_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144820_12-MAYRAN3LEX_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02H06M57S",
+        "extent_ms": 7617000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Mayran',
-        'http://sws.geonames.org/6426959/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Mayran",
+        "http://sws.geonames.org/6426959/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Aveyron, Mayran',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Aveyron, Mayran",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '44.38833',
-      'longitude': '2.36361'
+      "latitude": "44.38833",
+      "longitude": "2.36361"
     }
   },
   {
-    'id': '11280.100/crdo-12-MAYRAN4LEX_SOUND',
-    'uri': 'https://hdl.handle.net/11280.100/crdo-12-MAYRAN4LEX_SOUND',
-    'title': 'ALLOc : Mayran-4',
-    'language': 'http://lexvo.org/id/iso639-3/oci',
-    'modified': '2010-10-25T18:37:07+02:00',
-    'issued': '2010-10-25T18:37:07+02:00',
-    'publishers': [
-      'Équipe de Recherche en Syntaxe et Sémantique',
-      'Bases, corpus, langage'
+    "id": "11280.100/crdo-12-MAYRAN4LEX_SOUND",
+    "uri": "https://hdl.handle.net/11280.100/crdo-12-MAYRAN4LEX_SOUND",
+    "title": "ALLOc : Mayran-4",
+    "languages": [
+      "http://lexvo.org/id/iso639-3/oci"
+    ],
+    "modified": "2010-10-25T18:37:07+02:00",
+    "issued": "2010-10-25T18:37:07+02:00",
+    "publishers": [
+      "Équipe de Recherche en Syntaxe et Sémantique",
+      "Bases, corpus, langage"
     ],
-    'contributors': [
-      {
-        'name': 'LDOR',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Thésaurus Occitan',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/depositor'
-      },
-      {
-        'name': 'Équipe de Recherche en Syntaxe et Sémantique',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': 'Bases, corpus, langage',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/editor'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/interviewer'
-      },
-      {
-        'name': null,
-        'url': 'http://viaf.org/viaf/91792187',
-        'role': 'http://www.language-archives.org/OLAC/1.1/researcher'
-      },
-      {
-        'name': 'Boutary Jeannette',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Boutary Simon',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Lacombe Ruben',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Solignac Clément',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Solignac Léa',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
-      },
-      {
-        'name': 'Solignac Pierre',
-        'url': null,
-        'role': 'http://www.language-archives.org/OLAC/1.1/speaker'
+    "contributors": [
+      {
+        "name": "LDOR",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Thésaurus Occitan",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/depositor"
+      },
+      {
+        "name": "Équipe de Recherche en Syntaxe et Sémantique",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": "Bases, corpus, langage",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/editor"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/interviewer"
+      },
+      {
+        "name": null,
+        "url": "http://viaf.org/viaf/91792187",
+        "role": "http://www.language-archives.org/OLAC/1.1/researcher"
+      },
+      {
+        "name": "Boutary Jeannette",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Boutary Simon",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Lacombe Ruben",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Solignac Clément",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Solignac Léa",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
+      },
+      {
+        "name": "Solignac Pierre",
+        "url": null,
+        "role": "http://www.language-archives.org/OLAC/1.1/speaker"
       }
     ],
-    'subjects': [
-      {
-        'value': 'lexicography',
-        'datatype': 'http://www.language-archives.org/OLAC/1.1/linguistic-field',
-        'lang': null
-      },
-      'http://lexvo.org/id/iso639-3/oci',
-      {
-        'value': 'Occitan/Languedocien',
-        'datatype': null,
-        'lang': 'fr'
+    "subjects": [
+      {
+        "value": "lexicography",
+        "datatype": "http://www.language-archives.org/OLAC/1.1/linguistic-field",
+        "lang": null
+      },
+      "http://lexvo.org/id/iso639-3/oci",
+      {
+        "value": "Occitan/Languedocien",
+        "datatype": null,
+        "lang": "fr"
       }
     ],
-    'transcript': null,
-    'mediaArray': {
-      'http://cocoon.huma-num.fr/data/archi/144821_12-MAYRAN4LEX_22km.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/144821_12-MAYRAN4LEX_22km.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02H06M55S',
-        'extent_ms': 7615000,
-        'master': false
-      },
-      'http://cocoon.huma-num.fr/data/archi/masters/144821.wav': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/masters/144821.wav',
-        'format': 'audio/x-wav',
-        'extent': 'PT02H06M55S',
-        'extent_ms': 7615000,
-        'master': true
-      },
-      'http://cocoon.huma-num.fr/data/archi/mp3/144821_12-MAYRAN4LEX_44k.mp3': {
-        'url': 'http://cocoon.huma-num.fr/data/archi/mp3/144821_12-MAYRAN4LEX_44k.mp3',
-        'format': 'audio/mpeg',
-        'extent': 'PT02H06M55S',
-        'extent_ms': 7615000,
-        'master': false
+    "transcript": null,
+    "mediaArray": {
+      "http://cocoon.huma-num.fr/data/archi/144821_12-MAYRAN4LEX_22km.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/144821_12-MAYRAN4LEX_22km.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02H06M55S",
+        "extent_ms": 7615000,
+        "master": false
+      },
+      "http://cocoon.huma-num.fr/data/archi/masters/144821.wav": {
+        "url": "http://cocoon.huma-num.fr/data/archi/masters/144821.wav",
+        "format": "audio/x-wav",
+        "extent": "PT02H06M55S",
+        "extent_ms": 7615000,
+        "master": true
+      },
+      "http://cocoon.huma-num.fr/data/archi/mp3/144821_12-MAYRAN4LEX_44k.mp3": {
+        "url": "http://cocoon.huma-num.fr/data/archi/mp3/144821_12-MAYRAN4LEX_44k.mp3",
+        "format": "audio/mpeg",
+        "extent": "PT02H06M55S",
+        "extent_ms": 7615000,
+        "master": false
       }
     },
-    'geoInfo': {
-      'ref-locs': [
-        'http://fr.dbpedia.org/resource/Mayran',
-        'http://sws.geonames.org/6426959/'
+    "geoInfo": {
+      "ref-locs": [
+        "http://fr.dbpedia.org/resource/Mayran",
+        "http://sws.geonames.org/6426959/"
       ],
-      'notes': [
+      "notes": [
         {
-          'value': 'FR',
-          'datatype': 'http://purl.org/dc/terms/ISO3166',
-          'lang': null
+          "value": "FR",
+          "datatype": "http://purl.org/dc/terms/ISO3166",
+          "lang": null
         },
         {
-          'value': 'France, Aveyron, Mayran',
-          'datatype': null,
-          'lang': 'fr'
+          "value": "France, Aveyron, Mayran",
+          "datatype": null,
+          "lang": "fr"
         }
       ],
-      'latitude': '44.38833',
-      'longitude': '2.36361'
+      "latitude": "44.38833",
+      "longitude": "2.36361"
     }
   }
-];
+];
\ No newline at end of file
--- a/server/bo_client/server/fixtures/lexvo.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/bo_client/server/fixtures/lexvo.js	Sun Oct 16 23:19:57 2016 +0530
@@ -3,5 +3,15 @@
 module.exports = {
   'fra': 'français',
   'gsw': 'alémanique',
-  'oci': 'occitan'
+  'oci': 'occitan',
+  'corpus-global': 'global',
+  'corpus-regionals': 'langues régionales',
+  'corpus-oil': 'langues d\'oïl',
+  'corpus-creoles': 'les créoles',
+  'corpus-non-territorials': 'langues non territoriales',
+  'corpus-guyane': 'Guyane',
+  'corpus-mayotte': 'Mayotte',
+  'corpus-polynesia': 'Polynésie française',
+  'corpus-wallis-futuna': 'Wallis et Futuna',
+  'corpus-new-caledonia': 'Nouvelle-Calédonie'
 };
--- a/server/src/app/Console/Commands/ImportCocoonRDF.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Console/Commands/ImportCocoonRDF.php	Sun Oct 16 23:19:57 2016 +0530
@@ -100,8 +100,8 @@
         $documentCounts = ['all' => 0, 'unknown' => 0, 'error' => 0];
 
         foreach ($recs as $item) {
-
-            $identifier = (string) $item->xpath('/record/header/identifier')[0];
+            $item->registerXPathNamespace('oai', "http://www.openarchives.org/OAI/2.0/");
+            $identifier = (string) $item->xpath('/oai:record/oai:header/oai:identifier')[0];
             $docRdfUrl = Config::get('corpusparole.cocoon_rdf_base_uri').substr($identifier, strlen(Config::get('corpusparole.cocoon_doc_id_base')));
             $message = "$identifier : $docRdfUrl";
             if($recs->getNumRetrieved() <= $skip) {
--- a/server/src/app/Console/Commands/IndexDocuments.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Console/Commands/IndexDocuments.php	Sun Oct 16 23:19:57 2016 +0530
@@ -2,12 +2,28 @@
 
 namespace CorpusParole\Console\Commands;
 
+
+
 use Illuminate\Console\Command;
+use EasyRdf\Resource;
+use EasyRdf\Literal;
+use EasyRdf\Graph;
+
+use Carbon\Carbon;
+
 use GuzzleHttp\Client;
+use GuzzleHttp\Exception\TransferException;
+use GuzzleHttp\Psr7;
+
+use CorpusParole\Libraries\Utils;
 use CorpusParole\Repositories\DocumentRepository;
 use CorpusParole\Libraries\CocoonUtils;
 use CorpusParole\Models\GeonamesHierarchy;
+use CorpusParole\Services\BnfResolverInterface;
+use CorpusParole\Services\LexvoResolverInterface;
 use Es;
+use Log;
+use Cache;
 
 class IndexDocuments extends Command
 {
@@ -20,7 +36,8 @@
     protected $signature = 'corpus-parole:indexDocuments
                           {--limit=0 : index only the first n documents, 0 (default) means index everything }
                           {--no-bulk : index documents one by one instead of using ElasticSearch bulk indexing }
-                          {--step-size=100 : number of documents to retrieve from repository at a time before indexing}';
+                          {--step-size=100 : number of documents to retrieve from repository at a time before indexing}
+                          {--reset-geo-cache : reset geo cache befr indexing}';
 
     /**
      * The console command description.
@@ -34,9 +51,15 @@
      *
      * @return void
      */
-    public function __construct(DocumentRepository $documentRepository, Client $httpClient)
+    public function __construct(
+        DocumentRepository $documentRepository,
+        Client $httpClient,
+        BnfResolverInterface $bnfResolver,
+        LexvoResolverInterface $lexvoResolver)
     {
         $this->documentRepository = $documentRepository;
+        $this->bnfResolver = $bnfResolver;
+        $this->lexvoResolver = $lexvoResolver;
         $this->httpClient = $httpClient;
         parent::__construct();
     }
@@ -65,7 +88,8 @@
             'settings' => [
                 'number_of_shards' => config('elasticsearch.shards'),
                 'number_of_replicas' => config('elasticsearch.replicas'),
-                'index.mapping.ignore_malformed' => True
+                'index.mapping.ignore_malformed' => True,
+                'index.requests.cache.enable' => True
             ],
             'mappings' => [
                 'document' => [
@@ -79,10 +103,20 @@
                                 ]
                             ]
                         ],
-                        'date' => [ 'type' => 'date' ],
-                        'geonames_hyerarchy' => [ 'type' => 'string' ],
-                        'location' => [ 'type' => 'geo_point' ]
-                        // TODO: add location information
+                        'date' => [ 'type' => 'date', 'index' => 'not_analyzed'],
+                        'geonames_hyerarchy' => [ 'type' => 'string', 'index' => 'not_analyzed'],
+                        'location' => [ 'type' => 'geo_point'],
+                        'creation_date' => ['type' => 'date', 'index' => 'not_analyzed'],
+                        'language' => ['type' => 'string', 'index' => 'not_analyzed'],
+                        'discourse_types' => ['type' => 'string', 'index' => 'not_analyzed'],
+                        'subject' => [
+                            'type' => 'nested',
+                            'properties' => [
+                                'label' => [ 'type' => 'string', 'index' => 'not_analyzed'],
+                                'code' => [ 'type' => 'string', 'index' => 'not_analyzed'],
+                                'label_code' => [ 'type' => 'string', 'index' => 'not_analyzed']
+                            ]
+                        ]
                     ]
                 ]
             ]
@@ -96,7 +130,7 @@
 
 
     private function getGeonamesHierarchyArray($geonamesid) {
-        // TODO: Manage this cache !!!
+
         $hcache = GeonamesHierarchy::where('geonamesid', $geonamesid)->first();
         if(is_null($hcache)) {
 
@@ -112,7 +146,7 @@
                 ]
             )->getBody();
             $hjson = json_decode($apiBody);
-            $hcache = new GeonamesHierarchy;
+            $hcache = new GeonamesHierarchy();
             $hcache->geonamesid = $geonamesid;
             $hcache->hierarchy = $hjson;
             $hcache->save();
@@ -124,7 +158,6 @@
                 array_push($res, $hierarchyElem['geonameId']);
             }
         }
-
         return $res;
 
     }
@@ -153,22 +186,311 @@
     }
 
     /**
+     * get subjects as { 'label': label, 'code': code } objects
+     * Takes only into account the bnf subjects
+     */
+    private function getSubjects($doc) {
+
+        $sres = array_reduce($doc->getSubjects(), function($res, $s) {
+            $mBnf = [];
+            $mLexvo = [];
+
+            if($s instanceof Resource && preg_match(config('corpusparole.bnf_ark_url_regexp'), $s->getUri(), $mBnf) === 1) {
+
+                array_push($res, [
+                    'uri' => $mBnf[0],
+                    'code' => $mBnf[1],
+                    'type' => 'bnf'
+                ]);
+            } elseif($s instanceof Resource && preg_match(config('corpusparole.lexvo_url_regexp'), $s->getUri(), $mLexvo) === 1) {
+                array_push($res, [
+                    'uri' => $mLexvo[0],
+                    'code' => $mLexvo[1],
+                    'type' => 'lxv'
+                ]);
+            } elseif($s instanceof Literal && strpos($s->getDatatypeUri(), config('corpusparole.olac_base_url')) === 0 ) {
+                array_push($res, [
+                    'uri' => $s->getValue(),
+                    'code' => $s->getValue(),
+                    'type' => 'olac'
+                ]);
+            } elseif($s instanceof Literal) {
+                array_push($res, [
+                    'uri' => $s->getValue(),
+                    'code' => $s->getValue(),
+                    'type' => 'txt'
+                ]);
+            }
+            return $res;
+        }, []);
+
+        $labelsBnf = $this->bnfResolver->getLabels(
+            array_unique(array_reduce(
+                $sres,
+                function($r, $so) {
+                    if($so['type'] === 'bnf') {
+                        array_push($r, $so['uri']);
+                    }
+                    return $r;
+                },[]
+            ))
+        );
+        $labelsLexvo = $this->lexvoResolver->getNames(
+            array_unique(array_reduce(
+                $sres,
+                function($r, $so) {
+                    if($so['type'] === 'lxv') {
+                        array_push($r, $so['uri']);
+                    }
+                    return $r;
+                },[]
+            ))
+        );
+
+        return array_map(function($so) use ($labelsBnf, $labelsLexvo) {
+            $label = $so['uri'];
+            if($so['type'] === 'bnf') {
+                $label = $labelsBnf[$label];
+            } elseif ($so['type'] === 'lxv') {
+                $label = $labelsLexvo[$label];
+            }
+            return [ 'label' => $label, 'code' => $so['code'], 'label_code' =>  $label."|".$so['type']."|".$so['code'] ]; }, $sres
+        );
+    }
+
+    private function graphResolvCoordinate($loc, $graph) {
+        $latLit = $graph->getLiteral($loc, "<http://www.w3.org/2003/01/geo/wgs84_pos#lat>");
+        if(is_null($latLit) || empty($latLit->getValue())) {
+            return null;
+        }
+        $lat = $latLit->getValue();
+
+        $longLit = $graph->getLiteral($loc, "<http://www.w3.org/2003/01/geo/wgs84_pos#long>");
+        if(is_null($longLit) || empty($longLit->getValue())) {
+            return null;
+        }
+        $long = $longLit->getValue();
+
+        return [ $lat, $long ];
+    }
+
+    private function loadGraph($url, $type) {
+        try {
+            $r = $this->httpClient->get($url);
+        } catch (TransferException $e) {
+            $this->error("loadGraph : Error Loading $url");
+            Log::error("loadGraph : Error Loading $url");
+            Log::error("loadGraph : Error request " . Psr7\str($e->getRequest()));
+            if ($e->hasResponse()) {
+                $this->error("loadGraph : Error response " . Psr7\str($e->getResponse()));
+                Log::error("loadGraph : Error response " . Psr7\str($e->getResponse()));
+            }
+            return null;
+        }
+        try {
+            $message = (string)$r->getBody();
+            $graph = new Graph($url, $message, $type);
+            return $graph;
+        } catch (EasyRdf\Exception $e) {
+            $this->error("loadGraph : Error parsing $url");
+            Log::error("loadGraph : Error parsing $url");
+            if($e instanceof EasyRdf\Parser\Exception) {
+                Log::error("loadGraph : Error exception line ".$e->getLine().", column: ".$e->getColumn());
+            }
+            $this->error("loadGraph : Error exception message ".$e->getMessage());
+            Log::error("loadGraph : Error exception message ".$e->getMessage());
+            Log::error("loadGraph : Error content $message");
+            return null;
+        }
+
+    }
+
+    private function geonamesResolveCoordinates($loc) {
+        $coords = cache("corpus.geonames.coord.$loc");
+        if(is_null($coords)) {
+            $graph = $this->loadGraph("{$loc}about.rdf", 'rdfxml');
+            $coords = is_null($graph)?null:$this->graphResolvCoordinate($loc, $graph);
+            cache(["corpus.geonames.coord.$loc" => is_null($coords)?false:$coords], Carbon::now()->addMinutes(20));
+        }
+        return ($coords===false)?null:$coords;
+    }
+
+    private function dbpediaResolveCoordinates($loc) {
+        $coords = cache("corpus.dbpedia.coord.$loc");
+        if(is_null($coords)) {
+            $graph = $this->loadGraph("$loc.rdf", 'rdfxml');
+            $coords = is_null($graph)?null:$this->graphResolvCoordinate($loc, $graph);
+            cache(["corpus.dbpedia.coord.$loc"=> is_null($coords)?false:$coords], Carbon::now()->addMinutes(20));
+        }
+        return ($coords===false)?null:$coords;
+    }
+
+    private function getLocation($doc) {
+
+        $geoRes = $doc->getGeoInfo();
+
+        if(is_null($geoRes)) {
+            return null;
+        }
+
+        $locUrls = [];
+        foreach($geoRes->getRefLocs() as $loc) {
+            if(preg_match(config('corpusparole.geonames_url_regexp'), $loc, $m) === 1) {
+
+                if(!array_key_exists('geonames', $locUrls)) {
+                    $locUrls['geonames'] = [];
+                }
+                array_push($locUrls['geonames'], "http://sws.geonames.org/$m[1]/");
+
+            } elseif(preg_match(config('corpusparole.dbpedia_url_regexp'), $loc, $md) === 1) {
+                if(!array_key_exists('dbpedia', $locUrls)) {
+                    $locUrls['dbpedia'] = [];
+                }
+                //$this->line("DBPEDIA MATCH $loc ".print_r($md,true));
+                array_push($locUrls['dbpedia'], "http://$md[1]/data/$md[4]");
+            }
+        }
+
+        $coordinates = null;
+        foreach($locUrls as $locType => $locList) {
+            foreach($locList as $locationUrl) {
+                $coordinates = call_user_func([$this, "${locType}ResolveCoordinates"], $locationUrl);
+                if(!is_null($coordinates)) {
+                    break;
+                }
+            }
+        }
+
+        if(is_null($coordinates)) {
+            $coordinates = [$geoRes->getLatitudeValue(), $geoRes->getLongitudeValue()];
+        }
+
+        if(empty($coordinates[0]) || empty($coordinates[1])) {
+            return null;
+        } else {
+            return [floatval($coordinates[0]), floatval($coordinates[1])];
+        }
+
+    }
+
+    private function getCreationDate($doc) {
+
+        $created = $doc->getCreated();
+        if(is_null($created)) {
+            return null;
+        }
+        $dateType = $created->getDatatypeUri();
+        $res = null;
+
+        if($dateType === "http://purl.org/dc/terms/Period") {
+            $res = $this->processPeriod($created->getValue());
+        }
+        elseif($dateType === "http://purl.org/dc/terms/W3CDTF") {
+            $res = $this->processDate($created->getValue());
+        }
+
+        return $res;
+
+    }
+
+    private function extractDate($dateStr) {
+        if(preg_match("/^\\d{4}$/", $dateStr) === 1) {
+            $dateStr = "$dateStr-1-1";
+        }
+        $date = date_create($dateStr);
+        if($date === false ) {
+            Log::warning("DateStatsController:extractYear bad format for date $dateStr");
+            return null;
+        }
+        return $date;
+    }
+
+    private function processPeriod($periodStr) {
+        $start = null;
+        $end = null;
+        foreach(explode(";", $periodStr) as $elem) {
+            $elem = trim($elem);
+            if(strpos($elem, 'start=') === 0) {
+                $startDate = $this->extractDate(trim(substr($elem, 6)));
+                if(is_null($startDate)) {
+                    return null;
+                }
+                $start = intval($startDate->format("Y"));
+                if($start === false) {
+                    return null;
+                }
+            } elseif(strpos($elem, 'end=') === 0) {
+                $endDate = $this->extractDate(trim(substr($elem, 4)));
+                if(is_null($endDate)) {
+                    return null;
+                }
+                $end = intval($endDate->format("Y"));
+                if($end === false) {
+                    return null;
+                }
+            }
+        }
+
+        if(is_null($start) || is_null($end) || $start>$end ) {
+            Log::warning("Bad format for $periodStr");
+            return null;
+        }
+
+        return array_map(function($y) {
+            return \DateTime::createFromFormat("Y", "$y")->format(\DateTime::W3C);
+        }, range($start, $end));
+    }
+
+    private function processDate($dateStr) {
+        $date = $this->extractDate($dateStr);
+        if(is_null($date))  {
+            return null;
+        } else {
+            return $date->format(\DateTime::W3C);
+        }
+    }
+
+    private function getDiscourseTypes($doc) {
+        return array_reduce($doc->getDiscourseTypes(), function($res, $d) {
+            $val = null;
+            if($d instanceof Resource) {
+                $val = $d->getUri();
+            } elseif($d instanceof Literal) {
+                $datatype = $d->getDatatypeURI();
+                $val = (!empty($datatype)?"$datatype#":"").$d->getValue();
+            }
+            if(!empty($val)) {
+                array_push($res,$val);
+            }
+            return $res;
+        }, []);
+    }
+
+    private function getDocBody($doc) {
+        return [
+            'title' => (string)$doc->getTitle(),
+            'date' => (string)$doc->getModified(),
+            'location' => $this->getLocation($doc),
+            'creation_date' => $this->getCreationDate($doc),
+            'language' => $doc->getLanguagesValue(),
+            'discourse_types' => $this->getDiscourseTypes($doc),
+            'geonames_hierarchy' => $this->getGeonamesHierarchy($doc),
+            'subject' => $this->getSubjects($doc),
+        ];
+    }
+
+    /**
      * Index one document into Elasticsearch
      *
      * @return int (1 if sucess, 0 if error)
      */
-    private function indexOne($resultDoc)
+    private function indexOne($docId, $docBody)
     {
-        $doc = $this->documentRepository->get($resultDoc->getId());
         $query_data = [
             'index' => config('elasticsearch.index'),
             'type' => 'document',
-            'id' => (string)$doc->getId(),
-            'body' => [
-                'title' => (string)$doc->getTitle(),
-                'date' => (string)$doc->getModified(),
-                'geonames_hierarchy' => $this->getGeonamesHierarchy($doc)
-            ]
+            'id' => $docId,
+            'body' => $docBody
         ];
         Es::index($query_data);
     }
@@ -178,21 +500,18 @@
      *
      * @return int (1 if sucess, 0 if error)
      */
-     private function indexBulk($docs)
+     private function indexBulk($docBodies)
      {
           $query_data = ['body' => []];
-          foreach($docs as $doc){
+          foreach($docBodies as $docId => $docBody){
               $query_data['body'][] = [
                   'index' => [
                       '_index' => config('elasticsearch.index'),
                       '_type' => 'document',
-                      '_id' => (string)$doc->getId()
+                      '_id' => $docId
                   ]
               ];
-              $query_data['body'][] = [
-                  'title' => (string)$doc->getTitle(),
-                  'date' => (string)$doc->getModified()
-              ];
+              $query_data['body'][] = $docBody;
           }
           Es::bulk($query_data);
      }
@@ -220,6 +539,12 @@
         $stepSize = $this->option('step-size');
         $this->comment(' - Indexing with step size of '.$stepSize);
 
+        if($this->option('reset-geo-cache', false)) {
+            // delete all rows in GeonamesHierarchy
+            GeonamesHierarchy::getQuery()->delete();
+            $this->comment('Geonames cache reset!');
+        }
+
         $this->info('Resetting index...');
         $success = $this->resetIndex();
         if($success==1){
@@ -231,49 +556,43 @@
 
         $this->info('Indexing documents...');
 
-        if ($limit<=0) {
-            $lastPage = $this->documentRepository->paginateAll($stepSize, 'page')->lastPage();
-            $total = $this->documentRepository->getCount();
-            $lastPageEntryCount = $stepSize+1;
-        }
-        else {
-            $lastPage = min((int)($limit/$stepSize)+1, $this->documentRepository->paginateAll($stepSize, 'page')->lastPage());
-            $total = $limit;
-            $lastPageEntryCount = $limit % $stepSize;
+        $limit = (int)$limit;
+        $total = $this->documentRepository->getCount();
+
+        if($limit>0) {
+            $total = min($limit, $total);
         }
 
-        if ($noBulk)
-        {
-            $progressBar = $this->output->createProgressBar($total);
-        }
-        else
-        {
-            $progressBar = $this->output->createProgressBar($lastPage);
-        }
+        $progressBar = $this->output->createProgressBar($total);
         $progressBar->setFormat(' %current%/%max% [%bar%] %percent:3s%% - %message%');
 
-        for ($page=1;$page<=$lastPage;$page++)
-        {
-            $docs = $this->documentRepository->paginateAll($stepSize, 'page', $page);
-            if ($noBulk)
-            {
-                foreach ($docs as $i=>$doc){
-                    if ($page==$lastPage && $i>=$lastPageEntryCount){
-                        break;
-                    }
-                    $this->indexOne($doc);
-                    $progressBar->advance();
-                    $progressBar->setMessage($doc->getId());
+        $page = 0;
+        $lastPage = PHP_INT_MAX;
+        $docIds = [];
+
+        while($page++<$lastPage) {
+            $docsPaginator = $this->documentRepository->paginate(null, $stepSize, config('corpusparole.pagination_page_param'), $page, "_graph");
+            $lastPage = $docsPaginator->lastPage();
+            $docsBodies = [];
+            foreach($docsPaginator as $docResult) {
+                $docId = (string)$docResult->getId();
+                $progressBar->setMessage($docId);
+                $progressBar->advance();
+                $doc = $this->documentRepository->get($docId);
+                $docBody = $this->getDocBody($doc);
+                if($noBulk) {
+                    $this->indexOne($docId, $docBody);
+                } else {
+                    $docsBodies[$docId] = $docBody;
                 }
+                $docIds[] = $docId;
             }
-            else
-            {
-                $this->indexBulk($docs);
-                $progressBar->advance();
-                $progressBar->setMessage('Page '.$page);
+            if(!$noBulk) {
+                $this->indexBulk($docsBodies);
             }
         }
         $progressBar->finish();
-        $this->info('Indexing completed');
+        $this->info("\nIndexing completed for " . count(array_unique($docIds))." documents (of ".count($docIds).").");
+
     }
 }
--- a/server/src/app/Console/Commands/ManageHandles.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Console/Commands/ManageHandles.php	Sun Oct 16 23:19:57 2016 +0530
@@ -109,7 +109,7 @@
 
         $total = $this->documentRepository->getCount();
 
-        $docs = $this->documentRepository->paginateAll($stepSize, 'page');
+        $docs = $this->documentRepository->paginate(null, $stepSize, config('corpusparole.pagination_page_param'), 1, '_graph');
 
         $progressBar = $this->output->createProgressBar($docs->total());
         $progressBar->setFormat(' %current%/%max% [%bar%] %percent:3s%% - %message%');
@@ -120,7 +120,7 @@
                 $progressBar->setMessage($doc->getId());
                 $progressBar->advance();
             }
-            $docs = ($docs->hasMorePages()? $this->documentRepository->paginateAll($stepSize, 'page', $docs->currentPage()+1):null);
+            $docs = ($docs->hasMorePages()? $this->documentRepository->paginate(null, $stepSize, config('corpusparole.pagination_page_param'), $docs->currentPage()+1, '_graph'):null);
         }
 
         $progressBar->finish();
@@ -128,7 +128,7 @@
 
         $this->info("Removing extra handles...\n");
 
-        $handles = $this->handleClient->paginateAll($this->handlePrefix, $stepSize, 'page');
+        $handles = $this->handleClient->paginateAll($this->handlePrefix, $stepSize, config('corpusparole.pagination_page_param'));
 
         $progressBar = $this->output->createProgressBar($handles->total());
         $progressBar->setFormat(' %current%/%max% [%bar%] %percent:3s%% - %message%');
@@ -141,7 +141,7 @@
                 $progressBar->setMessage($handle);
                 $progressBar->advance();
             }
-            $handles = $handles->hasMorePages()?$this->handleClient->paginateAll($this->handlePrefix, $stepSize, 'page', $handles->currentPage()+1):null;
+            $handles = $handles->hasMorePages()?$this->handleClient->paginateAll($this->handlePrefix, $stepSize, config('corpusparole.pagination_page_param'), $handles->currentPage()+1):null;
         }
 
         $this->info("\nRemoving extra handles completed");
--- a/server/src/app/Exceptions/Handler.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Exceptions/Handler.php	Sun Oct 16 23:19:57 2016 +0530
@@ -38,6 +38,19 @@
      */
     public function render($request, Exception $e)
     {
+        if ( $request->isXmlHttpRequest() || $request->wantsJson() ) {
+
+            $statusCode = 500;
+            if(is_callable([$e, 'getStatusCode'])) {
+                $statusCode = $e->getStatusCode();
+            }
+
+            return response()->json([
+                'code' => $statusCode,
+                'message' => class_basename( $e ) . ' in ' . basename( $e->getFile() ) . ' line ' . $e->getLine() . ( ( $message = $e->getMessage() ) ? ': ' . $e->getMessage() : '.' ),
+                'trace' => $e->getTrace()
+            ], $statusCode);
+        }
         return parent::render($request, $e);
     }
 }
--- a/server/src/app/Http/Controllers/Api/DocumentController.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Http/Controllers/Api/DocumentController.php	Sun Oct 16 23:19:57 2016 +0530
@@ -9,6 +9,7 @@
 use CorpusParole\Http\Controllers\Controller;
 use CorpusParole\Repositories\DocumentRepository;
 use CorpusParole\Services\TranscriptManager;
+use CorpusParole\Libraries\Filters\CorpusFilterManager;
 
 class DocumentController extends Controller
 {
@@ -25,17 +26,27 @@
      *
      * @return Response
      */
-    public function index()
+    public function index(Request $request)
     {
-        $paginator = $this->documentRepository->paginateAll();
+        $perPage = intval($request->input('perpage', config('corpusparole.documents_per_page')));
+
+        $filters = [];
+        $languages = $request->input('language', []);
+        if(!empty($languages)) {
+            $filters['language'] = CorpusFilterManager::prepareLanguages($languages);
+        }
+        $sort = $request->input('sort', null);
+
+        $paginator = $this->documentRepository->paginate($filters, $perPage, config('corpusparole.pagination_page_param'), null, $sort);
+
         $res = $paginator->toArray();
         if(array_key_exists('data', $res)) {
             $documents = $res['data'];
             unset($res['data']);
-            $res['documents'] = $documents;
-            //$res['documents'] = $this->documentRepository->resolveLexvo($documents);
+        } else {
+            $documents = [];
         }
-        return response()->json($res);
+        return response()->json([ 'documents' => $documents, 'meta' => $res]);
     }
 
     /**
@@ -67,7 +78,7 @@
      */
     public function show(Request $request, $id)
     {
-        $id= urldecode($id);
+        $id = urldecode($id);
         $short = filter_var($request->input('short', false), FILTER_VALIDATE_BOOLEAN);
         $doc = $this->documentRepository->get($id, $short);
         if(is_null($doc)) {
--- a/server/src/app/Http/Controllers/Api/GeoStatsController.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Http/Controllers/Api/GeoStatsController.php	Sun Oct 16 23:19:57 2016 +0530
@@ -7,6 +7,7 @@
 use CorpusParole\Http\Requests;
 use CorpusParole\Http\Controllers\Controller;
 use Es;
+use Log;
 
 class GeoStatsController extends Controller
 {
@@ -17,10 +18,22 @@
      */
     public function index(Request $request)
     {
+        $area = $request->input('area');
+        $filter = [
+            'match_all' => []
+        ];
+        if(!is_null($area) && $area !== config('corpusparole.geonames_earth_geonamesid')) {
+            $filter = [
+                'term' => [
+                    "geonames_hierarchy" => $area
+                ]
+            ];
+        }
         $query = [
             'index' => env('ELASTICSEARCH_INDEX'),
             'body' => [
                 "size" => 0,
+                "query" => $filter,
                 "aggs" => [
                     "geos" => [
                         "terms" => [
--- a/server/src/app/Http/Controllers/Api/LexvoController.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Http/Controllers/Api/LexvoController.php	Sun Oct 16 23:19:57 2016 +0530
@@ -8,6 +8,9 @@
 use CorpusParole\Services\LexvoResolverInterface;
 use CorpusParole\Services\LexvoResolverException;
 
+use CorpusParole\Libraries\Filters\CorpusFilterManager;
+use CorpusParole\Libraries\Utils;
+
 class LexvoController extends Controller
 {
     public function __construct(LexvoResolverInterface $lexvoResolver) {
@@ -23,7 +26,26 @@
     public function show($id)
     {
         try {
-            return response()->json(['lexvoids' => $this->lexvoResolver->getNames(explode(",", $id))]);
+            $ids = [];
+            $corpusIds = [];
+            foreach(explode(",", $id) as $idStr) {
+                if(Utils::startsWith($idStr, config('corpusparole.language_corpus_node_prefix'))) {
+                    $corpusIds[] = $idStr;
+                } else {
+                    $ids[] = $idStr;
+                }
+            }
+            $lexvosNames = $this->lexvoResolver->getNames($ids);
+            $corpusNames = array_reduce($corpusIds, function($res,$cid) {
+                $cNode = CorpusFilterManager::getLanguageNode($cid);
+                if(is_null($cNode)) {
+                    $res[$cid] = null;
+                } else {
+                    $res[$cid] = $cNode['name'];
+                }
+                return $res;
+            }, []);
+            return response()->json(['lexvoids' => array_merge($lexvosNames, $corpusNames)]);
         } catch (LexvoResolverException $e) {
             abort(500, $e->getMessage());
         }
--- a/server/src/app/Http/Controllers/Api/ThemeController.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Http/Controllers/Api/ThemeController.php	Sun Oct 16 23:19:57 2016 +0530
@@ -10,6 +10,9 @@
 use EasyRdf\Resource;
 use EasyRdf\Literal;
 
+use Es;
+use Log;
+
 use CorpusParole\Libraries\Sparql\SparqlClient;
 use CorpusParole\Services\LexvoResolverInterface;
 use CorpusParole\Services\BnfResolverInterface;
@@ -33,77 +36,93 @@
     public function index(Request $request)
     {
         $filter = $request->input('filter', 'bnf');
-        $resolve = filter_var($request->input('resolve', true), FILTER_VALIDATE_BOOLEAN);
-
-        $filterClause = "";
+        $index = $request->input('index', 0);
+        $limit = $request->input('limit', config('corpusparole.theme_default_limit'));
+        $sort = $request->input('sort', 'count');
 
         if($filter === 'bnf') {
-            $filterClause = "FILTER (isIRI(?o) && regex(str(?o), '^".config('corpusparole.bnf_ark_base_url')."')) .";
+            $include = ".*\\|bnf\\|.*";
+        }
+        elseif($filter === 'lexvo') {
+            $include = ".*\\|lxv\\|.*";
         }
-        elseif($filter === 'uri') {
-            $filterClause = "FILTER isIRI(?o) .";
+        elseif($filter === 'olac') {
+            $include = ".*\\|olac\\|.*";
         }
-        elseif($filter === 'all' || $filter === 'none' || $filter === '') {
-            $filterClause = "";
+        elseif($filter === 'txt') {
+            $include = ".*\\|txt\\|.*";
+        }
+        elseif($filter === 'all') {
+            $include = false;
         }
         else {
-            abort(401,"Value for filter parameter must be in 'bnf', 'uri', 'all' or 'none'");
+            abort(401,"Value for filter parameter must be in 'bnf', 'lexvo', 'olac', 'txt', 'all'");
+        }
+
+        if($sort == "count" || $sort == "descending") {
+            $order_field = "_count";
+            $order_dir = "desc";
+        } elseif($sort == "-count") {
+            $order_field = "_count";
+            $order_dir = "asc";
+        } elseif ($sort == "label" || $sort == "alphabetical") {
+            $order_field = "_term";
+            $order_dir = "asc";
+        } elseif ($sort == "-label") {
+            $order_field = "_term";
+            $order_dir = "desc";
+        } else {
+            $order_field = "_count";
+            $order_dir = "desc";
         }
 
-        $query =  preg_replace('/\s+/', ' ',
-         "select (?o as ?theme) (COUNT(?s) as ?count) where {
-            ?s a <http://www.europeana.eu/schemas/edm/ProvidedCHO> .
-            ?s <http://purl.org/dc/elements/1.1/subject> ?o .
-            $filterClause
-          }
-          GROUP BY ?o
-          ORDER BY DESC(?count)");
+        $query = [
+            'index' => env('ELASTICSEARCH_INDEX'),
+            'body' => [
+                'size' => 0,
+                'aggs' => [
+                    "subjects" => [
+                        "nested" => [ "path" => "subject" ],
+                        "aggs" => [
+                            "subjects" => [
+                                "terms" => [
+                                    "field" => "subject.label_code",
+                                    "size" => $limit * ($index+1),
+                                    "order" => [ $order_field => $order_dir ]
+                                ]
+                            ]
+                        ]
+                    ]
+                ]
+            ]
+        ];
 
-        $docs = $this->sparqlClient->query($query);
+        if($include) {
+            $query['body']['aggs']['subjects']['aggs']['subjects']['terms']['include'] = $include;
+        }
+
+        $esRes = Es::search($query);
 
         $themes = [];
-        $labels = [];
 
-        $bnfUris = [];
-        $lexvoUris = [];
-
-        foreach ($docs as $row) {
-            $key = "";
-            $label = null;
-            if($row->theme instanceof Resource) {
-                $key = $row->theme->getUri();
-                if($resolve && strpos($key, config('corpusparole.bnf_ark_base_url')) === 0) {
-                    array_push($bnfUris, $key);
-                }
-                elseif($resolve && strpos($key, config('corpusparole.lexvo_base_url')) === 0) {
-                    array_push($lexvoUris, $key);
-                }
-                $label = null;
-            }
-            elseif($row->theme instanceof Literal) {
-                $key = $row->theme->getValue();
-                $label = $row->theme->getValue();
-            }
-
-            $themes[$key] = [
-                "label" => $label,
-                "count" => $row->count->getValue()
-            ];
+        $bucketList = $esRes['aggregations']['subjects']['subjects']['buckets'];
+        if($limit > 0) {
+            $bucketList = array_slice($bucketList, $index*$limit, $limit);
         }
 
-        if($resolve) {
-            if(count($lexvoUris) > 0) {
-                $labels = $this->lexvoResolver->getNames($lexvoUris);
-            }
-            if(count($bnfUris) > 0) {
-                $labels = array_merge($labels, $this->bnfResolver->getLabels($bnfUris));
+        foreach($bucketList as $bucket) {
+            $parts = explode("|", $bucket['key']);
+            $label = $parts[0];
+            if($parts[1] === 'bnf' || $parts[1] === 'lxv') {
+                $url = ['bnf' => config('corpusparole.bnf_ark_base_url'), 'lxv' => config('corpusparole.lexvo_base_url')][$parts[1]].$parts[2];
             }
-            foreach ($themes as $themeKey => $themeDef) {
-                if(array_key_exists($themeKey, $labels)) {
-                    $themeDef['label'] = $labels[$themeKey];
-                }
-                $themes[$themeKey] = $themeDef;
+            else {
+                $url = $parts[2];
             }
+            $themes[$url] = [
+                "label" => $label,
+                "count" => $bucket['doc_count']
+            ];
         }
 
         return response()->json(['themes' => $themes ]);
--- a/server/src/app/Http/Controllers/Bo/DocumentListController.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Http/Controllers/Bo/DocumentListController.php	Sun Oct 16 23:19:57 2016 +0530
@@ -27,10 +27,12 @@
      * @return Response
      */
     public function index() {
-        $docs = $this->documentRepository->paginateAll();
+        $docs = $this->documentRepository->paginate();
         $languageIds = [];
         foreach ($docs as $doc) {
-            array_push($languageIds, $doc->getLanguageValue());
+            foreach($doc->getLanguagesValue() as $langId) {
+                array_push($languageIds, $langId);
+            }
         }
         $languageNames = $this->lexvoResolver->getNames(array_unique($languageIds));
         return view('bo.docList', ['docs' => $docs, 'languageNames' => $languageNames]);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/app/Libraries/Filters/CorpusFilterManager.php	Sun Oct 16 23:19:57 2016 +0530
@@ -0,0 +1,74 @@
+<?php
+namespace CorpusParole\Libraries\Filters;
+
+use Config;
+use CorpusParole\Libraries\Utils;
+
+class CorpusFilterManager {
+
+    public static function getLanguageNode($nodeId) {
+        $node = null;
+        $currentNodes = [config('corpusparole.languages_treemap'),];
+        while(is_null($node) || !empty($currentNodes)) {
+            $currentNode = array_pop($currentNodes);
+            foreach($currentNode['children'] as $n) {
+                if($n['id'] === $nodeId) {
+                    $node = $n;
+                    break;
+                } elseif (array_key_exists('children', $n)) {
+                    array_push($currentNodes, $n);
+                }
+            }
+        }
+        return $node;
+    }
+
+    private static function getLanguageNodeChildren($nodeId) {
+        $node = self::getLanguageNode($nodeId);
+        if(is_null($node)) {
+            return [];
+        } elseif (array_key_exists('values', $node)) {
+            return $node['values'];
+        } elseif (array_key_exists('children', $node)) {
+            return array_map(function($c) {
+                return $c['id'];
+            }, $node['children']);
+        } else {
+            return [];
+        }
+    }
+
+    public static function prepareLanguages($languages) {
+
+        $resLanguage = [];
+        if(is_string($languages)) {
+            $languages = [ $languages, ];
+        }
+        foreach($languages as $lang) {
+            if($lang == config('corpusparole.language_corpus_node_global')) {
+                // ignore global
+                continue;
+            }
+            else if(Utils::startsWith($lang, config('corpusparole.lexvo_base_url'))) {
+                array_push($resLanguage, $lang);
+            } elseif(Utils::startsWith($lang, config('corpusparole.language_corpus_node_prefix'))) {
+                $resLanguage = array_merge($resLanguage, self::prepareLanguages(self::getLanguageNodeChildren($lang)));
+            } else {
+                array_push($resLanguage, config('corpusparole.lexvo_base_url').$lang);
+            }
+        }
+
+        return array_unique($resLanguage);
+    }
+
+    public static function getLanguagesFilterPart($languages) {
+        return [
+            'bool' => [
+                'should' => [
+                    [ 'terms' => [ 'language' => $languages ]]
+                ]
+            ]
+        ];
+    }
+
+}
--- a/server/src/app/Libraries/Handle/HandleClient.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Libraries/Handle/HandleClient.php	Sun Oct 16 23:19:57 2016 +0530
@@ -224,7 +224,7 @@
 
         $params = [
             'prefix' => $prefix,
-            'page' => is_null($page)?0:$page-1,
+            config('corpusparole.pagination_page_param') => is_null($page)?0:$page-1,
             'pageSize' => $perPage
         ];
 
--- a/server/src/app/Libraries/Utils.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Libraries/Utils.php	Sun Oct 16 23:19:57 2016 +0530
@@ -134,4 +134,26 @@
         return new Graph($graph1->getUri(), $merged, 'php');
     }
 
+    /**
+     * From http://stackoverflow.com/a/834355
+     */
+    public static function startsWith($haystack, $needle)
+    {
+        $length = strlen($needle);
+        return (substr($haystack, 0, $length) === $needle);
+    }
+
+    /**
+     * From http://stackoverflow.com/a/834355
+     */
+    public static function endsWith($haystack, $needle)
+    {
+        $length = strlen($needle);
+        if ($length == 0) {
+            return true;
+        }
+
+        return (substr($haystack, -$length) === $needle);
+    }
+
 }
--- a/server/src/app/Models/DocumentBase.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Models/DocumentBase.php	Sun Oct 16 23:19:57 2016 +0530
@@ -26,10 +26,11 @@
     // memoization
     private $providedCHO = null;
     private $title = false;
-    private $lang = null;
-    private $langResolved = null;
-    private $issued = null;
-    private $modified = null;
+    private $langs = null;
+    private $langsResolved = null;
+    private $issued = false;
+    private $modified = false;
+    private $created = false;
 
 
     public function getProvidedCHO() {
@@ -42,10 +43,11 @@
     protected function clearMemoizationCache() {
         $this->providedCHO = null;
         $this->title = false;
-        $this->lang = null;
-        $this->langResolved = null;
-        $this->issued = null;
-        $this->modified = null;
+        $this->langs = null;
+        $this->langsResolved = null;
+        $this->issued = false;
+        $this->modified = false;
+        $this->created = false;
     }
 
     public function getId() {
@@ -63,36 +65,33 @@
         return $this->id;
     }
 
-    public function getLanguage() {
-        if(is_null($this->lang)) {
+    public function getLanguages() {
+        if(is_null($this->langs)) {
             try {
-                $langs = $this->getProvidedCHO()->all('<http://purl.org/dc/elements/1.1/language>');
-                if(count($langs) > 0) {
-                    $this->lang = $langs[0];
-                }
+                $this->langs = $this->getProvidedCHO()->all('<http://purl.org/dc/elements/1.1/language>');
             } catch(\Exception $e) {
-                $this->lang = null;
+                $this->langs = [];
             }
         }
-        return $this->lang;
+        return $this->langs;
     }
 
-    public function getLanguageValue() {
-        $lang = $this->getLanguage();
-        if($lang instanceof Resource) {
-            return $lang->getUri();
-        } else if($lang instanceof Literal) {
-            return $lang->getValue();
-        }
-        return null;
+    public function getLanguagesValue() {
+        return array_map(function($lang) {
+            if($lang instanceof Resource) {
+                return $lang->getUri();
+            } else if($lang instanceof Literal) {
+                return $lang->getValue();
+            }
+        }, $this->getLanguages());
     }
 
-    public function getLanguageResolved() {
-        return $this->langResolved;
+    public function getLanguagesResolved() {
+        return $this->langsResolved;
     }
 
-    public function setLanguageResolved($languageResolved) {
-        $this->langResolved = $languageResolved;
+    public function setLanguagesResolved($languagesResolved) {
+        $this->langsResolved = $languagseResolved;
     }
 
 
@@ -125,7 +124,7 @@
     }
 
     public function getIssued() {
-        if(is_null($this->issued)) {
+        if($this->issued === false) {
             try {
                 $this->issued = $this->getProvidedCHO()->getLiteral("<http://purl.org/dc/terms/issued>");
             } catch(\Exception $e) {
@@ -140,8 +139,19 @@
         return is_null($issued)?null:$issued->getValue();
     }
 
+    public function getCreated() {
+        if($this->created === false) {
+            try {
+                $this->created = $this->getProvidedCHO()->getLiteral("<http://purl.org/dc/terms/created>");
+            } catch(\Exception $e) {
+                $this->created = null;
+            }
+        }
+        return $this->created;
+    }
+
     public function getModified() {
-        if(is_null($this->modified)) {
+        if($this->modified === false) {
             try {
                 $this->modified = $this->getProvidedCHO()->getLiteral("<http://purl.org/dc/terms/modified>");
                 if(is_null($this->modified)) {
@@ -168,7 +178,7 @@
             $newModified = new Literal($value, null, "http://purl.org/dc/terms/W3CDTF");
             $this->setSimpleProperty($this->getProvidedCHO(), 'http://purl.org/dc/terms/modified', $modified, $newModified);
 
-            $this->modified = null;
+            $this->modified = false;
         }
     }
 
@@ -189,12 +199,12 @@
                 'id' => $this->getId(),
                 'uri' => $this->getUri(),
                 'title' => $this->getTitleValue(),
-                'language' => $this->getLanguageValue(),
+                'languages' => $this->getLanguagesValue(),
                 'modified' => $this->getModifiedValue(),
                 'issued' => $this->getIssuedValue()            ];
 
-            if($this->language_resolved) {
-                $res['language_resolved'] = $this->getLanguageResolved();
+            if($this->languagesResolved) {
+                $res['languages_resolved'] = $this->getLanguagesResolved();
             }
 
             return $res;
--- a/server/src/app/Models/DocumentResult.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Models/DocumentResult.php	Sun Oct 16 23:19:57 2016 +0530
@@ -85,8 +85,8 @@
 
         if($this->graph) {
             $res = array_merge($res, [
-                'publishers' => $this->getPublishersValue(),
-                'duration' => $this->getDurationValue(),
+                'publisher' => $this->getPublishersValue(),
+                'duration_ms' => $this->getDurationValue(),
                 'transcript_url' => $this->getTranscriptUrl()
             ]);
         }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/app/Providers/PaginationServiceProvider.php	Sun Oct 16 23:19:57 2016 +0530
@@ -0,0 +1,32 @@
+<?php
+
+namespace CorpusParole\Providers;
+
+use Illuminate\Support\ServiceProvider;
+use Illuminate\Pagination\PaginationServiceProvider as BasePaginationServiceProvider;
+use Illuminate\Pagination\Paginator;
+
+use Log;
+
+class PaginationServiceProvider extends BasePaginationServiceProvider
+{
+
+    /**
+     * Register the application services.
+     *
+     * @return void
+     */
+    public function register()
+    {
+        parent::register();
+        Paginator::currentPathResolver(function () {
+            $r = $this->app['request'];
+            $queryParams = $r->all();
+            unset($queryParams[config('corpusparole.pagination_page_param')]);
+
+            $question = $r->getBaseUrl().$r->getPathInfo() == '/' ? '/?' : '?';
+            return $r->url().$question.http_build_query($queryParams);
+        });
+
+    }
+}
--- a/server/src/app/Repositories/DocumentRepository.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Repositories/DocumentRepository.php	Sun Oct 16 23:19:57 2016 +0530
@@ -21,6 +21,17 @@
     public function paginateAll($perPage = 15, $pageName = 'page', $page = null);
 
     /**
+     * Paginate filtered document as a paginator.
+     *
+     * @param  array $filters
+     * @param  int  $perPage
+     * @param  string  $pageName
+     * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
+     */
+    public function paginate($filters = [], $perPage = 15, $pageName = 'page', $page = null, $sort = null);
+
+
+    /**
      * Resolve lexvo id for all documents in the list
      * this allow to optimise the call of lexvo repository
      */
--- a/server/src/app/Repositories/RdfDocumentRepository.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/app/Repositories/RdfDocumentRepository.php	Sun Oct 16 23:19:57 2016 +0530
@@ -9,6 +9,7 @@
 use CorpusParole\Libraries\CorpusParoleException;
 use CorpusParole\Libraries\Utils;
 use CorpusParole\Libraries\Sparql\SparqlClient;
+use CorpusParole\Libraries\Filters\CorpusFilterManager;
 
 
 use CorpusParole\Services\LexvoResolverInterface;
@@ -18,6 +19,8 @@
 use Illuminate\Pagination\LengthAwarePaginator;
 use Illuminate\Pagination\Paginator;
 
+use Es;
+
 /**
  * Implement the DocumentRepository using EasyRdf
  * TODO: certainly split the transaction management (+add, +delete +transaction ) to an external class -> for this extend the sparql client.
@@ -31,18 +34,19 @@
         "    ?title".
         "    ?issued".
         "    ?modified".
-        "    ?lang".
+        "    (group_concat(distinct ?language;separator=\", \") as ?lang) ".
         "    (group_concat(distinct ?publisher;separator=\", \") as ?publishers) ".
         "  WHERE {".
-        "  GRAPH ?uri { ?doc a <http://www.europeana.eu/schemas/edm/ProvidedCHO>.".
-        "    ?doc <http://purl.org/dc/elements/1.1/title> ?title.".
-        "    OPTIONAL {?doc <http://purl.org/dc/elements/1.1/language> ?lang.} ".
-        "    OPTIONAL {?doc <http://purl.org/dc/terms/issued> ?issued.} ".
-        "    OPTIONAL {?doc <http://purl.org/dc/terms/modified> ?modified.} ".
-        "    OPTIONAL {?doc <http://purl.org/dc/elements/1.1/publisher> ?publisher.} }".
+        "    GRAPH ?uri { ?doc a <http://www.europeana.eu/schemas/edm/ProvidedCHO>.".
+        "      ?doc <http://purl.org/dc/elements/1.1/title> ?title.".
+        "      OPTIONAL {?doc <http://purl.org/dc/elements/1.1/language> ?language.} ".
+        "      OPTIONAL {?doc <http://purl.org/dc/terms/issued> ?issued.} ".
+        "      OPTIONAL {?doc <http://purl.org/dc/terms/modified> ?modified.} ".
+        "      OPTIONAL {?doc <http://purl.org/dc/elements/1.1/publisher> ?publisher.}".
+        "    }. ".
+        "    %s".
         "  } ".
-        "  GROUP BY ?uri ?doc ?title ?issued ?modified ?lang ".
-        "  ORDER BY ?uri";
+        "  GROUP BY ?uri ?doc ?title ?issued ?modified ";
 
     const ADDITIONAL_DOC_QUERIES = [
         "SELECT".
@@ -102,7 +106,14 @@
             $newGraph->add($doc->doc, "http://purl.org/dc/elements/1.1/title", $doc->title);
         }
         if(isset($doc->lang)) {
-            $newGraph->add($doc->doc, "http://purl.org/dc/elements/1.1/language", $doc->lang);
+            foreach(explode(", ", $doc->lang) as $langStr) {
+                $langStr = trim($langStr);
+                if(filter_var($langStr, FILTER_VALIDATE_URL)) {
+                    $newGraph->addResource($doc->doc, "http://purl.org/dc/elements/1.1/language", $langStr);
+                } else {
+                    $newGraph->addLiteral($doc->doc, "http://purl.org/dc/elements/1.1/language", $langStr);
+                }
+            }
         }
         if(isset($doc->issued)) {
             $newGraph->add($doc->doc, "http://purl.org/dc/terms/issued", $doc->issued);
@@ -122,26 +133,105 @@
         return $newGraph;
     }
 
-    private function queryDocs($offset=null, $limit=null) {
+    private function queryES($filters=null, $offset=null, $limit=null, $sort=null) {
+
+        if(empty($sort)) {
+            $sort = ["_doc"];
+        } elseif (is_string($sort)) {
+            $sort = [$sort];
+        }
+        if(is_null($filters)) {
+            //$filters = ['language' => ["http://lexvo.org/id/iso639-3/oci", "http://lexvo.org/id/iso639-3/bre"]];
+            $filters = [];
+        }
+
+        $qFilterParts = [];
+
+        if(array_key_exists('language', $filters) && !empty($filters['language'])) {
+            $languages = $filters['language'];
+            if(is_string($languages)) {
+                $languages = [ $languages, ];
+            }
+            $qFilterParts[] = CorpusFilterManager::getLanguagesFilterPart($languages);
+        }
+
+        $query = [
+            'index' => config('corpusparole.elasticsearch_index'),
+            'body' => [
+                "size" => empty($limit)?0:$limit,
+                "from" => $offset,
+                "sort" => $sort
+            ]
+        ];
+
+        if(count($qFilterParts)>0) {
+            $query['body']['query'] = ['constant_score' => [
+                'filter' => [
+                    'bool' => [
+                        'must' => $qFilterParts
+                    ]
+                ]
+            ] ];
+        }
+
+        $esRes = Es::search($query);
+
+        return ['total' => $esRes['hits']['total'], 'documents' => array_map(function($r) {
+            return $r['_id'];
+        }, $esRes['hits']['hits'])];
+
+    }
+
+    /**
+     * Query docs.
+     * if $filter is empty or null and $sort is '_graph', the documents list is fetched from the triple store, otherwise, They are fetched from ElasticSearch
+     */
+    private function queryDocs($filters=null, $offset=null, $limit=null, $sort=null) {
 
         $resDocs = [];
+
         $limitsClauses = [];
+        $sortClauseStr = "";
         $limitsClausesStr = "";
+        $filterUris = "";
 
-        if(!is_null($offset)) {
-            array_push($limitsClauses, "OFFSET $offset");
-        }
-        if(!is_null($limit)) {
-            array_push($limitsClauses, "LIMIT $limit");
-        }
-        if(!empty($limitsClauses)) {
-            $limitsClausesStr = "\n" . join(" ", $limitsClauses);
+        if(empty($filters) && $sort === "_graph") {
+            if(!is_null($offset)) {
+                array_push($limitsClauses, "OFFSET $offset");
+            }
+            if(!is_null($limit)) {
+                array_push($limitsClauses, "LIMIT $limit");
+            }
+            if(!empty($limitsClauses)) {
+                $limitsClausesStr = "\n" . join(" ", $limitsClauses);
+            }
+            $sortClauseStr = "\n ORDER BY ?uri";
+            $total = $this->getCount();
+        } else {
+            $esRes = $this->queryES($filters, $offset, $limit);
+            // WARNING: we count on the fact that php keep keys order
+            $total = intval($esRes['total']);
+            foreach($esRes['documents'] as $esDocId) {
+                $uri = config('corpusparole.corpus_doc_id_base_uri_prefix').$esDocId;
+                $resDocs[$uri] = null;
+            }
+            if(count($resDocs) > 0) {
+                $filterUris = "FILTER(?uri in (<".join(">, <" , array_keys($resDocs)).">)) ";
+            } else {
+                return ['meta' => [ 'total'=> $total ], 'documents' => []];
+            }
+
         }
 
-        $docs = $this->sparqlClient->query(self::BASE_DOC_QUERY.$limitsClausesStr);
+
+        $sparqlQuery = sprintf(self::BASE_DOC_QUERY.$sortClauseStr.$limitsClausesStr, $filterUris);
+
+        $docs = $this->sparqlClient->query($sparqlQuery);
+
         foreach($docs as $doc) {
             $graph = $this->getResGraph($doc);
             if(is_null($graph)) {
+                Log::debug("NULL GRAPH - odd");
                 continue;
             }
             $uri = $doc->uri->getUri();
@@ -149,10 +239,12 @@
         }
 
         if(count($resDocs) == 0) {
-            return [];
+            return ['meta' => [ 'total'=> $total ], 'documents' => []];
         }
 
-        $filterUris = "FILTER(?uri in (<".join(">, <" , array_keys($resDocs)).">)) ";
+        if(empty($filterUris)) {
+            $filterUris = "FILTER(?uri in (<".join(">, <" , array_keys($resDocs)).">)) ";
+        }
 
         foreach(self::ADDITIONAL_DOC_QUERIES as $query) {
             $docs = $this->sparqlClient->query(sprintf($query, $filterUris));
@@ -171,11 +263,13 @@
             }
         }
 
-        return array_map(function($g) { return new DocumentResult($g->getUri(), $g); }, array_values($resDocs));
+        $documentsResults = array_map(function($g) { return new DocumentResult($g->getUri(), $g); }, array_values($resDocs));
+
+        return ['meta' => [ 'total'=> $total ], 'documents' => $documentsResults];
     }
 
     public function all() {
-        return $this->queryDocs();
+        return $this->queryDocs(null, null, null, "_graph")['documents'];
     }
 
     public function get($id, $short=false) {
@@ -233,10 +327,19 @@
         }
     }
 
-    public function getCount() {
-        $res = $this->sparqlClient->query("SELECT (COUNT (DISTINCT ?g) as ?count) WHERE { GRAPH ?g { ?s a <http://www.europeana.eu/schemas/edm/ProvidedCHO> } }");
-        assert(!is_null($res) && $res->count()==1);
-        return $res[0]->count->getValue();
+    public function getCount($filters=null) {
+        $count = 0;
+        if(empty($filters)) {
+            $res = $this->sparqlClient->query("SELECT (COUNT (DISTINCT ?g) as ?count) WHERE { GRAPH ?g { ?s a <http://www.europeana.eu/schemas/edm/ProvidedCHO> } }");
+            assert(!is_null($res) && count($res)==1);
+            $count = intval($res[0]->count->getValue());
+        } else {
+            $esRes = $this->queryES($filters, 0, 0);
+            $count = intval($esRes['hits']['total']);
+        }
+
+        return $count;
+
     }
 
     //SELECT ?g WHERE { GRAPH ?g { ?s ?p ?o } }
@@ -250,6 +353,19 @@
      */
     public function paginateAll($perPage = 15, $pageName = 'page', $page = null)
     {
+        return $this->paginate(null, $perPage, $pageName, null);
+    }
+
+    /**
+     * Paginate filtered document as a paginator.
+     *
+     * @param  array $filters
+     * @param  int  $perPage
+     * @param  string  $pageName
+     * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
+     */
+    public function paginate($filters = null, $perPage = 15, $pageName = 'page', $page = null, $sort=null) {
+
         assert(is_numeric($perPage));
 
         if(is_null($page)) {
@@ -258,18 +374,18 @@
 
         assert(is_null($page) || is_numeric($page));
 
-        $total = $this->getCount();
-
         $offset = max(0,($page - 1) * $perPage);
 
-        $results = $this->queryDocs($offset, $perPage);
+        $results = $this->queryDocs($filters, $offset, $perPage, $sort);
 
-        return new LengthAwarePaginator($results, $total, $perPage, $page, [
+        return new LengthAwarePaginator($results['documents'], $results['meta']['total'], $perPage, $page, [
             'path' => Paginator::resolveCurrentPath(),
             'pageName' => $pageName,
         ]);
+
     }
 
+
     /**
      * Resolve lexvo id for all documents in the list
      * this allow to optimise the call of lexvo repository
@@ -280,8 +396,10 @@
         $languageIds = [];
         #get the list pf language needing resolving
         foreach ($docList as $doc) {
-            if($doc->getLanguageValue() && is_null($doc->getLanguageResolved())) {
-                $languageIds[$doc->getLanguageValue()] = true;
+            if(!empty($doc->getLanguagesValue()) && is_null($doc->getLanguagesResolved())) {
+                foreach($doc->getLanguagesValue() as $lang) {
+                    $languageIds[$lang]=true;
+                }
             }
         }
 
@@ -289,8 +407,12 @@
         $langNames = $this->lexvoResolver->getNames(array_keys($languageIds));
 
         foreach ($docList as $doc) {
-            if($doc->getLanguageValue() && is_null($doc->getLanguageResolved())) {
-                $doc->setLanguageResolved($langNames[$doc->getLanguageValue()]);
+            if(!empty($doc->getLanguagesValue()) && is_null($doc->getLanguagesResolved())) {
+                $langResolved = [];
+                foreach($doc->getLanguagesValue() as $lang) {
+                    $langResolved[] = $langNames[$lang];
+                }
+                $doc->setLanguageResolved($langResolved);
             }
         }
 
--- a/server/src/config/app.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/config/app.php	Sun Oct 16 23:19:57 2016 +0530
@@ -125,7 +125,7 @@
         'Illuminate\Foundation\Providers\FoundationServiceProvider',
         'Illuminate\Hashing\HashServiceProvider',
         'Illuminate\Mail\MailServiceProvider',
-        'Illuminate\Pagination\PaginationServiceProvider',
+//        'Illuminate\Pagination\PaginationServiceProvider',
         'Illuminate\Pipeline\PipelineServiceProvider',
         'Illuminate\Queue\QueueServiceProvider',
         'Illuminate\Redis\RedisServiceProvider',
@@ -159,6 +159,7 @@
         'CorpusParole\Providers\BnfServiceProvider',
         'CorpusParole\Providers\GeonamesServiceProvider',
         'CorpusParole\Providers\VersionServiceProvider',
+        'CorpusParole\Providers\PaginationServiceProvider',
 
     ],
 
--- a/server/src/config/corpusparole.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/config/corpusparole.php	Sun Oct 16 23:19:57 2016 +0530
@@ -5,6 +5,12 @@
 $baseUrl = ($baseUrl && strlen($baseUrl)>0)?$baseUrl:"/";
 
 return [
+    'pagination_page_param' => 'page',
+
+    'documents_per_page' => 15,
+
+    'elasticsearch_index' => env('ELASTICSEARCH_INDEX'),
+
     'sesame_base_url' => $sesameBaseUrl,
     'sesame_repository' => env('CORPUSPAROLE_SESAME_REPOSITORY'),
     'sesame_repository_raw' => env('CORPUSPAROLE_SESAME_REPOSITORY_RAW'),
@@ -24,6 +30,7 @@
     'corpus_id_scheme' => env('HANDLE_PREFIX').'/',
     'corpus_id_prefix' => env('HANDLE_PREFIX').'/crdo-',
 
+    'corpus_doc_id_base_uri_prefix' => 'https://hdl.handle.net/',
     'corpus_doc_id_base_uri' => 'https://hdl.handle.net/'.env('HANDLE_PREFIX').'/',
     'corpus_doc_default_cc_rights' => 'http://creativecommons.org/licenses/by/4.0/',
 
@@ -54,6 +61,8 @@
         "http://ark.bnf.fr/ark:/12148/cb11949715t" => "réunions"
     ],
 
+    'olac_base_url' => 'http://www.language-archives.org/OLAC',
+
     'olac_discourse_type' => [
         'uri' => 'http://www.language-archives.org/OLAC/1.1/discourse-type',
         'values' => [
@@ -112,24 +121,31 @@
     'viaf_cache_expiration' => 60*24*30,
     'viaf_max_ids' => 500,
 
+    'theme_default_limit' => 40,
+
     'lexvo_base_url' => 'http://lexvo.org/id/iso639-3/',
+    'lexvo_url_regexp' => '/http[s]?\:\/\/lexvo\.org\/id\/iso639\-3\/([[:alpha:]]{3})\/?/',
     'lexvo_cache_expiration' => 60*24*30,
     'lexvo_max_ids' => 50,
     'lexvo_sesame_query_url' => $sesameBaseUrl.'repositories/'.env('CORPUSPAROLE_SESAME_LEXVO_REPOSITORY'),
 
     'bnf_base_url' => 'http://data.bnf.fr/',
     'bnf_ark_base_url' => 'http://ark.bnf.fr/',
+    'bnf_ark_url_regexp' => '/http[s]?\:\/\/(?:data|ark)\.bnf\.fr\/(ark\:\/12148\/[[:alnum:]]+)\/?/',
     'bnf_cache_expiration' => 60*24*30,
     'bnf_max_ids' => 5,
     'bnf_query_url' => 'http://data.bnf.fr/sparql',
     'bnf_completion_url' => 'http://data.bnf.fr/search-letter/',
 
+    'dbpedia_url_regexp' => '/^https?\:\/\/(([[:alpha:]]+\.)?dbpedia\.org)\/(resource|page)\/([^\/]+)\/?$/',
+
     'geonames_base_url' => 'http://sws.geonames.org/',
     'geonames_url_regexp' => '/http[s]?\:\/\/(?:sws|www)\.geonames\.org\/(\d+)\/?/',
     'geonames_cache_expiration' => 60*24*30,
     'geonames_max_ids' => 500,
     'geonames_hierarchy_webservice_url' => 'http://api.geonames.org/hierarchyJSON',
     'geonames_username' => env('GEONAMES_USERNAME'),
+    'geonames_earth_geonamesid' => '6295630',
 
     'bo_client_environment' => [
         "modulePrefix" => "bo-client",
@@ -181,6 +197,186 @@
     'transcrit_decoder_mapping' => [
         "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_archive" => 'CorpusParole\Libraries\Transcript\LacitoTranscriptConverter',
         "http://purl.org/poi/crdo.vjf.cnrs.fr/crdo-dtd_transcriber" => 'CorpusParole\Libraries\Transcript\TranscriberTranscriptConverter'
+    ],
+
+    "language_corpus_node_prefix" => 'corpus-',
+    "language_corpus_node_global" => 'corpus-global',
+
+    "languages_treemap" => [
+        'id' => 'corpus-global',
+        'name' => 'Global',
+        'children' => [ [
+            'id' => 'http://lexvo.org/id/iso639-3/fra',
+            'name' => 'Français'
+          ], [
+            'id' => 'http://lexvo.org/id/iso639-3/gsw',
+            'name' => 'Alsacien'
+          ], [
+            'id' => 'http://lexvo.org/id/iso639-3/bre',
+            'name' => 'Breton'
+          ], [
+            'id' => 'http://lexvo.org/id/iso639-3/oci',
+            'name' => 'Occitan',
+          ], [
+            'id' => 'http://lexvo.org/id/iso639-3/lad',
+            'name' => 'Judéo-espagnol'
+          ], [
+            'id' => 'http://lexvo.org/id/iso639-3/und',
+            'name' => 'Indéterminée',
+          ], [
+            'id' => 'corpus-regionals',
+            'name' => 'Langues régionales',
+            'children' => [ [
+                    'id' => 'corpus-oil',
+                    'name' => 'Langues d\'oïl',
+                    'values' => [ 'http://lexvo.org/id/iso639-3/pcd' ]
+                  ], [
+                    'id' => 'http://lexvo.org/id/iso639-3/frp',
+                    'name' => 'Francoprovençal'
+                  ], [
+                    'id' => 'http://lexvo.org/id/iso639-3/cos',
+                    'name' => 'Corse'
+                  ], [
+                    'id' => 'corpus-creoles',
+                    'name' => 'Les Créoles',
+                    'children' => [ [
+                        'id' => 'http://lexvo.org/id/iso639-3/rcf',
+                        'name' => 'Créole de la Réunion'
+                      ], [
+                        'id' => 'http://lexvo.org/id/iso639-3/gcf',
+                        'name' => 'Créole de la Guadeloupe'
+                      ]
+                    ]
+                ]
+            ]
+          ], [
+            'id' => 'corpus-non-territorials',
+            'name' => 'Langues non territoriales',
+            'children' => [ [
+                'id' => 'http://lexvo.org/id/iso639-3/fsl',
+                'name' => 'Langue des signes française (LSF)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/kab',
+                'name' => 'Berbère'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/ell',
+                'name' => 'Grec moderne'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/spa',
+                'name' => 'Espagnol'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/eng',
+                'name' => 'Anglais'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/ita',
+                'name' => 'Italien'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/deu',
+                'name' => 'Allemand'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/tur',
+                'name' => 'Turque'
+              ]
+            ]
+          ], [
+            'id' => 'corpus-guyane',
+            'name' => 'Guyane',
+            'children' => [ [
+                'id' => 'http://lexvo.org/id/iso639-3/gcf',
+                'name' => 'Ndyuka-Trio Pidgin (njt)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/plu',
+                'name' => 'Palikúr (plu)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/gcr',
+                'name' => 'Guianese Creole French (gcr)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/gcr',
+                'name' => 'Guianese Creole French (gcr)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/srn',
+                'name' => 'Sranan Tongo (srn)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/car',
+                'name' => 'kali\'na (car)'
+              ]
+            ]
+          ], [
+            'id' => 'corpus-mayotte',
+            'name' => 'Mayotte',
+            'children' => [ [
+                'id' => 'http://lexvo.org/id/iso639-3/swb',
+                'name' => 'Maore Comorian (swb)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/lsy',
+                'name' => 'Mauritian Sign Language (lsy)'
+              ]
+            ]
+          ], [
+            'id' => 'corpus-polynesia',
+            'name' => 'Polynésie française',
+            'children' => [ [
+                'id' => 'http://lexvo.org/id/iso639-3/uve',
+                'name' => 'West Uvean (uve)'
+              ]
+            ]
+          ], [
+            'id' => 'corpus-wallis-futuna',
+            'name' => 'Wallis et Futuna',
+            'children' => [ [
+                'id' => 'http://lexvo.org/id/iso639-3/fud',
+                'name' => 'LanEast Futuna (fud)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/wls',
+                'name' => 'Wallisian (wls)'
+              ]
+            ]
+          ], [
+            'id' => 'corpus-new-caledonia',
+            'name' => 'Nouvelle-Calédonie',
+            'children' => [ [
+                'id' => 'http://lexvo.org/id/iso639-3/wls',
+                'name' => 'Wallisian (wls)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/ane',
+                'name' => 'Xârâcùù (ane)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/cam',
+                'name' => 'Cemuhî (cam)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/axx',
+                'name' => 'Xaragure (axx)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/iai',
+                'name' => 'Iaai (iai)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/nee',
+                'name' => 'Nêlêmwa-Nixumwak (nee)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/dhv',
+                'name' => 'Dehu (dhv)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/nen',
+                'name' => 'Nengone (nen)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/aji',
+                'name' => 'Ajië (aji)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/kdk',
+                'name' => 'Numee (kdk)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/nem',
+                'name' => 'Nemi'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/nua',
+                'name' => 'Yuaga (nua)'
+              ], [
+                'id' => 'http://lexvo.org/id/iso639-3/bwa',
+                'name' => 'Bwatoo (bwa)'
+              ]
+            ]
+          ]
+        ]
     ]
 
 ];
--- a/server/src/gulpfile.js	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/gulpfile.js	Sun Oct 16 23:19:57 2016 +0530
@@ -45,8 +45,8 @@
         if(err) {
             return;
         }
-        gulp.src(['**/*','!vendor', '!vendor/**', '!node_modules', '!node_modules/**', '!.env', '!.git*'])
-            .pipe(gulp.dest('../../build/root/var/www/corpusdelaparole/corpus/'))
+        gulp.src(['**/*','!vendor', '!vendor/**', '!node_modules', /*'!public/corpus-app', '!public/corpus-app/**',*/ '!node_modules/**', '!.env', '!.git*'])
+            .pipe(gulp.dest('../../build/root/var/www/corpusdelaparole/corpus-back/'))
     });
 });
 
--- a/server/src/public/css/app.css	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/public/css/app.css	Sun Oct 16 23:19:57 2016 +0530
@@ -1,7 +1,7 @@
 @charset "UTF-8";
 /*!
- * Bootstrap v3.3.6 (http://getbootstrap.com)
- * Copyright 2011-2015 Twitter, Inc.
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  */
 /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
@@ -1072,7 +1072,6 @@
     color: #23527c;
     text-decoration: underline; }
   a:focus {
-    outline: thin dotted;
     outline: 5px auto -webkit-focus-ring-color;
     outline-offset: -2px; }
 
@@ -2284,7 +2283,6 @@
 input[type="file"]:focus,
 input[type="radio"]:focus,
 input[type="checkbox"]:focus {
-  outline: thin dotted;
   outline: 5px auto -webkit-focus-ring-color;
   outline-offset: -2px; }
 
@@ -2789,7 +2787,6 @@
   -ms-user-select: none;
   user-select: none; }
   .btn:focus, .btn.focus, .btn:active:focus, .btn:active.focus, .btn.active:focus, .btn.active.focus {
-    outline: thin dotted;
     outline: 5px auto -webkit-focus-ring-color;
     outline-offset: -2px; }
   .btn:hover, .btn:focus, .btn.focus {
@@ -4374,12 +4371,6 @@
   .alert-danger .alert-link {
     color: #843534; }
 
-@-webkit-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0; }
-  to {
-    background-position: 0 0; } }
-
 @keyframes progress-bar-stripes {
   from {
     background-position: 40px 0; }
@@ -4413,7 +4404,6 @@
 
 .progress.active .progress-bar,
 .progress-bar.active {
-  -webkit-animation: progress-bar-stripes 2s linear infinite;
   animation: progress-bar-stripes 2s linear infinite; }
 
 .progress-bar-success {
@@ -5027,12 +5017,9 @@
   -webkit-overflow-scrolling: touch;
   outline: 0; }
   .modal.fade .modal-dialog {
-    -webkit-transform: translate(0, -25%);
     transform: translate(0, -25%);
-    transition: -webkit-transform 0.3s ease-out;
     transition: transform 0.3s ease-out; }
   .modal.in .modal-dialog {
-    -webkit-transform: translate(0, 0);
     transform: translate(0, 0); }
 
 .modal-open .modal {
@@ -5375,22 +5362,16 @@
       line-height: 1; }
     @media all and (transform-3d), (-webkit-transform-3d) {
       .carousel-inner > .item {
-        transition: -webkit-transform 0.6s ease-in-out;
         transition: transform 0.6s ease-in-out;
-        -webkit-backface-visibility: hidden;
         backface-visibility: hidden;
-        -webkit-perspective: 1000px;
         perspective: 1000px; }
         .carousel-inner > .item.next, .carousel-inner > .item.active.right {
-          -webkit-transform: translate3d(100%, 0, 0);
           transform: translate3d(100%, 0, 0);
           left: 0; }
         .carousel-inner > .item.prev, .carousel-inner > .item.active.left {
-          -webkit-transform: translate3d(-100%, 0, 0);
           transform: translate3d(-100%, 0, 0);
           left: 0; }
         .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active {
-          -webkit-transform: translate3d(0, 0, 0);
           transform: translate3d(0, 0, 0);
           left: 0; } }
   .carousel-inner > .active,
--- a/server/src/resources/views/bo/docList.blade.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/resources/views/bo/docList.blade.php	Sun Oct 16 23:19:57 2016 +0530
@@ -19,7 +19,7 @@
                                     <a href="{{ route('bo.docs.client',[ 'id' => rawurlencode($doc->getId())]) }}#/doc/{{ rawurlencode($doc->getId()) }}">{{ $doc->getId() }}</a>
                                 </td>
                                 <td>{{ $doc->getTitle() }}</td>
-                                <td><a href="{{ $doc->getLanguageValue() }}" target="_blank" title="{{ $languageNames[$doc->getLanguageValue()]}}">{{substr($doc->getLanguageValue(), 29)}}</td>
+                                <td>@foreach ($doc->getLanguagesValue() as $lang)<a href="{{ $lang }}" target="_blank" title="{{ $languageNames[$lang]}}">{{substr($lang, 29)}}</a>@endforeach</td>
                                 <td>{{ $doc->getModified() }}</td>
                             </tr>
                         @endforeach
--- a/server/src/routes/api.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/routes/api.php	Sun Oct 16 23:19:57 2016 +0530
@@ -11,36 +11,26 @@
 */
 Route::group(['prefix' => 'v1'] , function() {
 
-    Route::group(['prefix' => 'documents'], function() {
-        Route::pattern('id', ".*");
-        Route::get('{id}/transcript', 'Api\DocumentController@transcript');
-        Route::resource('', 'Api\DocumentController',
-                        ['only' => ['index', 'show', 'update']]);
-    });
+    Route::pattern('id', ".*");
+    Route::get('documents/{id}/transcript', 'Api\DocumentController@transcript');
+    Route::resource('documents', 'Api\DocumentController', [
+            'only' => ['index', 'show', 'update']
+    ]);
 
 
     Route::group(['prefix' => 'resolvers'], function() {
-        Route::resource('viaf', 'Api\ViafController',
-                        ['only' => ['show']]);
-        Route::resource('lexvo', 'Api\LexvoController',
-                        ['only' => ['show']]);
-        Route::resource('bnf', 'Api\BnfController',
-                        ['only' => ['index','show']]);
-        Route::resource('geonames', 'Api\GeonamesController',
-                        ['only' => ['index','show']]);
+        Route::get('viaf/{id}', 'Api\ViafController@show');
+        Route::get('lexvo/{id}', 'Api\LexvoController@show');
+        Route::get('bnf/{id}', 'Api\BnfController@show');
+        Route::get('geonames/{id}', 'Api\GeonamesController@show');
     });
 
 
     Route::group(['prefix' => 'stats'], function() {
-        Route::resource('languages', 'Api\LanguageController',
-                        ['only' => ['index']]);
-        Route::resource('themes', 'Api\ThemeController',
-                        ['only' => ['index']]);
-        Route::resource('discourses', 'Api\DiscourseController',
-                        ['only' => ['index']]);
-        Route::resource('datestats', 'Api\DateStatsController',
-                        ['only' => ['index']]);
-        Route::resource('geostats', 'Api\GeoStatsController',
-                        ['only' => ['index']]);
+        Route::get('languages', 'Api\LanguageController@index');
+        Route::get('themes', 'Api\ThemeController@index');
+        Route::get('discourses', 'Api\DiscourseController@index');
+        Route::get('datestats', 'Api\DateStatsController@index');
+        Route::get('geostats', 'Api\GeoStatsController@index');
     });
 });
--- a/server/src/tests/Controllers/DiscourseControllerTest.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/tests/Controllers/DiscourseControllerTest.php	Sun Oct 16 23:19:57 2016 +0530
@@ -29,10 +29,10 @@
 
     public function testIndexQuery() {
 
-        $query = preg_replace('/\s+/', ' ', "select (?o as ?res) (COUNT(?s) as ?count) where {
+        $query = preg_replace('/\s+/', ' ', "SELECT (?o AS ?res) (COUNT(?s) AS ?count) WHERE {
             ?s a <http://www.europeana.eu/schemas/edm/ProvidedCHO>.
             ?s <http://purl.org/dc/elements/1.1/type> ?o.
-            filter(uri(?o) in (<".implode('>,<', array_keys(config('corpusparole.corpus_discourse_type'))).">))
+            FILTER(uri(?o) in (<".implode('>,<', array_keys(config('corpusparole.corpus_discourse_type'))).">))
         }
         GROUP BY ?o
         ORDER BY DESC(?count)");
--- a/server/src/tests/Controllers/DocumentListControllerTest.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/tests/Controllers/DocumentListControllerTest.php	Sun Oct 16 23:19:57 2016 +0530
@@ -104,12 +104,12 @@
 
     public function testIndex() {
         $this->documentRepository
-            ->shouldReceive('paginateAll')
+            ->shouldReceive('paginate')
             ->once()
             ->andReturn(
                 new LengthAwarePaginator([], 0, 10, 1, [
                     'path' => '',
-                    'pageName' => 'page',
+                    'pageName' => config('corpusparole.pagination_page_param'),
                 ]));
 
         $response = $this->call('GET', '/bo/docs');
--- a/server/src/tests/Controllers/GeoStatsControllerTest.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/tests/Controllers/GeoStatsControllerTest.php	Sun Oct 16 23:19:57 2016 +0530
@@ -1,7 +1,5 @@
 <?php
 
-use Es;
-
 class GeoStatsControllerTest extends TestCase
 {
    public function testGetIndex()
@@ -10,6 +8,9 @@
             'index' => env('ELASTICSEARCH_INDEX'),
             'body' => [
                 "size" => 0,
+                "query" => [
+                    'match_all' => []
+                ],
                 "aggs" => [
                     "geos" => [
                         "terms" => [
@@ -62,4 +63,105 @@
             '3027939' => 851
         ]]);
     }
+
+
+    public function testGetIndexEarth()
+    {
+        $query = [
+            'index' => env('ELASTICSEARCH_INDEX'),
+            'body' => [
+                "size" => 0,
+                "query" => [
+                    'match_all' => []
+                ],
+                "aggs" => [
+                    "geos" => [
+                        "terms" => [
+                            "size" => 0,
+                            "field" => "geonames_hierarchy"
+                        ]
+                    ]
+                ]
+            ]
+        ];
+
+        Es::shouldReceive('search')
+                ->once()
+                ->with($query)
+                ->andReturn(json_decode("{
+  \"took\" : 17,
+  \"timed_out\" : false,
+  \"_shards\" : {
+    \"total\" : 1,
+    \"successful\" : 1,
+    \"failed\" : 0
+  },
+  \"hits\" : {
+    \"total\" : 3011,
+    \"max_score\" : 0.0,
+    \"hits\" : [ ]
+  },
+  \"aggregations\" : {
+    \"geos\" : {
+      \"doc_count_error_upper_bound\" : 0,
+      \"sum_other_doc_count\" : 0,
+      \"buckets\" : []
+    }
+  }
+}", true));
+
+        $this->get('/api/v1/stats/geostats/?area='.config('corpusparole.geonames_earth_geonamesid'))->assertTrue($this->response->isOk(), $this->response->content());
+    }
+
+
+    public function testGetIndexArea()
+    {
+        $query = [
+            'index' => env('ELASTICSEARCH_INDEX'),
+            'body' => [
+                "size" => 0,
+                "query" => [
+                    'term' => [
+                        "geonames_hierarchy" => "code_area"
+                    ]
+                ],
+                "aggs" => [
+                    "geos" => [
+                        "terms" => [
+                            "size" => 0,
+                            "field" => "geonames_hierarchy"
+                        ]
+                    ]
+                ]
+            ]
+        ];
+
+        Es::shouldReceive('search')
+                ->once()
+                ->with($query)
+                ->andReturn(json_decode("{
+  \"took\" : 17,
+  \"timed_out\" : false,
+  \"_shards\" : {
+    \"total\" : 1,
+    \"successful\" : 1,
+    \"failed\" : 0
+  },
+  \"hits\" : {
+    \"total\" : 3011,
+    \"max_score\" : 0.0,
+    \"hits\" : [ ]
+  },
+  \"aggregations\" : {
+    \"geos\" : {
+      \"doc_count_error_upper_bound\" : 0,
+      \"sum_other_doc_count\" : 0,
+      \"buckets\" : []
+    }
+  }
+}", true));
+
+        $this->get('/api/v1/stats/geostats/?area=code_area')->assertTrue($this->response->isOk(), $this->response->content());
+    }
+
 }
--- a/server/src/tests/Controllers/ThemeControllerTest.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/tests/Controllers/ThemeControllerTest.php	Sun Oct 16 23:19:57 2016 +0530
@@ -10,16 +10,10 @@
  */
 class ThemeControllerTest extends TestCase {
 
-    private $sparqlClient;
-
     public function setUp() {
 
         parent::setup();
 
-        // create a mock of the post repository interface and inject it into the
-        // IoC container
-        $this->sparqlClient = m::mock('CorpusParole\Libraries\Sparql\SparqlClient');
-        $this->app->instance('CorpusParole\Libraries\Sparql\SparqlClient', $this->sparqlClient);
     }
 
     public function tearDown() {
@@ -27,130 +21,602 @@
         parent::tearDown();
     }
 
-    public function testIndexQuery() {
+    public function testIndex() {
+
+        $query = [
+            'index' => env('ELASTICSEARCH_INDEX'),
+            'body' => [
+                'size' => 0,
+                'aggs' => [
+                    "subjects" => [
+                        "nested" => [ "path" => "subject" ],
+                        "aggs" => [
+                            "subjects" => [
+                                "terms" => [
+                                    "field" => "subject.label_code",
+                                    "size" => config('corpusparole.theme_default_limit'),
+                                    "order" => [ '_count' => 'desc' ],
+                                    "include" => ".*\|bnf\|.*"
+                                ]
+                            ]
+                        ]
+                    ]
+                ]
+            ]
+        ];
 
-        $query = preg_replace('/\s+/', ' ', "select (?o as ?theme) (COUNT(?s) as ?count) where {
-                    ?s a <http://www.europeana.eu/schemas/edm/ProvidedCHO> .
-                    ?s <http://purl.org/dc/elements/1.1/subject> ?o .
-                    FILTER (isIRI(?o) && regex(str(?o), '^".config('corpusparole.bnf_ark_base_url')."')) .
-                }
-                GROUP BY ?o
-                ORDER BY DESC(?count)");
+        Es::shouldReceive('search')
+            ->once()
+            ->with($query)
+            ->andReturn([
+                "took" => 27,
+                "timed_out" => false,
+                "_shards" => [
+                    "total" => 1,
+                    "successful" => 1,
+                    "failed" => 0
+                ],
+                "hits" => [
+                    "total" => 3011,
+                    "max_score" => 0.0,
+                    "hits" => [ ]
+                ],
+                "aggregations" => [
+                    "subjects" => [
+                        "doc_count" => 41524,
+                        "subjects" => [
+                            "doc_count_error_upper_bound" => 0,
+                            "sum_other_doc_count" => 13678,
+                            "buckets" => [ [
+                                "key" => "professions|bnf|ark:/12148/cb13318415c",
+                                "doc_count" => 1412
+                            ], [
+                                "key" => "travail non rémunéré|bnf|ark:/12148/cb16604691s",
+                                "doc_count" => 1092
+                            ], [
+                                "key" => "famille|bnf|ark:/12148/cb119339867",
+                                "doc_count" => 1050
+                            ], [
+                                "key" => "oiseaux|bnf|ark:/12148/cb11932889r",
+                                "doc_count" => 1003
+                            ], [
+                                "key" => "météorologie|bnf|ark:/12148/cb11932496x",
+                                "doc_count" => 1001
+                            ], [
+                                "key" => "plantes|bnf|ark:/12148/cb11933145f",
+                                "doc_count" => 995
+                            ], [
+                                "key" => "animaux sauvages|bnf|ark:/12148/cb11930908q",
+                                "doc_count" => 989
+                            ], [
+                                "key" => "arbres|bnf|ark:/12148/cb11934786x",
+                                "doc_count" => 989
+                            ] ]
+                        ]
+                    ]
+                ]
+            ]);
+        $this->get('/api/v1/stats/themes/')->assertTrue($this->response->isOk(), $this->response->content());
+        $this->seeJsonEquals(["themes" => [
+            "http://ark.bnf.fr/ark:/12148/cb13318415c" => ['label' => 'professions', 'count' => 1412 ],
+            "http://ark.bnf.fr/ark:/12148/cb16604691s" => ['label' => 'travail non rémunéré', 'count' => 1092 ],
+            "http://ark.bnf.fr/ark:/12148/cb119339867" => ['label' => 'famille', 'count' => 1050 ],
+            "http://ark.bnf.fr/ark:/12148/cb11932889r" => ['label' => 'oiseaux', 'count' => 1003 ],
+            "http://ark.bnf.fr/ark:/12148/cb11932496x" => ['label' => 'météorologie', 'count' => 1001 ],
+            "http://ark.bnf.fr/ark:/12148/cb11933145f" => ['label' => 'plantes', 'count' => 995  ],
+            "http://ark.bnf.fr/ark:/12148/cb11930908q" => ['label' => 'animaux sauvages', 'count' => 989 ],
+            "http://ark.bnf.fr/ark:/12148/cb11934786x" => ['label' => 'arbres', 'count' => 989 ]
+        ]]);
 
-        $this->sparqlClient
-            ->shouldReceive('query')
-            ->with($query)
-            ->once()
-            ->andReturn(new \ArrayIterator([]));
-        $this->get('/api/v1/stats/themes/');
     }
 
-    public function testIndexQueryBnf() {
+    public function testIndexAll() {
+
+        $query = [
+            'index' => env('ELASTICSEARCH_INDEX'),
+            'body' => [
+                'size' => 0,
+                'aggs' => [
+                    "subjects" => [
+                        "nested" => [ "path" => "subject" ],
+                        "aggs" => [
+                            "subjects" => [
+                                "terms" => [
+                                    "field" => "subject.label_code",
+                                    "size" => config('corpusparole.theme_default_limit'),
+                                    "order" => [ '_count' => 'desc' ]
+                                ]
+                            ]
+                        ]
+                    ]
+                ]
+            ]
+        ];
 
-        $query = preg_replace('/\s+/', ' ', "select (?o as ?theme) (COUNT(?s) as ?count) where {
-                    ?s a <http://www.europeana.eu/schemas/edm/ProvidedCHO> .
-                    ?s <http://purl.org/dc/elements/1.1/subject> ?o .
-                    FILTER (isIRI(?o) && regex(str(?o), '^".config('corpusparole.bnf_ark_base_url')."')) .
-                }
-                GROUP BY ?o
-                ORDER BY DESC(?count)");
+        Es::shouldReceive('search')
+            ->once()
+            ->with($query)
+            ->andReturn([
+                "took" => 27,
+                "timed_out" => false,
+                "_shards" => [
+                    "total" => 1,
+                    "successful" => 1,
+                    "failed" => 0
+                ],
+                "hits" => [
+                    "total" => 3011,
+                    "max_score" => 0.0,
+                    "hits" => [ ]
+                ],
+                "aggregations" => [
+                    "subjects" => [
+                        "doc_count" => 41524,
+                        "subjects" => [
+                            "doc_count_error_upper_bound" => 0,
+                            "sum_other_doc_count" => 13678,
+                            "buckets" => [ [
+                                "key" => "professions|bnf|ark:/12148/cb13318415c",
+                                "doc_count" => 1412
+                            ], [
+                                "key" => "travail non rémunéré|bnf|ark:/12148/cb16604691s",
+                                "doc_count" => 1092
+                            ], [
+                                "key" => "famille|bnf|ark:/12148/cb119339867",
+                                "doc_count" => 1050
+                            ], [
+                                "key" => "oiseaux|bnf|ark:/12148/cb11932889r",
+                                "doc_count" => 1003
+                            ], [
+                                "key" => "Français|lxv|fra",
+                                "doc_count" => 1002
+                            ], [
+                                "key" => "météorologie|bnf|ark:/12148/cb11932496x",
+                                "doc_count" => 1001
+                            ], [
+                                "key" => "plantes|bnf|ark:/12148/cb11933145f",
+                                "doc_count" => 995
+                            ], [
+                                "key" => "Breton|lxv|bzh",
+                                "doc_count" => 992
+                            ], [
+                                "key" => "animaux sauvages|bnf|ark:/12148/cb11930908q",
+                                "doc_count" => 989
+                            ], [
+                                "key" => "arbres|bnf|ark:/12148/cb11934786x",
+                                "doc_count" => 989
+                            ] ]
+                        ]
+                    ]
+                ]
+            ]);
+        $this->get('/api/v1/stats/themes/?filter=all')->assertTrue($this->response->isOk(), $this->response->content());
+        $this->seeJsonEquals(["themes" => [
+            "http://ark.bnf.fr/ark:/12148/cb13318415c" => ['label' => 'professions', 'count' => 1412 ],
+            "http://ark.bnf.fr/ark:/12148/cb16604691s" => ['label' => 'travail non rémunéré', 'count' => 1092 ],
+            "http://ark.bnf.fr/ark:/12148/cb119339867" => ['label' => 'famille', 'count' => 1050 ],
+            "http://ark.bnf.fr/ark:/12148/cb11932889r" => ['label' => 'oiseaux', 'count' => 1003 ],
+            "http://lexvo.org/id/iso639-3/fra" => ['label' => 'Français', 'count' => 1002 ],
+            "http://ark.bnf.fr/ark:/12148/cb11932496x" => ['label' => 'météorologie', 'count' => 1001 ],
+            "http://ark.bnf.fr/ark:/12148/cb11933145f" => ['label' => 'plantes', 'count' => 995  ],
+            "http://lexvo.org/id/iso639-3/bzh" => ['label' => 'Breton', 'count' => 992 ],
+            "http://ark.bnf.fr/ark:/12148/cb11930908q" => ['label' => 'animaux sauvages', 'count' => 989 ],
+            "http://ark.bnf.fr/ark:/12148/cb11934786x" => ['label' => 'arbres', 'count' => 989 ]
+        ]]);
 
-        $this->sparqlClient
-            ->shouldReceive('query')
-            ->with($query)
-            ->once()
-            ->andReturn(new \ArrayIterator([]));
-        $this->get('/api/v1/stats/themes/?filter=bnf');
     }
 
+    public function testIndexLexvo() {
 
-    public function testIndexQueryAll() {
+        $query = [
+            'index' => env('ELASTICSEARCH_INDEX'),
+            'body' => [
+                'size' => 0,
+                'aggs' => [
+                    "subjects" => [
+                        "nested" => [ "path" => "subject" ],
+                        "aggs" => [
+                            "subjects" => [
+                                "terms" => [
+                                    "field" => "subject.label_code",
+                                    "size" => config('corpusparole.theme_default_limit'),
+                                    "order" => [ '_count' => 'desc' ],
+                                    "include" => ".*\|lxv\|.*"
+                                ]
+                            ]
+                        ]
+                    ]
+                ]
+            ]
+        ];
+
+        Es::shouldReceive('search')
+            ->once()
+            ->with($query)
+            ->andReturn([
+                "took" => 27,
+                "timed_out" => false,
+                "_shards" => [
+                    "total" => 1,
+                    "successful" => 1,
+                    "failed" => 0
+                ],
+                "hits" => [
+                    "total" => 3011,
+                    "max_score" => 0.0,
+                    "hits" => [ ]
+                ],
+                "aggregations" => [
+                    "subjects" => [
+                        "doc_count" => 41524,
+                        "subjects" => [
+                            "doc_count_error_upper_bound" => 0,
+                            "sum_other_doc_count" => 13678,
+                            "buckets" => [ [
+                                "key" => "Français|lxv|fra",
+                                "doc_count" => 1002
+                            ], [
+                                "key" => "Breton|lxv|bzh",
+                                "doc_count" => 992
+                            ] ]
+                        ]
+                    ]
+                ]
+            ]);
+        $this->get('/api/v1/stats/themes/?filter=lexvo')->assertTrue($this->response->isOk(), $this->response->content());
+        $this->seeJsonEquals(["themes" => [
+            "http://lexvo.org/id/iso639-3/fra" => ['label' => 'Français', 'count' => 1002 ],
+            "http://lexvo.org/id/iso639-3/bzh" => ['label' => 'Breton', 'count' => 992 ]
+        ]]);
+
+    }
 
-        $query = preg_replace('/\s+/', ' ', "select (?o as ?theme) (COUNT(?s) as ?count) where {
-                    ?s a <http://www.europeana.eu/schemas/edm/ProvidedCHO> .
-                    ?s <http://purl.org/dc/elements/1.1/subject> ?o .
-                }
-                GROUP BY ?o
-                ORDER BY DESC(?count)");
+    private function getOrderQuery($order) {
+        return [
+            'index' => env('ELASTICSEARCH_INDEX'),
+            'body' => [
+                'size' => 0,
+                'aggs' => [
+                    "subjects" => [
+                        "nested" => [ "path" => "subject" ],
+                        "aggs" => [
+                            "subjects" => [
+                                "terms" => [
+                                    "field" => "subject.label_code",
+                                    "size" => config('corpusparole.theme_default_limit'),
+                                    "order" => $order,
+                                    "include" => ".*\|bnf\|.*"
+                                ]
+                            ]
+                        ]
+                    ]
+                ]
+            ]
+        ];
+
+    }
 
-        $this->sparqlClient
-            ->shouldReceive('query')
-            ->with($query)
+    private function getRespSort() {
+        return [
+            "took" => 27,
+            "timed_out" => false,
+            "_shards" => [
+                "total" => 1,
+                "successful" => 1,
+                "failed" => 0
+            ],
+            "hits" => [
+                "total" => 3011,
+                "max_score" => 0.0,
+                "hits" => [ ]
+            ],
+            "aggregations" => [
+                "subjects" => [
+                    "doc_count" => 41524,
+                    "subjects" => [
+                        "doc_count_error_upper_bound" => 0,
+                        "sum_other_doc_count" => 13678,
+                        "buckets" => [  ]
+                    ]
+                ]
+            ]
+        ];
+    }
+
+    public function testIndexSort() {
+
+        Es::shouldReceive('search')
             ->once()
-            ->andReturn(new \ArrayIterator([]));
-        $this->get('/api/v1/stats/themes/?filter=all');
+            ->with($this->getOrderQuery(['_count' => 'desc']))
+            ->andReturn($this->getRespSort());
+        $this->get('/api/v1/stats/themes/')->assertTrue($this->response->isOk(), $this->response->content());
+
+    }
+
+    public function testIndexSortReverseCount() {
+        Es::shouldReceive('search')
+            ->once()
+            ->with($this->getOrderQuery(['_count' => 'asc']))
+            ->andReturn($this->getRespSort());
+        $this->get('/api/v1/stats/themes/?sort=-count')->assertTrue($this->response->isOk(), $this->response->content());
+    }
+
+    public function testIndexSortLabel() {
+        Es::shouldReceive('search')
+            ->once()
+            ->with($this->getOrderQuery(['_term' => 'asc']))
+            ->andReturn($this->getRespSort());
+        $this->get('/api/v1/stats/themes/?sort=label')->assertTrue($this->response->isOk(), $this->response->content());
+    }
+
+    public function testIndexSortAlphabetical() {
+        Es::shouldReceive('search')
+            ->once()
+            ->with($this->getOrderQuery(['_term' => 'asc']))
+            ->andReturn($this->getRespSort());
+        $this->get('/api/v1/stats/themes/?sort=alphabetical')->assertTrue($this->response->isOk(), $this->response->content());
+    }
+
+    public function testIndexSortLabelReverse() {
+        Es::shouldReceive('search')
+            ->once()
+            ->with($this->getOrderQuery(['_term' => 'desc']))
+            ->andReturn($this->getRespSort());
+        $this->get('/api/v1/stats/themes/?sort=-label')->assertTrue($this->response->isOk(), $this->response->content());
     }
 
 
-    public function testIndexQueryNone() {
+    public function testIndexLimit() {
 
-        $query = preg_replace('/\s+/', ' ', "select (?o as ?theme) (COUNT(?s) as ?count) where {
-                    ?s a <http://www.europeana.eu/schemas/edm/ProvidedCHO> .
-                    ?s <http://purl.org/dc/elements/1.1/subject> ?o .
-                }
-                GROUP BY ?o
-                ORDER BY DESC(?count)");
-
-        $this->sparqlClient
-            ->shouldReceive('query')
-            ->with($query)
-            ->once()
-            ->andReturn(new \ArrayIterator([]));
-        $this->get('/api/v1/stats/themes/?filter=none');
-    }
+        $query = [
+            'index' => env('ELASTICSEARCH_INDEX'),
+            'body' => [
+                'size' => 0,
+                'aggs' => [
+                    "subjects" => [
+                        "nested" => [ "path" => "subject" ],
+                        "aggs" => [
+                            "subjects" => [
+                                "terms" => [
+                                    "field" => "subject.label_code",
+                                    "size" => 3,
+                                    "order" => [ '_count' => 'desc' ],
+                                    "include" => ".*\|bnf\|.*"
+                                ]
+                            ]
+                        ]
+                    ]
+                ]
+            ]
+        ];
 
-
-    public function testIndexQueryEmpty() {
+        // This is not normally what should be received, but we test that the limit is respected
+        Es::shouldReceive('search')
+            ->once()
+            ->with($query)
+            ->andReturn([
+                "took" => 27,
+                "timed_out" => false,
+                "_shards" => [
+                    "total" => 1,
+                    "successful" => 1,
+                    "failed" => 0
+                ],
+                "hits" => [
+                    "total" => 3011,
+                    "max_score" => 0.0,
+                    "hits" => [ ]
+                ],
+                "aggregations" => [
+                    "subjects" => [
+                        "doc_count" => 41524,
+                        "subjects" => [
+                            "doc_count_error_upper_bound" => 0,
+                            "sum_other_doc_count" => 13678,
+                            "buckets" => [ [
+                                "key" => "professions|bnf|ark:/12148/cb13318415c",
+                                "doc_count" => 1412
+                            ], [
+                                "key" => "travail non rémunéré|bnf|ark:/12148/cb16604691s",
+                                "doc_count" => 1092
+                            ], [
+                                "key" => "famille|bnf|ark:/12148/cb119339867",
+                                "doc_count" => 1050
+                            ], [
+                                "key" => "oiseaux|bnf|ark:/12148/cb11932889r",
+                                "doc_count" => 1003
+                            ], [
+                                "key" => "météorologie|bnf|ark:/12148/cb11932496x",
+                                "doc_count" => 1001
+                            ], [
+                                "key" => "plantes|bnf|ark:/12148/cb11933145f",
+                                "doc_count" => 995
+                            ], [
+                                "key" => "animaux sauvages|bnf|ark:/12148/cb11930908q",
+                                "doc_count" => 989
+                            ], [
+                                "key" => "arbres|bnf|ark:/12148/cb11934786x",
+                                "doc_count" => 989
+                            ] ]
+                        ]
+                    ]
+                ]
+            ]);
+        $this->get('/api/v1/stats/themes/?limit=3')->assertTrue($this->response->isOk(), $this->response->content());
+        $this->seeJsonEquals(["themes" => [
+            "http://ark.bnf.fr/ark:/12148/cb13318415c" => ['label' => 'professions', 'count' => 1412 ],
+            "http://ark.bnf.fr/ark:/12148/cb16604691s" => ['label' => 'travail non rémunéré', 'count' => 1092 ],
+            "http://ark.bnf.fr/ark:/12148/cb119339867" => ['label' => 'famille', 'count' => 1050 ]
+        ]]);
 
-        $query = preg_replace('/\s+/', ' ', "select (?o as ?theme) (COUNT(?s) as ?count) where {
-                ?s a <http://www.europeana.eu/schemas/edm/ProvidedCHO> .
-                ?s <http://purl.org/dc/elements/1.1/subject> ?o .
-            }
-            GROUP BY ?o
-            ORDER BY DESC(?count)");
-
-        $this->sparqlClient
-            ->shouldReceive('query')
-            ->with($query)
-            ->once()
-            ->andReturn(new \ArrayIterator([]));
-        $this->get('/api/v1/stats/themes/?filter=');
     }
 
-    public function testIndexQueryUri() {
+    public function testIndexIndex() {
+
+        $query = [
+            'index' => env('ELASTICSEARCH_INDEX'),
+            'body' => [
+                'size' => 0,
+                'aggs' => [
+                    "subjects" => [
+                        "nested" => [ "path" => "subject" ],
+                        "aggs" => [
+                            "subjects" => [
+                                "terms" => [
+                                    "field" => "subject.label_code",
+                                    "size" => 6,
+                                    "order" => [ '_count' => 'desc' ],
+                                    "include" => ".*\|bnf\|.*"
+                                ]
+                            ]
+                        ]
+                    ]
+                ]
+            ]
+        ];
 
-        $query = preg_replace('/\s+/', ' ', "select (?o as ?theme) (COUNT(?s) as ?count) where {
-                ?s a <http://www.europeana.eu/schemas/edm/ProvidedCHO> .
-                ?s <http://purl.org/dc/elements/1.1/subject> ?o .
-                FILTER isIRI(?o) .
-            }
-            GROUP BY ?o
-            ORDER BY DESC(?count)");
+        // This is not normally what should be received, but we test that the limit is respected
+        Es::shouldReceive('search')
+            ->once()
+            ->with($query)
+            ->andReturn([
+                "took" => 27,
+                "timed_out" => false,
+                "_shards" => [
+                    "total" => 1,
+                    "successful" => 1,
+                    "failed" => 0
+                ],
+                "hits" => [
+                    "total" => 3011,
+                    "max_score" => 0.0,
+                    "hits" => [ ]
+                ],
+                "aggregations" => [
+                    "subjects" => [
+                        "doc_count" => 41524,
+                        "subjects" => [
+                            "doc_count_error_upper_bound" => 0,
+                            "sum_other_doc_count" => 13678,
+                            "buckets" => [ [
+                                "key" => "professions|bnf|ark:/12148/cb13318415c",
+                                "doc_count" => 1412
+                            ], [
+                                "key" => "travail non rémunéré|bnf|ark:/12148/cb16604691s",
+                                "doc_count" => 1092
+                            ], [
+                                "key" => "famille|bnf|ark:/12148/cb119339867",
+                                "doc_count" => 1050
+                            ], [
+                                "key" => "oiseaux|bnf|ark:/12148/cb11932889r",
+                                "doc_count" => 1003
+                            ], [
+                                "key" => "météorologie|bnf|ark:/12148/cb11932496x",
+                                "doc_count" => 1001
+                            ], [
+                                "key" => "plantes|bnf|ark:/12148/cb11933145f",
+                                "doc_count" => 995
+                            ], [
+                                "key" => "animaux sauvages|bnf|ark:/12148/cb11930908q",
+                                "doc_count" => 989
+                            ], [
+                                "key" => "arbres|bnf|ark:/12148/cb11934786x",
+                                "doc_count" => 989
+                            ] ]
+                        ]
+                    ]
+                ]
+            ]);
+        $this->get('/api/v1/stats/themes/?limit=3&index=1')->assertTrue($this->response->isOk(), $this->response->content());
+        $this->seeJsonEquals(["themes" => [
+            "http://ark.bnf.fr/ark:/12148/cb11932889r" => ['label' => 'oiseaux', 'count' => 1003 ],
+            "http://ark.bnf.fr/ark:/12148/cb11932496x" => ['label' => 'météorologie', 'count' => 1001 ],
+            "http://ark.bnf.fr/ark:/12148/cb11933145f" => ['label' => 'plantes', 'count' => 995  ]
+        ]]);
 
-        $this->sparqlClient
-            ->shouldReceive('query')
-            ->with($query)
-            ->once()
-            ->andReturn(new \ArrayIterator([]));
-        $this->get('/api/v1/stats/themes/?filter=uri');
     }
 
-
-    public function testIndex() {
+    public function testIndexLimitIndex2() {
 
-        $this->sparqlClient
-            ->shouldReceive('query')
+        $query = [
+            'index' => env('ELASTICSEARCH_INDEX'),
+            'body' => [
+                'size' => 0,
+                'aggs' => [
+                    "subjects" => [
+                        "nested" => [ "path" => "subject" ],
+                        "aggs" => [
+                            "subjects" => [
+                                "terms" => [
+                                    "field" => "subject.label_code",
+                                    "size" => 9,
+                                    "order" => [ '_count' => 'desc' ],
+                                    "include" => ".*\|bnf\|.*"
+                                ]
+                            ]
+                        ]
+                    ]
+                ]
+            ]
+        ];
+
+        // This is not normally what should be received, but we test that the limit is respected
+        Es::shouldReceive('search')
             ->once()
-            ->andReturn(new \ArrayIterator([
-                (object)['theme'=>new Resource('http://lexvo.org/id/iso639-3/gsw'), 'count' => Literal::create(44)],
-                (object)['theme'=>new Resource('http://ark.bnf.fr/ark:/12148/cb119339867'), 'count' => Literal::create(33)],
-                (object)['theme'=>Literal::create('Français', 'fr'), 'count' => Literal::create(22)],
-            ]));
-        $this->get('/api/v1/stats/themes/')->assertTrue($this->response->isOk(), $this->response->content());
+            ->with($query)
+            ->andReturn([
+                "took" => 27,
+                "timed_out" => false,
+                "_shards" => [
+                    "total" => 1,
+                    "successful" => 1,
+                    "failed" => 0
+                ],
+                "hits" => [
+                    "total" => 3011,
+                    "max_score" => 0.0,
+                    "hits" => [ ]
+                ],
+                "aggregations" => [
+                    "subjects" => [
+                        "doc_count" => 41524,
+                        "subjects" => [
+                            "doc_count_error_upper_bound" => 0,
+                            "sum_other_doc_count" => 13678,
+                            "buckets" => [ [
+                                "key" => "professions|bnf|ark:/12148/cb13318415c",
+                                "doc_count" => 1412
+                            ], [
+                                "key" => "travail non rémunéré|bnf|ark:/12148/cb16604691s",
+                                "doc_count" => 1092
+                            ], [
+                                "key" => "famille|bnf|ark:/12148/cb119339867",
+                                "doc_count" => 1050
+                            ], [
+                                "key" => "oiseaux|bnf|ark:/12148/cb11932889r",
+                                "doc_count" => 1003
+                            ], [
+                                "key" => "météorologie|bnf|ark:/12148/cb11932496x",
+                                "doc_count" => 1001
+                            ], [
+                                "key" => "plantes|bnf|ark:/12148/cb11933145f",
+                                "doc_count" => 995
+                            ], [
+                                "key" => "animaux sauvages|bnf|ark:/12148/cb11930908q",
+                                "doc_count" => 989
+                            ], [
+                                "key" => "arbres|bnf|ark:/12148/cb11934786x",
+                                "doc_count" => 989
+                            ] ]
+                        ]
+                    ]
+                ]
+            ]);
+        $this->get('/api/v1/stats/themes/?limit=3&index=2')->assertTrue($this->response->isOk(), $this->response->content());
         $this->seeJsonEquals(["themes" => [
-            "http://lexvo.org/id/iso639-3/gsw" => ["label" => "alémanique", "count" => 44],
-            "http://ark.bnf.fr/ark:/12148/cb119339867" => ["label" => "famille", "count" => 33],
-            "Français" => ["label" => "Français", "count" => 22],
+            "http://ark.bnf.fr/ark:/12148/cb11930908q" => ['label' => 'animaux sauvages', 'count' => 989 ],
+            "http://ark.bnf.fr/ark:/12148/cb11934786x" => ['label' => 'arbres', 'count' => 989 ]
         ]]);
     }
+
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/src/tests/Libraries/Filters/CorpusFilterManagerTest.php	Sun Oct 16 23:19:57 2016 +0530
@@ -0,0 +1,73 @@
+<?php
+
+use CorpusParole\Libraries\Filters\CorpusFilterManager;
+
+class CorpusFilterManagerTest extends TestCase
+{
+    /**
+     * test prepare languages noop
+     *
+     * @return void
+     */
+    public function testPrepareLanguagesNoOp()
+    {
+        $languagesInput = ['http://lexvo.org/id/iso639-3/fra', 'http://lexvo.org/id/iso639-3/gsw', 'http://lexvo.org/id/iso639-3/bre', 'http://lexvo.org/id/iso639-3/oci'];
+        $languagesOutput = CorpusFilterManager::prepareLanguages($languagesInput);
+        $this->assertEquals($languagesOutput, $languagesInput);
+    }
+
+    /**
+     * test prepare languages addPrefix
+     *
+     * @return void
+     */
+    public function testPrepareLanguagesAddPrefix()
+    {
+        $languagesInput = ['fra', 'gsw', 'bre', 'oci'];
+        $languagesOutput = CorpusFilterManager::prepareLanguages($languagesInput);
+        $this->assertEquals($languagesOutput, ['http://lexvo.org/id/iso639-3/fra', 'http://lexvo.org/id/iso639-3/gsw', 'http://lexvo.org/id/iso639-3/bre', 'http://lexvo.org/id/iso639-3/oci']);
+    }
+
+    /**
+     * test prepare languages mix
+     *
+     * @return void
+     */
+    public function testPrepareLanguagesMix()
+    {
+        $languagesInput = ['fra', 'http://lexvo.org/id/iso639-3/gsw', 'bre', 'http://lexvo.org/id/iso639-3/oci'];
+        $languagesOutput = CorpusFilterManager::prepareLanguages($languagesInput);
+        $this->assertEquals($languagesOutput, ['http://lexvo.org/id/iso639-3/fra', 'http://lexvo.org/id/iso639-3/gsw', 'http://lexvo.org/id/iso639-3/bre', 'http://lexvo.org/id/iso639-3/oci']);
+    }
+
+    /**
+     * test prepare languages recursion simple
+     *
+     * @return void
+     */
+    public function testPrepareLanguagesRecusionSimple()
+    {
+        $languagesInput = ['http://lexvo.org/id/iso639-3/fra', 'http://lexvo.org/id/iso639-3/gsw', 'http://lexvo.org/id/iso639-3/bre', 'corpus-oil'];
+        $languagesOutput = CorpusFilterManager::prepareLanguages($languagesInput);
+        $this->assertEquals($languagesOutput, ['http://lexvo.org/id/iso639-3/fra', 'http://lexvo.org/id/iso639-3/gsw', 'http://lexvo.org/id/iso639-3/bre', 'http://lexvo.org/id/iso639-3/pcd']);
+    }
+
+    /**
+     * test prepare languages recursion simple
+     *
+     * @return void
+     */
+    public function testPrepareLanguagesRecusionComplex()
+    {
+        $languagesInput = ['fra', 'http://lexvo.org/id/iso639-3/gsw', 'corpus-oil', 'corpus-regional'];
+        $languagesOutput = CorpusFilterManager::prepareLanguages($languagesInput);
+        sort($languagesOutput);
+        $languagesExpected = ['http://lexvo.org/id/iso639-3/fra', 'http://lexvo.org/id/iso639-3/gsw', 'http://lexvo.org/id/iso639-3/pcd',
+             'http://lexvo.org/id/iso639-3/frp', 'http://lexvo.org/id/iso639-3/cos', 'http://lexvo.org/id/iso639-3/rcf',
+             'http://lexvo.org/id/iso639-3/gcf'];
+        sort($languagesExpected);
+        $this->assertEquals($languagesOutput, $languagesExpected);
+    }
+
+
+}
--- a/server/src/tests/Libraries/Handle/HandleClientTest.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/tests/Libraries/Handle/HandleClientTest.php	Sun Oct 16 23:19:57 2016 +0530
@@ -344,7 +344,7 @@
 
         $handleClient = new HandleClient($this->certTmpPath, null, "300:11280.101/CORPUS_ADMIN", "172.16.1.6", 8000, $this->httpClient);
 
-        $pagination = $handleClient->paginateAll('11280.101', 5, 'page', 2);
+        $pagination = $handleClient->paginateAll('11280.101', 5, config('corpusparole.pagination_page_param'), 2);
 
         $this->assertNotNull($pagination);
 
@@ -388,7 +388,7 @@
 
         $handleClient = new HandleClient($this->certTmpPath, null, "300:11280.101/CORPUS_ADMIN", "172.16.1.6", 8000, $this->httpClient);
 
-        $pagination = $handleClient->paginateAll('11280.101', 5, 'page', 3);
+        $pagination = $handleClient->paginateAll('11280.101', 5, config('corpusparole.pagination_page_param'), 3);
 
         $this->assertNotNull($pagination);
 
--- a/server/src/tests/Models/DocumentTest.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/tests/Models/DocumentTest.php	Sun Oct 16 23:19:57 2016 +0530
@@ -428,7 +428,7 @@
 
         $this->assertTrue(is_array($json), 'Returned json must be an array');
         $this->assertEquals(
-            ["id", "uri", "title", "language", "modified", "issued", "publishers", "contributors", "subjects", "transcript", "mediaArray", "geoInfo"],
+            ["id", "uri", "title", "languages", "modified", "issued", "publishers", "contributors", "subjects", "transcript", "mediaArray", "geoInfo"],
             array_keys($json)
         );
         $this->assertEquals(sprintf('%1$s/crdo-CFPP2000_35_SOUNDid', config('corpusparole.handle_prefix')), $json['id']);
--- a/server/src/tests/Repositories/DocumentRepositoryIntegrationTest.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/tests/Repositories/DocumentRepositoryIntegrationTest.php	Sun Oct 16 23:19:57 2016 +0530
@@ -62,7 +62,7 @@
     public function testAll() {
         $expectedId = $this->corpusDocIdBaseUri.'crdo-ALA_738';
         $docList = $this->documentRepository->all();
-        $this->assertCount(2, $docList, "Should have one element");
+        $this->assertCount(2, $docList, "Should have 2 element");
 
         $resDoc = $docList[0];
 
--- a/server/src/tests/Repositories/DocumentRepositoryTest.php	Sun Oct 16 22:23:31 2016 +0530
+++ b/server/src/tests/Repositories/DocumentRepositoryTest.php	Sun Oct 16 23:19:57 2016 +0530
@@ -99,9 +99,14 @@
                 $mock->title = new EasyRdf\Literal("Atlas Linguistique et ethnographique de l'Alsace - Enquetes sur la conscience linguistique - ALA_738", null, "fr");
             }),
         ];
+        $countArray = [
+            m::mock('resObj', function($mock) {
+                $mock->count = new EasyRdf\Literal(1, "http://www.w3.org/2001/XMLSchema#integer", null);
+            }),
+        ];
 
         $sparqlClientMock = m::mock('CorpusParole\Libraries\Sparql\SparqlClient');
-        $sparqlClientMock->shouldReceive('query')->andReturn($returnedArray);
+        $sparqlClientMock->shouldReceive('query')->andReturn($countArray, $returnedArray);
 
         $documentRepository = $this->app->make('CorpusParole\Repositories\RdfDocumentRepository', [$sparqlClientMock]);