Page 1 sur 1

Conversion de programme de chaine au format XMLTV

Posté : 06 mars 2010 11:44
par SkipCool
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>

Re: Conversion de programme de chaine au format XMLTV

Posté : 28 mai 2010 7:12
par Carmody
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

Re: Conversion de programme de chaine au format XMLTV

Posté : 05 juin 2010 10:03
par SkipCool
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 ;