Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tu propio cliente de Torrent Streaming en Python

Tu propio cliente de Torrent Streaming en Python

Nicolás Demarchi

November 28, 2014
Tweet

More Decks by Nicolás Demarchi

Other Decks in Programming

Transcript

  1. Tu propio cliente de Torrent Streaming en Python Nicolás Demarchi

    - @gilgamezh Felipe Lerena - @felipelerena Slides bit.ly/pyconar Ejemplos bit.ly/pyconar2 14/11/2014 - Pycon Argentina
  2. Disclaimer • Nos referimos a las cosas con su término

    en Inglés. • Esta no es una discusión filosófica, es una charla técnica. • Queremos discutir como hacer Video-on-demand usando tecnologías abiertas...
  3. ¿Qué es Bit Torrent? • Es un protocolo descentralizado para

    intercambiar archivos • Cada cliente es un Peer que se conecta a un Tracker para conocer quienes son los otros Peers para bajar Pieces de un Torrent Mas info
  4. Torrent y Magnet • El primer paso para compartir un

    archivo es generar un archivo .torrent Este archivo contiene la información necesaria para que un Peer sepa encontrar otros Peers que intercambien el mismo archivo: hash value, tamaño y nombre del archivo(s), IP del tracker(s), tamaño de las Pieces. • Un Magnet link tiene la información necesaria para pedirle el .torrent al resto de los clientes y bajarlo como si fuese un archivo más del torrent. Por lo tanto no se necesita alojar el .torrent en ningún lado. • Cada .torrent tiene un identificador único que es un hash SHA-1 de 20 bytes.
  5. Peers • Una instancia de un cliente de BitTorrent que

    transfiere datos desde y hacia otros clientes. • Seed: un Peer que tiene el 100% de las Pieces. • Leech: un Peer que tiene < 100%.
  6. Trackers • Es lo que utilizan los Peers para obtener

    la lista inicial de quiénes están compartiendo un torrent. • Un Peer “anuncia” en un Tracker que está dispuesto a intercambiar un torrent y la disponibilidad que tiene del mismo. • Es el punto de entrada al Enjambre (Swarm)
  7. Pieces • Las Pieces de un .torrent son la unidad

    de intercambio de la red torrent. • El .torrent tiene la información del tamaño y la cantidad de Pieces a descargar. • Normalmente tienen entre 64KB y 4MB. • Cada Piece tiene un identificador SHA-1 único. • Más info en derecho a leer
  8. Cómo obtener Magnets con Python • Torrent Media Searcher ◦

    https://pypi.python.org/pypi/TorrentMediaSearcher/
  9. Cómo descargar el torrent • Con libtorrent ◦ Es una

    implementación de BitTorrent en C++. ◦ Enfocada a performance y usabilidad. ◦ Demasiado Buena documentación. ◦ PYTHON BINDING!! ◦ Muy simple de usar. ◦ Disponible en cualquier SO respetable (... y en Windows).
  10. • Session: La instancia principal de libtorrent que contiene el

    loop principal del thread que maneja los torrents que estamos descargando • Torrent Handle: Maneja la descarga de un archivo .torrent • Torrent Status: Contiene toda la información de estado del torrent
  11. Tips para entender cómo funciona la descarga • status.pieces() expone

    una máscara de bits (bitmask) que representa todas las Pieces y su estado. (True si ya la descargamos) • handle.piece_priority() permite setear u obtener la prioridad de un piece. • status.get_downlodad_queue() expone la cola de descarga. • status.download_rate() y status.upload_rate()
  12. Piece picker • Es el responsable de administrar que Pieces

    se van a incorporar en la cola de descarga. • Tiene diferentes estrategias, por default usa rare first. En este modo siempre le da una prioridad más alta a las pieces que menos disponibilidad tienen en el enjambre. Es la estrategia más solidaria. • Cada Piece tiene una prioridad de 1 a 7 (7 es la más alta) y un deadline (handle.set_piece_deadline() ) que también influyen sobre el orden en que el Piece picker las encola. • TIP: Una Piece con un deadline muy bajo va a ser descargada ASAP.
  13. Torrent Streaming • VOD con BitTorrent. • Cómo? : Descargando

    un video de la red torrent y al mismo tiempo entregarlo a un reproductor (player) por HTTP. • Cómo servirlo via HTTP?: Con SimpleHTTPServer
  14. Subtítulos: subliminal y guessit https://pypi.python.org/pypi/subliminal/ Descarga subtitulos para muchos idiomas

    desde diferentes providers https://pypi.python.org/pypi/guessit Asume información del video en base al nombre del archivo
  15. Un detalle final Esta charla y nuestro trabajo en TouchAndGo

    son un ejemplo de una de las piezas más potentes de Python: La comunidad. Como pueden ver nos ahorramos la mitad del trabajo gracias a librerías de terceros. ;)