Freebox Server (Ultra V9/ Pop V8/ Delta V7 / Revolution V6 / Mini 4K)

  • État Nouveau
  • Pourcentage achevé
    0%
  • Type Anomalie
  • Catégorie Freebox OS → API
  • Assignée à Personne
  • Système d'exploitation Tous
  • Sévérité Basse
  • Priorité Très Basse
  • Basée sur la version 4.9.0
  • Due pour la version Non décidée
  • Échéance Non décidée
  • Votes
  • Privée

FS#40136 - Impossible de changer de chaine sur le player avec l'API

Bonjour

J'ai suivi la documentation pour pourvoir changer de chaine sur le player DEVIALET

Open TV on channel 2:

POST /api/v8/player/{id_player}/api/v6/control/open
{ "url": "tv:?channel=2" }

Malheureusement j'obtiens un message d'erreur

POST sur la l'adresse mafreebox.freebox.fr/api/v14/player/17/api/v6/control/open/({"url":"tv:?channel=2"})
{"msg":"Invalid request: cannot parse json","success":false,"error_code":"invalid_request"}
ERROR  Erreur AUTRE : Invalid request: cannot parse json

je voudrais savoir ce qu'il manque ou que je fais mal pour résoudre mon problème

les autres actions fonctionnent bien comme changé le volume

PUT sur la l'adresse mafreebox.freebox.fr/api/v14/player/17/api/v6/control/volume/({"volume":"61"})
{"success":true,"result":{"mute":false,"volume":61}}

A disposition pour plus de renseignements

nbanba a commenté le 22.03.2025 10:14

Bonjour

La version d'API est erronée :
Chez moi sur le Devialet:

$ get_fbx_api player | jq
{
  "success": true,
  "result": [
    {
      "mac": "34:27:92:80:29:7c",
      "stb_type": "stb_v7",
      "id": 17,
      "last_time_reachable": 1742638051,
      "api_available": true,
      "device_name": "Freebox Player",
      "device_model": "fbx7hd-delta",
      "reachable": true,
      "uid": "a51dde83e07a057e64bef5bdcac8c5e2",
      "api_version": "13.0",
      "lan_gids": [
        "ether-34:27:92:80:29:7c"
      ]
    }
  ]
}

Je récupère la valeur:

$ get_fbx_api player | jq .result[].api_version
"13.0"

Plus simplement:

$ player_list
----------------------------------------------------------------------------------------------------
			ID, PLAYER NAME, PLAYER MODEL, PLAYER API VERSION
----------------------------------------------------------------------------------------------------
PLAYER-0:	id: 17  mac: 34:27:92:80:29:7c  model: fbx7hd-delta  api: 13.0  name: Freebox Player

Et donc quand je fais le POST ça fonctionne:

$ post_fbx_api player/17/api/v13/control/open/ '{"url":"tv:?channel=2"}'
{"success":true}

NB:
ici les fonctions "get_fbx_api" et "post_fbx_api" contient déjà une partie de l'URL: '/api/v14/'
Je passe donc en argument uniquement la partie de l'URL qui vient après soit 'player/17/api/v13/control/open/'

Cordialement
nbanba

JA_G a commenté le 23.03.2025 10:04

Bonjour,
je viens de faire le nécessaire pour récupérer la version de l'API du player pour lancer la mise à jour
Je suis en v14 sur le player

{"success":true,"result":[{"mac":"34:27:92:85:09:64","stb_type":"stb_v7","id":17,"last_time_reachable":1742722576,"api_available":true,"device_name":"JAG Freebox Player","device_model":"fbx7hd-delta","reachable":true,"uid":"c0aa11a494f2da369cc5c9b1830a1887","api_version":"14.0","lan_gids":["ether-34:27:92:85:09:64","ether-34:27:92:85:09:65"]}]}

Si lance la requête qui permet de rallumer le player en lançant la dernière chaine ouverte cela fonction

POST sur la l'adresse mafreebox.freebox.fr/api/v14/player/17/api/v14/control/open({"url":"app:fr.freebox.tv"})
{"success":true}

si je lance la requête pour le changement de chaine, j'ai toujours l'erreur

POST sur la l'adresse mafreebox.freebox.fr/api/v14/player/17/api/v14/control/open/({"url":"tv:?channel=24"})
{"msg":"Invalid request: cannot parse json","success":false,"error_code":"invalid_request"}

si j'utilise la nouvelle méthode décrite sur ce site https://github.com/Aymkdn/assistant-freebox-cloud/wiki/Player-API j'ai aussi la même erreur

POST sur la l'adresse mafreebox.freebox.fr/api/v14/player/17/api/v14/control/open/({"url":"app:fr.freebox.tv?channel=24"})
{"msg":"Invalid request: cannot parse json","success":false,"error_code":"invalid_request"}

A disposition pour d'autres tests

nbanba a commenté le 23.03.2025 10:22

Bonjour

Alors je ne comprends pas:

Quand je fais depuis un terminal linux :

$ curl -s --cacert /dev/shm/fbx-cacert -H "Content-Type: application/json" -H "X-Fbx-App-Auth: $_SESSION_TOKEN" -X POST https://mafreebox.freebox.fr/api/v14/player/17/api/v13/control/open/ -d '{"url":"tv:?channel=2"}'
{"success":true}

Ça fonctionne bien…: {"success":true}

Après :
- je n'ai pas reboot mon player (v13.0) ⇒ peut-être un bug en v14.0 (je vais reboot pour voir)

Question:
Quel outil utilisez vous pour faire les requêtes POST / PUT avec la syntaxe que vous utilisez (à savoir rajouter le json entre parenthèses à la suite de l'URL comme dans votre exemple: mafreebox.freebox.fr/api/v14/player/17/api/v14/control/open/({"url":"app:fr.freebox.tv?channel=24"}) ?

Cordialement
nbanba

nbanba a commenté le 23.03.2025 10:35

Bonjour

Non ça ne change rien après reboot du player (api player version 14.0):

$ reboot_player  17

operation completed 
{"success":true}

puis :

$ get_fbx_api player | jq .result[].api_version
"14.0"

Et que je refais la requête:

$ curl -s \
--cacert /dev/shm/fbx-cacert \
-H "Content-Type: application/json" \
-H "X-Fbx-App-Auth: $_SESSION_TOKEN" \
-X POST \
https://mafreebox.freebox.fr/api/v14/player/17/api/v14/control/open/ \
-d '{"url":"tv:?channel=3"}'

{"success":true}

PS: par contre j'ai trouvé un autre bug avec le player (⇒ nouveau ticket)

Cordialement
nbanba

JA_G a commenté le 23.03.2025 10:43
({"url":"app:fr.freebox.tv?channel=24"}) ? 

C'est juste le formatage des logs. je viens de les enlever pour éviter de croire qu'il y a un problème
je passe par Jeedom et le plugin Freebox

OST sur la l'adresse mafreebox.freebox.fr/api/v14/player/17/api/v14/control/open/{"url":"app:fr.freebox.tv?channel=24"}
{"msg":"Invalid request: cannot parse json","success":false,"error_code":"invalid_request"}
PS: par contre j'ai trouvé un autre bug avec le player (⇒ nouveau ticket) 

quoi comme bug ?

nbanba a commenté le 23.03.2025 11:32

Bonjour

Un truc un peu ballot :
https://dev.freebox.fr/bugs/task/40140

Par contre à vous lire, il est possible que le plugin JDOM ait un souci de parsing avec le '?' dans le JSON qui serait pris comme un paramètre HTML (= un BUG plugin Jdoom)

Si depuis votre VM Jdom vous avez accès au shell (pas besoin d'être root, just un bash en version supérieur à bash 4.2 (déjà très vieux)), alors je vous recommande d'utiliser la library bash que j'utilise
ça permet d'utiliser l'API depuis la ligne de commande et chacune des "fonctions frontend" sont utilisables comme des commandes intégrées nativement au shell bash
La library est ici:
https://github.com/nbanb/fbx-delta-nba_bash_api.sh

(PS: après vous faite un script avec les fonctions de l'API puis vous dites à JDOM de lancer le script … ça doit fonctionner ça, non ?)

Cordialement
nbanba

nbanba a commenté le 23.03.2025 13:01

Bonjour

Bien qu'il ne soit pas sure que ca fonctionne, à votre place et pour WORKARROUND j'essayerai des trucs comme

'{"url":"tv:?channel=3"}'

Ou encore

{"url":"tv\:?channel=3"}

Ou encore

{"url":"tv:\?channel=3"}

Ou encore

{"url":"tv:?channel\=3"}

Ou encore toutes combinaisons:

{"url":"tv\:\?channel=3"}
# or
{"url":"tv\:?channel\=3"}
# or
{"url":"tv\:\?channel\=3"}
# or ...

Enfin pour voir si ça fonctionne en échappant certains caractères…

Disposez de fonctions type
base64_encode
base64_decode
?

Si oui à votre place j'essayerai de send à la box la requête en temps que résultats d'un truc comme:
echo $(base64_encode $request $json_param) | base64_decode

En dernier lieu j'ouvrirai un ticket sur le github des développeurs du plugin JDOOM en donnant la référence de ce present ticket
(si ce github existe… Après je serais surpris du contraire)
Si vous ouvrez un tel ticket j'apprécierai que vous me mettiez en copie des échanges (mon compte github : https://github.com/nbanb).

En vous remerciant d'avance,

Cordialement
nbanba

JA_G a commenté le 23.03.2025 14:00

Bonjour,
C'est moi qui est repris le plugin il est la
https://github.com/JEALG/Jeedom-Freebox_OS

Merci pour la fonction reboot, je viens de l'ajouter

Par contre cela ne fonctionne pas les combinaisons

nbanba a commenté le 23.03.2025 18:21

Bonjour

Merci pour l'ajout sur github

de mon côté j'ai également (inconnu de la doc)

reboot_freeplug () {
device="freeplug"
local freeplug_id=${1}
mac_id_reboot_err $freeplug_id
local result=$(add_freebox_api freeplug/${freeplug_id}/reset {})
colorize_output "${result}" || echo -e "${result}"
}

reboot_repeater () {
device="repeater"
local repeater_id=${1}
num_id_reboot_err $repeater_id
local result=$(add_freebox_api repeater/${repeater_id}/reboot {})
colorize_output "${result}" || echo -e "${result}"
}

reboot_wifi-ap () {
device="wifi-ap"
local wifi_ap_id=${1}
num_id_reboot_err $wifi_ap_id
local result=$(add_freebox_api wifi/ap/${wifi_ap_id}/restart {})
colorize_output "${result}" || echo -e "${result}"
}

reboot_player () {
device="player"
local player_id=${1}
local api_version=""
local idpla=0
num_id_reboot_err $player_id
answer=$(get_freebox_api player)
dump_json_keys_values "$answer" >/dev/null
while [[ $(get_json_value_for_key "$answer" "result[$idpla].id") != "" ]] 
do
        local id[$idpla]=$(get_json_value_for_key "$answer" "result[$idpla].id")
        local api[$idpla]=$(get_json_value_for_key "$answer" "result[$idpla].api_version")
        [[ "${player_id}" == "${id[$idpla]}" ]] && api_version=${api[$idpla]//\.0/}
        ((idpla++))
done
local result=$(add_freebox_api player/${player_id}/api/v${api_version}/system/reboot {})
colorize_output "${result}" || echo -e "${result}"
}

reboot_freebox () {
    # NBA modify for getting reboot status from API 
    #call_freebox_api '/system/reboot' '{}' >/dev/null
local result=$(call_freebox_api '/system/reboot' '{}')
colorize_output "${result}" || echo -e "${result}"
}

shutdown_freebox () {
    #call_freebox_api '/system/shutdown' '{}' 
local result=$(call_freebox_api '/system/shutdown' '{}')
colorize_output "${result}" || echo -e "${result}"
}

Et aussi la gestion des certificats / noms de domaines

domain_addcert     
domain_list       
domain_setdefault  
domain_add         
domain_del

Regardez le code des fonctions dans la lib BASH que j'ai écrite, il y a les requêtes et les JSON
https://github.com/nbanb/fbx-delta-nba_bash_api.sh

Cordialement
nbanba

Chargement...

Activer les raccourcis clavier

Liste des tâches

Détails de la tâche

Édition de la tâche