joe di castrohttp://joedicastro.com2010-07-29T22:01:00+02:00TED Talks, descargar videos y subtitulos de las charlas2010-07-29T22:01:00+02:00joe di castrohttp://joedicastro.com/ted-talks-descargar-videos-y-subtitulos-de-las-charlas.html<p><img alt="TED logo" src="http://joedicastro.com/pictures/ted_logo.png" title="TED logo" /></p>
<p>Como introducción, para aquellos que aun no conozcan <a href="http://www.ted.com/">TED</a> <strong>(Technology,
Enternaiment, Design)</strong> y sus famosas charlas, <strong>TED Talks</strong>, podría resumirlo
como algo así como la versión en vídeo de las revistas de "divulgación
científica y tecnológica" (acogiendo bajo esta denominación desde las más
banales a las mas prestigiosas) que todos conocemos como <a href="http://www.muyinteresante.es/">Muy Interesante</a>,
<a href="http://www.investigacionyciencia.es/">Investigación y Ciencia</a>, <a href="http://www.mundo-geo.es/">Geo</a>, <a href="http://www.quo.es/">Quo</a>, <a href="http://www.nationalgeographic.com.es/">National Geographic</a>,
<a href="http://www.popsci.com/">Popular Science</a>, <a href="http://www.nature.com/">Nature</a>, <a href="http://www.sciencemag.org/">Science</a>, <a href="http://www.thelancet.com/">Lancet</a>, etc... con
la ventaja de la escasa distorsión del mensaje y lo conciso del mismo. Esto se
debe a que no tenemos que pasar por el filtro del periodista (cuando no es un
<a href="http://es.wikipedia.org/wiki/Art%C3%ADculo_cient%C3%ADfico">paper</a>), <strong>es el propio interesado</strong> quien nos <strong>relata sus ideas
personalmente</strong> y que la gran mayoría de las charlas esta sometida a un
<strong>tiempo limite de 18 minutos</strong>, ya que es el tiempo máximo que se ha calculado
que podemos estar centrados en un solo asunto sin perder el interés o la
atención. Evidentemente no son comparables a un articulo amplio, detallado y
bien redactado o a un buen documental, ni tampoco lo pretenden.
No se trata de profundizar en los temas, <strong>se trata de que</strong> el ponente
<strong>consiga transmitirte sus ideas, su entusiasmo y la trascendencia de las
mismas</strong>, y en la mayoría de los casos <strong>lo consiguen</strong>, y algunas de estas
charlas son de una calidad y de una trascendencia tales, que deberían tener
lugar también en los medios tradicionales (TV). La calidad de estas charlas es
tal que es difícil no quedarte impresionado (cuando no deslumbrado) al final de
las mismas y contagiado del entusiasmo de los ponentes, la apertura de miras,
conocimiento y humildad que te proporcionan (amen de ayudarte a creer un poquito
más en la humanidad) no tiene parangón actualmente. Desde la serie <a href="http://es.wikipedia.org/wiki/Cosmos:_un_viaje_personal">Cosmos</a>
de <a href="http://es.wikipedia.org/wiki/Carl_Sagan">Carl Sagan</a>, no he encontrado nada parecido que me invitara tanto a
pensar y me abriera tanto la mente. Lo único que se acerca, entre la telebasura
reinante, en el mundo audiovisual actual, es el programa
<a href="http://www.rtve.es/television/redes/">Redes</a> de <a href="http://es.wikipedia.org/wiki/Eduardo_Punset">Eduardo Punset</a>.</p>
<p>Para una definición más precisa, un extracto del <a href="http://es.wikipedia.org/wiki/TED">articulo de la Wikipedia</a>:</p>
<blockquote>
<p><strong>TED</strong> (<strong>Tecnología, Entretenimiento, Diseño</strong>, del inglés: <em>Technology,
Entertainment, Design</em>) es una organización sin ánimo de lucro dedicada a las
"ideas que vale la pena difundir" (del inglés: <em>Ideas worth spreading</em>). TED es
ampliamente conocida por su conferencia anual (<strong>TED Conference</strong>) y sus charlas
(<strong>TED Talks</strong>) que cubren un amplio espectro de temas que incluyen <strong>ciencias,
arte y diseño, política, educación, cultura, negocios, asuntos globales,
tecnología y desarrollo, y entretenimiento</strong>. Los conferenciantes han incluido
a personas como el ex-Presidente de los Estados Unidos <strong>Bill Clinton</strong>, los
laureados con el Premio<strong> Nobel James D. Watson</strong>, <strong>Murray Gell-Mann</strong>, y Al
Gore, el co-fundador de Microsoft, <strong>Bill Gates</strong>, los co-fundadores de Google
<strong>Sergey Brin</strong> y <strong>Larry Page</strong>, y <strong>Billy Graham</strong></p>
</blockquote>
<p>Estas charlas se publican en su pagina web actualmente a un ritmo aproximado de
una por día de semana (esto es, lunes a viernes). <strong>Actualmente (julio 2010)
hay más de 700 charlas disponibles en su página y se han visionado más de
290.000.000 de veces (julio 2010)</strong>, para que os hagáis una idea de la
repercusión y trascendencia de las mismas.</p>
<p>El caso es que yo las sigo habitualmente, vamos que veo todas las que publican.
Al principio me limitaba a enterarme de la publicación de las mismas por mi
lector de fuentes RSS, veía el asunto de las mismas y si me parecía interesante,
las veía directamente a través de su página web. Luego, cansado de los
inconvenientes de verlas a través de un navegador web a pantalla completa, en
flash desde Linux, dí un paso más y me pase a un programa como
<strong><a href="http://www.getmiro.com/">Miro</a></strong>, de hecho hay una versión del mismo para <strong>TED</strong>. Para el que no
lo conozca, <strong>Miro</strong> es un reproductor multimedia open source multiplataforma
que cuenta con un agregador de fuentes RSS y torrents para podcasts de audio y
vídeo. Así que él automáticamente se baja las charlas a medida que se van
publicando y tu solo tienes que visionarlas desde el mismo, decidiendo después
si las eliminas o las conservas.</p>
<p style="text-align: center;"><img src="/pictures/miro_TED.jpg"
alt="Miro TED Talks" title="Miro TED Talks" height="327" width="540"/></p>
<p>Pero <strong>Miro</strong> para mi tenia dos grandes problemas, el primero que no descarga
los subtitulos, y el segundo que la visualización de estos es bastante pobre
(al menos comparado con la configuración que tengo en mi <a href="http://smplayer.sourceforge.net/"><strong>SMPlayer</strong></a>).
No es que los subtitulos me sean esenciales (todas las charlas son en ingles)
pero si que ayudan mucho para el contexto de aquellas donde uno ni de lejos
domina los tecnicismos de algunos campos, o porque no decirlo, cuando el
acento o la pronunciación de algunos de los ponentes me hace imposible
seguirlos sin los mismos. Siempre veo los subtitulos en el idioma original,
inglés, pero siempre descargo también la versión en español porque me es muy
útil en algunos momentos, como por ejemplo cuando se refieren a especies
animales o vegetales de los que no conozco la traducción al español, y en lugar
de tirar de diccionario continuamente, gano tiempo visionandolos en
castellano.</p>
<p>Como uno ha de reconocer humildemente, rara es la vez que a uno no se le presente
un problema que no se le haya presentado antes a otro y no haya dado con una
solución valida. Luego en vez de reinventar la rueda (aunque finalmente es lo
que haya acabado haciendo) me dirigí a San Google para encontrar una solución
para descargar los subtitulos de las <strong>TED Talks</strong>, y he aquí, que doy con
<a href="http://fci-h.blogspot.com/2010/05/python-script-to-download-ted-talks.html">este script</a> en <a href="http://python.org/"><strong>Python</strong></a> (mi lenguaje de programación favorito).
Lo empleé durante unos días (tres para ser exactos), pero no me acaba de
convencer y me puse a modificarlo, y cuando estaba en ello, me dije: Que
demonios! si al final no te convence <strong>Miro</strong> para visionar los vídeos con
subtitulos, porque no descargar también los mismos y utilizar el <strong>SMPlayer</strong>
para visionarlos? Así que me puse manos a la obra, y esto es lo que salio y
actualmente empleo.</p>
<p><strong>El script hace uso de la fuente RSS de las TED Talks en calidad HD para
conocer cuando se publica una nueva charla en la pagina</strong>. Comprueba si no esta
ya descargado, si no es así, lo descarga y luego comprueba la disponibilidad de
los subtitulos (español e ingles) para las charlas ya descargadas que se
encuentren en la carpeta. Si encuentra alguno disponible y no descargado
anteriormente, lo convierte en un nuevo fichero .srt en la carpeta. Finalmente,
si se ha descargado algo (charlas o subs), manda un correo a mi usuario local
notificándomelo. Esta script lo tengo automatizado mediante una tarea cron en
un pequeño servidor que tengo y que se ejecuta todas las mañanas a eso de las
9:30 y que normalmente me descarga la charla del día anterior y los subtitulos
en ingles de la misma y los de español de dos días antes. Esto depende mucho de
la velocidad de traducción de los colaboradores, ya que a veces, cuando una
charla es muy interesante, es posible que a las pocas horas dispongamos de los
subtitulos en los dos idiomas.</p>
<p>La parte fundamental del código del <a href="https://github.com/joedicastro/ted-talks-download/blob/master/src/TEDTalks.py" title="TEDTalks.py">script</a>, es la siguiente:</p>
<div class="codehilite"><pre><span class="k">def</span> <span class="nf">get_sub</span><span class="p">(</span><span class="n">tt_id</span> <span class="p">,</span> <span class="n">tt_intro</span><span class="p">,</span> <span class="n">sub</span><span class="p">):</span>
<span class="sd">"""Get TED Subtitle in JSON format & convert it to SRT Subtitle</span>
<span class="sd"> Obtiene el subtitulo de TED en formato JSON y lo convierte al formato SRT"""</span>
<span class="k">def</span> <span class="nf">srt_time</span><span class="p">(</span><span class="n">tst</span><span class="p">):</span>
<span class="sd">"""Format Time from TED Subtitles format to SRT time Format</span>
<span class="sd"> Convierte el formato de tiempo del subtitulo TED al formato de SRT"""</span>
<span class="n">secs</span><span class="p">,</span> <span class="n">mins</span><span class="p">,</span> <span class="n">hours</span> <span class="o">=</span> <span class="p">((</span><span class="n">tst</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">)</span> <span class="o">%</span> <span class="mi">60</span><span class="p">),</span> <span class="p">(</span><span class="n">tst</span> <span class="o">/</span> <span class="mi">60000</span><span class="p">),</span> <span class="p">(</span><span class="n">tst</span> <span class="o">/</span> <span class="mi">3600000</span><span class="p">)</span>
<span class="n">right_srt_time</span> <span class="o">=</span> <span class="s">"{0:02d}:{1:02d}:{2:02d},000"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">hours</span><span class="p">,</span> <span class="n">mins</span><span class="p">,</span> <span class="n">secs</span><span class="p">)</span>
<span class="k">return</span> <span class="n">right_srt_time</span>
<span class="n">srt_content</span> <span class="o">=</span> <span class="s">''</span>
<span class="n">sub_log</span> <span class="o">=</span> <span class="s">''</span>
<span class="n">tt_url</span> <span class="o">=</span> <span class="s">'http://www.ted.com/talks'</span>
<span class="n">sub_url</span> <span class="o">=</span> <span class="s">'{0}/subtitles/id/{1}/lang/{2}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">tt_url</span><span class="p">,</span> <span class="n">tt_id</span><span class="p">,</span> <span class="n">sub</span><span class="p">[</span><span class="o">-</span><span class="mi">7</span><span class="p">:</span><span class="o">-</span><span class="mi">4</span><span class="p">])</span>
<span class="c">## Get JSON sub</span>
<span class="k">if</span> <span class="n">FOUND</span><span class="p">:</span>
<span class="n">json_file</span> <span class="o">=</span> <span class="n">Popen</span><span class="p">([</span><span class="s">'wget'</span><span class="p">,</span> <span class="s">'-q'</span><span class="p">,</span> <span class="s">'-O'</span><span class="p">,</span> <span class="s">'-'</span><span class="p">,</span> <span class="n">sub_url</span><span class="p">],</span>
<span class="n">stdout</span><span class="o">=</span><span class="n">PIPE</span><span class="p">)</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span>
<span class="k">if</span> <span class="n">json_file</span><span class="p">:</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">json_file</span><span class="p">:</span>
<span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">'captions'</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="ow">and</span> <span class="n">line</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">'status'</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
<span class="n">json_file</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">sub_log</span> <span class="o">+=</span> <span class="s">"Subtitle '{0}' not found.{1}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">sub</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">json_file</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">sub_url</span><span class="p">)</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">json_object</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">json_file</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">if</span> <span class="s">'captions'</span> <span class="ow">in</span> <span class="n">json_object</span><span class="p">:</span>
<span class="n">caption_idx</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">json_object</span><span class="p">[</span><span class="s">'captions'</span><span class="p">]:</span>
<span class="n">sub_log</span> <span class="o">+=</span> <span class="p">(</span><span class="s">"Subtitle '{0}' not available.{1}"</span><span class="o">.</span>
<span class="n">format</span><span class="p">(</span><span class="n">sub</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">))</span>
<span class="k">for</span> <span class="n">caption</span> <span class="ow">in</span> <span class="n">json_object</span><span class="p">[</span><span class="s">'captions'</span><span class="p">]</span> <span class="p">:</span>
<span class="n">start</span> <span class="o">=</span> <span class="n">tt_intro</span> <span class="o">+</span> <span class="n">caption</span><span class="p">[</span><span class="s">'startTime'</span><span class="p">]</span>
<span class="n">end</span> <span class="o">=</span> <span class="n">start</span> <span class="o">+</span> <span class="n">caption</span><span class="p">[</span><span class="s">'duration'</span><span class="p">]</span>
<span class="n">idx_line</span> <span class="o">=</span> <span class="s">'{0}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">caption_idx</span><span class="p">)</span>
<span class="n">time_line</span> <span class="o">=</span> <span class="s">'{0} --> {1}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">srt_time</span><span class="p">(</span><span class="n">start</span><span class="p">),</span> <span class="n">srt_time</span><span class="p">(</span><span class="n">end</span><span class="p">))</span>
<span class="n">text_line</span> <span class="o">=</span> <span class="s">'{0}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">caption</span><span class="p">[</span><span class="s">'content'</span><span class="p">]</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">"utf-8"</span><span class="p">))</span>
<span class="n">srt_content</span> <span class="o">+=</span> <span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">idx_line</span><span class="p">,</span> <span class="n">time_line</span><span class="p">,</span> <span class="n">text_line</span><span class="p">,</span> <span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="p">])</span>
<span class="n">caption_idx</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="s">'status'</span> <span class="ow">in</span> <span class="n">json_object</span><span class="p">:</span>
<span class="n">sub_log</span> <span class="o">+=</span> <span class="p">(</span><span class="s">"This is an error message returned by TED:{0}{0} - {1}"</span>
<span class="s">"{0}{0}Probably because the subtitle '{2}' is not "</span>
<span class="s">"available.{0}{0}{0}"</span>
<span class="s">""</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">,</span> <span class="n">json_object</span><span class="p">[</span><span class="s">'status'</span><span class="p">][</span><span class="s">'message'</span><span class="p">],</span>
<span class="n">sub</span><span class="p">))</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="n">sub_log</span> <span class="o">+=</span> <span class="p">(</span><span class="s">"Subtitle '{0}' it's a malformed json file.{1}"</span><span class="o">.</span>
<span class="n">format</span><span class="p">(</span><span class="n">sub</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">))</span>
<span class="k">return</span> <span class="n">srt_content</span><span class="p">,</span> <span class="n">sub_log</span>
<span class="k">def</span> <span class="nf">check_subs</span><span class="p">(</span><span class="n">ttalk</span><span class="p">,</span> <span class="n">v_name</span><span class="p">):</span>
<span class="sd">"""Check if the subtitles for the talk are downloaded, if not try to get</span>
<span class="sd"> them. Checks it for english and spanish languages</span>
<span class="sd"> Comprueba si los subtitulos para la charla estan descargados, si no, intenta</span>
<span class="sd"> obtenerlos. Lo comprueba para los idiomas español e ingles"""</span>
<span class="c">## Get the names for the subtitles (for english and spanish languages) only</span>
<span class="c"># if they not are already downloaded</span>
<span class="n">subs</span> <span class="o">=</span> <span class="p">(</span><span class="n">s_name</span> <span class="k">for</span> <span class="n">s_name</span> <span class="ow">in</span>
<span class="p">(</span><span class="s">"{0}.{1}.srt"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">v_name</span><span class="p">[:</span><span class="o">-</span><span class="mi">4</span><span class="p">],</span> <span class="n">lang</span><span class="p">)</span> <span class="k">for</span> <span class="n">lang</span> <span class="ow">in</span> <span class="p">(</span><span class="s">'eng'</span><span class="p">,</span> <span class="s">'spa'</span><span class="p">))</span>
<span class="k">if</span> <span class="n">s_name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s">'*.srt'</span><span class="p">))</span>
<span class="n">s_log</span> <span class="o">=</span> <span class="s">''</span>
<span class="k">for</span> <span class="n">sub</span> <span class="ow">in</span> <span class="n">subs</span><span class="p">:</span>
<span class="c">## Reads the talk web page, to search the talk's intro duration</span>
<span class="k">if</span> <span class="n">FOUND</span><span class="p">:</span>
<span class="n">tt_webpage</span> <span class="o">=</span> <span class="n">Popen</span><span class="p">([</span><span class="s">'wget'</span><span class="p">,</span> <span class="s">'-q'</span><span class="p">,</span> <span class="s">'-O'</span><span class="p">,</span> <span class="s">'-'</span><span class="p">,</span>
<span class="n">ttalk</span><span class="o">.</span><span class="n">feedburner_origlink</span><span class="p">],</span>
<span class="n">stdout</span><span class="o">=</span><span class="n">PIPE</span><span class="p">)</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">tt_webpage</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">urlopen</span><span class="p">(</span><span class="n">ttalk</span><span class="o">.</span><span class="n">feedburner_origlink</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="n">tt_intro</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">search</span><span class="p">(</span><span class="s">"introDuration:(\d+),"</span><span class="p">,</span> <span class="n">tt_webpage</span><span class="p">)</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
<span class="n">subtitle</span><span class="p">,</span> <span class="n">get_log</span> <span class="o">=</span> <span class="n">get_sub</span><span class="p">(</span><span class="n">ttalk</span><span class="o">.</span><span class="n">id</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">':'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">tt_intro</span><span class="p">,</span> <span class="n">sub</span><span class="p">)</span>
<span class="n">s_log</span> <span class="o">+=</span> <span class="n">get_log</span>
<span class="k">if</span> <span class="n">subtitle</span><span class="p">:</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">sub</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span> <span class="k">as</span> <span class="n">srt_file</span><span class="p">:</span>
<span class="n">srt_file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">subtitle</span><span class="p">)</span>
<span class="n">s_log</span> <span class="o">+=</span> <span class="s">"{0}{1} downloaded.{0}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">linesep</span><span class="p">,</span> <span class="n">sub</span><span class="p">)</span>
<span class="k">return</span> <span class="n">s_log</span>
<span class="k">def</span> <span class="nf">get_video</span><span class="p">(</span><span class="n">ttk</span><span class="p">,</span> <span class="n">vid_url</span><span class="p">,</span> <span class="n">vid_name</span><span class="p">):</span>
<span class="sd">"""Gets the TED Talk video</span>
<span class="sd"> Obtiene el video de la TED Talk"""</span>
<span class="k">if</span> <span class="n">FOUND</span><span class="p">:</span>
<span class="n">Popen</span><span class="p">([</span><span class="s">'wget'</span><span class="p">,</span> <span class="s">'-q'</span><span class="p">,</span> <span class="s">'-O'</span><span class="p">,</span> <span class="n">vid_name</span><span class="p">,</span> <span class="n">vid_url</span><span class="p">],</span> <span class="n">stdout</span><span class="o">=</span><span class="n">PIPE</span><span class="p">)</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">urllib</span><span class="o">.</span><span class="n">urlretrieve</span><span class="p">(</span><span class="n">vid_url</span><span class="p">,</span> <span class="n">vid_name</span><span class="p">)</span>
<span class="n">v_log</span> <span class="o">=</span> <span class="s">'{0} ({1})</span><span class="se">\n</span><span class="s">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ttk</span><span class="o">.</span><span class="n">subtitle</span><span class="p">,</span> <span class="n">ttk</span><span class="o">.</span><span class="n">itunes_duration</span><span class="p">)</span>
<span class="n">v_log</span> <span class="o">+=</span> <span class="s">'{0}</span><span class="se">\n\n</span><span class="s">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">'='</span> <span class="o">*</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">ttk</span><span class="o">.</span><span class="n">subtitle</span><span class="p">)</span> <span class="o">+</span> <span class="mi">11</span><span class="p">))</span>
<span class="n">v_log</span> <span class="o">+=</span> <span class="s">'{0}</span><span class="se">\n\n</span><span class="s">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ttk</span><span class="o">.</span><span class="n">feedburner_origlink</span><span class="p">)</span>
<span class="n">v_log</span> <span class="o">+=</span> <span class="s">'{0}</span><span class="se">\n\n</span><span class="s">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ttk</span><span class="o">.</span><span class="n">content</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="n">v_log</span> <span class="o">+=</span> <span class="s">'file://{0}</span><span class="se">\n</span><span class="s">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">(),</span> <span class="n">vid_name</span><span class="p">))</span>
<span class="n">vid_size</span> <span class="o">=</span> <span class="n">best_unit_size</span><span class="p">(</span><span class="n">get_size</span><span class="p">(</span><span class="n">vid_name</span><span class="p">))</span>
<span class="n">v_log</span> <span class="o">+=</span> <span class="s">'{0:.2f} {1}</span><span class="se">\n\n</span><span class="s">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">vid_size</span><span class="p">[</span><span class="s">'s'</span><span class="p">],</span> <span class="n">vid_size</span><span class="p">[</span><span class="s">'u'</span><span class="p">])</span>
<span class="k">return</span> <span class="n">v_log</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="sd">"""main section"""</span>
<span class="c">#===============================================================================</span>
<span class="c"># SCRIPT PARAMETERS</span>
<span class="c">#===============================================================================</span>
<span class="c">## The directory to store the videos and subs.</span>
<span class="c"># For Windows change the character '\' for the character '/', I know is</span>
<span class="c"># akward but is because how escape strings python</span>
<span class="n">ttalk_vid_dir</span> <span class="o">=</span> <span class="s">'/your/path/to/TED/Talks/Videos'</span>
<span class="c">#===============================================================================</span>
<span class="c"># END PARAMETERS</span>
<span class="c">#===============================================================================</span>
<span class="c"># initalize the log</span>
<span class="n">log</span> <span class="o">=</span> <span class="n">Logger</span><span class="p">()</span>
<span class="c"># log the header</span>
<span class="n">url</span> <span class="o">=</span> <span class="s">'http://joedicastro.com'</span>
<span class="n">msg</span> <span class="o">=</span> <span class="s">'Download TED Talks from HD RSS Feed'</span>
<span class="n">log</span><span class="o">.</span><span class="n">header</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
<span class="c"># log the start time</span>
<span class="n">log</span><span class="o">.</span><span class="n">time</span><span class="p">(</span><span class="s">'Start Time'</span><span class="p">)</span>
<span class="n">os</span><span class="o">.</span><span class="n">chdir</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">normpath</span><span class="p">(</span><span class="n">ttalk_vid_dir</span><span class="p">))</span>
<span class="c">## Get a list of the current TED Talks downloaded in the dir</span>
<span class="n">videos</span> <span class="o">=</span> <span class="n">glob</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s">'*.mp4'</span><span class="p">)</span>
<span class="c">## Get the last download Talk video date</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s">'.data.pkl'</span><span class="p">,</span> <span class="s">'rb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">pkl_file</span><span class="p">:</span>
<span class="n">last</span> <span class="o">=</span> <span class="n">pickle</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">pkl_file</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">EOFError</span><span class="p">,</span> <span class="ne">IOError</span><span class="p">,</span> <span class="n">pickle</span><span class="o">.</span><span class="n">PickleError</span><span class="p">):</span>
<span class="n">last</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">localtime</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="mi">86400</span><span class="p">)</span>
<span class="n">video_dates</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c">## The TED Talks HD RSS feed</span>
<span class="n">ttalk_feed_url</span> <span class="o">=</span> <span class="s">'http://feeds.feedburner.com/tedtalksHD'</span>
<span class="n">ttalk_feed</span> <span class="o">=</span> <span class="n">feedparser</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">ttalk_feed_url</span><span class="p">)</span>
<span class="c">## If the feed is erroneous or occurs a http or network error, log and exit!</span>
<span class="k">if</span> <span class="n">ttalk_feed</span><span class="o">.</span><span class="n">bozo</span><span class="p">:</span>
<span class="n">log</span><span class="o">.</span><span class="n">list</span><span class="p">(</span><span class="s">'An error occurred'</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">ttalk_feed</span><span class="o">.</span><span class="n">bozo_exception</span><span class="p">))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">WIN_OS</span><span class="p">:</span>
<span class="n">log</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">'Download TED Talks'</span><span class="p">)</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="c">## If correct, process the feed entries</span>
<span class="n">vids_log</span><span class="p">,</span> <span class="n">subs_log</span> <span class="o">=</span> <span class="s">''</span><span class="p">,</span> <span class="s">''</span>
<span class="k">for</span> <span class="n">ttalk_entrie</span> <span class="ow">in</span> <span class="n">ttalk_feed</span><span class="o">.</span><span class="n">entries</span><span class="p">:</span>
<span class="c">## Get The video url and name</span>
<span class="n">tt_vid_url</span> <span class="o">=</span> <span class="n">ttalk_entrie</span><span class="o">.</span><span class="n">enclosures</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">href</span>
<span class="n">tt_vid_name</span> <span class="o">=</span> <span class="n">tt_vid_url</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">'/'</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="c">## If the video is new, download it!</span>
<span class="k">if</span> <span class="n">ttalk_entrie</span><span class="o">.</span><span class="n">updated_parsed</span> <span class="o">></span> <span class="n">last</span> <span class="ow">and</span> <span class="n">tt_vid_name</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">videos</span><span class="p">:</span>
<span class="n">vids_log</span> <span class="o">+=</span> <span class="n">get_video</span><span class="p">(</span><span class="n">ttalk_entrie</span><span class="p">,</span> <span class="n">tt_vid_url</span><span class="p">,</span> <span class="n">tt_vid_name</span><span class="p">)</span>
<span class="n">videos</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tt_vid_name</span><span class="p">)</span>
<span class="n">video_dates</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ttalk_entrie</span><span class="o">.</span><span class="n">updated_parsed</span><span class="p">)</span>
<span class="c">## If video is already downloaded, check if subs exists, if not, get it!</span>
<span class="k">if</span> <span class="n">tt_vid_name</span> <span class="ow">in</span> <span class="n">videos</span><span class="p">:</span>
<span class="n">subs_log</span> <span class="o">+=</span> <span class="n">check_subs</span><span class="p">(</span><span class="n">ttalk_entrie</span><span class="p">,</span> <span class="n">tt_vid_name</span><span class="p">)</span>
<span class="n">log</span><span class="o">.</span><span class="n">list</span><span class="p">(</span><span class="s">'Talks downloaded'</span><span class="p">,</span> <span class="n">vids_log</span><span class="p">)</span>
<span class="n">log</span><span class="o">.</span><span class="n">list</span><span class="p">(</span><span class="s">'Subs downloaded'</span><span class="p">,</span> <span class="p">[</span><span class="n">subs_log</span><span class="p">])</span>
<span class="c">## Set the last download video date</span>
<span class="k">if</span> <span class="n">video_dates</span><span class="p">:</span>
<span class="n">last</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">video_dates</span><span class="p">)</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s">'.data.pkl'</span><span class="p">,</span> <span class="s">'wb'</span><span class="p">)</span> <span class="k">as</span> <span class="n">output</span><span class="p">:</span>
<span class="n">pickle</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">last</span><span class="p">,</span> <span class="n">output</span><span class="p">)</span>
<span class="n">log</span><span class="o">.</span><span class="n">time</span><span class="p">(</span><span class="s">'End time'</span><span class="p">)</span>
<span class="c">## If logs any activity, sends the information mail</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">WIN_OS</span><span class="p">:</span>
<span class="n">log</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">'Download TED Talks'</span><span class="p">)</span>
<span class="n">log</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">False</span><span class="p">)</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span>
<span class="n">WIN_OS</span> <span class="o">=</span> <span class="bp">True</span> <span class="k">if</span> <span class="n">platform</span><span class="o">.</span><span class="n">system</span><span class="p">()</span> <span class="o">==</span> <span class="s">'Windows'</span> <span class="k">else</span> <span class="bp">False</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">WIN_OS</span><span class="p">:</span>
<span class="n">FOUND</span> <span class="o">=</span> <span class="n">check_exec_posix</span><span class="p">(</span><span class="s">'wget'</span><span class="p">)</span>
<span class="n">main</span><span class="p">()</span>
</pre></div>
<p>Y un ejemplo de un correo enviado por el mismo quedaría así:</p>
<div class="codehilite"><pre>De: youruser@yourcomputer
Para: youruser@yourcomputer
Asunto: Download TED Talks - Thursday 07/29/10, 17:04:52
Fecha: Thu, 29 Jul 2010 17:04:52 +0200
New TED Talk downloaded!
========================
http://www.ted.com/talks/view/id/927
Laurie Santos: A monkey economy as irrational as ours (00:19:45)
Laurie Santos looks for the roots of human irrationality by watching the way
our primate relatives make decisions. A clever series of experiments in
"monkeynomics" shows that some of the silly choices we make, monkeys make too.
file:///your/path/to/TEDTalks/LaurieSantos_2010G_480.mp4
240.7 MiB
SusanShaw_2010X_480.eng.srt downloaded
</pre></div>
<p>Pudiendo acceder al vídeo directamente desde el correo, y si se encontraran los
subtítulos para el mismo ya disponibles, visualizarlos automáticamente.</p>
<p>El que el script esté fundamentalmente en ingles (la mayoría de comentarios y
los nombres de las variables) es que me siento más cómodo de esta manera y
ayuda a que un espectro más amplio de personas sea capaz de comprenderlo. Si
este script le sirve a alguien más o le inspira para crear el suyo propio, pues
habrá valido la pena el publicarlo. El resto del script, <strong>TEDTalks.py</strong> está
disponible en mi repositorio alojado en <a href="http://github.com/joedicastro/ted-talks-download">github</a>, al igual que instrucciones
ampliadas de su uso.</p>
<p>Finalmente como ejemplo, publico una de las charlas más impactantes este año y
ganadora del <strong>TED Prize</strong>, <a href="http://www.ted.com/talks/lang/spa/jamie_oliver.html">Jamie Oliver: Enseñarle a todos los niños acerca de
la comida</a></p>
<div><p style="text-align: center;"><object data="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" type="application/x-shockwave-flash" height="326" width="446"><param name="data" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><param name="wmode" value="transparent"><param name="bgColor" value="#ffffff"><param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/JamieOliver_2010-medium.mp4&su=http://images.ted.com/images/ted/tedindex/embed-posters/JamieOliver-2010.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=765&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=jamie_oliver;year=2010;theme=a_taste_of_ted2010;theme=ted_prize_winners;event=TED2010;&preAdTag=tconf.ted/embed;tile=1;sz=512x288;"><param name="src" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"><param name="bgcolor" value="#ffffff"><param name="allowfullscreen" value="true"></object></p></div>
<br />
<hr />
<h2 id="comentarios_realizados_anteriormente_en_drupal">Comentarios realizados anteriormente en Drupal</h2>
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<a href="http://www.elnaranjal.com.ve/"><img src="pictures/avtr_dennis.png"
height=28 width=28 alt="avatar" title="avatar de Dennis"/></a></div>
<h3 id="excelente">Excelente!</h3>
<p>por <a href="http://www.elnaranjal.com.ve/">Dennis</a> el Sáb, 31/07/2010 - 21:12 </p>
<p>Amigo, he leído con atención su articulo acerca de los subtítulos. El nivel de
automatización alcanzado resulta sorprendente, sin embargo, para aquellos que no
contamos con el hardware necesario se torna complicada la cosa.</p>
<p>En mi caso, me interesa descargar algunas (no todas) las charlas. De hecho,
quisiera unas pocas, cuidadosamente seleccionadas, para presentarlas en el
colegio en el cual doy clases a mis alumnos de secundaria.</p>
<p>¿Conoce Ud. de alguna forma de descargar en un formato legible por VLC (.SUB o
.SRT, por ejemplo) los subtítulos en español de charlas seleccionadas? He estado
tratando de conseguir algunos en forma infructuosa desde hace algún tiempo,
aunque he conseguido algunos en formato JSON.</p>
<p>Gracias mil por la ayuda con este tema.</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<a href="http://joedicastro.com"><img src="pictures/avtr_joedicastro.png" height=28
width=28 alt="avatar" title="avatar de joedicastro"/></a></div>
<h3 id="script_para_subtitulos_de_una_charla">Script para subtitulos de una charla</h3>
<p>por <a href="http://joedicastro.com">joe di castro</a> el Dom, 01/08/2010 - 01:38</p>
<p>Bueno, para conseguir eso que me comentas, he modificado el script anterior un
poco y he creado este <a href="https://github.com/joedicastro/ted-talks-download/blob/master/src/TEDSubs.py"><strong>nuevo script</strong></a>.</p>
<p>La forma de utilizarlo es muy sencilla, por ejemplo para bajarse la charla de
Jamie Oliver, simplemente en la linea de comandos escribes</p>
<div class="codehilite"><pre><span class="go">python TEDSubs.py http://www.ted.com/talks/lang/eng/jamie_oliver.html</span>
</pre></div>
<p>Y el te baja tanto los subtítulos como el vídeo. Si quisieras bajarte solo los
subtítulos, bastaría con que añadieras la opción <code>-s</code> ó <code>--only_subs</code>, quedaría
así:</p>
<div class="codehilite"><pre><span class="go">python TEDSubs.py -s http://www.ted.com/talks/lang/eng/jamie_oliver.html</span>
</pre></div>
<p>Como ves es muy sencillo, solo tendrías que sustituir la dirección de la charla
de Oliver por la que deseas bajar.</p>
<p>Espero que te sirva.</p>
<p>Saludos</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<img src="pictures/avtr_ignacio.png" height=28 width=28
alt="avatar" title="avatar de Ignacio"/></div>
<h3 id="ted">TED</h3>
<p>por Ignacio el Mié, 04/08/2010 - 01:02 </p>
<p>Estimado muy bueno lo que haces, me parecen excelentes los vídeos y me gustaría
contar con ellos. ¿Donde corro el script?¿podrías subírmelos con subtítulos a
algún gestor o ftp?</p>
<p>Muchas gracias</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<a href="http://joedicastro.com"><img src="pictures/avtr_joedicastro.png" height=28
width=28 alt="avatar" title="avatar de joedicastro"/></a></div>
<h3 id="vamos_por_partes">Vamos por partes...</h3>
<p>por <a href="http://joedicastro.com">joe di castro</a> el Jue, 05/08/2010 - 19:47</p>
<p>Vamos por partes...</p>
<p>Los scripts los ejecutas en tu ordenador, lo único necesario es el lenguaje de
programación <strong>Python</strong> y una conexión a Internet. Si tu maquina corre en linux,
el python lo tienes instalado por defecto en casi todas las distribuciones. Si
corre en Windows o Mac, lo puedes descargar en <a href="http://www.python.org/download/"><strong>Python.org</strong></a></p>
<p>Para correr los scripts, en la linea de comandos solo necesitas ejecutar estas
lineas de comando:</p>
<div class="codehilite"><pre><span class="go">python TEDTalks.py</span>
</pre></div>
<p>para el primer script o las lineas de comando ya comentadas anteriormente para
el segundo script.</p>
<p>Para descargarlos, puedes o bien copiar y pegar el código tal y como aparece en
el articulo, o bien descargarlos:</p>
<p><a href="https://github.com/joedicastro/ted-talks-download/archive/master.zip"><strong>TEDTalks.py & TEDSubs.py</strong></a></p>
<p>o bien vas directamente al mi <strong><a href="https://github.com/joedicastro/ted-talks-download">repositorio en github</a></strong></p>
<p>Eso si, hay que tener en cuenta que en el caso del primer script, este solo se
baja el vídeo del dia anterior en su primera ejecución o bien el más reciente no
descargado en caso de ejecuciones sucesivas. Y como la gente de <strong>TED</strong> parece
que se ha tomado un descanso en Agosto (el último vídeo es del 30 de Julio),
este no descargara nada, porque de momento no hay nada que descargar. Hasta que
no retornen la publicación de nuevas charlas, el primer script no bajara nuevos
contenidos, igual que los tradicionales lectores RSS o el mismo Miro.</p>
<p>Saludos</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<img src="pictures/avtr_daniel.png" height=28 width=28
alt="avatar" title="avatar de Daniel"/></div>
<h3 id="gracias">Gracias</h3>
<p>por Daniel el Mié, 22/09/2010 - 04:38 </p>
<p>Hermano, muchas gracias.. excelente script.. ya te imaginaras lo importante que
es que para muchos, poder adquirir estas excelente conferencias. Gracias de
nuevo</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<img src="pictures/avtr_xavier.png" height=28 width=28
alt="avatar" title="avatar de Xavier"/></div>
<h3 id="funcionan_los_subtitulos">Funcionan los Subtitulos?</h3>
<p>por Xavier el Mié, 24/11/2010 - 00:35 </p>
<p>Hola,</p>
<p>muchas gracias por disponibilizar los scripts.</p>
<p>Estoy intentando usar el segundo script (para bajar vídeos concretos) pero solo
me baja el vídeo. Si lo uso con -s no me baja nada (tampoco devuelve ningún
mensaje de error.</p>
<p>Podría ser que hayan cambiado la manera de bajar los subtítulos?</p>
<p>gracias por adelantado</p>
<p>Xavier</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<a href="http://joedicastro.com"><img src="pictures/avtr_joedicastro.png" height=28
width=28 alt="avatar" title="avatar de joedicastro"/></a></div>
<h3 id="si_funcionan_pero">Si, funcionan, pero...</h3>
<p>por <a href="http://joedicastro.com">joe di castro</a> el Mié, 24/11/2010 - 09:28</p>
<p>Si, funcionan, pero a veces los subtítulos aún no están disponibles, o peor, el
fichero original en formato json es defectuoso. Lo de que el formato json sea
defectuoso suele pasar de vez en cuando y generalmente acaban
solucionándolo al cabo de unos días. Debe de ser algún defecto en la traducción
o al subir el fichero.</p>
<p>De todos modos ya he modificado el script para que te muestre un mensaje de
error en caso de que no esté disponible o este defectuoso, e indicado si es el
subtitulo en español o ingles. Puedes descargarlo de aquí o del repositorio.
Gracias por informarme del error, se me había escapado el proporcionar esta
información.</p>
<p>Y voy a mirar la manera de convertir igualmente el subtitulo de json a srt
aunque el json esté malformado siempre que sea posible. No será muy difícil.</p>
<p>Saludos</p>
<p><strong>Actualización</strong>: Bueno, he encontrado un fallo, a veces cuando la página
termina un cierto tiempo en responder, no cargaba algunos ficheros json de
subtítulos completos, y lo interpretaba como un fichero json defectuoso. Ya he
corregido el error, substituyendo la función que empleaba para la descarga por
otra que siempre descarga el fichero completo.</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<a href="http://joedicastro.com"><img src="pictures/avtr_joedicastro.png" height=28
width=28 alt="avatar" title="avatar de joedicastro"/></a></div>
<h3 id="bueno_ya_estan_incorporadas">Bueno, ya estan incorporadas</h3>
<p>por <a href="http://joedicastro.com">joe di castro</a> el Mié, 24/11/2010 - 23:26</p>
<p>Bueno, ya están incorporadas las mejoras también al otro script. En principio no
veo necesario el crear el método para los ficheros JSON defectuosos, en parte
porque sería replicar más o menos lo que ya hace el modulo json y en parte
porque los JSON defectuosos provenían del empleo de la librería de python urllib
para descargarlos, lo que a veces por timeouts no conseguía hacerlo del todo. El
emplear la librería urllib2 soluciona este problema puesto que si los descarga
al completo.</p>
<p>De todos modos ahora se reportan todos los códigos de error que aparezcan, tanto
los que genero yo en el script, como los originales generados por TED (en
realidad dotSUB, que es el que proporciona los subtítulos para TED) y les haré
un seguimiento. Porque puede que si estén cambiando algo, dados los errores que
reportan algunos de los últimos vídeos.</p>
<p>Saludos y gracias por reportarme el fallo, Xavier.</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<img src="pictures/avtr_xavier.png" height=28 width=28
alt="avatar" title="avatar de Xavier"/></div>
<h3 id="aun_tengo_algun_problemilla">Aun tengo algun problemilla</h3>
<p>por Xavier el Jue, 25/11/2010 - 00:40</p>
<p>Muchas gracias por tan rápida respuesta. Me he copiado el código para bajar los
vídeos individuales, pero aun tengo problemas. Esta vez parece como si me
faltara algún modulo de python, aunque no se ni cual ni como debo actualizarlo.
Tengo el siguiente error:</p>
<div class="codehilite"><pre><span class="gt">Traceback (most recent call last):</span>
File <span class="nb">"./TEDVideos.py"</span>, line <span class="m">184</span>, in <span class="n"><module></span>
<span class="n">main</span><span class="p">()</span>
File <span class="nb">"./TEDVideos.py"</span>, line <span class="m">172</span>, in <span class="n">main</span>
<span class="n">ttalk_webpage</span><span class="p">)</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
<span class="gr">AttributeError</span>: <span class="n">'NoneType' object has no attribute 'group'</span>
</pre></div>
<p>(El programa TEDVideos.py es el nombre que le he dado yo a tu código)</p>
<p>muchas gracias de antemano</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<a href="http://joedicastro.com"><img src="pictures/avtr_joedicastro.png" height=28
width=28 alt="avatar" title="avatar de joedicastro"/></a></div>
<h3 id="no_en_este_caso_no_te_falta">No, en este caso no te falta</h3>
<p>por <a href="http://joedicastro.com">joe di castro</a> el Jue, 25/11/2010 - 10:12</p>
<p>No, en este caso no te falta ningún modulo para ejecutar el script, eso es algo
que ya tengo contemplado y es lo primero que compruebo, y lanzo un aviso del
modulo que es necesario para ejecutarlo si no se encuentra.</p>
<p>El error que me muestras es porque intento seleccionar uno de entre los
resultados de una búsqueda de datos dentro de una página web, y al ser el
resultado de la búsqueda vacío arroja ese error. Es un error que tampoco tenía
contemplado porque asumía que en un principio las direcciones web introducidas
serían correctas, algo que voy a contemplar a partir de ahora, para avisar al
usuario.</p>
<p>Ese error te lo da porque no encuentra lo que busca, el identificador único de
la charla, en la página web que le proporcionas. Lo raro es que si fuera una
dirección web incorrecta, el error tendría que producirse antes, cuando busca
la duración de la introducción previa al vídeo. Lo he probado con unas 25
charlas diferentes y no he conseguido reproducir el error. La mejora forma de
entender lo que ha pasado es que me proporciones la dirección web que te da el
error para comprobar lo que ocurre.</p>
<p>Saludos</p>
<p><strong>Actualización</strong>: He añadido mensajes de error para contemplar estas
posibilidades, así será más fácil diagnosticar los fallos.</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<img src="pictures/avtr_xavier.png" height=28 width=28
alt="avatar" title="avatar de Xavier"/></div>
<h3 id="en_efecto_no_encuentra_la_p+gina">En efecto, no encuentra la página</h3>
<p>por Xavier el Jue, 25/11/2010 - 12:01 </p>
<p>Tal y como predices, no parece encontrar la pagina buscada. Ahora me lanza este
error:</p>
<div class="codehilite"><pre>Some data not found in this URL:
http://www.ted.com/talks/lang/eng/jamie_oliver.html
Please report this error and provides the URL to check at:
http://code.joedicastro.com/ted-talks-download/issues/new
Thanks for helping to fix errors.
</pre></div>
<p>Lo curioso es que estoy probándolo con el ejemplo que tu nos proporcionas:</p>
<div class="codehilite"><pre><span class="go">TEDSubs.py -s http://www.ted.com/talks/lang/eng/jamie_oliver.html</span>
</pre></div>
<p>Para asegurarme que tengo conectividad desde mi ordenador he intentado ir a la
pagina web en un browser (sale ok) y he intentado bajarla con wget (baja ok).</p>
<p>No creo que afecte, pero estoy usando OS X 10.6</p>
<p>gracias</p>
<p>Xavier</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<a href="http://joedicastro.com"><img src="pictures/avtr_joedicastro.png" height=28
width=28 alt="avatar" title="avatar de joedicastro"/></a></div>
<h3 id="bueno_teniendo_en_cuenta_los">Bueno, teniendo en cuenta los</h3>
<p>por <a href="http://joedicastro.com">joe di castro</a> el Jue, 25/11/2010 - 12:33</p>
<p>Bueno, teniendo en cuenta los errores que te da ahora y que al principio si
podías bajar el vídeo, el problema está en el cambio que hice de urllib a
urllib2, pero si el segundo te da este error, el primero no te bajaba los
subtítulos. He mirado googleando un poco y si parece haber algunos problemas
con estas librerías y MAC OSX, es algo que no puedo corroborar directamente
puesto que no dispongo de este SO para probarlo.</p>
<p>Así que voy a ir por terreno seguro y aprovechando el feedback que me das, voy
a prepararte una versión que emplee la herramienta externa wget para coger los
datos de la página, los subtítulos y el vídeo. De este modo nos aseguramos de
sortear este problema.</p>
<p>De nada, la pena es no tener un Mac, si no, no te hacia dar tantas vueltas.</p>
<p>Saludos</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<a href="http://joedicastro.com"><img src="pictures/avtr_joedicastro.png" height=28
width=28 alt="avatar" title="avatar de joedicastro"/></a></div>
<h3 id="ya_tienes_la_nueva_versi+n">Ya tienes la nueva versión</h3>
<p>por <a href="http://joedicastro.com">joe di castro</a> el Jue, 25/11/2010 - 14:00</p>
<p>Ya tienes la nueva versión con wget, esta no debería darte esos problemas. Ya me
dirás el resultado.</p>
<p>Saludos</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<img src="pictures/avtr_xavier.png" height=28 width=28
alt="avatar" title="avatar de Xavier"/></div>
<h3 id="fant+stico">fantástico!</h3>
<p>por Xavier el Jue, 25/11/2010 - 14:43 </p>
<p>Ahora ya funciona perfectamente!</p>
<p>muchas gracias por añadir estas funcionalidades y por los scripts. Van a serme
de grande utilidad.</p>
<p>un saludo,</p>
<p>Xavier</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<a href="http://joedicastro.com"><img src="pictures/avtr_joedicastro.png" height=28
width=28 alt="avatar" title="avatar de joedicastro"/></a></div>
<h3 id="de_nada_gracias_a_ti_por_el">De nada, gracias a ti por el</h3>
<p>por <a href="http://joedicastro.com">joe di castro</a> el Jue, 25/11/2010 - 14:47</p>
<p>De nada, gracias a ti por el feedback, le servirá a futuros usuarios.</p>
<p>Luego modifico también el otro script para emplear wget.</p>
<p>Un saludo</p>
<p>Joe</p>
<hr />
<div style="float:right; padding:2px; border: 1px solid #ccc; height:28px;">
<a href="http://joedicastro.com"><img src="pictures/avtr_joedicastro.png" height=28
width=28 alt="avatar" title="avatar de joedicastro"/></a></div>
<h3 id="nuevas_versiones_mejoradas_de">Nuevas versiones mejoradas de</h3>
<p>por <a href="http://joedicastro.com">joe di castro</a> el Mié, 01/12/2010 - 23:51</p>
<p>Nuevas versiones mejoradas de los scripts (versión 1.3) y probadas en las 831
charlas disponibles hasta hoy, contemplando todos los casos diferentes.</p>
<p>Saludos</p>