Skip to content

Player API

Aymeric edited this page Aug 27, 2023 · 32 revisions

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 :
Capture

À 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.

Lister les players

GET https://mafreebox.freebox.fr/api/v6/player

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';

État du Player

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"
  }
}

Paramètres

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 que cur_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" et cur_url est vide
  • Dans "Freebox Replay", "package_id":24, "package":"fr.freebox.vodlauncher" et cur_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" et cur_url est vide
  • Dans le "Guide des Programmes", "package_id":29, "package":"fr.freebox.epg" et cur_url est vide
  • Pendant la lecture d'un enregistrement, "package_id":6, "package":"fr.freebox.mediaplayer" et cur_url est vide
  • Dans "Mes Vidéos", "package_id":31, "package":"fr.freebox.filebrowser" et cur_url est vide ; mais lorsqu'on lit une vidéo du disque dur cur_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" et cur_url est vide

Récupération des chaines avec leur uuid

GET https://mafreebox.freebox.fr/api/v6/tv/channels/

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
    }
  }
}

Lancer un média / une application

Cette action allumera automatiquement le player s'il ne l'est pas déjà.

Lancer une chaîne de TV

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" }

Service Freebox Replay

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" }

Ouvrir une page Web

Pour ouvrir une page web dans le navigateur :

{ "url": "https://www.google.fr" }

Pour lancer Netflix, Amazon Prime ou Youtube

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" }

Pour lancer une application

On utilise app: et le nom du package :

{ "url": "app:fr.freebox.radio" }

Pour aller dans certains répertoires

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 une radio

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 lancer une vidéo

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
}

Récupération du volume

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
   }
}

Définir le volume

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 }

Contrôle de la lecture

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"}

Associer une chaine avec un numéro de chaine

Voir https://github.com/Aymkdn/assistant-freebox-cloud/issues/113#issuecomment-669188691

Clone this wiki locally