XML TV Fr est un service permettant de récupérer un guide des programmes au format XMLTV.
Site web et documentation : https://xmltvfr.fr/
PHP >=7.1.0 avec les extensions
- curl
- zip
- mbstring
- xml
- json
Un composer install
est requis pour utiliser le script.
Cette partie va vous permettre de configurer XML TV Fr.
La liste des chaines doit être indiquée dans le fichier channels.json au format JSON. Chaque chaine correspond à l'ID d'une chaine (Exemple : France2.fr) présente dans les fichiers de chaines par services (dossier channels_by_providers). La structure d'un item se fait comme ceci :
"IdDelaChaineDansLeProgramme":{"name":"Nom de la chaine","alias":"IDdeLaChaineDansLeXMLTV", "icon":"http://icone de la chaine","priority":["Service1","Service2"]}
Les champs name, icon, alias et priority sont optionnels. Le champ priority donne un ordre de priorité différent de celui par défaut en indiquant les noms des services (nom des classes dans le dossier classes). Dans l'exemple, Service1 sera appelé en premier et Service2 ne sera appelé que si Service1 échoue. Par exemple si on met en priorité Télérama puis Orange, Télérama sera lancé. Si aucun programme n'est trouvé sur Télérama, Orange est lancé, sinon on continue. Si aucun programme n'est trouvé sur tous les services, la chaine est indiquée HS pour le jour concerné. Le champ alias permet de donner un ID alternatif à une chaine que celui renseigné par défaut. Si le champ est absent, c'est l'ID par défaut renseigné dans XML TV Fr qui sera affiché.
Le fichier config.json est au format JSON.
{
"days" : 1, // Nombre de jours de l'EPG
"cache_max_days": 8, // Nombre de jours de cache
"output_path": "./xmltv/", // Chemin de destination du XML final
"time_limit": 0, // Temps d'éxécution max du script (0=illimité)
"memory_limit": -1, // Quantité de mémoire vive max (-1=illimité)
"delete_raw_xml": false, // Supprimer le XML brut après génération (true|false)
"enable_gz": false, // Activer la compression gz (true|false)
"enable_zip": true // Activer la compression zip (true|false),
"enable_dummy" : false, // Afficher un EPG mire en cas d'absence de guide pour une chaine
"custom_priority_orders" : {"Telerama": 0.2, "UltraNature": 0.5}, // Modifier l'ordre de priorité pour certains services globalement
"guides_to_generate" : [{"channels": "config/channels.json", "filename": "xmltv.xml"}] // liste des XML à générer. Pour chaque élément, `channels` indique le fichier des chaines et `filename` le nom du fichier de sortie
}
Pour démarrer la récupération du guide des programmes, lancez cette commande dans votre terminal (dans le dossier du programme).
php example/script_all.php
Il est possible de générer depuis votre navigateur le fichier channels.json. Pour cela, placez vous dans le dossier de travail du programme et lancez cette commande
php -S localhost:8080 -t tools
Note : le port 8080 peut être changé par un autre.
Ouvrez ensuite dans votre navigateur http://localhost:8080/ (port à modifier en fonction de celui indiqué dans la commande au dessus).
Les logs sont stockés dans le dossier logs au format JSON. Les derniers logs sont accessibles via le navigateur à l'adresse http://localhost:8080/logs.php (à condition d'avoir lancé la commande précédente).
Les fichiers de sorties XML sont stockés dans le dossier xmltv au format XML, ZIP et GZ. Cette commande indiquera si le dernier fichier XML généré est valide.
Il est possible d'ajouter des services (Provider
) autres que ceux fournis. Pour cela, il faut ajouter une classe dans le dossier src/Component/Provider
qui implémente l'interface ProviderInterface et étendre la classe AbstractProvider.
Le constructeur aura le chemin des XML temporaires d'indiqué.
La méthode getPriority()
doit retourner un flottant entre 0 et 1 pour indiquer la priorité par rapport à d'autres services (comparez les valeurs des autres scripts pour vous situer). L'ordre de priorité doit être indiqué dans le second paramètre du constructeur parent. La méthode getPriority()
est déjà implémentée dans la classe abstraite.
La méthode constructEPG(channel,date)
construira un fichier XML pour une chaine à une date donnée. Elle retourne un objet Channel
si la tâche s'est déroulée avec succès, sinon false
.
L'instance de chaque Provider
par date possédera un attribut channelObj
étant une instance de la classe Channel (si constructEPG
appelle la classe parente). A cette instance de classe Channel
, vous pourrez ajouter des programmes (instances de la classe Program
) avec la méthode addProgram($start, $end)
($start
et $end
étant des timestamp UNIX) et sur l'instance de chaque programme, vous pourrez définir les infos telles que le titre, les catégories, ... Une fois l'ajout des programmes terminé, il suffira d'appeller la méthode save()
de l'attribut channelObj
pour enregistrer le fichier XML pour la chaine et la date en question.
Exemple :
function constructEPG($channel, $date)
{
parent::constructEPG($channel, $date);
$error = false;
foreach($results as $result) {
$program = $this->channelObj->addProgram(strtotime($result['start']), strtotime($result['end']));
$program->addTitle($result["title"], "en"); // argument langue optionnel, par defaut = "fr"
$program->setIcon("myIconUrl");
$program->addCategory(...)
$program->addSubtitle(...)
...
}
if($error){
return false;
}
return $this->channelObj;
}
Attention, le nom de la classe du service doit correspondre à son nom de fichier. Bien que PHP, contrairement à Java autorise des noms différents, le programme ici ne le permet pas.