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