Manual para creación de canales

En el equipo Alfa hemos decidido inculcar un poco de cultura a los usuarios y porque no, también a desarrolladores para que puedan aprender a programar o mejorar sus conocimientos, Alfa como siempre lo dijimos no solo pretende entretener, también pretende que los usuarios obtengan cierta independencia y conocimiento suficiente el cual les permita poder crear o reparar sus propios canales, addons y no depender de que alguien haga el trabajo por ellos, esperamos sea de utilidad para muchos!

Como somos un addon que publica su codigo en github y nos gustaria ver nuevos desarrolladores, vamos a aportar nuestro granito de arena.

Las preguntas se hacen en público para que otros puedan aprender.

Equipo Alfa
 

Adjuntos

bic tranquilo aun estamos en la peliculas.

Paquito, ya te adverti q el regex te daria problemas con los item q no tuviesen la calidad. Mira esto: Regex101 - online regex editor and debugger
Cada vez q encuentra una serie, o mejor dicho q no encuentra la calidad2 se come al siguiente item de la lista (compara la pagina 2 de novedades en la web y en el canal).

  • Lo primero q me sorprende es el condicional de la linea 27. Has probado: data2 = scrapertools.find_single_match(data,'(?s)<div class="item_1.*?>(.*?)<div class=\'paginado\'>') sin condicion?

  • En segundo lugar lo que yo haria seria sustituir el patron de la linea 38 y 39 por:
patron += 'class="year">(\d{4})' # año
patron += '</span>(.*?)<div' # calidad

Con lo q te quedaria: (?s)class="ml-item.*?a href="([^"]+).*?img src="([^"]+).*?alt="([^"]+).*?class="year">(\d{4})</span>(.*?)<div Con este patron en scrapedquality tendrias siempre algo (pruebalo en regex101)
  • El filtrado de las series (lineas 42+) lo modificariamos e iria dentro del for:
Python:
for scrapedurl, scrapedthumbnail, scrapedtitle, scrapedyear, scrapedquality in matches:
    if not "/series/" in scrapedurl:
        scrapedquality = scrapertools.find_single_match(scrapedquality, '<span class="calidad2">(.*?)</span>')
        itemlist.append(Item(action = "findvideos", channel = item.channel,
                             title = scrapedtitle + " (" + scrapedyear + ") [" + scrapedquality + "]",
                             thumbnail = scrapedthumbnail, url = scrapedurl, quality=scrapedquality, infoLabels={'year':scrapedyear}))

Es decir, por cada coincidencia (matches) comprueba si scrapedurl no contiene "/series/" y solo entonces recupera la calidad mediante otra expresion regular y añade el item al listado.​
 
Lo primero, @caperucitaferoz, muchas gracias por tus aclaraciones, sin ellas no sería capaz de avanzar.

Lo primero q me sorprende es el condicional de la linea 27. Has probado: data2 = scrapertools.find_single_match(data,'(?s)<div class="item_1.*?>(.*?)<div class=\'paginado\'>') sin condicion?

Sí, lo he probado y funciona. El caso es que si buscas "<div class="item_1.*?>" hay dos coincidencias en la página principal de la web, es decir, en nuestra sección "Novedades del canal". Entiendo que utilizando la función "scrapertools.find_single_match" sólo cogería la primera ocurrencia, que es la que necesitamos, pero al no estar 100% seguro, preferí utilizar otro patrón que únicamente me devolviera 1 coincidencia.

¿Me aseguras que "scrapertools.find_single_match" sólo coge la primera coincidencia? Al llamarse "single" entiendo que sí, pero prefiero que me lo confirmes. De ser así, evidentemente el "if" sobra.

Cada vez q encuentra una serie, o mejor dicho q no encuentra la calidad2 se come al siguiente item de la lista (compara la pagina 2 de novedades en la web y en el canal).

Esto me ha dado muchos quebraderos de cabeza, pensé que se quedaba solucionado al eliminar las series de la lista, pero veo que no. Tras probar tu patrón para la calidad (utilizo constantemente regex101.com), veo que para las pelis devuelve:

</div> <span class="calidad2">Hd1080p</span> </div>

y para las series:

</div> </div>

Ahora veo claro a qué problema te refieres y veo la forma de solventarlo que has puesto en el código. Así visto, parece hasta sencillo, pero te aseguro que le he echado algunas horas para tratar de solventarlo. :confused:

Una vez implantado estos cambios, ¿quedaría por retocar algo de las pelis o pasaríamos a las series?

Una vez más, gracias por tu ayuda.
 
Última edición:
¿Me aseguras que "scrapertools.find_single_match" sólo coge la primera coincidencia?
esa funcion busca TODAS las coincidencias pero solo devuelve aquella cuyo indice se pase como tercer argumento, que sera 0 si se ignora. Asi q de hecho te devuelve la primera coincidencia. Pero ojo la primera coincidencia con el patron completo (comineza por <div class="item_1.*?> y termina por <div class=\'paginado\'>')) q en este caso coincide en q solo hay una.

Ahora veo claro a qué problema te refieres y veo la forma de solventarlo que has puesto en el código. Así visto, parece hasta sencillo, pero te aseguro que le he echado algunas horas para tratar de solventarlo. :confused:
Esto es parte del aprendizaje, creeme a mi me resulataria mas sencillo pasarte todo el codigo terminado y ya esta, pero asi no ibas a aprender nunca. No pienses q eso es tiempo perdido por q no lo es.

Una vez implantado estos cambios, ¿quedaría por retocar algo de las pelis o pasaríamos a las series?
Pero q ganas teneis de acabar!!! :D:D:D ¿tan duro soy como profe? o_Oo_Oo_O
Si te fijas en el tutorial sobre el objeto Item dice q hay q identificar el tipo de contenido al q corresponde cada item, mediante contentType, aunq si rellenamos correctamente el atributo item.contetTitle ya estaria.
Por otro lado, ahora la funcion contenidos solo nos añade peliculas, asi q propongo cambiarle el nombre por otra mas acorde. ¿q tal movies?
Una vez tenga esto creo q ya podras descomentar la linea 56
 
Gracias por responder de nuevo.

esa funcion busca TODAS las coincidencias pero solo devuelve aquella cuyo indice se pase como tercer argumento, que sera 0 si se ignora. Asi q de hecho te devuelve la primera coincidencia. Pero ojo la primera coincidencia con el patron completo (comineza por <div class="item_1.*?> y termina por <div class=\'paginado\'>')) q en este caso coincide en q solo hay una.

Tienes razón, sólo hay 1 coincidencia por la cadena elegida para cerrar el patrón, no me había dado cuenta.

Esto es parte del aprendizaje, creeme a mi me resulataria mas sencillo pasarte todo el codigo terminado y ya esta, pero asi no ibas a aprender nunca. No pienses q eso es tiempo perdido por q no lo es. Pero q ganas teneis de acabar!!! :D:D:D ¿tan duro soy como profe? o_Oo_Oo_O

Aquí quiero aclarar algo, estoy disfrutando con esto aunque a veces me cueste. Por supuesto que no es tiempo perdido. Precisamente todas estas dificultades hacen que se aprenda más. No tengo ninguna prisa.

Si te fijas en el tutorial sobre el objeto Item dice q hay q identificar el tipo de contenido al q corresponde cada item, mediante contentType, aunq si rellenamos correctamente el atributo item.contetTitle ya estaria.

No he encontrado el tutorial del objeto ITEM, ¿podrías decirme donde está para leermelo???

Por otro lado, ahora la funcion contenidos solo nos añade peliculas, asi q propongo cambiarle el nombre por otra mas acorde. ¿q tal movies?
Una vez tenga esto creo q ya podras descomentar la linea 56

De acuerdo a esto último.

Una vez más, muchas gracias por tu paciencia.
 
El tutorial está en el foro mimediacenter dentro de la sección de tutoriales

Vale, ya me leí el tutorial del Item y ya he puesto los cambios que me has recomendado.

La línea del itemlist.append quedaría así:

itemlist.append(Item(action = "findvideos", channel = item.channel, title = scrapedtitle + " (" + scrapedyear + ") [" + scrapedquality + "]", contentTitle=scrapedtitle, thumbnail = scrapedthumbnail, url = scrapedurl, quality=scrapedquality, infoLabels={'year':scrapedyear}))


También descomenté la línea del infolabels:

tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
.

Me he dado cuenta que la función de búsqueda, como su action es "movies" (la que anteriormente se llamaba "contenidos") ya no muestra las series puesto que lo hemos filtrado. Es algo que habrá que revisar posteriormente.

A la espera de nuevas directrices ;)
 
El caso es que este canal ya lo habia creado alguien pero como addon y estaba en el repositorio Kodigo y como tenia ese addon instalado le eche un vistazo hace pocas semanas y le fallaban la seccion de peliculas pero la seccion series funcionaba perfectamente y tenia series mas modernas y actuales que este canal,por ejemplo tenia una serie recien sacada como estreno llemada La peste y Pelisultra creado aqui como canal no tiene y lo curioso es que creo que tampoco aparece en la pagina web:rolleyes:
 
ya he puesto los cambios que me has recomendado
Pero no seas asi Paquito...comparte el codigo con tus follovers jejejeje (mas q nada por q es mas sencillo referirme a una linea en concreto si tenemos el mismo codigo base)

Es algo que habrá que revisar posteriormente.
No te preocupes ya lo miraremos.

Ahora vamos con las series.... he dicho SERIES ¿donde esta ese redoble de tambores?
Si te fijas en la web dentro del apartado series te sera realmente sencillo obtener el listado de las series disponibles en una nueva funcion llamada por ejemplo 'tvshows' incluyendo paginacion y añadiendole a cada item el año y el contentSerieName.

Una vez obtenida las series, si te fijas cada item tiene la url de una pagina donde se incluyen todos los episodios disponibles en la web. Aqui tendremos dos opciones una sencilla que seria mostrar todos los capitulos y ya esta, y otra q consiste en añadir un submenu entre la serie y el capitulo para listar las temporadas.
  • Opcion1:
    • Listado series:
      • serie1
      • serie 2:
        • capitulo 1x1
        • capitulo 1x2
        • capitulo 2x1
        • capitulo TxN
  • Opcion 2:
    • Listado series:
      • serie 1
      • serie 2:
        • Temporada 1
        • Temporada 2:
          • capitulo 2x1
          • capitulo 2x2
Yo de momento empezaria con la opcion 1, creando una nueva funcion llamada episodes, aunq confieso q me gusta mas la 2 ;-) Resumiendo desde mainlist iriamos a tvshows y de este a episodes
 
Lo primero, como siempre, gracias @caperucitaferoz por tu tiempo y tu atención, realmente lo valoro.

Pero no seas asi Paquito...comparte el codigo con tus follovers jejejeje (mas q nada por q es mas sencillo referirme a una linea en concreto si tenemos el mismo codigo base)

Como eran cambios mínimos, no pensaba que fuera necesario, pero lo subo ahora en este mismo post. He modificado también los idiomas dentro del .json porque me he dado cuenta que todo el audio es latino, así que he quitado el "esp" y el "cast".

Ahora vamos con las series.... he dicho SERIES ¿donde esta ese redoble de tambores?

:D:D:D Tenía ganas de que llegara este momento, porque creo que será la parte más complicada del canal.

Si te fijas en la web dentro del apartado series te sera realmente sencillo obtener el listado de las series disponibles en una nueva funcion llamada por ejemplo 'tvshows' incluyendo paginacion y añadiendole a cada item el año y el contentSerieName.

Una vez obtenida las series, si te fijas cada item tiene la url de una pagina donde se incluyen todos los episodios disponibles en la web. Aqui tendremos dos opciones una sencilla que seria mostrar todos los capitulos y ya esta, y otra q consiste en añadir un submenu entre la serie y el capitulo para listar las temporadas.
  • Opcion1:
    • Listado series:
      • serie1
      • serie 2:
        • capitulo 1x1
        • capitulo 1x2
        • capitulo 2x1
        • capitulo TxN
  • Opcion 2:
    • Listado series:
      • serie 1
      • serie 2:
        • Temporada 1
        • Temporada 2:
          • capitulo 2x1
          • capitulo 2x2
Yo de momento empezaria con la opcion 1, creando una nueva funcion llamada episodes, aunq confieso q me gusta mas la 2 ;-) Resumiendo desde mainlist iriamos a tvshows y de este a episodes

A mí también me gusta más la segunda opción, pero vamos a empezar por la primera, que parece algo más sencilla.
 

Adjuntos

El caso es que este canal ya lo habia creado alguien pero como addon y estaba en el repositorio Kodigo y como tenia ese addon instalado le eche un vistazo hace pocas semanas y le fallaban la seccion de peliculas pero la seccion series funcionaba perfectamente y tenia series mas modernas y actuales que este canal,por ejemplo tenia una serie recien sacada como estreno llemada La peste y Pelisultra creado aqui como canal no tiene y lo curioso es que creo que tampoco aparece en la pagina web:rolleyes:

Si no lo tiene la web no puede tenerlo el canal. Si dices que en ese addon aparecen más series, supongo que las estará cogiendo de otra web. Es la única explicación que se me ocurre.
 
Buenas de nuevo,
es un desastre el código fuente de las series, el numero de capítulo y el nombre contienen muchos espacios en blanco, saltos de línea, etc. Estoy seguro de que con regex puedes obviar los espacios en blanco, pero como no tengo apenas experiencia, lo he resuelto con Python, que algo de experiencia tengo.
Subo la nueva versión con las series funcionales con la opción 1 que comentaste, @caperucitaferoz. Faltaría crear un paginador para que no te muestre todos los capítulos en el mismo menú. Lo suyo sería mostrar unos 20 resultados y en la siguiente página otros 20 y así.
Ahora me voy a la cama que madrugo mucho :rolleyes:
 

Adjuntos

Un apunte sobre la seccion peliculas: como podras comprobar en algunas de ellas aparece ahora el fanart, la sinopsis y otros datos. Esto es gracias al modulo tmdb (linea 45), pero en otras muchas no. ¿por que? Pues porq el titulo q le pasamos no es exactamente el titulo de la pelicula por ejemplo en las de Cantiflas no se por q pero al webmaster le ha parecido buena idea incluir el nombre del protagonista en el titulo de la pelicula :mad: En la seccion series funciona mucho mejor por q los titulos estan mas limpios (descomenta la linea 90)

Sobre las series y episodios: da gusto ver como te resuelves con las tareas encomendadas :D:D:D Ya vi en su momento la guarrada de los numeros de capitulos. Por suerte el formato de la url permite extraerlos, si no fuese asi habria q ir a limpiar los espacios en blanco, tabulaciones y saltos de linea. Para obtener el numero de capitulo y episodio de la url (y en general de cualquier texto) puedes utilizar la funcion scrapertools.get_season_and_episode. Echale un ojo. Y ya q sabemos el numero de temporada y episodio ¿por q no incluirlo en el Item? Tambien sabemos el tipo de item ¿no? (todos estos datos q a lo mejor piensas q son inutiles despues los utiliza tmdb para hacer su trabajo)

Otra cosa interesante: si leiste el tutorial de Item recordaras que recomienda clonar los items en lugar de crearlos de cero. Pruebalo en episodios y veras como los datos obtenidos por tmdb en series se heredan automaticamente.

Faltaría crear un paginador para que no te muestre todos los capítulos en el mismo menú. Lo suyo sería mostrar unos 20 resultados y en la siguiente página otros 20 y así.
Esto solo lo veo util si nos quedamos con la opcion 1, en otro caso es dificil encontrar (aunq no imposible) una serie q tenga mas de 20 episodios por temporada. La forma de hacerlo seria: una vez obtenido TODOS los episodios me quedo solo con los 20 primeros de la lista: itemlist[x:x+19] y le añado un nuevo item "pagina siguiente" si hay mas episodios en la lista, a este nuevo item le añado un atributo item.extra=x ¿me sigues?

Lo proximo podria ser un apartado en mainlist para "Nuevos Episodios" o bien la opcion 2 de los episodios. Tu decides.
 
Esto marcha bien, @caperucitaferoz! Poco a poco voy entendiendo mejor el funcionamiento de Alfa y crear el menú de series y episodios no me llevó anoche ni una hora, lo cual es un logro para mí. Estoy contento con los avances. De nuevo, gracias por tu ayuda.

Un apunte sobre la seccion peliculas: como podras comprobar en algunas de ellas aparece ahora el fanart, la sinopsis y otros datos. Esto es gracias al modulo tmdb (linea 45), pero en otras muchas no. ¿por que? Pues porq el titulo q le pasamos no es exactamente el titulo de la pelicula por ejemplo en las de Cantiflas no se por q pero al webmaster le ha parecido buena idea incluir el nombre del protagonista en el titulo de la pelicula :mad: En la seccion series funciona mucho mejor por q los titulos estan mas limpios (descomenta la linea 90)

¿Crees que merece la pena tratar el texto del título para extraer lo de Cantinflas? Yo creo que no, pero tú eres el profe.
Lo de las series lo descomenté anoche, pero debe ser que subí una versión previa.

Sobre las series y episodios: da gusto ver como te resuelves con las tareas encomendadas :D:D:D Ya vi en su momento la guarrada de los numeros de capitulos. Por suerte el formato de la url permite extraerlos, si no fuese asi habria q ir a limpiar los espacios en blanco, tabulaciones y saltos de linea. Para obtener el numero de capitulo y episodio de la url (y en general de cualquier texto) puedes utilizar la funcion scrapertools.get_season_and_episode. Echale un ojo. Y ya q sabemos el numero de temporada y episodio ¿por q no incluirlo en el Item? Tambien sabemos el tipo de item ¿no? (todos estos datos q a lo mejor piensas q son inutiles despues los utiliza tmdb para hacer su trabajo)

Ya he visto la función get_season_and_episode, hubiera sido útil anoche, pero ya le metí yo el hachazo con mis escasos conocimientos de Python. Lo que debería hacer es mirarme todas las funciones de scrapertools para tener en cuenta de cara al futuro qué otras funciones podría utilizar. De eso se trata la POO, ¿no? :p
En cuanto a meter la info en el Item, pues tienes razón, meteré el numero de temporada, de capítulo y el contentType.

Otra cosa interesante: si leiste el tutorial de Item recordaras que recomienda clonar los items en lugar de crearlos de cero. Pruebalo en episodios y veras como los datos obtenidos por tmdb en series se heredan automaticamente.

Lo miraré, a ver cómo puede mejorar mi vida :p

Esto solo lo veo util si nos quedamos con la opcion 1, en otro caso es dificil encontrar (aunq no imposible) una serie q tenga mas de 20 episodios por temporada. La forma de hacerlo seria: una vez obtenido TODOS los episodios me quedo solo con los 20 primeros de la lista: itemlist[x:x+19] y le añado un nuevo item "pagina siguiente" si hay mas episodios en la lista, a este nuevo item le añado un atributo item.extra=x ¿me sigues?

Este punto no lo veo claro, ¿la idea sería algo así?:

Python:
lista=["hola", "que", "tal", "yo", "muy", "bien"]
x=0
for item in lista[x:x+3]:
  print(item)
print("Separador")
x=3
for item in lista[x:x+3]:
  print(item)

Lo proximo podria ser un apartado en mainlist para "Nuevos Episodios" o bien la opcion 2 de los episodios. Tu decides.

Pues me apunto las dos mejoras ;) Aunque empezaré por lo de las temporadas, que me llama más.

Seguimos adelante.
 
Última edición:
¿Crees que merece la pena tratar el texto del título para extraer lo de Cantinflas? Yo creo que no,
Como bien dices no vale la pena, por q no es el unico caso. En otras peliculas incluye el titulo original entre parentesis, etc... Si siempre siguiese un patron podriamos extraerlo, pero no podemos caer en la tentacion de ir añadiendo casos concretos. Estos son los detalles q pueden hacer q una web no sea interesante para convertirla en canal (otro es q no se actualice a menudo), pero en cualquier caso si es una web util para aprender.

Lo que debería hacer es mirarme todas las funciones de scrapertools para tener en cuenta de cara al futuro qué otras funciones podría utilizar. De eso se trata la POO, ¿no? :p
No se trata de estudiar todo el codigo de Alfa (a no ser q sea para modificar el propio plugin), pero si algunos archivos, sobretodo los q terminan el xxxtools.py suelen contener 'herramientas' utiles.

Este punto no lo veo claro, ¿la idea sería algo así?:
Vamos a arremangarnos y crear una paginacion donde no existe, sustituye tu linea 115 por:

Python:
if not item.page:
   item.page = 0
 
itemlist_page = itemlist[item.page: item.page + 20]

# InfoLabels:
#tmdb.set_infoLabels_itemlist(itemlist_page, seekTmdb=True)

if len(itemlist) > item.page + 20:
   itemlist_page.append(item.clone(title = "Ver mas episodios >>", page = item.page + 20))

return itemlist_page

Miratelo y si algo no entiendes lo preguntas.
 
Nueva versión con la paginación de las series que nos ha pasado @caperucitaferoz y con contentSeason y contentEpisodeNumber.
Hoy no creo que pueda dedicarle más tiempo, aunque tengo ganas de meter el menú de temporada por cada serie.
 

Adjuntos

Bien!!! Pero te sobra la linea 119 (supongo q seria debug)

Has visto como al clonar el item tus episodios heredan los datos encontrados en tmdb para la serie?
Ahora te falta añadir tmdb.set_infoLabels_itemlist despues de filtrar la lista para q busque datos del capitulo.

Volviendo al tema de los numeros de temporadas y episodios mira la serie 'Chance'
 
Última edición:
Bien!!! Pero te sobra la linea 119 (supongo q seria debug)

Has visto como al clonar el item tus episodios heredan los datos encontrados en tmdb para la serie?
Ahora te falta añadir tmdb.set_infoLabels_itemlist despues de filtrar la lista para q busque datos del capitulo.

Volviendo al tema de los numeros de temporadas y episodios mira la serie 'Chance'

Sí, lo de la línea 119 era una prueba, ya está eliminado (no se te pasa una, eh? :p). He visto como funciona el item.clone... está muy bien.
Añadido el infolabels para los capítulos.
La serie Chance no funciona, el resto sí. Voy a ver qué barbaridad ha hecho el webmaster con esta serie.
El patrón captura correctamente la url y el título, lo que pasa que la url es del tipo:
http:/ /www.pelisultra.com/episodio/chance-1x1-2
es decir, que mete un "-2" al final de todos los enlaces porque sí, porque él lo vale. :mad:
¿En estos casos como soléis actuar? ¿Creáis una excepción para esta serie en concreto o buscáis una solución "más global"?
 
Última edición:
Hola, solo para comentar que la búsqueda no funciona, haber si puedes solucionarlo o lo comentas para ayudarte.

Saludos y muy buen trabajo :)
 
¿En estos casos como soléis actuar? ¿Creáis una excepción para esta serie en concreto o buscáis una solución "más global"?

Hay q evitar las excepciones y si hay una función ya creada para hacer algo pues mejor usarla q reinventar la rueda ¿No?

Hola, solo para comentar que la búsqueda no funciona, haber si puedes solucionarlo o lo comentas para ayudarte
Vaya tu también metiendo presión??? :D:D:D
 
Atrás
Arriba