Página 2 de 3

Re: Creacion de canales

Publicado: 19 Jun 2018, 23:04
por dan83
caperucitaferoz escribió:
19 Jun 2018, 18:08
Entendemos que la función del plugin es ver vídeos ¿No? Se pueden descargar para verlos más tarde, pero en cualquier caso serán vídeos no DVDs o BlueRay con varios vídeos, menús, audios, etc... ¿Correcto?
Los unicos completos con menus y todo eso son las Fullbluray.
caperucitaferoz escribió:
19 Jun 2018, 18:08
Dicho lo anterior ¿Cuál sería la diferencia entre microhd,FullBluRay,BDremux?
Metodo de ripeo,calidad,...por ejemplo FullBluRay es el bluray completo(video,audio,extras,...),en BDremux,no tocan nada(no recodifican nada,el video original,audio,...)pero quitan los extras,...y las demas como microhd recodifican video,audio,...

Fullbluray>bdremux>microhd,....cuanto mas tamaño de archivo mas calidad.Yo solo veo microhd por tamaño y porque se ven bien a 1080, aunque se pueden ver hasta los de 4k(ya depende como este compartido, las cosas del p2p), pero microhd,blurayrip y series sin ningun problema.

Re: Creacion de canales

Publicado: 21 Jun 2018, 00:40
por caperucitaferoz
dan83 escribió:
19 Jun 2018, 23:04
Los unicos completos con menus y todo eso son las Fullbluray.
En principio este plugin no esta pensado para esto. Solo para reproducir videos, cualquier otra funcionalidad queda fuera de su proposito.

Respecto a los 4K si realmente tienen una resolucion mayor de los 1080 podemos crear una nueva calidad dentro del archivo item.py, si no es asi deberias identificarlos como HDFull.

Hasta ahora en todos nuestros canales encontrabamos un listado de peliculas, no repetidas, y al seleccionar una de ellas nos llevaba al listado de servidores (findvideos) cada uno con su calidad. En este canal esto ya no es asi, ya que en el listado de peliculas podemos encontrar algunas repetidas, pero con diferentes calidad, y al entrar solo encontraremos un unico enlace torrent.
Para adaptarnos a este nuevo funcionamiento modificaremos los perfiles para que muestren la calidad en el listado de peliculas. No sabemos si sera necesario hacer lo propio con las series, ya lo iremos viendo.
Los perfiles modificados los tendreis en la proxima beta, pero por si quereis probarlos os los paso en un zip.

dan83, he repasado el codigo y creo que tienes un error en el regex del bloque_quality (aunq eso no quita que el codigo funcione), puedes comprobarlo si añades un logger.debug(bloque_quality). Por otra parte creo q seria mejor obtener el titulo junto a la calidad (es mas fiable que de la url). Te pongo mi version a ver q te parece:

Código: Seleccionar todo

def newest_movies(item):
    logger.trace()
    itemlist = list()

    data = httptools.downloadpage(item.url).data
    data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
    data = re.sub(r"\n|\r|\t|\s{2}| ", "", data)

    # Extraemos bloque_noticia
    patron = "<td><div align='justify'><center>(.*?)</td>"
    for noticia in scrapertools.find_multiple_matches(data,patron):
        # Obtenemos las urls y los posters incluidos en cada noticia
        patron = '<a href="([^"]+)"><img src="([^"]+)'
        for url, poster in scrapertools.find_multiple_matches(noticia, patron):
            # Con ayuda de la url obtenemos el titulo y la calidad de cada pelicula
            patron = '%s">([^<]+)</a> <b>([^<]+)</b>' % url
            title, quality = scrapertools.find_single_match(noticia, patron)
            title = title.replace(quality, '').strip()
            quality = quality.replace('(','').replace(')','').strip()

            itemlist.append(item.clone(
                title=title,
                label=title,
                url= HOST + url,
                type="movie",
                content_type="servers",
                poster= HOST + poster,
                action="findvideos",
                quality=QLT.get(quality)
                ))

    # Paginador
    next_url = scrapertools.find_single_match(data, "</span> <a href='(.*?)'")
    if next_url:
        next_url = HOST + next_url
        itemlist.append(item.clone(
            action="newest_movies",
            url=next_url,
            type='next'
        ))

    return itemlist

Una cosa que me gusta de la clase Quality es que cuando encuentra algo desconocido para ella lo indica en el log:

Código: Seleccionar todo

20:22:51 DEBUG core.item                      get                  122  | Calidad desconocida: 'HDRip'
20:22:51 DEBUG core.item                      get                  122  | Last line repeats 35 times
20:22:51 DEBUG core.item                      get                  122  | Calidad desconocida: 'BR-Screener'
20:22:51 DEBUG core.item                      get                  122  | Last line repeats 5 times
Asi que ya sabes, debes añadir esas calidades a QLT.

PD: No se si editar el primer mensaje es la manera mas sencilla de ir siguiendo los progresos. Casi seria preferible que fueses incluyendolo en las respuestas segun avanzamos el hilo.

Re: Creacion de canales

Publicado: 21 Jun 2018, 15:45
por dan83
-Interesante esto

Código: Seleccionar todo

title, quality = scrapertools.find_single_match(noticia, patron)
siempre lo habia visto de otra forma, lo tipico de 'for....in...'

-Lo de quality si, hare una busqueda de todas y las pondre.

-Y si mejor lo pondre poco a poco segun avancemos.

-En size me he dado cuenta que no acepta ',' y tuve que hacer "size = size.replace(',','.')", no digo que este mal, sino que para que la gente lo tenga en cuenta.

Re: Creacion de canales

Publicado: 22 Jun 2018, 10:17
por caperucitaferoz
dan83 escribió:
21 Jun 2018, 15:45
En size me he dado cuenta que no acepta ',' y tuve que hacer "size = size.replace(',','.')", no digo que este mal, sino que para que la gente lo tenga en cuenta.
En Python el separados decimal de los Float es el punto y en nuestro codigo el size se convierte de string a float, por eso falla si el numero tiene una coma en lugar de un punto.
dan83 escribió:
21 Jun 2018, 15:45
-Interesante esto: title, quality = scrapertools.find_single_match(noticia, patron)
siempre lo habia visto de otra forma, lo tipico de 'for....in...'
find_single_match devuelve una tupla con la primera concordancia del patron en el texto. El numero de elementos de la tupla es el numero de capturas (parentesis) del patron, en este caso 2. Por eso se puede hacer esa asignacion.
find_multiples_match devuelve una lista con todas las coincidencias encontradas en el texto. El numero de elementos de la lista es el numero de veces que el patron ha encontrado concordancia en el texto. Y cada elemento de esa lista es una tupla con las capturas (parentesis) del patron (si solo hay una captura la tupla tendra un solo elemento).

Continuamos?
  • Sobre la nueva funcion findvideos nada que alegar de momento.
  • Sobre la nueva funcion mainlist, aunque volveremos a ella mas tarde, de momento solo decir que newest_movies es valida para las secciones Peliculas y Peliculas HD de la web, por lo que podemos añadir un nuevo item a mainlist solo cambiando la url.
El siguiente paso serian las series. Aunque si nos fijamos bien en la web las noticias que se publican en estas secciones no son realmente series, sino nuevos episodios y asi es como debemos tratarlos.
Por lo tanto:
  • Nuevo item en mainlists: "Nuevos episodios"
  • Nueva funcion: newest_episodes
  • De momento ignoramos los capitulos multiples, los trataremos como si fueran episodios normales y le asignaremos el numero de episodio mas bajo. Por ejemplo si es Cap. 6 al 10 nuestro item.episode sera el 6 (ojo: debe ser un Int no un str)
  • Debemos obtener tambien el numero de temporada y asignarlo como un entero a item.season. En el caso de las miniseries se asignara el numero de season 1
Yo ya lo tengo hecho, pero os dejo un tiempo para q lo hagais vosotros antes de publicarlo.

Re: Creacion de canales

Publicado: 23 Jun 2018, 13:54
por dan83
Aqui el mio que seguro es mejorable,

Código: Seleccionar todo

def newest_series(item):
    logger.trace()
    itemlist = list()

    data = httptools.downloadpage(item.url).data
    data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
    data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;", "", data)

    patron = "<td><div align='justify'><center>(.*?)</td>"
    for noticia in scrapertools.find_multiple_matches(data,patron):

        patron = '<a href="([^"]+)"><img src="([^"]+)"'
        for url, poster in scrapertools.find_multiple_matches(noticia, patron):

            patron = '%s">([^<]+) - ([0-9,M]).*?\[([^<]+)\].*?Cap\. (\d+)' % url
            for title, season, quality, episode in scrapertools.find_multiple_matches(noticia, patron):
                #si es miniserie
                season= season.replace('M','1')
                
                itemlist.append(item.clone(
                    title= title,
                    label=title,
                    url= HOST + url,
                    type="tvshow",
                    episode=int(episode),
                    season=int(season),
                    poster= HOST + poster,
                    content_type="servers",
                    action="findvideos",
                    quality=QLT.get(quality)
                    ))

    # Paginador
    next_url = scrapertools.find_single_match(data, "</span> <a href='(.*?)'")
    if next_url:
        next_url = HOST + next_url
        itemlist.append(item.clone(
            action="newest_series",
            url=next_url,
            type='next'
        ))

    return itemlist

Re: Creacion de canales

Publicado: 23 Jun 2018, 17:37
por caperucitaferoz
dan83 escribió:
23 Jun 2018, 13:54
Aqui el mio que seguro es mejorable,
Esta muy bien, solo unos detalles ...
  • Me has cambiado el nombre de la funcion :oops: . Lo que vemos es un listado de nuevos episodios por lo tanto creo q lo logico es newest_episode y sus item seran del type='episode'
  • El patron que busca el titulo, season, etc..., la verdad es q me ha sorprendido (no acabo de entender muy bien como funciona :lol: ), pero:
    • Tiene un problema si el numero de temporada es mayor de 9.
    • Ademas me he encontrado 'temporada' escrito con mayuscula y con minuscula, no se si con 'miniserie' pasara lo mismo, pero habria q tenerlo en cuenta.
    • Por otra parte en la seccion 'Series' (las no HD) no se incluye la calidad, por lo q este patron te fallara.
  • Ese patron se lo pasas a scrapertools.find_multiple_matches(noticia, patron) y recorres el resultado con un for. Pues bien, dentro de la noticia solo va a encontrar una unica coincidencia con el patron (recuerda q incluye la url). Una unica iteraccion del for, por lo tanto seria mas correcto hacer: title, season, quality, episode = scrapertools.find_single_matches(noticia, patron) (¿te suena?)
Continuamos?
De alguna manera deberemos indicar y tratar los enlaces multi_capitulos, asi q en un primer momento lo que vamos a hacer es recuperarlos de la informacion de la noticia (modificando tu famoso patron para q no solo coja el primer numero de la etiqueta Cap.) Yo lo que hago es dividir ese patron en varios pasos (aqui tb se soluciona el problema de la calidad no HD):

Código: Seleccionar todo

        for url, poster in scrapertools.find_multiple_matches(noticia, patron):
            # Con ayuda de la url obtenemos el titulo_temporada y el capitulo
            patron = '%s">([^<]+)</a>\s*<b>([^<]+)</b>' % url
            title_season, episode = scrapertools.find_single_match(noticia, patron)
            tvshowtitle, season = scrapertools.find_single_match(title_season, "(?i)(.*?) - ([0-9,M]+)")
            quality = scrapertools.find_single_match(title_season, "\[([^\]]+)")

            # si es miniserie
            season = int(season.lower().replace('m', '1'))

            new_item = item.clone(
                tvshowtitle=tvshowtitle.strip(),
                label=tvshowtitle.strip(),
                url=HOST + url,
                action="findvideos",
                thumb=HOST + poster,
                season=season,
                type='episode',
                content_type='servers',
                quality = QLT.get(quality) if quality else ""
            )

            num_episode = scrapertools.find_multiple_matches(episode, "(\d+)")
            num_episode = [int(n) for n in num_episode]
            new_item.episode = num_episode[0]
El siguiente problema que nos vamos a encontrar es que en la descripcion de los capitulos podemos encontrarnos tres casos:
  • Cap. 3: Un solo episodio.
  • Cap. 3-4: Dos episodios(no se si podriamos encontrar Cap. 3-7 o Cap. 3-5-7, pero en cualquier caso mejor preveerlo)
  • Cap. 3-al-5: Varios episodios correlativos
En los dos ultimos casos hay que guardar los numeros de episodios en otra lista (por ejemplo multi_episode), en un caso sera [3,4] mientras que en el otro sera [3,4,5]

Para acabar de complicarlo mas (dan83 no te quejes q fuiste tu el que escogiste la web) hay dos tipos de enlaces multi_capitulos:
  • Los reales, que podemos abrir con ayuda de findvideos y cuya url es del tipo: "/serie-episodio-descargar-torrent..."
  • Los que abren una pagina con el listado completo de episodios de esta temporada y cuya url es del tipo: "/serie-descargar-torrents..."
Para estos ultimos habra que crear una nueva funcion "episodes(item)" que nos devuelva todos los episodios de la temporada (ya los filtraremos a posteriori si quereis) y cambiarle algunas cosas a new_item (la action y el content_type por ejemplo) antes de añadirlo al itemlist.

Dentro de la nueva funcion 'episodes' tb hay q tener en cuenta los enlaces q sean de un solo episodio y los q seran multi_capitulos reales.

PD1: Adjunto profiles con la calidad incluida en 'episode'
PD2: Desactivar tmdb para ver las diferencias entre type='episode' y type='tvshow' y fijaros en el truco de new_item.thumb.

Re: Creacion de canales

Publicado: 23 Jun 2018, 20:27
por dan83
Me has cambiado el nombre de la funcion :oops: . Lo que vemos es un listado de nuevos episodios por lo tanto creo q lo logico es newest_episode y sus item seran del type='episode'
Jajaja si lo tenia como 'newest_series' porque lo tenia hecho de antes.
Tiene un problema si el numero de temporada es mayor de 9
-Lo de mas de 9 temporadas no lo habia tenido en cuenta,lo de miniseries busque en la pagina(puse miniserie directamente en la busqueda) y estan todas en mayusculas,y lo de quality tienes razon,lo hice directamente desde HD(yo lo hubiera solucionado con un if-else :roll: ,pero asi esta mejor)
se patron se lo pasas a scrapertools.find_multiple_matches(noticia, patron) y recorres el resultado con un for.....
-Ya con este ejemplo si, vamos que se podria usar en todos los find_single_match
Para acabar de complicarlo mas.......
-Ya sabia lo de los multi_capitulos jajajaja, si se diferencian en la url, yo lo hacia asi

Código: Seleccionar todo

if "episodio" in url:
	action='episodes'
(si uso bastante los if y los extra= para diferenciar :oops: )


En findvideos en los de un solo capitulo, pondria un item para ir al listado de la serie(hay una url que dirige a la serie y vale la misma funcion 'episodes'),pero eso mas adelante.

Re: Creacion de canales

Publicado: 25 Jun 2018, 12:07
por caperucitaferoz
¿Como lo llevais? Realmente no se si a parte de dan83 me lee alguien mas :cry: , pero bueno, aunque solo haya un expectador el Show ha de continuar!!!

Como habreis deducido ya, al ser este el primer canal que nos encontramos con esta estructura, vamos adaptando los perfiles a medida que avanzamos para ir mostrando la informacion que en cada momento creemos oportuna. Es por eso que hoy os dejo una nueva version que incluye la informacion de los multi-episodios. Como ya dije en mi anterior mensaje los items de este tipo deben incluir un atributo multi_episodes del tipo list, con una lista ordenada de los episodios incluidos. Solo con esto el perfil mostrara en el listado de episodios una etiqueta extra del tipo "(Cap. 3-4)" o "(Cap. 3 al 5)".

Continuamos?
Ya hemos visto que hay enlaces del listado que solo contienen un episodio y que podriamos enviar a findvideos para reproducirlos, pero debemos adaptar esa funcion ya que no es exactamente igual para series q para peliculas, y nos deberia funcionar para cualquier tipo decontenido y calidad.
Por contra, hay otros enlaces que debemos enviar a episodes(). En esta funcion leeremos la web para obtener los enlaces reales y descompondremos los multi-episodes en otros tantos items con su correspondiente numero de episodio pero todos con la misma URL.

Por ultimo, no es muy logico seleccionar en el listado de episodios el item (Cap. 3 al 5) y obtener todo el listado de la temporada ¿no? Es necesario filtrar el resultado de episodes en una nueva funcion filter_multi_episodes() que muestre solo los episodios 3, 4 y 5 siguiendo el ejemplo anterior.

Re: Creacion de canales

Publicado: 25 Jun 2018, 13:57
por bic
caperucitaferoz escribió:
25 Jun 2018, 12:07
¿Como lo llevais? Realmente no se si a parte de dan83 me lee alguien mas :cry: , pero bueno, aunque solo haya un expectador el Show ha de continuar!!!


Hola caperucitaferoz ¿ como estas ? :)


Tranquila que por lo menos hay otro espectador mas y me imagino que quizas haya algun otro observador vergonzoso como ya ocurrio en el foro de Alfa https://alfa-addon.com/threads/manual-p ... #post-2266 :lol: :lol: :lol:



Voy siguiendo este hilo desde sus comienzos pero con mis escasos conocimientos tengo poco que decir,solo puedo ir aprediendo algo por si algun dia con mas tiempo y mis pequeños conocimientos puedo intentar aprender algo con un canal mas sencillo y facil de hacer,aunque dudo que consiga aprender y completar alguna vez algun canal por facil que sea,creo que primero tendria que aprender python y algo de programacion y esa ya seria mucha labor para mi :oops:



Gran trabajo como siempre y magistrales explicaciones caperucitaferoz y buen trabajo tambien de Dan83 :)

Re: Creacion de canales

Publicado: 26 Jun 2018, 15:40
por dan83
Pongo lo que llevo hasta ahora, falta lo de multiepisodes que con mas tiempo lo mirare

Código: Seleccionar todo

# -*- coding: utf-8 -*-

from core.libs import *

QLT = Qualities({
    Qualities.rip: ['DVDRip', 'HDRip'],
    Qualities.hd_full: ['1080p', 'BluRay-1080p', 'BDremux-1080p',  'MicroHD-1080p', 'FullBluRay'],
    Qualities.hd: ['BluRay-720p', 'hdtv', '720p'],
    Qualities.scr: ['dvdscr'],
    Qualities.sd: ['sd']
})

HOST = 'http://www.mejortorrent.com'

def mainlist(item):
    logger.trace()
    itemlist = list()

    itemlist.append(item.clone(
        action="newest_movies",
        label="Peliculas",
        url=HOST + '/torrents-de-peliculas.html',
        type="item",
        group=True,
        content_type='movies'
    ))

    itemlist.append(item.clone(
        action="newest_movies",
        label="Peliculas HD",
        url=HOST + '/torrents-de-peliculas-hd-alta-definicion.html',
        type="item",
        group=True,
        content_type='movies'
    ))

    itemlist.append(item.clone(
        action="newest_episodes",
        label="Series",
        url=HOST + '/torrents-de-series.html',
        type="item",
        group=True,
        quality='sd',
        content_type='episodes'
    ))
    
    itemlist.append(item.clone(
        action="newest_episodes",
        label="Series HD",
        url=HOST + '/torrents-de-series-hd-alta-definicion.html',
        type="item",
        group=True,
        content_type='episodes'
    ))
    
    return itemlist

def newest_movies(item):
    logger.trace()
    itemlist = list()

    data = httptools.downloadpage(item.url).data
    data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
    data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;", "", data)

    # Extraemos bloque_noticia
    patron = "<td><div align='justify'><center>(.*?)</td>"
    for noticia in scrapertools.find_multiple_matches(data,patron):
        # Obtenemos las urls y los posters incluidos en cada noticia
        patron = '<a href="([^"]+)"><img src="([^"]+)'
        for url, poster in scrapertools.find_multiple_matches(noticia, patron):
            # Con ayuda de la url obtenemos el titulo y la calidad de cada pelicula
            patron = '%s">([^<]+)</a> <b>([^<]+)</b>' % url
            title, quality = scrapertools.find_single_match(noticia, patron)
            title = title.replace(quality, '').replace('(4K-HDR)','').replace('(FullBluRay)','').strip()
            quality = quality.replace('(','').replace(')','').strip()

            itemlist.append(item.clone(
                title=title,
                label=title,
                url= HOST + url,
                type="movie",
                content_type="servers",
                poster= HOST + poster,
                action="findvideos",
                quality=QLT.get(quality)
                ))

    # Paginador
    next_url = scrapertools.find_single_match(data, "</span> <a href='(.*?)'")
    if next_url:
        next_url = HOST + next_url
        itemlist.append(item.clone(
            action="newest_movies",
            url=next_url,
            type='next'
        ))

    return itemlist

def newest_episodes(item):
    logger.trace()
    itemlist = list()

    data = httptools.downloadpage(item.url).data
    data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
    data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;", "", data)

    # Extraemos bloque_noticia
    patron = "<td><div align='justify'><center>(.*?)</td>"
    for noticia in scrapertools.find_multiple_matches(data,patron):
        # Obtenemos las urls y los posters incluidos en cada noticia
        patron = '<a href="([^"]+)"><img src="([^"]+)'
        for url, poster in scrapertools.find_multiple_matches(noticia, patron):
            # Con ayuda de la url obtenemos el titulo_temporada y el capitulo
            patron = '%s">([^<]+)</a>\s*<b>([^<]+)</b>' % url
            title_season, episode = scrapertools.find_single_match(noticia, patron)
            tvshowtitle, season = scrapertools.find_single_match(title_season, "(?i)(.*?) - ([0-9,M]+)")
            quality = scrapertools.find_single_match(title_season, "\[([^\]]+)")

            # si es miniserie
            season = int(season.lower().replace('m', '1'))

            if 'episodio' in url:
                action='findvideos'
                content_type='servers'
                extra='extra' #para identificar en findvideos 'ir a la serie'
            else:
                action='episodes'
                content_type='episodes'
        
            new_item = item.clone(
                tvshowtitle=tvshowtitle.strip(),
                label=tvshowtitle.strip(),
                url=HOST + url,
                action=action,
                thumb=HOST + poster,
                season=season,
                type='episode',
                content_type=content_type,
                extra=extra,
                quality = QLT.get(quality) if quality else item.quality
                )
        
            num_episode = scrapertools.find_multiple_matches(episode, "(\d+)")
            num_episode = [int(n) for n in num_episode]
            new_item.episode = num_episode[0]

            itemlist.append(new_item)

    # Paginador
    next_url = scrapertools.find_single_match(data, "</span> <a href='(.*?)'")
    if next_url:
        next_url = HOST + next_url
        itemlist.append(item.clone(
            action="newest_episodes",
            url=next_url,
            type='next'
        ))

    return itemlist

def episodes(item):
    logger.trace()
    itemlist = list()

    data = httptools.downloadpage(item.url).data
    data = unicode(data, "iso-8859-1", errors="replace").encode("utf-8")
    data = re.sub(r"\n|\r|\t|\s{2}|&nbsp;", "", data)

    bloque = scrapertools.find_single_match(data, 'Listado(.*?)<center')
    
    for url, title in scrapertools.find_multiple_matches(bloque, "<a href='(.*?)'>(.*?)<"):

        season,episode = scrapertools.find_single_match(title,'(\d+).*?(\d+)')
            
        new_item = item.clone(
            title=title,
            url=HOST + url,
            season=int(season),
            episode=int(episode),
            type='episode',
            content_type='servers',
            action="findvideos",
            extra=''#para que no se repita,ir a la serie,luego al meternos en la serie
            )
    
        itemlist.append(new_item)

    return itemlist


def findvideos(item):
    logger.trace()
    itemlist = list()

    data = httptools.downloadpage(item.url).data
    data = re.sub(r"\n|\r|\t|&nbsp;|<br>", "", data)
          
    data_torrent = scrapertools.find_single_match(data, "Torrent:.*?<a href='(.*?)'")
    url2 = HOST+"/"+data_torrent

    #descargamos la siguiente pagina
    data_enlace = httptools.downloadpage(url2).data
    data_enlace = re.sub(r"\n|\r|\t|&nbsp;|<br>", "", data_enlace)
    
    enlace = "Pincha <a href='(.*?)'>"

    url = scrapertools.find_single_match(data_enlace, enlace)

    itemlist.append(item.clone(
        label=item.label,
        action="play",
        url=HOST+url,
        type='server',
        server='torrent'
        ))

    #ir a la serie
    serie = scrapertools.find_single_match(data,"<td valign='top'>.*?<a href='(.*?)'")
    if 'extra' in item.extra:
        url = HOST + serie
        itemlist.append(item.clone(
            label="Ir a la Serie",
            action="episodes",
            type='item',
            url=url,
            content_type='episodes'
        ))

    itemlist = servertools.get_servers_from_id(itemlist)
    
    return itemlist
comento mas o menos lo que he hecho:

-linea 43, añado 'sd', no creo que haya de otra calidad en esa categoria y para mostrarla en quality(en newest_episodes) y que no de problemas.
-linea 124, aqui añado para diferenciar el tipo de enlace.
-linea 219, añado item para ir a la serie, lo hago con 'extra' de la linea 124.

Lo de multiepisodes, no se muy bien como hacerlo :? , he estado mirando y con range() a lo mejor se podria,con mas tiempo lo miro.