diff --git a/API.md b/API.md
index 4ac21b79..ce6586b2 100644
--- a/API.md
+++ b/API.md
@@ -86,8 +86,8 @@ build_playlist() | | Rebuild playlist. Shoul
add_plane(plane, title, data) | boolean | Create an annotation plane (¹)(²)(³)
remove_plane(plane) | boolean | Remove an annotation plane (¹)(²)
add_point(plane, timecode, point, data) | boolean | Add an annotation point to a plane at a timecode (¹)(²)(⁴)
-get_point(plane, point) | object | Return data for a point
-edit_point(plane, point, data) | | Modify data for a point. Only existing keys from get_point() are updated
+get_point(plane, point) | object | Return data for a point (³)
+edit_point(plane, point, data) | | Modify data for a point (³). Only existing keys from get_point() are updated
remove_point(plane, point) | boolean | Remove an annotation point (¹)(²)
clear_plane(plane) | | Remove any points from an annotation plane (¹)(²)
redraw_all_planes() | | Redraw any annotation planes and points
diff --git a/dist/cpu-audio.js b/dist/cpu-audio.js
index 113125ea..245fd108 100644
--- a/dist/cpu-audio.js
+++ b/dist/cpu-audio.js
@@ -10,10 +10,10 @@ License GNU GPL 3
- use case : http://cpu.pm
- blog post : https://dascritch.net/post/2018/11/06/Reconstruire-son-lecteur-audio-pour-le-web
*/
-'use strict';let e,h;const k=(document._currentScript||document.currentScript).ownerDocument,p="poster actions timeline chapters panels panels-title panels-except-play".split(" "),q=/^[a-zA-Z0-9\-_]+$/,r=/^([a-zA-Z0-9\-_]+_\u00ab)([a-zA-Z0-9\-_]+)((\u00bb_.*_\u00ab)([a-zA-Z0-9\-_]+))?(\u00bb)$/,t={opentag:/<(\w+)(\.[^>]+)?( [^>]+)?>/gi,closetag:/<\/(\w+)( [^>]*)?>/gi,br:/\n/g},u={passive:!0};const v={fr:{loading:"Chargement en cours\u2026",pause:"Pause",play:"Lecture",canonical:"Lien vers la fiche du sonore",moment:"Lien vers ce moment",untitled:"(sans titre)",cover:"pochette",more:"Actions",share:"Partager",twitter:"Partager sur Twitter",facebook:"Partager sur Facebook",e_mail:"Partager par e-mail",download:"T\u00e9l\u00e9charger",back:"Annuler",chapters:"Chapitres",playlist:"Playlist",media_err_aborted:"Vous avez annul\u00e9 la lecture.",media_err_network:"Une erreur r\u00e9seau a caus\u00e9 l'interruption du t\u00e9l\u00e9chargement.",
+'use strict';let e,h;const k=(document._currentScript||document.currentScript).ownerDocument,p="poster actions timeline chapters panels panels-title panels-except-play".split(" "),q=/^[a-zA-Z0-9\-_]+$/,r=/^([a-zA-Z0-9\-_]+_\u00ab)([a-zA-Z0-9\-_]+)((\u00bb_.*_\u00ab)([a-zA-Z0-9\-_]+))?(\u00bb)$/,t={opentag:/<(\w+)(\.[^>]+)?( [^>]+)?>/gi,closetag:/<\/(\w+)( [^>]*)?>/gi,br:/\n/g},v={passive:!0};const w={fr:{loading:"Chargement en cours\u2026",pause:"Pause",play:"Lecture",canonical:"Lien vers la fiche du sonore",moment:"Lien vers ce moment",untitled:"(sans titre)",cover:"pochette",more:"Actions",share:"Partager",twitter:"Partager sur Twitter",facebook:"Partager sur Facebook",e_mail:"Partager par e-mail",download:"T\u00e9l\u00e9charger",back:"Annuler",chapters:"Chapitres",playlist:"Playlist",media_err_aborted:"Vous avez annul\u00e9 la lecture.",media_err_network:"Une erreur r\u00e9seau a caus\u00e9 l'interruption du t\u00e9l\u00e9chargement.",
media_err_decode:"La lecture du sonore a \u00e9t\u00e9 annul\u00e9e suite \u00e0 des probl\u00e8mes de corruption ou de fonctionnalit\u00e9s non support\u00e9s par votre navigateur.",media_err_src_not_supported:"Le sonore n'a pu \u00eatre charg\u00e9, soit \u00e0 cause de sourcis sur le serveur, le r\u00e9seau ou parce que le format n'est pas support\u00e9.",media_err_unknow:"Erreur due \u00e0 une raison inconnue."},en:{loading:"Loading\u2026",pause:"Pause",play:"Play",canonical:"Link to the sound's page",
moment:"Link to this time",untitled:"(untitled)",cover:"cover",more:"Actions",share:"Share",twitter:"Share on Twitter",facebook:"Share on Facebook",e_mail:"Share via e-mail",download:"Download",back:"Back",chapters:"Chapters",playlist:"Playlist",media_err_aborted:"You have aborted the play.",media_err_network:"A network error broke the download.",media_err_decode:"Play was canceled due to file corruption or a not supported function in your browser.",media_err_src_not_supported:"The media cannot be downloaded due to server problems, network problems or unsupported by your browser.",
-media_err_unknow:"Error of unknown cause."}};let x=document.querySelector("html").lang;if(!(x.length&&x.toLowerCase()in v)){x="en";let a=window.navigator.languages;a=void 0!==a?a:[navigator.language||navigator.browserLanguage];for(let b of a)if(b.split){let c=b.split("-")[0];c in v&&(x=c)}}const y=v[x];function z(){var a=document.createElement("style");a.innerHTML=' audio[controls] { display : block; width : 100%; } :root { --cpu-height : 64px; --cpu-font-family : Lato, "Open Sans", "Segoe UI", Frutiger, "Frutiger Linotype", "Dejavu Sans", "Helvetica Neue", Arial, sans-serif; --cpu-font-size : 15px; --cpu-font-small-size : calc(var(--cpu-font-size) * 0.8); --cpu-background : #555; --cpu-color : #ddd; --cpu-playing-background : #444; --cpu-playing-color : #fff; --cpu-error-background : #a00 ; --cpu-error-color : #ff7 ; --cpu-popup-background : #aaa; --cpu-popup-color : #333; --cpu-cue : #000; --cpu-elapse-width : 160px; --cpu-min-padding : 16px; --cpu-inner-shadow : inset 0px 5px 10px -5px black; --cpu-color-transitions : 0s; --cpu-background-transitions : 0s; --cpu-unfold : 0s; } @media (max-width: 640px) { :root , .interface { --cpu-font-size : 13px; --cpu-height : 48px; --cpu-elapse-width : 140px; --cpu-min-padding : 4px; } @media (max-width: 480px) { :root , .interface { --cpu-elapse-width : 70px; } }';
+media_err_unknow:"Error of unknown cause."}};let x=document.querySelector("html").lang;if(!(x.length&&x.toLowerCase()in w)){x="en";let a=window.navigator.languages;a=void 0!==a?a:[navigator.language||navigator.browserLanguage];for(let b of a)if(b.split){let c=b.split("-")[0];c in w&&(x=c)}}const y=w[x];function z(){var a=document.createElement("style");a.innerHTML=' audio[controls] { display : block; width : 100%; } :root { --cpu-height : 64px; --cpu-font-family : Lato, "Open Sans", "Segoe UI", Frutiger, "Frutiger Linotype", "Dejavu Sans", "Helvetica Neue", Arial, sans-serif; --cpu-font-size : 15px; --cpu-font-small-size : calc(var(--cpu-font-size) * 0.8); --cpu-background : #555; --cpu-color : #ddd; --cpu-playing-background : #444; --cpu-playing-color : #fff; --cpu-error-background : #a00 ; --cpu-error-color : #ff7 ; --cpu-popup-background : #aaa; --cpu-popup-color : #333; --cpu-cue : #000; --cpu-elapse-width : 160px; --cpu-min-padding : 16px; --cpu-inner-shadow : inset 0px 5px 10px -5px black; --cpu-color-transitions : 0s; --cpu-background-transitions : 0s; --cpu-unfold : 0s; } @media (max-width: 640px) { :root , .interface { --cpu-font-size : 13px; --cpu-height : 48px; --cpu-elapse-width : 140px; --cpu-min-padding : 4px; } @media (max-width: 480px) { :root , .interface { --cpu-elapse-width : 70px; } }';
document.head.appendChild(a);a=document.createElement("template");a.id="CPU__template";a.innerHTML=`
${m}`);c.innerHTML=m;this.container.appendChild(c);b(c)}"CPU-CONTROLLER"!==this.element.tagName&&null!==document.CPU.global_controller&&this.audiotag.isEqualNode(document.CPU.global_controller.audiotag)&&document.CPU.global_controller.draw_plane(a)}}add_plane(a,b,c){if("CPU-CONTROLLER"===this.element.tagName||!a.match(q)||
void 0!==this.get_plane(a))return!1;void 0===c&&(c={});void 0===this.audiotag._CPU_planes&&(this.audiotag._CPU_planes={});b={track:!0,panel:!0,title:b,highlight:!0,points:{}};for(let d in b)void 0===c[d]&&(c[d]=b[d]);this.audiotag._CPU_planes[a]=c;this.draw_plane(a);return!0}remove_plane(a){if("CPU-CONTROLLER"===this.element.tagName||!a.match(q)||void 0===this.audiotag._CPU_planes[a])return!1;this.audiotag&&delete this.audiotag._CPU_planes[a];let b=this.get_plane_track(a);b&&b.remove();(b=this.get_plane_panel(a))&&
b.remove();"CPU-CONTROLLER"!==this.element.tagName&&null!==document.CPU.global_controller&&this.audiotag.isEqualNode(document.CPU.global_controller.audiotag)&&document.CPU.global_controller.draw_plane(a);return!0}get_point_id(a,b,c){return`${c?"panel":"track"}_\u00ab${a}\u00bb_point_\u00ab${b}\u00bb`}get_point(a,b){return this.audiotag._CPU_planes[a].points[b]}get_point_track(a,b){return this.elements.line.querySelector("#"+this.get_point_id(a,b,!1))}get_point_panel(a,b){return this.container.querySelector("#"+
-this.get_point_id(a,b,!0))}translate_vtt(a){let b={i:"i",em:"em",b:"b",bold:"strong",u:"u",lang:"i"};return(a.match(//g)||[]).length?H(a):a.replace(t.opentag,function(c,d,f,g){d=d.toLowerCase();if(!(d in b))return"";c="";"lang"===d&&(c=` lang="${g.trim()}"`);return`<${b[d]}${c}>`}).replace(t.closetag,function(c,d){d=d.toLowerCase();return d in b?`${b[d]}>`:""}).replace(t.br," ")}plane_resort(a){this.audiotag._CPU_planes[a].points=Object.fromEntries(Object.entries(this.audiotag._CPU_planes[a].points).sort(function(b,
-c){return b[1].start-c[1].start}))}draw_point(a,b){var c=this.get_point(a,b),d=c.start;let f=c.link,g="#",m=A;var l=`#${(this.audiotag?this.audiotag:document.CPU.global_controller.audiotag).id}&t=${d}`;!0===f&&(g=l);"string"===typeof f&&(g=f);if("function"===typeof f){let C=this;m=V=>{f(C,a,b);V.preventDefault()}}var w=this.get_plane_track(a);if(w){var n=this.get_point_track(a,b);let C=this.get_point_id(a,b,!1);n||(n=document.createElement("a"),n.id=C,n.tabIndex=-1,w.appendChild(n));n.href=l;n.title=
-c.text;l="";c.image&&(l=``);l+=`${c.text}`;n.innerHTML=l;n.title=n.innerText;this.timeline_position(n,d,c.end)}if(l=this.get_plane_nav(a))n=this.get_point_panel(a,b),w=this.get_point_id(a,b,!0),n||(n=document.createElement("li"),n.id=w,n.innerHTML='',l.appendChild(n)),l="",c.text&&(l=c.text),n.querySelector("strong").innerHTML=l,c=n.querySelector("time"),c.dateTime=J.IsoDuration(d),c.innerText=J.SecondsInColonTime(d),
-d=n.querySelector("a"),d.href=g,d.onclick=m;"CPU-CONTROLLER"!==this.element.tagName&&null!==document.CPU.global_controller&&this.audiotag.isEqualNode(document.CPU.global_controller.audiotag)&&document.CPU.global_controller.draw_point(a,b)}add_point(a,b,c,d){d=void 0===d?{}:d;if("CPU-CONTROLLER"===this.element.tagName||void 0===this.get_plane(a)||void 0!==this.get_point(a,c)||0>b||!c.match(q))return!1;d.start=b;this.audiotag._CPU_planes[a].points[c]=d;this.plane_resort(a);this.draw_point(a,c);return!0}edit_point(a,
-b,c){let d=this.get_point(a,b);for(let f in d)f in c&&(d[f]=c[f]);this.audiotag._CPU_planes[a].points[b]=c;"start"in c&&this.plane_resort(a);this.draw_point(a,b)}remove_point(a,b){let c=this.get_point_track(a,b);if(!c)return!1;delete this.audiotag._CPU_planes[a].points[b];c.remove();this.get_point_panel(a,b).remove();"CPU-CONTROLLER"!==this.element.tagName&&null!==document.CPU.global_controller&&this.audiotag.isEqualNode(document.CPU.global_controller.audiotag)&&document.CPU.global_controller.remove_point(a,
-b);return!0}get_point_names_from_id(a){let b=a.replace(r,"$2");a=a.replace(r,"$5");return[b,a]}clear_plane(a){let b=this.get_plane(a);if(!this.get_plane(a))return!1;for(let c of Object.keys(b.points))this.remove_point(a,c);a=this.get_plane_nav(a);null!==a&&(a.innerHTML="");return!0}refresh_plane(a){this.plane_resort(a);for(let b of Object.keys(this.audiotag._CPU_planes[a].points))this.draw_point(a,b)}undraw_all_planes(){D("aside, div.panel",a=>{a.remove()},this.container)}redraw_all_planes(){this.undraw_all_planes();
+this.get_point_id(a,b,!0))}translate_vtt(a){let b={i:"i",em:"em",b:"b",bold:"strong",u:"u",lang:"i"};return(a.match(//g)||[]).length?H(a):a.replace(t.opentag,function(c,d,f,g){d=d.toLowerCase();if(!(d in b))return"";c="";"lang"===d&&(c=` lang="${g.trim()}"`);return`<${b[d]}${c}>`}).replace(t.closetag,function(c,d){d=d.toLowerCase();return d in b?`${b[d]}>`:""}).replace(t.br," ")}plane_resort(a){this.audiotag._CPU_planes[a].points=Object.fromEntries(Object.entries(this.audiotag._CPU_planes[a].points).sort((b,
+c)=>b[1].start-c[1].start))}draw_point(a,b){var c=this.get_point(a,b),d=c.start;let f=c.link,g="#",m=A;var l=`#${(this.audiotag?this.audiotag:document.CPU.global_controller.audiotag).id}&t=${d}`;!0===f&&(g=l);"string"===typeof f&&(g=f);if("function"===typeof f){let V=this;m=W=>{f(V,a,b);W.preventDefault()}}var u=this.get_plane_track(a);if(u){var n=this.get_point_track(a,b),C=this.get_point_id(a,b,!1);n||(n=document.createElement("a"),n.id=C,n.tabIndex=-1,u.appendChild(n));n.href=l;n.title=c.text;
+l="";c.image&&(l=``);l+=`${c.text}`;n.innerHTML=l;n.title=n.innerText;this.timeline_position(n,d,c.end)}if(l=this.get_plane_nav(a))n=this.get_point_panel(a,b),u=Number(c.start),n&&Number(n.dataset.start)!==u&&(n.remove(),n=!1),C=this.get_point_id(a,b,!0),n||(n=document.createElement("li"),n.id=C,n.innerHTML='',l.appendChild(n)),n.dataset.start=u,l="",c.text&&(l=c.text),n.querySelector("strong").innerHTML=
+l,c=n.querySelector("time"),c.dateTime=J.IsoDuration(d),c.innerText=J.SecondsInColonTime(d),d=n.querySelector("a"),d.href=g,d.onclick=m;"CPU-CONTROLLER"!==this.element.tagName&&null!==document.CPU.global_controller&&this.audiotag.isEqualNode(document.CPU.global_controller.audiotag)&&document.CPU.global_controller.draw_point(a,b)}add_point(a,b,c,d){d=void 0===d?{}:d;if("CPU-CONTROLLER"===this.element.tagName||void 0===this.get_plane(a)||void 0!==this.get_point(a,c)||0>b||!c.match(q))return!1;d.start=
+b;this.audiotag._CPU_planes[a].points[c]=d;this.audiotag._CPU_planes[a]._st_max>b?this.refresh_plane(a):(this.draw_point(a,c),this.audiotag._CPU_planes[a]._st_max=b);return!0}edit_point(a,b,c){let d=this.get_point(a,b),f=!1;"start"in c&&Number(c.start)!==d.start&&(f=!0);for(let g in d)g in c&&(d[g]=c[g]);this.audiotag._CPU_planes[a].points[b]=d;f?(this.clear_plane(a),this.refresh_plane(a)):this.draw_point(a,b);b=Number(c.start);this.audiotag._CPU_planes[a]._st_max{a.remove()},this.container)}redraw_all_planes(){this.undraw_all_planes();
for(let a of Object.keys(this.audiotag._CPU_planes))this.draw_plane(a),this.refresh_plane(a)}remove_highlights_points(a,b){b=void 0===b?!0:b;a="string"===typeof a?a:"with-preview";D(`.${a}`,c=>{c.classList.remove(a)},this.container);b&&null!==document.CPU.global_controller&&this.audiotag.isEqualNode(document.CPU.global_controller.audiotag)&&("CPU-CONTROLLER"!==this.element.tagName?document.CPU.global_controller.remove_highlights_points(a,!1):document.CPU.find_container(document.CPU.global_controller.audiotag).remove_highlights_points(a,
!1))}highlight_point(a,b,c,d){d=void 0===d?!0:d;c="string"===typeof c?c:"with-preview";this.remove_highlights_points(c,d);var f=this.get_plane(a);f&&f.highlight&&(this.get_plane_track(a)&&(f=this.get_point_track(a,b))&&f.classList.add(c),this.get_plane_panel(a)&&(f=this.get_point_panel(a,b))&&f.classList.add(c),d&&null!==document.CPU.global_controller&&this.audiotag.isEqualNode(document.CPU.global_controller.audiotag)&&("CPU-CONTROLLER"!==this.element.tagName?document.CPU.global_controller.highlight_point(a,
b,c,!1):document.CPU.find_container(document.CPU.global_controller.audiotag).highlight_point(a,b,c,!1)))}_cuechange_event(a){try{let b=a.target.activeCues[0];if(Object.is(b,this._activecue))return;this._activecue=b}catch(b){}K.cuechange(a,this.elements["interface"])}build_chapters(a){if("CPU-CONTROLLER"!==this.element.tagName){var b=this;void 0!==a&&(b=document.CPU.find_container(a.target),null===b&&window.console.error("CPU-AUDIO: ","Container CPU- not ready yet. WTF ?"));var c=b.audiotag;a=!1;if(c&&
c.textTracks&&0${y.playlist}`;for(let b of this.current_playlist){let c=document.getElementById(b),d=document.createElement("a");d.classList.add("cue");b===this.audiotag.id&&d.classList.add("active-cue");d.href=`#${c.id}&t=0`;d.tabIndex=0;d.innerHTML=`${c.dataset.title}`;a.append(d)}}}}build_controller(){let a=this;
-D("[id]",g=>{a.elements[g.id]=g},this.element.shadowRoot);this.elements.poster.addEventListener("load",()=>{a.elements["interface"].classList.add("poster-loaded")},u);var b={pause:K.play,play:K.pause,time:K.throbble,actions:this.show_actions,back:this.show_main,poster:this.show_main,restart:K.restart};for(var c in b)this.elements[c].addEventListener("click",b[c],u);b=["fastreward","reward","foward","fastfoward"];c={touchstart:!0,touchend:!1,touchcancel:!1,mousedown:!0,mouseup:!1,mouseleave:!1};for(var d of b)for(var f in c)this.elements[d].addEventListener(f,
-c[f]?K._press_button:K._release_button);this.element.addEventListener("keydown",K.key);this.elements.control.addEventListener("keydown",K.keydownplay);d=this.elements.time;f={mouseover:!0,mousemove:!0,mouseout:!1,touchstart:!0,touchend:!1,touchcancel:!1};for(let g in f)d.addEventListener(g,f[g]?K.hover:K.out,u);d.addEventListener("touchstart",K.touchstart,u);d.addEventListener("touchend",K.touchcancel,u);d.addEventListener("contextmenu",this.show_handheld_nav);this.audiotag&&(this.show_main(),this.build_chapters_loader(),
-this.audiotag.addEventListener("loadedmetadata",this.redraw_all_planes.bind(this),u))}};HTMLAudioElement.prototype.CPU_connected=!1;HTMLAudioElement.prototype.CPU_controller=function(){return this.closest("CPU-AUDIO")};HTMLAudioElement.prototype.CPU_update=function(){var a=this.CPU_controller();a&&(a=a.CPU)&&a.update&&a.update();null!==document.CPU.global_controller&&document.CPU.global_controller.update()};class T extends HTMLElement{constructor(){super();this.CPU=null;window.matchMedia("screen").matches?"CPU-AUDIO"===this.tagName&&null===this.querySelector("audio[controls]")?(I("Tag without