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

    View Slide

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

    View Slide

  3. ...y estaría bueno que todos
    tengamos la libertad para discutirlo

    View Slide

  4. ¿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

    View Slide

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

    View Slide

  6. 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%.

    View Slide

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

    View Slide

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

    View Slide

  9. A los Bifes
    Image link

    View Slide

  10. Cómo obtener Magnets con Python
    ● Torrent Media Searcher
    ○ https://pypi.python.org/pypi/TorrentMediaSearcher/

    View Slide

  11. 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).

    View Slide

  12. View Slide

  13. ● 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

    View Slide

  14. 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()

    View Slide

  15. El ejemplo completo en Github

    View Slide

  16. Estrategia

    View Slide

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

    View Slide

  18. Video

    View Slide

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

    View Slide

  20. View Slide

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

    View Slide

  22. View Slide

  23. Cómo integrar todo?
    pip install touchandgo
    https://github.com/touchandgo-devs/touchandgo
    Es lo que estamos
    intentando hacer.
    con TouchAndGo.

    View Slide

  24. 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. ;)

    View Slide

  25. ¿PREGUNTAS?

    View Slide

  26. Gracias!!
    Felipe Lerena
    @felipelerena
    Nicolas Demarchi
    @gilgamezh

    View Slide