-
-
Notifications
You must be signed in to change notification settings - Fork 14
Player API
Free n'ayant pas encore documenté l'API dédié au player, j'ai dû chercher un moment avant de trouver quelques informations.
Free a fini par documenter l'API Player dans la section "Aide" de Freebox OS : http://mafreebox.freebox.fr/#Fbx.os.app.help.app
Tout d'abord, il est à noter qu'il est nécessaire d'avoir les droits player
sur Freebox OS pour l'application – ces droits ne pouvant se définir que manuellement :
À noter qu'il est bien sûr nécessaire de se loguer et d'envoyer l'en-tête X-Fbx-App-Auth
dans tous les requêtes.
Réponse :
{
"result": [
{
"api_available": true,
"api_version": "7.0",
"device_name": "Freebox Player",
"id": 1,
"reachable": true,
"stb_type": "stb_v6",
"uid": "9f20347c10fcd7751f3e6543d3aafb86"
}
],
"success": true
}
Les players vont être listés. On notera que stb_type
est stb_v6
pour la Freebox Révolution, mais stb_v7
pour la Freebox Delta et la One.
Ici on aura donc :
PLAYER_ID = 1;
PLAYER_API_VERSION = 'v7';
GET https://mafreebox.freebox.fr/api/v6/player/PLAYER_ID/api/PLAYER_API_VERSION/status/
Réponse quand le player est éteint :
{
"result": {
"power_state": "standby"
},
"success": true
}
Réponse quand le player est allumé sur une chaine :
{
"result": {
"foreground_app": {
"context": {},
"cur_url": "tv://?bouquetId=675&channel=7",
"package": "fr.freebox.tv",
"package_id": 28
},
"power_state": "running"
},
"success": true
}
Attention, depuis août 2023, la Freebox retourne beaucoup plus d'informations (ci-dessous un exemple lorsqu'une chaîne de TV est en cours) :
{
"success": true,
"result": {
"foreground_app": {
"package_id": 34,
"cur_url": "",
"context": {
"player": {
"source": "rtsp://rtsp-server/fbxtv_priv/stream?namespace=1&service=612",
"duration": 0,
"livePos": "1693143304193",
"playbackState": "play",
"audioIndex": 0,
"audioList": [
{
"samplerate": 48000,
"type": "Main",
"pid": 130,
"channelCount": 2,
"bitrate": "0",
"codec": "AAC",
"adAvailable": false,
"uid": 0,
"codecId": "Aac",
"language": "fra",
"metadataId": "None"
},
{
"samplerate": 0,
"type": "Main",
"pid": 131,
"channelCount": 0,
"bitrate": "0",
"codec": "AAC",
"adAvailable": false,
"uid": 1,
"codecId": "Aac",
"language": "qaa",
"metadataId": "None"
},
{
"samplerate": 0,
"type": "Description",
"pid": 132,
"channelCount": 0,
"bitrate": "0",
"codec": "AAC",
"adAvailable": false,
"uid": 2,
"codecId": "Aac",
"language": "qad",
"metadataId": "None"
}
],
"curPos": "1693143304193",
"subtitleIndex": -1,
"videoIndex": 0,
"metadata": {},
"videoList": [
{
"bitrate": "0",
"codec": "H264",
"pid": 120,
"height": 1080,
"framerate": {
"den": 1,
"num": 25
},
"uid": 0,
"width": 1440
}
],
"subtitleList": [
{
"codec": "Teletext subtitle",
"pid": 140,
"uid": 0,
"language": "fra",
"type": "HearingImpaired"
},
{
"codec": "Teletext subtitle",
"pid": 140,
"uid": 1,
"language": "fra",
"type": "Normal"
}
],
"position": 0,
"mediaState": "ready",
"sourceHidden": false,
"minPos": "1693143304193",
"maxPos": "1693143304193"
},
"channel": {
"services": [
{
"timeshifting": true,
"id": 1817,
"typeLabel": "ADSL",
"qualityName": "auto",
"url": "rtsp://rtsp-server/fbxtv_priv/stream?namespace=1&service=612",
"name": "TF1 (auto)",
"qualityLabel": "Automatique",
"sortInfo": 0,
"pvr": "private",
"typeName": "iptv",
"priv": {
"iptv": {
"bandwidth": 0,
"udpmsg3_namespace": 1,
"udpmsg3_service": 612,
"rash": false,
"lan_stream": false
},
"type": "iptv"
}
},
{
"timeshifting": true,
"id": 1816,
"typeLabel": "ADSL",
"qualityName": "hdplus",
"url": "rtsp://rtsp-server/fbxtv_priv/stream?namespace=1&service=1320&flavour=hd",
"name": "TF1 (HD+)",
"qualityLabel": "HD+",
"sortInfo": 1,
"pvr": "private",
"typeName": "iptv",
"priv": {
"iptv": {
"bandwidth": 15000,
"udpmsg3_namespace": 1,
"udpmsg3_service": 1320,
"rash": false,
"lan_stream": false
},
"type": "iptv"
}
},
{
"timeshifting": true,
"id": 1813,
"typeLabel": "ADSL",
"qualityName": "hd",
"url": "rtsp://rtsp-server/fbxtv_priv/stream?namespace=1&service=612&flavour=hd",
"name": "TF1 (HD)",
"qualityLabel": "HD",
"sortInfo": 4,
"pvr": "private",
"typeName": "iptv",
"priv": {
"iptv": {
"bandwidth": 6000,
"udpmsg3_namespace": 1,
"udpmsg3_service": 612,
"rash": false,
"lan_stream": false
},
"type": "iptv"
}
},
{
"timeshifting": true,
"id": 1814,
"typeLabel": "ADSL",
"qualityName": "sd",
"url": "rtsp://rtsp-server/fbxtv_priv/stream?namespace=1&service=612&flavour=sd",
"name": "TF1 (standard)",
"qualityLabel": "Standard",
"sortInfo": 5,
"pvr": "private",
"typeName": "iptv",
"priv": {
"iptv": {
"bandwidth": 2900,
"udpmsg3_namespace": 1,
"udpmsg3_service": 612,
"rash": false,
"lan_stream": false
},
"type": "iptv"
}
},
{
"timeshifting": true,
"id": 1815,
"typeLabel": "ADSL",
"qualityName": "ld",
"url": "rtsp://rtsp-server/fbxtv_priv/stream?namespace=1&service=612&flavour=ld",
"name": "TF1 (bas débit)",
"qualityLabel": "Bas débit",
"sortInfo": 6,
"pvr": "private",
"typeName": "iptv",
"priv": {
"iptv": {
"bandwidth": 2400,
"udpmsg3_namespace": 1,
"udpmsg3_service": 612,
"rash": false,
"lan_stream": false
},
"type": "iptv"
}
}
],
"isTimeShifting": false,
"videoIsVisible": true,
"channelName": "TF1",
"channelNumber": 1,
"channelType": "regular",
"bouquetName": "Freebox TV",
"currentServiceIndex": "0",
"channelUuid": "uuid-webtv-612",
"bouquetType": "adsl",
"bouquetId": 170,
"channelSubNumber": 0
}
},
"package": "fr.freebox.tv"
},
"player": {
"state": {
"duration_ms": 0,
"playback_state": "playing",
"position_ms": 0
},
"capabilities": {
"shuffle": false,
"select_srt_track": true,
"seek_forward": true,
"play": true,
"select_stream": true,
"start_over": true,
"select_audio_track": true,
"repeat_all": false,
"next": false,
"record_stop": true,
"repeat_one": false,
"stop": true,
"seek_to": true,
"seek_backward": true,
"record": true,
"pause": true,
"prev": false
},
"name": "Freebox TV",
"last_activity": 1693143259
},
"power_state": "running"
}
}
Ces paramètres varient selon où on se trouve (tests faits avec une Révolution) :
- Pour une chaine de TV : voir l'exemple ci-dessus
- Dans les menus :
"package_id":21
,"package":"fr.freebox.home"
, tandis quecur_url
varie (par exemple sur l'icône Netflix :home://?highlight=app%3Acom.netflix%3Fsource_type%3D2
, ou icône "Mes Vidéos"home://?highlight=filebrowser%3A%2F%2F%3Funiverse%3Dvideo
) - Dans "Mes Enregistrements",
"package_id":26
,"package":"fr.freebox.pvr"
etcur_url
est vide - Dans "Freebox Replay",
"package_id":24
,"package":"fr.freebox.vodlauncher"
etcur_url
est vide ;cur_url
va prendre une valeur selon le programme dans lequel on se rend (par exemple dans "MyTF1""cur_url":"vodservice://replay?currentSelectedService=42"
) - Dans "Netflix",
"package_id":35
,"package":"com.netflix"
etcur_url
est vide - Dans le "Guide des Programmes",
"package_id":29
,"package":"fr.freebox.epg"
etcur_url
est vide - Pendant la lecture d'un enregistrement,
"package_id":6
,"package":"fr.freebox.mediaplayer"
etcur_url
est vide - Dans "Mes Vidéos",
"package_id":31
,"package":"fr.freebox.filebrowser"
etcur_url
est vide ; mais lorsqu'on lit une vidéo du disque durcur_url
va indiquer tout un tas de paramètres sur la vidéo - Dans "Système" > "Information Freebox", on aura
"package_id":2
,"package":"fr.freebox.freeboxinfo"
etcur_url
est vide
Retourne les centaines de chaines avec leur uuid
:
{
"success": true,
"result": {
"uuid-webtv-404": {
"uuid": "uuid-webtv-404",
"name": "TEVA",
"available": true,
"logo_url": "https://mafreebox.freebox.fr/api/v6/tv/img/channels/logos68x60/uuid-webtv-404.png",
"has_service": true,
"short_name": "TEVA",
"has_abo": true
},
"uuid-webtv-1204": {
"uuid": "uuid-webtv-1204",
"name": "Syfy",
"available": false,
"logo_url": "https://mafreebox.freebox.fr/api/v6/tv/img/channels/logos68x60/uuid-webtv-1204.png",
"has_service": false,
"short_name": "Syfy",
"has_abo": false
}
}
}
Cette action allumera automatiquement le player s'il ne l'est pas déjà.
Pour les chaines de TV, l'uuid
est fourni par https://mafreebox.freebox.fr/api/v6/tv/channels/
.
Attention, les commandes ci-dessous ne sont plus valables depuis août 2023 :
POST https://mafreebox.freebox.fr/api/v6/player/PLAYER_ID/api/PLAYER_API_VERSION/control/open
{ "url": "tv://?uuid=uuid-webtv-XXXX" }
Il est également possible d'envoyer un numéro de chaine :
{ "url": "tv://?channel=6" }
Pour allumer la TV avec la dernière chaine :
{ "url": "tv://" }
Après août 2023, pour la TV, il faut les commandes suivantes :
POST https://mafreebox.freebox.fr/api/v6/player/PLAYER_ID/api/PLAYER_API_VERSION/control/open
{ "url": "app:fr.freebox.tv?uuid=uuid-webtv-XXXX" }
Il est également possible d'envoyer un numéro de chaine :
{ "url": "app:fr.freebox.tv?channel=6" }
Pour allumer la TV avec la dernière chaine :
{ "url": "app:fr.freebox.tv" }
Pour aller dans le service Freebox Replay :
{ "url": "vodservice://replay"
Ou lancer un service de Replay en particulier, par exemple celui de "MYTF1" :
{ "url": "vodservice://replay?currentSelectedService=42" }
Pour ouvrir une page web dans le navigateur :
{ "url": "https://www.google.fr" }
Pour lancer l'application Netflix :
{ "url": "https://www.netflix.com" }
Ou lancer l'application Amazon Prime :
{ "url": "https://www.primevideo.com" }
Ou lancer l'application Youtube :
{ "url": "https://www.youtube.com" }
On utilise app:
et le nom du package :
{ "url": "app:fr.freebox.radio" }
Pour aller dans "Mes Enregistrements" :
{ "url": "pvr://" }
Ou aller dans "Mes Vidéos" :
{ "url": "filebrowser://?currentPathString=%5B%7B%22defaults%22%3A%7B%22nid%22%3A%22fbx-fs%3A%2F%2Ffreebox-gw%253A8091%2FL0Rpc3F1ZSBkdXI%253D%2FL0Rpc3F1ZSBkdXIvVmlkw6lvcw%253D%253D%22%2C%22profileId%22%3A1%2C%22title%22%3A%22Vid%C3%A9os%22%2C%22savedNid%22%3A%22fbx-fs%3A%2F%2Ffreebox-gw%253A8091%2FL0Rpc3F1ZSBkdXI%253D%2FL0Rpc3F1ZSBkdXIvVmlkw6lvcw%253D%253D%22%7D%2C%22title%22%3A%22Vid%C3%A9os%22%2C%22url%22%3A%22file%3A%2F%2F%2Fusr%2Fshare%2Ffbxqmlapps%2Ffilebrowser%2Fviews%2Fdirectory_page.qml%22%7D%5D" }
À noter que pour "Mes Vidéos" (les autres listés plus bas), il s'agit en fait de l'objet ci-dessous qui est encodé :
[
{
"defaults": {
"nid": "fbx-fs://freebox-gw%3A8091/L0Rpc3F1ZSBkdXI%3D/L0Rpc3F1ZSBkdXIvVmlkw6lvcw%3D%3D",
"profileId": 1,
"savedNid": "fbx-fs://freebox-gw%3A8091/L0Rpc3F1ZSBkdXI%3D/L0Rpc3F1ZSBkdXIvVmlkw6lvcw%3D%3D",
"title": "vidéos"
},
"title": "vidéos",
"url": "file:///usr/share/fbxqmlapps/filebrowser/views/directory_page.qml"
}
]
Pour faciliter la création du path, on peut utiliser la fonction JS ci-dessous :
function fbxUrl (path, title) {
let str = [
{
defaults: {
nid: "fbx-fs://freebox-gw%3A8091/L0Rpc3F1ZSBkdXI%3D/",
profileId: 1,
savedNid: "fbx-fs://freebox-gw%3A8091/L0Rpc3F1ZSBkdXI%3D/",
title: ""
},
title: "",
url: "file:///usr/share/fbxqmlapps/filebrowser/views/directory_page.qml"
}
];
str[0].defaults.nid += encodeURIComponent(btoa(path));
str[0].defaults.savedNid += encodeURIComponent(btoa(path));
str[0].defaults.title = title;
str[0].title = title;
return encodeURIComponent(JSON.stringify(str));
}
fbxUrl("/Disque dur/Musiques", "Musiques");
Ou aller dans "Mes Musiques" :
{ "url": "filebrowser://?currentPathString=%5B%7B%22defaults%22%3A%7B%22nid%22%3A%22fbx-fs%3A%2F%2Ffreebox-gw%253A8091%2FL0Rpc3F1ZSBkdXI%253D%2FL0Rpc3F1ZSBkdXIvTXVzaXF1ZXM%253D%22%2C%22profileId%22%3A1%2C%22savedNid%22%3A%22fbx-fs%3A%2F%2Ffreebox-gw%253A8091%2FL0Rpc3F1ZSBkdXI%253D%2FL0Rpc3F1ZSBkdXIvTXVzaXF1ZXM%253D%22%2C%22title%22%3A%22Musiques%22%7D%2C%22title%22%3A%22Musiques%22%2C%22url%22%3A%22file%3A%2F%2F%2Fusr%2Fshare%2Ffbxqmlapps%2Ffilebrowser%2Fviews%2Fdirectory_page.qml%22%7D%5D" }
Ou aller dans "Mes Photos" :
{ "url": "%5B%7B%22defaults%22%3A%7B%22nid%22%3A%22fbx-fs%3A%2F%2Ffreebox-gw%253A8091%2FL0Rpc3F1ZSBkdXI%253D%2FL0Rpc3F1ZSBkdXIvUGhvdG9z%22%2C%22profileId%22%3A1%2C%22savedNid%22%3A%22fbx-fs%3A%2F%2Ffreebox-gw%253A8091%2FL0Rpc3F1ZSBkdXI%253D%2FL0Rpc3F1ZSBkdXIvUGhvdG9z%22%2C%22title%22%3A%22Photos%22%7D%2C%22title%22%3A%22Photos%22%2C%22url%22%3A%22file%3A%2F%2F%2Fusr%2Fshare%2Ffbxqmlapps%2Ffilebrowser%2Fviews%2Fdirectory_page.qml%22%7D%5D" }
Pour lancer les Radios :
{ "url": "radio://" }
Pour le moment je n'ai pas trouvé comment lancer une radio précise… À défaut il est possible de lancer un lien vers le stream d'une radio, par exemple avec NRJ :
{ "url" => "http://cdn.nrjaudio.fm/audio1/fr/30001/mp3_128.mp3", "type" => "audio/mp3" }
Pour une vidéo de votre Disque Dur (par exemple un fichier .mkv qui se trouve dans "TV" > "BIG LITTLE LIES") – référence :
{ "url" : "filebrowser://?currentPathString=%5B%7B%22defaults%22%3A%7B%22nid%22%3A%22fbx-fs%3A%2F%2Ffreebox-gw%253A8091%2FL0Rpc3F1ZSBkdXI%253D%2FL0Rpc3F1ZSBkdXIvVmlkw6lvcw%253D%253D%22%2C%22profileId%22%3A1%2C%22title%22%3A%22Mes vidéos%22%2C%22savedNid%22%3A%22fbx-fs%3A%2F%2Ffreebox-gw%253A8091%2FL0Rpc3F1ZSBkdXI%253D%2FL0Rpc3F1ZSBkdXIvVmlkw6lvcy9UVg%253D%253D%22%7D%2C%22title%22%3A%22Mes vidéos%22%2C%22url%22%3A%22file%3A%2F%2F%2Fusr%2Fshare%2Ffbxqmlapps%2Ffilebrowser%2Fviews%2Fdirectory_page.qml%22%7D%2C%7B%22defaults%22%3A%7B%22nid%22%3A%22fbx-fs%3A%2F%2Ffreebox-gw%253A8091%2FL0Rpc3F1ZSBkdXI%253D%2FL0Rpc3F1ZSBkdXIvVmlkw6lvcy9UVg%253D%253D%22%2C%22profileId%22%3A1%2C%22title%22%3A%22TV%22%2C%22savedNid%22%3A%22fbx-fs%3A%2F%2Ffreebox-gw%253A8091%2FL0Rpc3F1ZSBkdXI%253D%2FL0Rpc3F1ZSBkdXIvVmlkw6lvcy9UVi9CSUcgTElUVExFIExJRVM%253D%22%7D%2C%22title%22%3A%22TV%22%2C%22url%22%3A%22file%3A%2F%2F%2Fusr%2Fshare%2Ffbxqmlapps%2Ffilebrowser%2Fviews%2Fdirectory_page.qml%22%7D%2C%7B%22defaults%22%3A%7B%22nid%22%3A%22fbx-fs%3A%2F%2Ffreebox-gw%253A8091%2FL0Rpc3F1ZSBkdXI%253D%2FL0Rpc3F1ZSBkdXIvVmlkw6lvcy9UVi9CSUcgTElUVExFIExJRVM%253D%22%2C%22profileId%22%3A1%2C%22title%22%3A%22BIG LITTLE LIES%22%2C%22savedNid%22%3A%22fbx-fs%3A%2F%2Ffreebox-gw%253A8091%2FL0Rpc3F1ZSBkdXI%253D%2FL0Rpc3F1ZSBkdXIvVmlkw6lvcy9UVi9CSUcgTElUVExFIExJRVMvQmlnLkxpdHRsZS5MaWVzLlMwMkUwMy43MjBwLldFQi5oMjY0LVRCU1tlenR2XS5ta3Y%253D%22%7D%2C%22title%22%3A%22BIG LITTLE LIES%22%2C%22url%22%3A%22file%3A%2F%2F%2Fusr%2Fshare%2Ffbxqmlapps%2Ffilebrowser%2Fviews%2Fdirectory_page.qml%22%7D%5D"
Réponse :
{
"success": true
}
GET https://mafreebox.freebox.fr/api/v6/player/PLAYER_ID/api/PLAYER_API_VERSION/control/volume
Réponse :
{
"success":true,
"result":{
"target":"avr",
"valid":true,
"mute":false,
"volume":64
}
}
L'API ci-dessous a été trouvée dans ce code Python, mais n'est pas encore disponible pour la Freebox Révolution ; cependant elle pourrait être disponible pour la Freebox Delta (à vérifier)
PUT https://mafreebox.freebox.fr/api/v6/player/PLAYER_ID/api/PLAYER_API_VERSION/control/volume
{ "volume":50 }
Ou :
PUT https://mafreebox.freebox.fr/api/v6/player/PLAYER_ID/api/PLAYER_API_VERSION/control/volume
{ "mute":true }
L'API partielle ci-dessous a été trouvée dans ce code Python, mais n'est pas documentée
POST https://mafreebox.freebox.fr/api/v7/player/PLAYER_ID/api/PLAYER_API_VERSION/control/mediactrl
{ "cmd":"play_pause" }
Les commandes disponibles devraient être :
{
"play",
"pause",
"play_pause",
"stop",
"next",
"prev",
"seek_forward",
"seek_backward",
"seek_to",
"repeat_all",
"repeat_one",
"repeat_off",
"repeat_toggle",
"shuffle_on",
"shuffle_off",
"shuffle_toggle",
"record",
"record_stop",
"select_audio_track",
"select_srt_track",
"select_stream",
}
Avec d'autres paramètres… :
{"seek_position": 0, "type": "seek_position"}
media_control_stream = {"quality": "", "source": ""}
media_control_stream_args = {"stream": media_control_stream, "type": "stream"}
{"track_id": 0, "type": "track_id"}
{"args": media_control_stream_args, "cmd": "pause"}
Voir https://github.com/Aymkdn/assistant-freebox-cloud/issues/113#issuecomment-669188691