Conversion de programme de chaine au format XMLTV

Tout ce qui concerne le package XMLTV officiel.

Modérateurs : Modérateurs, Développeurs

Règles du forum
Rappel: Conditions générales d'utilisation du forum zguidetv.net

Pensez à effectuer une recherche, la réponse à votre question a de grandes chances d'avoir déjà été donnée.

Pensez également à consulter les FAQ

On ne hurle pas, on respecte l'opinion de chaque personne, on reste aimable et on respecte le travail des autres, c'est la base d'une entraide constructive.

Tout post ne respectant pas les Règles du forum sera effacé sans préavis.
SkipCool
Beta testeur
Messages : 60
Enregistré le : 30 avr. 2006 21:42
Localisation : Toulouse

Conversion de programme de chaine au format XMLTV

Message non lu par SkipCool » 06 mars 2010 11:44

Bonjour à tous,
je me suis décidé à donner à la communauté quelques outils que j'ai développé pour convertir des programmes télés de certaines chaines au format XMLTV.
Je tiens à préciser que les programmes sont dispos sur les sites des différentes chaines.

1ère chaine : i-concerts
- Etape 1 : récupérer le nouveau programme... lorsqu'il y'en a un ! Le programme est disponible sous la forme d'un PDF sur le site d iconcerts.
Ce PDF est généré à partir d'un tableau excel, vraisemblablement manuellement! Le nom du fichier est donc assez aléatoire...

- Etape 2 : convertir le PDF en tableau
J'utilise la commande pdftotext pour convertir le PDF en texte plein format, et après c'est du bidouillage.

Etape 3 : mouliner le tableau pour en faire du xmltv.
J'utilise du code sous python, mais n'importe quel langage de programmation peut être utilisé.

Code : Tout sélectionner

pdftotext $PDFFILE -layout -nopgbrk iconcerts.txt
sed 's/\s\{2,\}/\;/g' iconcerts.txt  | grep -v '^;.*$' | grep -v '^$' > iconcerts.cvs
python iconcertcvs2xml.py > iconcerts.xml
Le fichier python

Code : Tout sélectionner

#coding=UTF-8 
# Probleme actuel non résolu : 
# - la sortie se fait ... en mono ligne. ça doit etre possible de faire ça mieux
# - le décalage "horaire" est écrit en dur.
# - le changement d'annee peut poser pb.

from xml.dom.minidom import Document
from datetime import date
import re
import csv

today = date.today()

xmldoc = Document()
xmltag = xmldoc.createElement("tv")
xmlchild = xmldoc.createElement("channel")
xmlchild.setAttribute("id","iconcerts.fr")
xmlchild2 = xmldoc.createElement("display-name")
xmlchild2.appendChild(xmldoc.createTextNode("i-concerts"))
xmlchild.appendChild(xmlchild2)
xmltag.appendChild(xmlchild)

cvsreader = csv.reader(open("iconcerts.cvs","rb"), delimiter=";")
x = 0
startvalue = ""
stopvalue = ""
titlevalue = ""
descvalue = ""

for i in cvsreader:
	year = today.year
# c'est chiant, mais y'a pas plus court.
	month = re.sub('[a-zA-Z]* [0-9]*','',i[0])
	month = re.sub('janvier','01',month)
	month = re.sub('f\S*vrier','02',month)
	month = re.sub('mars','03',month)
	month = re.sub('avril','04',month)
	month = re.sub('mai','05',month)
	month = re.sub('juin','06',month)
	month = re.sub('juilet','07',month)
	month = re.sub('ao\S*t','08',month)
	month = re.sub('septembre','09',month)
	month = re.sub('octobre','10',month)
	month = re.sub('novembre','11',month)
	month = re.sub('d\S*cembre','12',month)
# on repart de la date et on supprime tous les champs de texte pour garder le jour
	day = re.sub('\D*','',i[0])
	if len(day) == 1:
		day = '0'+day
	time = re.sub(r'\:','',i[1])

	if x > 0:
		# on a deja fait notre boucle une fois. Nos variables sont donc initialisés.
		xmlchild = xmldoc.createElement("programme")
		xmlchild.setAttribute("channel","iconcerts.fr")
		xmlchild.setAttribute("start",startvalue)
		xmlchild.setAttribute("stop",repr(year)+month+day+time+'00 +0100')
		xmlchild2 = xmldoc.createElement("title")
		xmlchild2.appendChild(xmldoc.createTextNode(titlevalue))
		xmlchild.appendChild(xmlchild2)
		xmlchild2 = xmldoc.createElement("desc")
		xmlchild2.appendChild(xmldoc.createTextNode(descvalue))
		xmlchild.appendChild(xmlchild2)
		xmlchild2 = xmldoc.createElement("category")
		xmlchild2.appendChild(xmldoc.createTextNode("Musique"))
		xmlchild.appendChild(xmlchild2)
		xmltag.appendChild(xmlchild)

	startvalue = repr(year)+month+day+time+'00 +0100'
	titlevalue = i[2]
	try:
		descvalue = i[3] + ' - ' + i[2]
	except IndexError:
		descvalue = i[2]
# de meme, si on pouvait recuperer le decalage horaire, ca serait plus pratique.
	x = x+1

xmlchild = xmldoc.createElement("programme")
xmlchild.setAttribute("channel","iconcerts.fr")
xmlchild.setAttribute("start",startvalue)
xmlchild2 = xmldoc.createElement("title")
xmlchild2.appendChild(xmldoc.createTextNode(titlevalue))
xmlchild.appendChild(xmlchild2)
xmlchild2 = xmldoc.createElement("desc")
xmlchild2.appendChild(xmldoc.createTextNode(descvalue))
xmlchild2 = xmldoc.createElement("category")
xmlchild2.appendChild(xmldoc.createTextNode("Musique"))
xmlchild.appendChild(xmlchild2)
xmltag.appendChild(xmlchild)
xmldoc.appendChild(xmltag)
print xmldoc.toxml()

2e chaine : Nolife
Nolife fournit des programmes au format xml, mais dans un format propriétaire (noair).
C'est donc plus simple : un fichier XSL de conversion du format xml est utilisé et appliqué (utilisation de xsltproc sous *nix)
Seul "défaut" : Nolife ne fournit pas beaucoup de programmes en avance (entre 1 et 4 jours).
PS : et pour les français, penser à vous abonner!

Code : Tout sélectionner

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:date="http://exslt.org/dates-and-times"
  extension-element-prefixes="date"
  >

	<xsl:output method="xml"
		indent="yes"
		encoding="UTF-8"
		omit-xml-declaration="no"/>
	<xsl:template match="/">
		<xsl:comment> Programme de NoLife en xmltv </xsl:comment>
		<tv source-info-name="NoAir" generator-info-name="NoAirToXMLTV" source-info-url="http://www.nolife-tv.com/noair/noair.xml">
		<channel id="nolife.fr">
			<display-name>NoLife</display-name>
		</channel>
		<xsl:for-each select="/NoAir/slot">
			<xsl:if test="position() != last()">
				<xsl:element name="programme">
					<xsl:attribute name="start">
						<xsl:value-of select="concat(translate(@date,'/: ',''), ' +0100')" />
					</xsl:attribute>
					<xsl:attribute name="stop">
    <!---  
la date de stop correspond à l'attribut date du prochain element.
     -->
 						<xsl:value-of select="concat(translate(following-sibling::*[position()=1]/@date,'/: ',''), ' +0100')" />
					</xsl:attribute>
					<xsl:attribute name="channel">nolife.fr</xsl:attribute>
					<xsl:element name="title">
						<xsl:value-of select="concat(@title,' ',@sub-title)" />
					</xsl:element>
					<xsl:element name="desc">
						<xsl:value-of select="concat(@description,' ', @detail)" />
					</xsl:element>
					<xsl:element name="category">
						<xsl:choose>
							<xsl:when test="@color = 'red'">Musique</xsl:when>
							<xsl:when test="@color = 'blue'">Magazine</xsl:when>
							<xsl:when test="@color = 'yellow'">Musique</xsl:when>
							<xsl:when test="@color = 'white'">Information</xsl:when>
							<xsl:when test="@color = 'green'">Magazine</xsl:when>
							<xsl:when test="@color = 'pink'">Magazine</xsl:when>
							<xsl:when test="@color = 'purple'">Série</xsl:when>
						</xsl:choose>
					</xsl:element>
				</xsl:element>
			</xsl:if>
		</xsl:for-each>
		</tv>
	</xsl:template>
</xsl:stylesheet>

Carmody
Nouveau
Messages : 1
Enregistré le : 28 mai 2010 7:09

Re: Conversion de programme de chaine au format XMLTV

Message non lu par Carmody » 28 mai 2010 7:12

Bonjour,


Ca a l'air très intéressant, par contre j'ai un souci :

Code : Tout sélectionner

xsltproc -v nolife.xsl


creating dictionary for stylesheet
reusing dictionary from nolife.xsl for stylesheet
xsltParseStylesheetProcess : found stylesheet
add extension prefix date
Registering extension namespace 'http://exslt.org/dates-and-times'.
Attempting to load plugin: /usr/lib/libxslt-plugins/exslt_org_dates_and_times.so for URI: http://exslt.org/dates-and-times
xmlCheckFilename failed for plugin: /usr/lib/libxslt-plugins/exslt_org_dates_and_times.so
xsltPrecomputeStylesheet: removing ignorable blank node
xsltCompilePattern : parsing '/'
xsltCompilePattern : parsed /, default priority 0.500000
added pattern : '/' priority 0.500000
parsed 1 templates
Resolving attribute sets references
freeing dictionary from stylesheet
Ai-je loupé un truc ?
l'url http://exslt.org/dates-and-times renvoie un 404 (probablement la cause du souci ^^)

Merci d'avance de ton aide

SkipCool
Beta testeur
Messages : 60
Enregistré le : 30 avr. 2006 21:42
Localisation : Toulouse

Re: Conversion de programme de chaine au format XMLTV

Message non lu par SkipCool » 05 juin 2010 10:03

Oula !

En fait, l'adresse internet pointe bien dans le vide, mais c'est pas trop grave car elle est là uniquement pour indiquer le "nom" du module à charger (c'est un "namespace" en fait)

Et apparement je n'ai pas le souci sur mon nouveau xubuntu ; je pense que le module doit y être installé par défaut ; je sais pas trop quoi te dire : regarde sur le site on peut y télécharger le module :

http://exslt.org/date/index.html

Par contre, ça ne résoudra qu'à moitié le problème car i concert a arrêté de fournir son programme au format PDF pour fournir un epg en AJAX sur son site web il y a un mois ...
Donc la conversion ne fonctionne plus ;

Répondre