{"id":120,"date":"2010-02-03T00:31:52","date_gmt":"2010-02-03T03:31:52","guid":{"rendered":"http:\/\/www.maurom.com\/wp\/?p=120"},"modified":"2015-03-02T10:23:37","modified_gmt":"2015-03-02T13:23:37","slug":"tvtime-xmltv-tv_grab_ar-py","status":"publish","type":"post","link":"https:\/\/maurom.com\/blog\/2010\/02\/03\/tvtime-xmltv-tv_grab_ar-py\/","title":{"rendered":"tvtime + xmltv + tv_grab_ar.py"},"content":{"rendered":"<p>En lo que ha sido del a\u00f1o pasado he dedicado poco tiempo a la TV, tras advertir como se viene abajo la calidad de la programaci\u00f3n (o como cada vez uno se pone m\u00e1s exquisito), me da menos \u00edmpetu. Veo la &#8220;caja boba&#8221; por la PC, como todo el que quiere ahorrar espacio, mediante una peque\u00f1a y econ\u00f3mica placa sintonizadora (<a href=\"http:\/\/www.encore-usa.com\/product_item.php?region=us&amp;bid=2&amp;pgid=17&amp;pid=45\">Encore ENLTV-FM<\/a>) que funciona muy bien en Linux, incluso con control remoto.<\/p>\n<p>Tratando de encontrar alguna emisi\u00f3n como la gente por el canal de cable, hace unos meses me dediqu\u00e9 a hacer funcionar la informaci\u00f3n en pantalla de <a href=\"http:\/\/tvtime.sourceforge.net\/\">tvtime<\/a>. B\u00e1sicamente, tvtime obtiene la informaci\u00f3n de programaci\u00f3n a partir de un archivo con formato est\u00e1ndar <a href=\"http:\/\/wiki.xmltv.org\/index.php\/Main_Page\">XMLTV<\/a>, por lo que del lado del software de visualizaci\u00f3n est\u00e1 todo hecho, lo que falta es conseguir una fuente desde la cual obtener la informaci\u00f3n y entreg\u00e1rsela de la forma adecuada (es decir, generar el archivo <a href=\"http:\/\/wiki.xmltv.org\/index.php\/XMLTVFormat\">XML<\/a>).<\/p>\n<p>De eso se encargan los scripts del paquete <a href=\"http:\/\/packages.debian.org\/lenny\/xmltv-util\">xmltv-util<\/a>. En particular, el script <span style=\"font-style: italic;\">tv_grab_ar<\/span> toma la informaci\u00f3n de mi <a href=\"http:\/\/www.buscadormulticanal.com.ar\/\">proveedor de cable<\/a> en argentina, amasa los datos y escupe un xml que se puede pasar directo a tvtime. Lamentablemente no logr\u00e9 hacer funcionar la versi\u00f3n 1.6 de <span style=\"font-style: italic;\">tv_grab_ar<\/span> tal cual viene en el paquete, y tras varios minutos haciendo debugging sobre las l\u00edneas decid\u00ed dejar de descifrar perl y comenzar a escribir un nuevo script en python.<\/p>\n<p>Las primeras versiones fueron bastante sencillas, la librer\u00eda <span style=\"text-decoration: line-through;\"><a href=\"http:\/\/www.crummy.com\/software\/BeautifulSoup\/\">BeautifulSoup<\/a><\/span> <a href=\"http:\/\/codespeak.net\/lxml\/\">lxml<\/a> (BeautifulSoup ya no funciona correctamente) facilita mucho nadar en el HTML del sitio web de MC. En versiones siguientes a\u00f1ad\u00ed la posibilidad de descargar la rese\u00f1a de cada programa de TV, una funcionalidad que seg\u00fan creo no estaba en el paquete original.<\/p>\n<p>B\u00e1sicamente los pasos son: obtener la grilla de programaci\u00f3n de la semana actual para cada canal, y luego para cada programa obtener el t\u00edtulo, horario, descripci\u00f3n, g\u00e9nero, etc. Como la descarga de descripciones es muy tediosa y lenta (es como m\u00ednimo una petici\u00f3n HTTP por programa) y como muchas veces los programas se repiten (en la misma semana o entre semanas) aprovech\u00e9 el <a href=\"http:\/\/docs.python.org\/library\/pickle.html\">m\u00f3dulo pickle<\/a> para almacenar el diccionario de emisiones entre invocaciones al script, agilizando de esta manera la actualizaci\u00f3n de los datos.<\/p>\n<p>Finalmente termin\u00e9 con este script que dejo en el blog por si a alguien le sirve. Las capturas de pantalla son un indicio de como tvtime presenta la informaci\u00f3n. Como siempre, cualquier consulta, sugerencia, cr\u00edtica o mejora es bienvenida.<\/p>\n<p><strong>Descarga: <a href=\"http:\/\/maurom.com\/files\/tv_grab_ar.py\">tv_grab_ar.py<\/a><\/strong> [ver. 2015.03.02-1]<\/p>\n<p><strong>\u00daltimos cambios:<\/strong>\u00a0Fix sutil por problemas en la codificaci\u00f3n de los t\u00edtulos. Reincorporaci\u00f3n del cach\u00e9 y de la descarga de descripciones de los shows. Sean pacientes pues la descarga ahora demora bastante m\u00e1s tiempo que antes. Si quieren la programaci\u00f3n r\u00e1pidamente, aunque no tenga las descripciones, usen &#8211;skip-descriptions. Como no tengo forma de probarlo localmente, <strong>Please Test &amp; Give Feedback!<\/strong><\/p>\n<p><a href=\"http:\/\/www.maurom.com\/blog\/wp-content\/uploads\/2012\/05\/pantallazo-tvtime2.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-122\" title=\"pantallazo-tvtime2\" src=\"http:\/\/www.maurom.com\/blog\/wp-content\/uploads\/2012\/05\/pantallazo-tvtime2.jpg\" alt=\"\" width=\"550\" srcset=\"https:\/\/maurom.com\/blog\/wp-content\/uploads\/2012\/05\/pantallazo-tvtime2.jpg 770w, https:\/\/maurom.com\/blog\/wp-content\/uploads\/2012\/05\/pantallazo-tvtime2-300x235.jpg 300w\" sizes=\"(max-width: 770px) 100vw, 770px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/www.maurom.com\/blog\/wp-content\/uploads\/2012\/05\/pantallazo-tvtime1.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-121\" title=\"pantallazo-tvtime1\" src=\"http:\/\/www.maurom.com\/blog\/wp-content\/uploads\/2012\/05\/pantallazo-tvtime1.jpg\" alt=\"\" width=\"550\" srcset=\"https:\/\/maurom.com\/blog\/wp-content\/uploads\/2012\/05\/pantallazo-tvtime1.jpg 770w, https:\/\/maurom.com\/blog\/wp-content\/uploads\/2012\/05\/pantallazo-tvtime1-300x235.jpg 300w\" sizes=\"(max-width: 770px) 100vw, 770px\" \/><\/a><\/p>\n<p>Instalaci\u00f3n:<\/p>\n<ol>\n<li>Descargar tv_grab_ar.py y mover el archivo al directorio de tvtime:\n<pre><strong>mv tv_grab_ar.py ~\/.tvtime\/tv_grab_ar.py<\/strong><\/pre>\n<\/li>\n<li style=\"text-decoration: line-through;\">Instalar la librer\u00eda beautifulsoup:\n<pre><strong>apt-get install python-beautifulsoup<\/strong><\/pre>\n<\/li>\n<li>Instalar la librer\u00eda python lxml:\n<pre><strong>apt-get install python-lxml<\/strong><\/pre>\n<\/li>\n<li>Ejecutar:<code><strong>.\/tv_grab_ar.py --configure<\/strong><\/code>e indicar la zona y los canales para los cuales se desea obtener la informaci\u00f3n. El valor de zone determina la grilla de canales seg\u00fan la localidad.<\/li>\n<li>Ejecutar:\n<pre><strong>.\/tv_grab_ar.py --verbose --output=programacion.xml<\/strong><\/pre>\n<p>para obtener la programaci\u00f3n y las descripciones de los programas. Este proceso demora varios minutos, sean pacientes.<\/li>\n<li>Iniciar tvtime e indicar que obtenga la programaci\u00f3n desde el archivo:\n<pre><strong>tvtime --xmltv=programacion.xml<\/strong><\/pre>\n<\/li>\n<\/ol>\n<p>Para finalizar, lo ideal es colocar en el cron de usuario una entrada para ejecutar la actualizaci\u00f3n al menos una vez por semana.<\/p>\n<pre>usage: tv_grab_ar.py [-h] [--days N] [--offset N] [--skip-descriptions]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [--output FILE] [--configure] [--config-file FILE]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [--quiet] [--verbose] [--list-channels] [--zone N]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [--capabilities] [--describe] [--description]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 [--cache FILE] [--version]\r\n\r\nGet Argentinian television listings in XMLTV format\r\n\r\noptional arguments:\r\n\u00a0 -h, --help\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 show this help message and exit\r\n\u00a0 --days N\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Grab N days. The default is 3.\r\n\u00a0 --offset N\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Start N days in the future. The default is to start\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 from today.\r\n\u00a0 --skip-descriptions\u00a0 Do not download program descriptions.\r\n\u00a0 --output FILE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Write to FILE rather than standard output.\r\n\u00a0 --configure\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Prompt for which channels and write the configuration\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 file.\r\n\u00a0 --config-file FILE\u00a0\u00a0 Set the name of the configuration file, the default is\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/home\/maurom\/.xmltv\/tv_grab_ar.conf&gt;. This is the file\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 written by --configure and read when grabbing.\r\n\u00a0 --quiet\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Suppress the progress messages normally written to\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 standard error. [not implemented]\r\n\u00a0 --verbose\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Display additional information.\r\n\u00a0 --list-channels\u00a0\u00a0\u00a0\u00a0\u00a0 Display only the channel listing.\r\n\u00a0 --zone N\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Override user location for retrieval of channels.\r\n\u00a0 --capabilities\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Show which capabilities the grabber supports. For more\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 information, see\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;<a href=\"http:\/\/wiki.xmltv.org\/index.php\/XmltvCapabilities\">http:\/\/wiki.xmltv.org\/index.php\/XmltvCapabilities<\/a>&gt;\r\n\u00a0 --describe\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Show a brief description of the grabber.\r\n\u00a0 --description\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Show a brief description of the grabber.\r\n\u00a0 --cache FILE\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Cache description data in FILE. The default is \r\n                       &lt;\/home\/maurom\/.xmltv\/tv_grab_ar.db&gt;.\r\n\u00a0 --version\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 show program's version number and exit<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En lo que ha sido del a\u00f1o pasado he dedicado poco tiempo a la TV, tras advertir como se viene abajo la calidad de la programaci\u00f3n (o como cada vez uno se pone m\u00e1s exquisito), me da menos \u00edmpetu. Veo la &#8220;caja boba&#8221; por la PC, como todo el que quiere ahorrar espacio, mediante una [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[5,3,9,6,25],"_links":{"self":[{"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/posts\/120"}],"collection":[{"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/comments?post=120"}],"version-history":[{"count":0,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/posts\/120\/revisions"}],"wp:attachment":[{"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/media?parent=120"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/categories?post=120"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurom.com\/blog\/wp-json\/wp\/v2\/tags?post=120"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}