Aymkdn / assistant-freebox-cloud

Assistant Freebox in the Cloud
74 stars 14 forks source link

Numéro de chaine et logo #113

Closed Aymkdn closed 4 years ago

Aymkdn commented 4 years ago

J'ai parlé à un développeur de Free qui m'a indiqué qu'une partie seulement de l'API Player est disponible pour la Freebox Révolution

@Aymkdn : je suis en train de regarder l'API player, effectivement j'arrive a avoir le numero de la chaine par contre je ne vois pas comment faire une relation entre le numero de la chaine et le logo ? je ne sais pas si tu as eu des info la dessus ?

Originally posted by @bugsounet in https://github.com/Aymkdn/assistant-freebox-cloud/issues/70#issuecomment-668756817

Aymkdn commented 4 years ago

Si tu utilises l'API Player, alors tu peux récupérer la liste des chaines puis le uuid te sert pour lancer la chaine :

POST https://mafreebox.freebox.fr/api/v6/player/PLAYER_ID/api/PLAYER_API_VERSION/control/open { "url": "tv://?uuid=uuid-webtv-XXXX" }

Il n'y a cependant pas de lien avec le numéro de la chaine (par exemple on ne sait pas que M6 est sur la 6).

bugsounet commented 4 years ago

Explications et but Sur un Mirroir Magique:

Ce qui est fait

En cours récupération de logos et autres infos: (utilisation uniquement JS) pas de souci de ce côté la:

Premiere idée:

-> essai avec les 29 premieres chaines: pas de souci cela fonctionne -> Probleme demande de faire 900 entrées a la main ! (ça commence a faire beaucoup)

Deuxieme idée: faire une base de donnée des chaines avec ce qui est disponible avec l'api player/server Apres des recherches j'ai reussi a trouver ceci: http://mafreebox.freebox.fr/api/v8/tv/bouquets/

{"success":true,"result":[{"id":518,"channel_count":32,"name":"TNT player 1 (1)","state":"ready"},{"id":517,"channel_count":583,"name":"Freebox TV","state":"ready"}]}

cela retourne les bouquets souscrits On vois ici 2 id: 517 et 518

lorsque je reporte cette id dans: http://mafreebox.freebox.fr/api/v3/tv/bouquets/[id]/channels

pour le bouquet freebox, il y a une réponse numero de chaine/logo avec l'ensemble des chaînes de ce bouquet dans result:{} par exemple pour la chaine 1:

{"number":1,"uuid":"uuid-webtv-612","pub_service":true,"available":true,"streams":[{"rtsp":"rtsp:\/\/192.168.0.103\/fbxdvb\/stream?tsid=6&nid=8442&sid=1537&frontend=1","type":"dvb","quality":"sd"}],"sub_number":0}

l'uuid de TF1 est donc : uuid-webtv-612 pour avoir le logo de la chaine : il suffit de rajouter l'extension .png et arborescence qui va bien http://mafreebox.free.fr/api/v8/tv/img/channels/logos68x60/uuid-webtv-612.png

Magie On a donc le lien entre la chaine et le logo On peux donc faire une relation entre ce dernier et http://mafreebox.freebox.fr/api/v8/player/1/api/v8/status/ Problème: uniquement sur les bouquets auquel on est abonné (deuxième solution)

Si cela peux aider quelqu'un ;)

Aymkdn commented 4 years ago

Bien joué 👍

Merci pour le partage : je l'ai rajouté en bas de la "doc" sur le Player API.

rickeymandraque commented 2 years ago

Bonjour à tous. Je sais très bien que cette issue est fermée mais je tenais à partager mon petit travail. Je cherchais à faire comme vous, combiner les noms de chaînes, les identifiants, etc... Je travail sur du bash pour le moment et j'ai trouvé un début de piste car le script reste encore à améliorer.

Le principe est de :

Si on lance curl et jq en sélectionnant la variable "\(.uuid)", voila que l'on obtient :

curl -s "http://mafreebox.freebox.fr/api/v8/tv/bouquets/freeboxtv/channels/" | jq -r .result | jq -r '.[] | "\(.uuid)"'

Sortie :

uuid-webtv-223
uuid-webtv-309
uuid-webtv-747
uuid-webtv-1167

nous pouvons ajouter n'importe quel chaîne de caractère avant ou après la variable, seuls les caractères spéciaux doivent être échappés comme les guillemets :

curl -s "http://mafreebox.freebox.fr/api/v8/tv/bouquets/freeboxtv/channels/" | jq -r .result | jq -r '.[] | " toto \(.uuid)"'

Sortie :

toto uuid-webtv-223
toto uuid-webtv-309
toto uuid-webtv-747
toto uuid-webtv-1167
curl -s "http://mafreebox.freebox.fr/api/v8/tv/bouquets/freeboxtv/channels/" | jq -r .result | jq -r '.[] | "\"\(.uuid)\":{\"number\":\(.number),\"uuid\":\"\(.uuid)\",\"pub_service\":\(.pub_service),\"available\":\(.available),\"streams\":\(.streams),\"sub_number\":\(.sub_number)},"' | sed '$ s/,$//g'

Et cela nous donne un fichier JSON avec les même index que tv/channels !

{
    "uuid-webtv-223": {
        "number": 245,
        "uuid": "uuid-webtv-223",
        "pub_service": true,
        "available": true,
        "streams": [
            {
                "rtsp": "rtsp://mafreebox.freebox.fr/fbxtv_pub/stream?namespace=1&service=223&flavour=sd",
                "type": "iptv",
                "hls": "http://mafreebox.freebox.fr:8765/service/223/sd/master.m3u8",
                "quality": "sd"
            }
        ],
        "sub_number": 0
    }
}

Il nous reste plus qu'à concaténer les 2 fichiers avec jq maintenant qu'ils ont le même index !

jq -s '.[0] * .[1]' "channels.json" "bouquet.json"

Et en script bash, voici ce que cela donne :

 #!/bin/bash

# Fichiers et URLs
bouquet_file="./bouquet.json"
channel_file="./channels.json"
final_json="./merged.json"
FreeboxURLBase="http://mafreebox.freebox.fr"
# possible de récupérer la version via un "curl | jq .version | cut -d '.' -f1" mais bon...
FreeboxAPIBase="${FreeboxURLBase}/api/v8"
FreeboxTVAPI="${FreeboxAPIBase}/tv"
Channels_list="${FreeboxTVAPI}/channels"
Bouquets_list="${FreeboxTVAPI}/bouquets"
Channels_Freebox="${Bouquets_list}/freeboxtv/channels/"

# fonction qui permet de builder un json valide depuis bouquets/freeboxtv en enlevant la derniere virgule
function JSON_Rebuilder {

    jq -r '.[] | "\"\(.uuid)\":{\"number\":\(.number),\"uuid\":\"\(.uuid)\",\"pub_service\":\(.pub_service),\"available\":\(.available),\"streams\":\(.streams),\"sub_number\":\(.sub_number)},"' | sed '$ s/,$//g'

}
function Build_JSON {
        # on télécharge la liste des chaînes sur channels et on commence à partir de result. on enregistre la sortie vers le fichier channels.json
    curl -s "$Channels_list" | jq -r .result >"$channel_file"
        # on créer un fichier bouquet.json en y insérant une accolade au début
    echo '{' >"$bouquet_file"
        # on télécharge la liste des chaînes depuis bouquet/freeboxtv on le pipe à notre fonction et on l’envoie dans bouquet.json
    curl -s "$Channels_Freebox" | jq -r .result | JSON_Rebuilder >>"$bouquet_file"
        # on ferme l'accolade de bouquet.json
    echo '}' >>"$bouquet_file"
        # on merge nos deux fichier avec jq et l'option "-s" pour "--slurpfile"
        #  ".[0] *" veux dire tous ce qui a dans le 1er fichier dans le 2nd fichier (".[1]") 
        jq -s '.[0] * .[1]' "$channel_file" "$bouquet_file"
        # On supprime nos fichier, ils ne nous sont plus utiles.
    rm "$channel_file" "$bouquet_file"
}
# on appelle notre fonction et on exporte le tout dans le fichier merged.json
Build_JSON >"$final_json"
echo "ok"

et voici le résultat ici

Il reste encore quelque anomalies tel que des doublons lorsque l'on veut faire un JSON à partir d'un bouquet perso ou des chaînes comme SyFy qui ont une valeur null dans la variable "(.stream)". Cela peut se régler avec un if ou manipuler plus finement les JSON de base.

En espérant que cela aide quelqu'un.

Aymkdn commented 2 years ago

Merci pour le partage 😉