Emulateur Freebox (fb2ie tagslib.js)
Un article de Wiki FreePlayer.org.
Emulateur Freebox : retour à la page principale.
Cette page contient le code source complet du script "fb2ie_tagslib.js" (v2). Ce code est fourni tel quel, et peut être modifié directement en modifiant cette page.
La section "Changelog" permet à chaque contributeur d'indiquer les changements effectués.
Sommaire |
[modifier]
Code source du fichier "fb2ie_tagslib.js"
/***********************************************************/
/*** Fonctions utilitaires ***/
/***********************************************************/
// liste des touches reconnues
var touches = {
'help':"Aide",'options':"Options",
'red':"Rouge",'green':"Vert",'yellow':"Jaune",'blue':"Bleu",
'info':"Info",'guide':"Guide",
'stop':"Stop",'play':"Lecture",'pause':"Pause",'rec':"Enregistrer",
'prev':"Précédent",'next':"Suivant",'rev':"Retour rapide",'fwd':"Avance rapide",
'up':"Haut",'down':"Bas",'left':"Gauche",'right':"Droite",
'star':"Etoile",'sharp':"Dièse",
'home_page':"Maison",
'love_page':"Favoris",'love2_page':"Favoris (appui long)",
'mail_page':"Messages",'mail2_page':"Messages (appui long)",
'star_page':"Etoile",'sharp_page':"Dièse"
}
// ajoute la touche "rel" à la liste des touches
function ajouteTouche(rel, href) {
if (touches[rel] != undefined) {
// préparation du lien
var lien = document.createElement("a");
lien.setAttribute("href",href);
lien.appendChild(document.createTextNode(touches[rel]));
// affichage du lien
document.body.appendChild(document.createTextNode("["));
document.body.appendChild(lien);
document.body.appendChild(document.createTextNode("] "));
}
}
// corrige l'opacité de l'élément "obj"
function setOpacity(obj, opacity) {
opacity = hex2dec(opacity)/4
opacity = opacity+36;
// IE/Win
obj.style.filter = "alpha(opacity:"+opacity+")";
// Safari<1.2, Konqueror
obj.style.KHTMLOpacity = opacity/100;
// Older Mozilla and Firefox
obj.style.MozOpacity = opacity/100;
// Safari 1.2, newer Firefox and Mozilla, CSS3
obj.style.opacity = opacity/100;
}
// mini-freebox (mode html)
function MiniFreebox() {
// init historique
lasturl="";
// déplacement à l'url indiquée
this.allerAUrl = function allerAUrl(url) {
// traitement des urls "none"
if (url == "none") { return(true) };
// traitement des urls "back"
if (url == "back") { url=lasturl; location.href=url; };
lasturl=url;
location.href=url;
}
}
/***********************************************************/
/*** Règles de conversion des tags "freebox" en tags HTML ***/
/***********************************************************/
var myrules = {
'a' : function(a){
// style des liens
a.style.textDecoration="none"; // pas de soulignement
a.style.color=document.body.getAttribute("link"); // couleur standard
// on ajoute un onmouseover/onmouseout sur le lien (IE)
if (navigator.appName == "Microsoft Internet Explorer") {
a.setAttribute("onfocus",function() {
this.style.color=document.body.getAttribute("alink");
// - onfocus
//(this.onfocus)?maFreebox.allerAUrl(this.onfocus):null;
});
a.setAttribute("onmouseover",function() {
this.style.color=document.body.getAttribute("alink");
// - onfocus
//(this.onfocus)?maFreebox.allerAUrl(this.onfocus):null;
});
a.setAttribute("onmouseout",function() {
this.style.color=document.body.getAttribute("link");
// - onblur
//(this.onblur)?maFreebox.allerAUrl(this.onblur):null;
});
a.setAttribute("onblur",function() {
this.style.color=document.body.getAttribute("link");
// - onblur
//(this.onblur)?maFreebox.allerAUrl(this.onblur):null;
});
a.setAttribute("onclick",function() {
this.style.color=document.body.getAttribute("vlink");
// - onselect
//(this.onselect)?maFreebox.allerAUrl(this.onselect):null;
});
// on ajoute un onmouseover/onmouseout sur le lien (Firefox/Mozilla)
} else {
a.setAttribute("onFocus","this.style.color=document.body.getAttribute('alink');");
a.setAttribute("onMouseOver","this.style.color=document.body.getAttribute('alink');");
a.setAttribute("onMouseOut","this.style.color=document.body.getAttribute('link');");
a.setAttribute("onBlur","this.style.color=document.body.getAttribute('link');");
a.setAttribute("onClick","this.style.color=document.body.getAttribute('vlink');");
}
// - href
a.href='javascript:maFreebox.allerAUrl("'+a.href+'");';
// - focused
(a.focused)?null:null;
// - tag
(a.tag)?null:null;
// - title
(a.title)?null:null;
// - rel (nouveauté firmwares 1.8.x)
(a.rel)?ajouteTouche(a.rel,a.href):null;
},
'body' : function(body) {
body.style.fontFamily="helvetica";
body.style.fontWeight="bold";
body.style.background="#000000";
// <body background="ts://127.0.0.1?ox=10&oy=10&ow=700&oh=500">
//maFreebox.setBackground(body.background);
/*
Protocoles supportés par la freebox :
* ts
Flux de transport Mpeg2 encapsulé dans des paquets UDP/multicast.
Les arguments sont :
* pcr= pid de l'horloge de référence du programme.
* vid= pid du flux vidéo.
* aud= pid du flux audio.
* ttx= pid du flux télétexte.
* [ix|iy|iw|ih]= définit un rectangle à l'intérieur d'une image vidéo décodée. (NdT:defines a rectangle within a decode video picture.) Notez que la résolution de cette image n'est pas liée à la taille de l'écran (i.e elle peut être plus petite, plus grande ou égale à la taille de l'écran).
* [ox|oy|ow|oh]= définit un rectangle dans lequel la fenêtre d'entrée sera affichée, ceci définit implicitement un facteur de taille qui est égal au ratio de la taille des fenêtres de sortie et d'entrée. (NdT:defines a rectangle into which the input window is to be displayed, this implicitly defines a scaling factor which is equal to the ration of the output and input window sizes.)
*/
},
'box' : function(box){
// préparation de l'élément "table" correspondant à la box
var table=document.createElement("table");
table.cellPadding = 0;
table.cellSpacing = 0;
table.width = box.width;
table.height = box.height;
box.bgcolor?table.bgColor = box.bgcolor.substr(0, 7):null;
box.abgcolor?table.abgcolor = box.abgcolor.substr(0, 7):null;
table.border = box.border;
table.borderColor = box.bordercolor.substr(0, 7);
// ajout du texte de la box
var text = document.createElement("tbody");
var tmpNode2 = document.createElement("tr");
var tmpNode3 = document.createElement("td");
tmpNode3.align = "center";
var textNode = document.createTextNode(box.text);
tmpNode3.appendChild(textNode);
tmpNode2.appendChild(tmpNode3);
text.appendChild(tmpNode2);
table.appendChild(text);
// remplacement de la "box" par la table créée
box.parentNode.replaceChild(table,box);
},
'flags' : function(flags) {
flags.wait_new_picture?null:null;
flags.program_key?null:null;
flags.volume_key?null:null;
flags.no_parental_rating?null:null;
},
'font' : function(font) {
// gestion de la police "symbol"
// à remplacer par des images
// ou des symboles équivalents
},
'hslider' : function(slider) {
// todo : créer une bare de défilement horizontale
},
'img' : function(img){
img.alpha?setOpacity(img,alpha.substr(1,2)):null;
img.border?null:img.border=0;
},
'link' : function(link){
ajouteTouche(link.rel,link.href);
},
'meta' : function(meta){
// simulation des touches
ajouteTouche(meta.name,meta.content);
// configuration de la Freebox virtuelle
switch (meta.name) {
// dans le cas d'une redirection,, on poite le navgateur sur l'adresse cible
// avec le timeout qui va bien
case "refresh" :
// récupération des paramètres
valeurs = meta.content.split(",");
setTimeout('maFreebox.allerAUrl("'+valeurs[1].substring(4, valeurs[1].length)+'");',valeurs[0]*1000);
break;
case "disappear" :
setTimeout('document.write("")',meta.content*1000);
break;
case "location" :
maFreebox.allerAUrl(meta.content);
break;
case "defer_location" :
setTimeout('maFreebox.allerAUrl("'+meta.content+'");',500);
break;
case "nopicture" :
// redirection si pas d'image vidéo reçue au bout de <content> secondes
break;
// flux vidéo
case "display_aspect_ratio_conversion" :
// "letterbox" "combined" "panscan" "ignore"
break;
case "display_video_output" :
// "rgb" ou "video"
break;
case "video_output_scale" :
break;
case "denc_brightness" :
break;
case "denc_contrast" :
break;
case "denc_saturation" :
break;
case "volume" :
break;
case "display_video_commut" :
break;
// interface utilisateur
case "scroll_increment" :
break;
case "front_panel" :
break;
// touches de la télécommande
case "home_page" :
break;
case "love_page" :
break;
case "love2_page" :
break;
case "mail_page" :
break;
case "mail2_page" :
break;
case "star_page" :
break;
case "sharp_page" :
break;
// canaux :
/*
Une URL générique est une URL standard,
- où le premier '%d' est substitué par le numéro de chaîne courante,
- et le second '%d' par l'identificateur de service (sid) courant.
*/
case "nochannel_page" :
break;
case "channel_page" :
// <meta name="channel_page
// content="http://192.168.2.10/channel.pl?num=%d&sid=%d"
break;
case "channel" :
// non documentée
break;
case "prog_select_timeout" :
// temps avant validation de saisie d'un digit (2000)
break;
case "prog_expand_timeout" :
// temps avant ajout d'un dgit (300)
break;
case "key_repeat_delay" :
// temps avant répétition de touche (288)
break;
case "key_repeat_interval" :
// intervalle mini entre 2 répétitions de touche (72)
break;
// Accueil
case "settings_page" :
break;
case "prompt" :
break;
// page d'erreur (VOD)
case "error_page" :
break;
// statut freebox
case "status_output" :
// status freebox on ou off (off)
break;
// contrôle parental
case "parental_rating" :
// âge maximum en années de l'utilisateur final.
break;
case "user-agent" :
// Redéfinit l'agent utilisateur dans l'en-tête des requêtes HTTP.
break;
case "parental_rating_page" :
break;
// sous-titres
case "ttx_subtitle_bgcolor" :
break;
case "ttx_subtitle_adjust" :
break;
case "ttx_subtitle_default_page" :
break;
case "ttx_subtitle_default_display" :
break;
case "ttx_subtitle_page" :
break;
case "ttx_subtitle_display" :
break;
default :
// gestion des balises meta non reconues
// lien.appendChild(document.createTextNode("Autre"));
break;
}
},
'service' : function(service) {
/*
<service num=2 sid=1002 shortname="France 2"
url="ts://224.1.1.2?pcr=68&vid=68&aud=69&ttx=70"
page="/channel/france2/head.html"
code="special service flags">
*/
},
'table' : function(table){
// correction du style des bordures sous Firefox
if (navigator.appName != "Microsoft Internet Explorer") {
table.style.borderStyle="solid";
}
table.getAttribute("vbgcolor")?null:table.setAttribute("vbgcolor",table.getAttribute("abgcolor"));
// si un lien précède la table
if (table.parentNode.tagName == "A" && table.getAttribute("abgcolor")) {
// on ajoute un onmouseover/onmouseout sur le lien (IE)
if (navigator.appName == "Microsoft Internet Explorer") {
table.setAttribute("onmouseover",function() {
this.borderColor2=this.borderColor;
this.borderColor=document.body.getAttribute("alink");
this.bgColor2=this.bgColor;
(this.abgcolor)?this.bgColor=this.abgcolor:null;
this.style.cursor='hand';
});
table.setAttribute("onmouseout",function() {
this.borderColor=this.borderColor2;
this.bgColor=this.bgColor2;
});
table.setAttribute("onclick",function() {
this.borderColor=document.body.getAttribute("vlink");
maFreebox.allerAUrl(this.parentNode.href);
});
// on ajoute un onmouseover/onmouseout sur le lien (Firefox/Mozilla/Opera)
} else {
table.setAttribute("onmouseover","this.bgColor = '"+table.getAttribute("abgcolor")+"'; "+ "this.style.borderColor='"+document.body.getAttribute("alink")+"';");
table.setAttribute("onmouseout","this.bgColor = '"+table.bgColor+"';"+"this.style.borderColor='"+table.style.borderColor+"';");
table.setAttribute("onfocus","this.bgColor = '"+table.getAttribute("abgcolor")+"'; "+ "this.style.borderColor='"+document.body.getAttribute("alink")+"';");
table.setAttribute("onblur","this.bgColor = '"+table.bgColor+"';"+"this.style.borderColor='"+table.style.borderColor+"';");
table.setAttribute("onclick","this.bgColor = '"+table.getAttribute("vbgcolor")+"';"+"this.style.borderColor='"+document.body.getAttribute("vlink")+"';");
}
}
},
'var' : function(variable) {
// todo : gérer les variables dynamiques
},
'vslider' : function(slider) {
// todo : créer une barre de défilement verticale
// bgcolor="#3f3f3f3f" name="video_pos" min="0" max="99" grad="2"
}
};
// exécution du script
var maFreebox = new MiniFreebox();
Behaviour.register(myrules);
[modifier]
Fonctionnement
Le tableau associatif "myrules" contient la liste dees règles appliquées aux tags Freebox.
Ces règles font appel aux fonctions utilitaires présentes en début de script.
Utilisation en mode "script" :
Le fichier fb2ie_tagslib.js intègre une mini-freebox vrtuelle assurant la gestion des liens.
Utilisation en mode "stand alone" :
Le fichier fb2ie_core.js prend le relais au niveau de la freebox virtuelle.
[modifier]
Bugs connus
- Pas encore de bug connu... (mais il y en a sûrement plein !)
[modifier]
Changelog
- 2007-04-27: version initiale. </u>

