semplice guida per creare un canale in Sod
Publicado: 17 Sep 2016, 00:57
Ciao a tutti,
inizio con una premessa:
Ho provato una sensazione di confusione quando ho iniziato a cercare di capire come mettere mani a StreamOnDemand(SoD), perchè non basta conoscere il mondo python e la sua rigida sintassi e/o indetazione, ma capire necessarimente il mondo Kodi e i suoi meccanismi che associati a Pelisalacarta vi assicuro che la confusione è assicurata, soprattutto per chi è alle prime armi come lo sono stato io.
Qualcuno giustamente si chiederà cosa c'entra "Pelisalacarta" ? Ebbeni si, StreamOnDemand è la versione Italiana di Pelisalacarta (Spagnolo), ecco perchè il forum è in spagnolo con una sezione tutta italiana!
Interessante sapere che Sod nasce da loro: Zanzibar, Fenice, Dentaku e Doc, così scrive Dentaku in un post su questo Forum che vi invito a leggere qui: viewtopic.php?f=38&t=7500#p30891. E fù così che il grande Zanzibar con un bel pò di messaggio mi spiegò i primi passi per far funzionare un canale, poi si aggiunse il grande Dentaku sempre disponibile e un'altro grande è Doc che ancora oggi non capisco come faccia a trovare certe soluzioni, ma questa è un'altra storia!
In "Imparare python per stream on demand" è stato linkata una guida di python http://www.python.it/doc/Howtothink/HowToThink_ITA.pdf, ma iniziare da questo pdf come dice Zanzibar vuol dire fare un giro troppo largo per arrivare a Sod, quindi dopo la mia esperienza penso che sia più semplice partire al contrario, dal risultato per poi chiarire pian piano i retroscena di certi miracoli....
Vi rimando a dei link interessanti(in Spagnolo!) che mi inviò Zanzibar in uno dei messaggi notturni:
- http://www.mimediacenter.info/guias-de-desarrollo/
- http://www.mimediacenter.info/2009/09/2 ... a-parte-1/
Bene dopo aver spero ringraziato tutti(quelli che conosco) passo alla parte essenziale, il canale.
Strumenti(che uso io!):
-PyCharm (https://www.jetbrains.com/pycharm/downl ... on=windows) editor aiuta nella correzione dell'indentazione, vi assicuro che è una rottura di p....
-Firefox con relativo plugin Firebug, Live HTTP headers
-https://regex101.com/#python link da tenere sempre a portata di mano vi aiuterà, almeno per i primi tempi nelle espressioni regolari
- notepad++ lo utilizzo prettamente per visualizzare il file di log, non indenta bene i file python, qundi spesso genera errori incomprensibili
Mi fermo qui per ora.
Facciamo immediatamente l'esempio pratico:
il sito è http://www.animevision.altervista.org/, bene quello che a non interessa sono gli elenchi dei film/serietv più l'elenco è completo meno lavoreremo noi, fortuna vuole che questo si non ha moltissimo materiale, ma quello che ha funziona perfettamente.
L'unica opzione è "Anime" con un sotto menù "mostra tutti" quindi cliccheremo lì, in alto il link è: "http://www.animevision.altervista.org/elenco.php", per ora fermiamoci qui.
Ora iniziamo a preparare i file che ci serviranno per preparare il nuovo canale che normalmente ha come nome pensate un pò lo stesso del sito.
i file sono questi e vanno messi nella cartella channels all'interno di plugin.video.streamondemand:
#=====animevision.py
ora passiamo al primissimo menù che viene visualizzato quando apriamo il canale, importante i ritorni a capo non sono casuali, fate attenzione!
benissimo ora così potremmo vedere già il nostro canale con il suo primo titolo principale, ma non ancora funzionante.
Io uso windows 10 quando programmo Sod, quindi i miei percorsi possono differire dai vostri, ricordo anche di abilitare la viisualizzazione dei file nascosti. Il percordi di Sod in Win10 C:\Users\nomeutente\AppData\Roaming\Kodi:
per i log apro con notepad++ C:\Users\nomeutente\AppData\Roaming\Kodi\Kodi.log (notepad si aggiorna dopo che il file viene modificato, quindi non sto ad aprire e chiudere il file)
il file vanno inseriti e/o editati in C:\Users\nomeutente\AppData\Roaming\Kodi\addons\plugin.video.streamondemand
tranquilli se sbagliate qualcosa abituatevi subito a sentire quel rumore odioso dell'errore di Kodi, che sparisce dopo poco secondi, e dopo sparito potete andare a vedere il log per capire l'errore.
Adesso dobbiamo creare la funzione che crea l'elenco dei titoli con realtive immagini(se ci sono!)e i suoi relativi link:
Adesso riavviamo e poi controlliamo il file di log è vediamo quello che a noi interessa, la pagina del sito(non interpretata dal browser), la stessa che vedremmo facendo ctrl+u in firefox sulla pagina interessata.
Potevamo anche semplicemente usare appunto ctrl+u per vederlo, ma spesso ho scoperto che l'interpretazione dei browser è diversa rispetto a come mette in cache SoD, e per noi è importante sapere cosa ci ritorna la cache più che il nostro browser, perchè le espressioni regolari sono rognose. Le espressioni regolari sono l'unico modo per avere di ritorno un dato certo e per alcuni è un'arte ci possono essere tante varianti che possono portare allo stesso risultato. Per capore i punti che a noi interessano ci torna utile firebag che selezionando ci mette in evidenza il suo html nella barra sottostante, se vado sull'immagine di Angel Beats sotto trovo questa parte di html all'interno di un div: "<div class="epContainer">" che per mia fortuna è seguito da molti di quei div, morale ogni div è un titolo.
Scrutando il log trovo questa parte di codice:
quindi per esercitarvi vi consiglio di copiare questo codice su https://regex101.com/#python in text string è iniziate ad usare le spressioni regolari, io per questo codice ho usato questo patron, in tutto SoD patron è la parola usata per indicare l'espressione regolare che filtra i dati dalla cache,
patron = "<div class='epContainer'>[^=]+='imgEp'[^<]+<a href='(.*?)'>[^>]+><img src='(.*?)'[^<]+<[^>]+>(.*?)</div>"
io ho usato questo che potete direttamente copiare in REGULAR EXPRESSION è vedrete cosa viene fuori, solo il contenuto da " a ".
Il risutlato è un link(parziale) un titolo e un percorso web di una immagine(la locandina), quindi la funzione diventa questa:
a questo punto se tutto ha funzionato vederete popolarsi l'elenco dei titoli con relativa icona....
ultima funzione importante è episodi molto simile a prima come struttura, che ovviamente gestisce l'url passato dalla funzione lista_anime:
La cosa si ripete quasi in modo perpetuo, qui vediamo in azione una funzione miracolosa "findvideos" praticamente è una funzione di SoD che scruta la pagina in cache alla ricerca dei link video e automaticamente ne propone quel menù(download, aggiungi a preferiti, ecc..) che tutti noi vediamo poco prima di avviare un film o serie che sia.
Per il momento è tutto, almeno per poter iniziare a vedere qualcosa di interessante, certo non è sempre così semplice, anzi spesso bisogna districarsi tra javascipt,adfly, e offuscamenti vari codifiche e decodifiche e tanti altri problemi.....
Purtroppo sul forum è difficile postare codice, vi rimando al link dei file funzionanti in modo da poterveli scaricare e testare il nuovo canale
https://github.com/streamondemand/plugi ... evision.py
https://github.com/streamondemand/plugi ... vision.xml
Mi rendo conto che doveva essere semplice, ma è complicato fare un concentrato, troppa carne al fuoco.
Se avete domande o dubbi postate pure ne discutiamo a quattrocchi
Buon divertimento.
Costaplus
Update il 18/10/2016
inizio con una premessa:
Bene iniziamo con un pò di storia:Non sono un'esperto del settore e quindi potrei aver scritto cose non giuste, se ci sono degli errori vi prego di farmelo presente, mi reputo smanettone con la passione della programmazione, quindi non prendete come oro colato quello che scrivo.
Ho provato una sensazione di confusione quando ho iniziato a cercare di capire come mettere mani a StreamOnDemand(SoD), perchè non basta conoscere il mondo python e la sua rigida sintassi e/o indetazione, ma capire necessarimente il mondo Kodi e i suoi meccanismi che associati a Pelisalacarta vi assicuro che la confusione è assicurata, soprattutto per chi è alle prime armi come lo sono stato io.
Qualcuno giustamente si chiederà cosa c'entra "Pelisalacarta" ? Ebbeni si, StreamOnDemand è la versione Italiana di Pelisalacarta (Spagnolo), ecco perchè il forum è in spagnolo con una sezione tutta italiana!
Interessante sapere che Sod nasce da loro: Zanzibar, Fenice, Dentaku e Doc, così scrive Dentaku in un post su questo Forum che vi invito a leggere qui: viewtopic.php?f=38&t=7500#p30891. E fù così che il grande Zanzibar con un bel pò di messaggio mi spiegò i primi passi per far funzionare un canale, poi si aggiunse il grande Dentaku sempre disponibile e un'altro grande è Doc che ancora oggi non capisco come faccia a trovare certe soluzioni, ma questa è un'altra storia!
In "Imparare python per stream on demand" è stato linkata una guida di python http://www.python.it/doc/Howtothink/HowToThink_ITA.pdf, ma iniziare da questo pdf come dice Zanzibar vuol dire fare un giro troppo largo per arrivare a Sod, quindi dopo la mia esperienza penso che sia più semplice partire al contrario, dal risultato per poi chiarire pian piano i retroscena di certi miracoli....
Vi rimando a dei link interessanti(in Spagnolo!) che mi inviò Zanzibar in uno dei messaggi notturni:
- http://www.mimediacenter.info/guias-de-desarrollo/
- http://www.mimediacenter.info/2009/09/2 ... a-parte-1/
Bene dopo aver spero ringraziato tutti(quelli che conosco) passo alla parte essenziale, il canale.
Strumenti(che uso io!):
-PyCharm (https://www.jetbrains.com/pycharm/downl ... on=windows) editor aiuta nella correzione dell'indentazione, vi assicuro che è una rottura di p....
-Firefox con relativo plugin Firebug, Live HTTP headers
-https://regex101.com/#python link da tenere sempre a portata di mano vi aiuterà, almeno per i primi tempi nelle espressioni regolari
- notepad++ lo utilizzo prettamente per visualizzare il file di log, non indenta bene i file python, qundi spesso genera errori incomprensibili
Mi fermo qui per ora.
Facciamo immediatamente l'esempio pratico:
il sito è http://www.animevision.altervista.org/, bene quello che a non interessa sono gli elenchi dei film/serietv più l'elenco è completo meno lavoreremo noi, fortuna vuole che questo si non ha moltissimo materiale, ma quello che ha funziona perfettamente.
L'unica opzione è "Anime" con un sotto menù "mostra tutti" quindi cliccheremo lì, in alto il link è: "http://www.animevision.altervista.org/elenco.php", per ora fermiamoci qui.
Ora iniziamo a preparare i file che ci serviranno per preparare il nuovo canale che normalmente ha come nome pensate un pò lo stesso del sito.
i file sono questi e vanno messi nella cartella channels all'interno di plugin.video.streamondemand:
Código: Seleccionar todo
- animevision.xml
- animevision.py
- animevision.json
Código: Seleccionar todo
#=====animevision.xml
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<channel>
id del canale senza estensione (il suo nome)[
<id>animevision</id>
il testo che comparirà nell'elenco canali di Sod
<name>Animevision</name>
Se il canale è attivo, quindi visibile nell'elenco[/b]
<active>true</active>
Se è un canale per Adulti, non ci sperate in Sod la parte adulti è stata eliminata!!!!
<adult>false</adult>
Lingua del canale ovviamente sempre it(italiano)
<language>it</language>
L'immagine che compare come sfondo quando selezioni il testo o icona del canale
<fanart></fanart>
L'immagine che compare del canale
<thumbnail>http://animevision.altervista.org/images/logo.png</thumbnail>
L'immagine che compare del canale, vi chiederete perchè due ? dipende da come visualizzate la lista
<bannermenu>http://animevision.altervista.org/images/logo.png</bannermenu>
Link diretto quando deve aggiornare il canale (dove lo trova)
<update_url>https://raw.githubusercontent.com/streamondemand/plugin.video.streamondemand/master/channels/</update_url>
versione canale. Molto importante, incrementato aggiorna a tutti il canale automaticamente
<version>1</version>
data dell'ultima modifica del canale
<date>15/09/2016</date>
testo generico per tenere traccia di cosa è stato fatto
<changes>new channel</changes>
<categories>
<category>anime</category> <- qui indica che fa parte della categoria anime
</categories>
<settings>
<include_in_global_search>true</include_in_global_search> <- indica se nella ricerca globale deve essere interpellato
</settings>
</channel>
#==================================================================================
Código: Seleccionar todo
# il cancelletto delimita un commento in python
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# streamondemand.- XBMC Plugin
# Canale per http://animevision.altervista.org/
# http://www.mimediacenter.info/foro/viewforum.php?f=36
# By costaplus
# ------------------------------------------------------------
# qui sotto si importano le librerie di base necessarie
import re
import urllib
import urlparse
# qui riferimenti a file pronti all'uso in Sod che si trovano nella cartella core
# andate a curiosare
from core import config
from core import logger
from core import scrapertools
from core.item import Item
# questi sono riferimenti del canale che si commentano da soli
__channel__ = "animevision"
__category__ = "A"
__type__ = "generic"
__title__ = "Animevision"
__language__ = "IT"
# qui alla variabile DEBUG viene assegnato il valore di un settaggio, appunto debug
DEBUG = config.get_setting("debug")
# con host spesso si assegna la stringa del sito per eivtare di riscriverlo in fase di manutenzione
# cambiarlo in un punto solo è più comodo che scorrere tutto il file
host = "http://animevision.altervista.org"
# con def vengono definite delle funzioni
# questa ad'esempio si chiama isGeneric e ritorna il valore True, ma sinceramente non ho mai capito il suo perchè, spero che qualcuno possa spiegarlo a me.
def isGeneric():
return True
Código: Seleccionar todo
# -----------------------------------------------------------------
def mainlist(item):
# con logger inviamo al file di log di Kodi dei messaggio che aiutano in un secondo momento nel debug se qualcosa va storto, sappiamo che era in questa funzione
logger.info("streamondemand.animevision mainlist")
# itemlist è un array che contiene tutti gli elementi del menù iniziale, che a sua volte contiene un Item che è praticamente la riga che noi selezioniamo nel menù
#
itemlist = [Item(channel=__channel__, <-channel indica il canale che è impostato sopra
action="lista_anime", <- l'azione che invia ad altra funziona
title="[COLOR azure]Anime [/COLOR]- [COLOR orange]Lista Completa[/COLOR]", il titolo della nostra Item(riga) Color indica appunto il colore differente
url=host + "/elenco.php", <- url appunto l'url del sito che ci interessa(completo! quindi host + ""
thumbnail=CategoriaThumbnail,<- Ricordate l'immagine quando selezionato
fanart=CategoriaFanart)] <- L'immagine dello sfondo
return itemlist <- ritorna l'elenco
# =================================================================
Io uso windows 10 quando programmo Sod, quindi i miei percorsi possono differire dai vostri, ricordo anche di abilitare la viisualizzazione dei file nascosti. Il percordi di Sod in Win10 C:\Users\nomeutente\AppData\Roaming\Kodi:
per i log apro con notepad++ C:\Users\nomeutente\AppData\Roaming\Kodi\Kodi.log (notepad si aggiorna dopo che il file viene modificato, quindi non sto ad aprire e chiudere il file)
il file vanno inseriti e/o editati in C:\Users\nomeutente\AppData\Roaming\Kodi\addons\plugin.video.streamondemand
tranquilli se sbagliate qualcosa abituatevi subito a sentire quel rumore odioso dell'errore di Kodi, che sparisce dopo poco secondi, e dopo sparito potete andare a vedere il log per capire l'errore.
Adesso dobbiamo creare la funzione che crea l'elenco dei titoli con realtive immagini(se ci sono!)e i suoi relativi link:
Código: Seleccionar todo
# -----------------------------------------------------------------
def lista_anime(item):
logger.info("streamondemand.animevision lista_anime")
#array generico
itemlist = []
# ecco chi si occupa di recuperare la pagina web del sito che a noi interessa
data = scrapertools.cache_page(item.url)
# io per capire se è tutto ok normalmente faccio questo
# uso le funzioni di Kodi per viusalizzare nel log la pagina caricata in cache
# ricordateri di aggiungere negli import di prima "import xmbc"
xbmc.log("pagina sito ->" + data)
return itemlist
# -----------------------------------------------------------------
Potevamo anche semplicemente usare appunto ctrl+u per vederlo, ma spesso ho scoperto che l'interpretazione dei browser è diversa rispetto a come mette in cache SoD, e per noi è importante sapere cosa ci ritorna la cache più che il nostro browser, perchè le espressioni regolari sono rognose. Le espressioni regolari sono l'unico modo per avere di ritorno un dato certo e per alcuni è un'arte ci possono essere tante varianti che possono portare allo stesso risultato. Per capore i punti che a noi interessano ci torna utile firebag che selezionando ci mette in evidenza il suo html nella barra sottostante, se vado sull'immagine di Angel Beats sotto trovo questa parte di html all'interno di un div: "<div class="epContainer">" che per mia fortuna è seguito da molti di quei div, morale ogni div è un titolo.
Scrutando il log trovo questa parte di codice:
Código: Seleccionar todo
<div class='epContainer'>
<div class='imgEp' id='1'><a href='elenco.php?a=1'><div class='immagine'><img src='images/backgrounds/angelbeats.jpg' onerror="this.src='images/backgrounds/error.png'"><div class='numEpisodio' id='numEpisodio1'>Angel Beats</div></div></a>
<a href='elenco.php?a=1' style='color: black;'><div class='imgEpOver' id='imgOver1'><b>Angel Beats</b><hr style='color: rgba(255,255,255,0.1);'>
Tag: <span style='color:#9b0000'>Drammatico</span>, <span style='color:#9b0000'>Seinen</span>, <span style='color:#9b0000'>Vita quotidiana</span></div></a></div>
<div class='titoloEp'><a href='elenco.php?a=1' style='color: white;'>Angel Beats</a></div>
patron = "<div class='epContainer'>[^=]+='imgEp'[^<]+<a href='(.*?)'>[^>]+><img src='(.*?)'[^<]+<[^>]+>(.*?)</div>"
io ho usato questo che potete direttamente copiare in REGULAR EXPRESSION è vedrete cosa viene fuori, solo il contenuto da " a ".
Il risutlato è un link(parziale) un titolo e un percorso web di una immagine(la locandina), quindi la funzione diventa questa:
Código: Seleccionar todo
# -----------------------------------------------------------------
def lista_anime(item):
logger.info("streamondemand.animevision lista_anime")
itemlist = []
data = scrapertools.cache_page(item.url)
xbmc.log(data)
patron = "<div class='epContainer'>[^=]+='imgEp'[^<]+<a href='(.*?)'>[^>]+><img src='(.*?)'[^<]+<[^>]+>(.*?)</div>"
matches = re.compile(patron, re.DOTALL).findall(data) <- questa copiatel così comè
# il ciclo for che appunto estrare i nostri dati
for scrapedurl,scrapedimg, scrapedtitle in matches:
scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle) <- qui converte i caratteri speciali codificati
scrapedimg = host + "/" + scrapedimg <- qui aggiunge l'host che manca per l'immagine
scrapedurl = host + "/" + scrapedurl <- qui aggiunge l'host che manca per il percorso completo
#solito itemlist con le assegnazioni con l'aggiunta di view="movie" server a visualizzare la modalità
#netflix(icone) a patto che nelle impostazioni è abilitata l'opzione forza modalità visualizzazione
itemlist.append(
Item(channel=__channel__,
action="episodi",
title=scrapedtitle,
url=scrapedurl,
fulltitle=scrapedtitle,
show=scrapedtitle,
thumbnail=scrapedimg,
fanart=scrapedimg,
viewmode="movie"))
return itemlist
# =================================================================
ultima funzione importante è episodi molto simile a prima come struttura, che ovviamente gestisce l'url passato dalla funzione lista_anime:
Código: Seleccionar todo
# -----------------------------------------------------------------
def episodi(item):
logger.info("streamondemand.animevision episodi")
itemlist=[]
data = scrapertools.cache_page(item.url)
patron="epContainer'>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+><[^<]+<[^>]+>.*?href='(.*?)'[^>]+>(.*?)</a></div>"
matches = re.compile(patron, re.DOTALL).findall(data)
for scrapedurl,scrapedtitle in matches:
scrapedtitle=scrapedtitle.split(';')[1] <- qui vinee tagliata una parte del testo
scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle)
scrapedurl = host + "/" + scrapedurl
itemlist.append(
Item(channel=__channel__,
action="findvideos",
title=scrapedtitle,
url=scrapedurl,
fulltitle=scrapedtitle,
show=scrapedtitle,
thumbnail=item.thumbnail,
fanart=item.fanart))
return itemlist
Per il momento è tutto, almeno per poter iniziare a vedere qualcosa di interessante, certo non è sempre così semplice, anzi spesso bisogna districarsi tra javascipt,adfly, e offuscamenti vari codifiche e decodifiche e tanti altri problemi.....
Purtroppo sul forum è difficile postare codice, vi rimando al link dei file funzionanti in modo da poterveli scaricare e testare il nuovo canale
https://github.com/streamondemand/plugi ... evision.py
https://github.com/streamondemand/plugi ... vision.xml
Mi rendo conto che doveva essere semplice, ma è complicato fare un concentrato, troppa carne al fuoco.
Se avete domande o dubbi postate pure ne discutiamo a quattrocchi




Buon divertimento.
Costaplus
Update il 18/10/2016