Página 3 de 6

Re: Varios archivos, 1 torrent

Publicado: 18 Ene 2016, 22:51
por robalo
neno1978 escribió:Lo del porcentaje me parece muy correcto, creo que efectivamente es eso lo q pasa. Pero cuál es el motivo de poner todos los vídeos en allocate? Y en q caso concreto sucede q no trinque el formato. Para probarlo, xq estoy harto probarlo diferenciando avi y mkv y no me da en absoluto ningún problema con el porcentaje adecuado de reproducción.
Cierto neno, pero he estado conspirando a tus espaldas con Cmos para quitarte el sparse de tus mkv, me jode que te funcione mejor que a mi :lol:. Fuera coña, era por ver si el problema que comenta Cmos era por la forma de almacenar los datos y despejar dudas.

Y no, no te voy a decir que serie es y menos por aquí :lol: sólo te puedo decir que es una de tantas que veo y reveo una y otra vez y me gustaría tenerla en la mejor calidad posible, de momento me conformo con lo que hay en pelisalacarta para verlas sin tener que tirar de DVDs originales :)

@Cmos
Muy bueno Cmos, lo probaré. Mi gran quebradero de cabeza es poder colocar un porcentaje de inicio que se adapte a los tamaños de los archivos sin que sea un número demasiado grande pero sí suficiente.

Lo de usar el 7, si te soy sincero he probado con el 7, 5, 1 y 6 que son los que más, en ese mismo orden, he visto cuando he estado buscando información del tema. Como no noté diferenciás sobre un mismo torrent y un mismo magnet, decidí dejar el 7, pero si el siete se carga el 'set_sequential_download' pues se borra el

Código: Seleccionar todo

        else:
            h.file_priority(i,7)
y asunto arreglao :)
Ni pasárseme por la cabeza mirar los archivos para comprobar que se está almacenando, a cada día que pasa me vuelvo más inocentón :)

Lo que no se guarden en orden a que te refieres, a que no se colocan donde deben o a que se demoran algunos trozos y quedan se quedan los bytes a cero en el offset que le toca?

Re: Varios archivos, 1 torrent

Publicado: 18 Ene 2016, 23:37
por Cmos
robalo escribió: Lo que no se guarden en orden a que te refieres, a que no se colocan donde deben o a que se demoran algunos trozos y quedan se quedan los bytes a cero en el offset que le toca?
A que descarga por decir algo la pieza 1 y 2, luego la 4 y la 5, después la 7... Es decir, que sin haber terminado de descargar la parte que debería (si ha descargado la 1 y la 2 no debería empezar con la 4 hasta que no termine con la 3, al menos con las primeras, luego puede ser más flexible). Por ejemplo, te copio el log que devuelve el status de libtorrent, la peli es Atrapa la Bandera (1080p) del canal Bityouth, tamaño casi 4 GB:

Código: Seleccionar todo

23:27:09 T:7328  NOTICE: [1.0.3.0] 1.75% complete (down: 2102.0 kb/s up: 129.0 kB/s piezas completadas: [True, False, True, True, True, True, True, False, False, True, True, True, True, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False.... lo corto porque a partir de aquí todo es False
Los True-False indican si la pieza está descargada al completo o no. Como ves cuando empieza la reproducción tiene descargada la primera, pero falta la 2, sin embargo sí ha finalizado las siguientes, por lo tanto cuando llegue a la 2, si ésta no se ha descargado, la película se pixelará y meterá un salto. A eso me refiero.

Por cierto, la prueba es con la prioridad 1, si lo hago con la 7, las 8 primeras piezas están en False, así que sí, seguramente el modo 7 se carga la descarga secuencial del todo.

Re: Varios archivos, 1 torrent

Publicado: 19 Ene 2016, 13:06
por Cmos
Bueno, pues mirando la documentación sobre libtorrent he visto que hay una forma de dar prioridad diferente a lo que estamos intentando y según la he probado, creo que podría solucionar el tema del orden de las piezas. Resulta que el set_sequential_download lo que hace es pedir las piezas en orden, pero no discrimina si al que se la pide tiene una buena velocidad y por ejemplo, si pide la pieza 2 pero ese usuario no la tiene y tiene la 4, empezará a descargarse la 4, lo que hace que puedan descargarse partes que no nos interesan para empezar la reproducción que sin embargo para el porcentaje de comienzo sí cuentan.

Esto se puede cambiar utilizando para algunas piezas, las más urgentes, la función "set_piece_deadline". Con esto lo que hace es priorizar esas piezas y buscar al peer que se las puede proporcionar lo antes posible, para ello hay que indicar un límite de tiempo, que es lo que se usará para discriminar a los peers, por ejemplo si ponemos 10000 ms, se filtrará a los peers y se conectará a aquellos del que se la pueda descargar en menos de ese tiempo. Este es el código que he utilizado, justo después de:

Código: Seleccionar todo

    for i, _set in enumerate(h.file_priorities()):
        if i != _index:
            h.file_priority(i,0)

Código: Seleccionar todo

    filelist = []
    for Id, File in enumerate(info.files()):
        fdata = {"title": File.path, "size": File.size, "ind": int(Id), 'offset': File.offset}
        filelist.append(fdata)
    piece_length = info.piece_length()
    selectedFileInfo = filelist[_index]
    startPart = selectedFileInfo['offset'] / piece_length
    endPart = int((selectedFileInfo['offset'] + selectedFileInfo['size']) / piece_length)
    for i, index in enumerate(h.piece_priorities()):
        if (index==1) & (i < startPart+5): h.set_piece_deadline(i,10000)
        elif (index==1) & ((i < startPart+20) & (i< endPart-2)): h.set_piece_deadline(i,300000)
        elif (index==1) & (i>endPart-2): h.set_piece_deadline(i,10000)
Básicamente lo que hago es primero sacar la info de los archivos y sacar el offset en el que empieza y termina el archivo que se haya seleccionado. Luego recorro la prioridad de las piezas cambiando únicamente las que tengan prioridad 1 para descargar y dentro de ellas, a las 5 primeras y a las 2 últimas (a veces si no se hace no termina de reproducir el archivo) les pongo una prioridad superior, y a partir de la 5 hasta la 20 hago lo mismo pero con un deadline superior, lo que hace que se prioricen justo después de las anteriores pero antes que todas las demás que estarán con prioridad 1.

Esto lo he comprobado sacando por el log las piezas completadas como puse con el mensaje anterior, que simplemente se hace con un print dentro de while not h.is_seed():

Código: Seleccionar todo

s = h.status()
print ('%.2f%% completado - piezas terminadas: %s)' % \ (s.progress * 100, s.pieces))
Y pude comprobar cómo hasta que no terminaba las 5 primeras y las 2 últimas, no comenzaba con las siguientes. Con esto se asegura que al iniciar la reproducción no habrá problemas :D
Comentar también que el set_sequential_download no debería quitarse, para que así el resto de piezas que tienen prioridad normal se soliciten en orden.

Re: Varios archivos, 1 torrent

Publicado: 19 Ene 2016, 22:49
por neno1978
Bestial Cmos , BESTIAL... deseando probarlo, yo tb estuve leyendo sobre justo eso en un mailing del creador del libtorrent , pero como toy mi verde en esto pues como no . MAÑANA tempranito lo pruebo crack ;)

Re: Varios archivos, 1 torrent

Publicado: 20 Ene 2016, 01:11
por robalo
No quiero defraudaros pero por lo que he probado el que maneja el cotarro es el 'set_sequential_download(True)'. Todo lo que hagamos para prioritarizar piezas importa poco. Creo que las funciones para prioritizar piezas no está pensada para el streamin, en su lugar está set_sequential_download(True) y desde mi punto de vista funciona muy bien.

Cuando usamos 'set_sequential_download(True)' los únicos valores que nos serán útiles son el '0' (cero) "piece is not downloaded at all" y del 1 al 7 ó diferente a cero. Diferente a cero con 'set_sequential_download(True)' se puede entender como 'not' al significado de cero.

Creo que lo he probado todo, setear valores diferente a cero con 'piece_priority' y también con 'set_piece_deadline'. Los resultados son siempre los mismo.

El algoritmo que he usado para probar es algo diferente pero hace lo mismo

Código: Seleccionar todo

    for i, _set in enumerate(h.file_priorities()):
        if i != _index:
            h.file_priority(i,0)

    piece_set = []
    for i, _set in enumerate(h.piece_priorities()):
        if _set == 1:
            piece_set.append(i)

    for i in range(0,10):
    #    h.set_piece_deadline(piece_set[i],10000)
        h.piece_priority( piece_set[i], 7 )
    for i in range(len(piece_set)-10,len(piece_set)):
    #    h.set_piece_deadline(piece_set[i],10000)
        h.piece_priority( piece_set[i], 7 )

Re: Varios archivos, 1 torrent

Publicado: 20 Ene 2016, 01:57
por Cmos
neno1978 escribió:Bestial Cmos , BESTIAL... deseando probarlo, yo tb estuve leyendo sobre justo eso en un mailing del creador del libtorrent , pero como toy mi verde en esto pues como no . MAÑANA tempranito lo pruebo crack ;)
Espera, espera, que leyendo a robalo lo mismo lo mío ha sido un efecto placebo :lol:
robalo escribió:No quiero defraudaros pero por lo que he probado el que maneja el cotarro es el 'set_sequential_download(True)'. Todo lo que hagamos para prioritarizar piezas importa poco. Creo que las funciones para prioritizar piezas no está pensada para el streamin, en su lugar está set_sequential_download(True) y desde mi punto de vista funciona muy bien.
Pues la verdad, he estado probando ayer y hoy con el código que comento en varios torrents de diferentes canales y sí que he notado que hasta que no descarga las piezas indicadas por el deadline no se pone con el resto. Incluso noto que la velocidad es menor hasta que no descarga esas piezas, señal de que no está descargando de muchos peers, sino de los que solamente tienen esas.

Tal vez sea casualidad, pero por ejemplo si pongo una misma película con prioridad 1 o 7, al comenzar las piezas al 1,50% están así:

Código: Seleccionar todo

False, True, True, False, False, False, True, True, False, True, False, False,
Y así con el 'set_piece_deadline' prioritario para las 5 primeras, con el cual mirando la progresión hay un momento en que solo están descargadas las 5 del principio y las 2 del final, y a partir de ahí se van completando las siguientes:

Código: Seleccionar todo

True, True, True, True, True, False, False, True, True, True, False,
Todo esto con el 'storage_mode' en modo sparse para cualquier archivo, aunque no sé si tendrá algo que ver. Seguiré haciendo pruebas, que seguro que vosotros habéis hecho un montón más que yo y lo mismo me he tirado a la piscina antes de tiempo xD A unas malas, si ninguna solución de estas funciona bien, se podría hacer que comenzara a reproducir no solo teniendo en cuenta el porcentaje, sino también si las primeras piezas están descargadas.

Re: Varios archivos, 1 torrent

Publicado: 20 Ene 2016, 12:20
por robalo
No se Cmos, la disponibilidad es la que manda, de eso dependerá como funcione 'set_sequential_download(True)'.
Las pruebas las he hecho con distintos valores en el 'set_piece_deadline' con 'Atrapa la bandera MicroHD (bityouth)' que aveces se resiste un pelín la pieza 0 y unas veces la pilla antes de iniciar el vídeo y otras no. Lo mismo ocurre si no se usa 'set_piece_deadline'. La pieza 0 no es importante en un vídeo de 4 gigas, ni te enteras de que falta.

Cuando pruebo, intento cambiar el método lo más rápido posible para intentar cazar a los mismo peers y si he tenido suerte que hay que tener bastante :) los resultados son casi idénticos.

Creo que 'set_sequential_download(True)' ya se engarga de lo que estamos probando, aunque para salir de dudas lo mejor es preguntarle al desarrolador del libtorrent :)

Re: Varios archivos, 1 torrent

Publicado: 20 Ene 2016, 16:18
por Cmos
robalo escribió:No se Cmos, la disponibilidad es la que manda, de eso dependerá como funcione 'set_sequential_download(True)'.
Las pruebas las he hecho con distintos valores en el 'set_piece_deadline' con 'Atrapa la bandera MicroHD (bityouth)' que aveces se resiste un pelín la pieza 0 y unas veces la pilla antes de iniciar el vídeo y otras no. Lo mismo ocurre si no se usa 'set_piece_deadline'. La pieza 0 no es importante en un vídeo de 4 gigas, ni te enteras de que falta.

Cuando pruebo, intento cambiar el método lo más rápido posible para intentar cazar a los mismo peers y si he tenido suerte que hay que tener bastante :) los resultados son casi idénticos.

Creo que 'set_sequential_download(True)' ya se engarga de lo que estamos probando, aunque para salir de dudas lo mejor es preguntarle al desarrolador del libtorrent :)
Pues curiosamente con esa peli ha sido la prueba que puse antes :mrgreen: Disculpa por insistir tanto con el tema, pesado que es uno :lol: , pero es que en mi caso si no uso el set_piece_deadline y le pongo la misma prioridad a todas, noto pixelaciones al comienzo de la reproducción y al minuto o dos ya me pega un salto.

La verdad es que es complicado saber si realmente con el sequential download es suficiente, como dices seguramente solo lo sepa el desarrollador xD. Y tampoco es que haya muchas opiniones en torno a ello en internet. Lo único "interesante" que he visto es un cliente basado en libtorrent creado especialmente para el streaming por torrent, BTClient. Por sus especificaciones, creo que lo que hace es setear todas las piezas a prioridad 0 en lugar de a 1, excepto las 5 primeras y últimas que lo hace con deadline, y una vez terminadas, les pone deadline a las 5 siguientes y así sucesivamente. Supongo que de esta manera evita que se descarguen piezas que no se van a reproducir todavía, pero he estado mirando el código y no doy con la tecla de cómo implementarlo en MCT para hacer la prueba...

Re: Varios archivos, 1 torrent

Publicado: 20 Ene 2016, 16:57
por robalo
Cmos escribió:Pues curiosamente con esa peli ha sido la prueba que puse antes :mrgreen: Disculpa por insistir tanto con el tema, pesado que es uno :lol: , pero es que en mi caso si no uso el set_piece_deadline y le pongo la misma prioridad a todas, noto pixelaciones al comienzo de la reproducción y al minuto o dos ya me pega un salto.

La verdad es que es complicado saber si realmente con el sequential download es suficiente, como dices seguramente solo lo sepa el desarrollador xD. Y tampoco es que haya muchas opiniones en torno a ello en internet. Lo único "interesante" que he visto es un cliente basado en libtorrent creado especialmente para el streaming por torrent, BTClient. Por sus especificaciones, creo que lo que hace es setear todas las piezas a prioridad 0 en lugar de a 1, excepto las 5 primeras y últimas que lo hace con deadline, y una vez terminadas, les pone deadline a las 5 siguientes y así sucesivamente. Supongo que de esta manera evita que se descarguen piezas que no se van a reproducir todavía, pero he estado mirando el código y no doy con la tecla de cómo implementarlo en MCT para hacer la prueba...
Esa forma que comentas se ma ha pasado por la cabeza más de una vez. No creo que sea complicado implementarlo MCT, todo lo contrario, no hay tanto code como para perderse :).

Respeto al BTC, creo que no tiene mucho sentido usar 'set_sequential_download(True)' y 'set_piece_deadline', o se usa una cosa o la otra.

Si te sientes con ganas te hecho un cable para implementar el 'set_piece_deadline' o marcar bloques de piezas a 1, el resto a 0 y el sequential o lo que más te guste, en mente tengo varias formas posible que se pueden testear, he tenido mucho tiempo para pensarlo :). Se hacer sin mareos de offset como ya has visto, no usarlo aligera el trabajo y visualmente marea menos.

Y sobre 'Atrapa la bandera', esto es lo que hace un rato he optenido en una de las pruebas nada más empezar la reproducción del vídeo con todas la piezas a 1 y sin 'set_piece_deadline'

Código: Seleccionar todo

6:18:26 T:3176  NOTICE: 24 piezas descargadas
                                            [00000][00001][00002][00003][00004][00005][00006][00007][00008][00009][00010][00011][00012][00013][00014][00015][00016][XXXXX][00018][00019]
                                            [00020][00021][XXXXX][00023][XXXXX][00025][XXXXX][XXXXX][00028][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX]
                                            [XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX]
                                            [XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX]
                                            [XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX]
                                            [XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX][XXXXX]
.....

Re: Varios archivos, 1 torrent

Publicado: 21 Ene 2016, 00:10
por Cmos
robalo escribió:Esa forma que comentas se ma ha pasado por la cabeza más de una vez. No creo que sea complicado implementarlo MCT, todo lo contrario, no hay tanto code como para perderse :).

Respeto al BTC, creo que no tiene mucho sentido usar 'set_sequential_download(True)' y 'set_piece_deadline', o se usa una cosa o la otra.

Si te sientes con ganas te hecho un cable para implementar el 'set_piece_deadline' o marcar bloques de piezas a 1, el resto a 0 y el sequential o lo que más te guste, en mente tengo varias formas posible que se pueden testear, he tenido mucho tiempo para pensarlo :). Se hacer sin mareos de offset como ya has visto, no usarlo aligera el trabajo y visualmente marea menos.
Pues me he puesto a ello y he llegado a un punto muerto, veo que el código funciona y que consigo priorizar las piezas siguientes una vez han sido descargadas las 5 primeras y últimas, pero justo entonces Kodi me da un error y se cierra directamente, con lo que muy gordo debe ser algo de lo que estoy intentando :D Aquí está el código completo: https://github.com/CmosGit/pelisalacart ... ore/mct.py

Te comento un poco por encima lo que he hecho. He utilizado tu código (no el mío que era un caos xD) con el piece_set, pero incluyéndole a este el valor de prioridad además del número de pieza:

Código: Seleccionar todo

    piece_set = []
    for i, _set in enumerate(h.piece_priorities()):
        if _set == 1:
            piece_set.append([i,_set])
Y justo después pongo todas a modo 0 excepto las primeras y últimas. Tras esto, dentro del while not h.is_seed() creo una escucha de alerta que se lanza cuando ésta sea del tipo "read_piece_alert", que es la que se activa cuando una pieza descargada por el método deadline termina, y además ya se hayan descargado todas las piezas que no están a 0. Lo que hace es simplemente recorrer el piece_set y modificar las 5 primeras piezas que encuentre a 0.

Código: Seleccionar todo

    while not h.is_seed():
        s = h.status()
        if s.is_finished == True : update_piece(h, piece_set)
        alert = ses.pop_alert()
        while alert is not None:
            alert_type = type(alert).__name__
            if (alert_type == 'read_piece_alert') & (s.is_finished) == True:
                update_piece(h, piece_set)
                alert = ses.pop_alert()
            else: break
        xbmc.sleep(100)
.........
def update_piece(h, piece_set):
    count = 0
    for i, _set in enumerate(piece_set):
        if (_set[1] == 0) & (count < 5):
            h.set_piece_deadline(i,10000,lt.deadline_flags.alert_when_available)
            print "#### h.piece_priorities() ## %s ##" % h.piece_priorities()
            count += 1
        elif count == 5: return
Aparte de esto, he tenido que modificar el "disparador" de reproducción junto con la función getProgress(). Antes comparaba el porcentage_to_play con el s.progress, pero esto muestra el progreso sobre el total de piezas puestas a descargar, y como la mayoría están a 0 la reproducción salta enseguida. Por eso lo he sustituido por la división del total descargado del archivo (s.total_done) entre el tamaño del archivo, que al final es lo mismo que el s.progress con todas las piezas a 1.

Pues eso, ahí queda mi intento, como digo debo estar haciendo algo terriblemente mal porque Kodi me da en todos los morros, pero por más que lo reviso no acierto a saber el qué :?: . Fijo que está tan claro que por poco me come, pero nada, te agradecería si pudieras echarle un ojo y así probarlo bien para asegurarme de si funciona ;)