Página 1 de 5

semplice guida per creare un canale in Sod

Publicado: 17 Sep 2016, 00:57
por costaplus
Ciao a tutti,

inizio con una premessa:
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.
Bene iniziamo con un pò di storia:
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>
#================================================================================== 
#=====animevision.py

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
ora passiamo al primissimo menù che viene visualizzato quando apriamo il canale, importante i ritorni a capo non sono casuali, fate attenzione!

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     
# =================================================================
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:

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 
# -----------------------------------------------------------------
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:

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

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
# =================================================================   
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:

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
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 :lol: :lol: :lol: :lol:
Buon divertimento.

Costaplus

Update il 18/10/2016

Re: semplice guida per creare un canale in Sod

Publicado: 17 Sep 2016, 07:43
por laratv
Per il momento grazie....
Ciao

Re: semplice guida per creare un canale in Sod

Publicado: 18 Sep 2016, 15:27
por laratv
Ciao @costaplus,

ho avuto modo di leggere a volo quanto da te postato (il bello è capirlo....infatti il lasciar perder è stato il mio primo pensiero).
Ho inserito i file nella cartella indicata, ma non succede nulla.

Cerco di spiegare quello che ho capito (poco in realtà):

il primo controllo che SOD effettua è la ricerca del file serverlist.xml e poi del channelslist.xml nei rispettivi path (servers e channels), scaricando dal repository ufficiale l'elenco delle configurazioni per i server ed i relativi canali.
Per cui tutto ciò che inserisci nelle cartella channels non ne tiene conto.
La cosa strana è che la lista server (quella che effettivamente si vede caricata con TUTTI I CANALI) è scritta nel file channelselector.py in modo per così dire "manuale" non comprendendone il motivo, visto che dal repository si scarica il servelist.xml aggiornato per cui si potrebbe crearla a runtime (ma forse cè una spiegazione che non conosco!).
Per cui credo che il server che si introduce bisogna caricarlo attraverso la funzione INSERISCI UN URL...(basta inserire solo URL con il corrispondente nomeserver.py?).

Lo so, chiedo troppo, ma se hai tempo, puoi commentare un server esistente nel repository ufficiale?

Oppure qualche dritta in più su quello che hai postato.
Scusami...ma sono alle prime battute di python e kodi..
Anticipatamente ringrazio.
Laratv

:o ammirato

Re: semplice guida per creare un canale in Sod

Publicado: 18 Sep 2016, 18:02
por costaplus
laratv escribió:Ciao @costaplus,

ho avuto modo di leggere a volo quanto da te postato (il bello è capirlo....infatti il lasciar perder è stato il mio primo pensiero).
Ho inserito i file nella cartella indicata, ma non succede nulla.

Cerco di spiegare quello che ho capito (poco in realtà):

il primo controllo che SOD effettua è la ricerca del file serverlist.xml e poi del channelslist.xml nei rispettivi path (servers e channels), scaricando dal repository ufficiale l'elenco delle configurazioni per i server ed i relativi canali.
Per cui tutto ciò che inserisci nelle cartella channels non ne tiene conto.
La cosa strana è che la lista server (quella che effettivamente si vede caricata con TUTTI I CANALI) è scritta nel file channelselector.py in modo per così dire "manuale" non comprendendone il motivo, visto che dal repository si scarica il servelist.xml aggiornato per cui si potrebbe crearla a runtime (ma forse cè una spiegazione che non conosco!).
Per cui credo che il server che si introduce bisogna caricarlo attraverso la funzione INSERISCI UN URL...(basta inserire solo URL con il corrispondente nomeserver.py?).

Lo so, chiedo troppo, ma se hai tempo, puoi commentare un server esistente nel repository ufficiale?

Oppure qualche dritta in più su quello che hai postato.
Scusami...ma sono alle prime battute di python e kodi..
Anticipatamente ringrazio.
Laratv

:o ammirato
Ciao laratv,
Se penso di aver deciso di scrivere questo post per te e per tutti i curiosi, da quello che scrivi tu penso di aver sbagliato tutto!! :lol:
Però hai scritto letto al volo, questo mi consola un pò, tantè che in un punto di quanto scritto sopra scrivevo:
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....
Forse ho scritto male io, e so di non essere bravo a scrivere, ma perchè hai iniziato a cercare di capire la dinamica dei server e dei channels quando ancora non hai capito la dinamica di un canale ?
Stai facendo il mio stesso identico errore!
Focalizzati adesso sul singolo canale che ti ho indicato e dopo ti spiego il resto.
Nell'ultima versione di SoD i file che si occupano di far "apparire il canale nell'elenco" sono i due nomecanale.json e nomecanale.xml, generati in modo corretto sono loro che si occupano di far apparire il canale e da cui SoD confronta per aggiornare il canale. Ho la sensazione
Che tu ti stia riferenda alla vecchia versione di SoD quella sul github con account zanzibar82 o mi sbaglio ?

Ti chiedo solo di provare a gestire il canale creando le funzioni necessarie, evita di capire il resto, ti perderai come ho fatto io....
Fammi sapere.

Costaplus

Re: semplice guida per creare un canale in Sod

Publicado: 18 Sep 2016, 21:32
por laratv
Ciao,
effettivamente ho scaricato quella di @zanzibar82 su github, sembrava questa la versione ufficiale.
Ma come vedi, ho sbagliato.
Troppi link!
Ok....provo a trovare la versione ufficiale, da qualche parte sarà indicato.
Grazie della pazienza.
Un caro saluto
laratv

Re: semplice guida per creare un canale in Sod

Publicado: 18 Sep 2016, 22:04
por costaplus
laratv escribió:Ciao,
effettivamente ho scaricato quella di @zanzibar82 su github, sembrava questa la versione ufficiale.
Ma come vedi, ho sbagliato.
Troppi link!
Ok....provo a trovare la versione ufficiale, da qualche parte sarà indicato.
Grazie della pazienza.
Un caro saluto
laratv
Mi sembrava molto strano quello che stavi descrivendo, comunque il link ufficiale è questo:

https://github.com/streamondemand/plugi ... d/releases

ti consiglio vivamente di crearti un'account su git e ti crei un fork(una biforcazione dell'originale) quindi ne puoi creare una versione tua personalizzata se vuoi oppure se hai creato qualcosa di interessante e vouoi farlo includere nella versione ufficiale potrai richiedere un pullrequest, ma per il momento ti consiglio di farti un fork e pasticciare quanto vuoi sulla tua versione...

Ripento mi rendo conto che non è semplice, ma anch'io ero un disperso quando ho inziatoe ancora oggi molte cose mi sono oscure, quello che ho capito lo condivido..

Costaplus

Re: semplice guida per creare un canale in Sod

Publicado: 18 Sep 2016, 23:39
por costaplus
Ciao a tutti,
giusto per invogliare chi vuole cimentarsi nel coding di SoD ho trovato un ipotetico nuovo canale, ora non importa se riusciamo a concluderlo in modo funzionante e nemmeno io ho controlato più di tanto la fattibilità, però voglio ragionare con voi, anche se al momento abbiamo solo laratv interessato....
eccovi il link: http://filmhdstreaming.net

bene dobbiamo iniziare, da dove iniziamo ? (tralasciando server funzionanti, replica di altro canale già esistente, ecc....) in primis cosa dobbiamo fare per creare il nostro nuovissimo e bellissimo canale ?

Re: semplice guida per creare un canale in Sod

Publicado: 20 Sep 2016, 11:33
por laratv
Ho creato il fork...
Adesso provo a ragionare...(!).

Ciao
laratv


:roll:

Re: semplice guida per creare un canale in Sod

Publicado: 20 Sep 2016, 11:40
por costaplus
laratv escribió:Ho creato il fork...
Adesso provo a ragionare...(!).

Ciao
laratv


:roll:
Visto che sei l'unico partecipante attualmente ti aiuto... :lol: :lol: :lol: :lol:

iniziamo a creare i 3 famosi file, vedi post sopra..

quindi normalmente con il nome del sito:

1) filmhdstreaming.xml
2) filmhdstreaming.py
3) filmhdstreaming.json

Re: semplice guida per creare un canale in Sod

Publicado: 21 Sep 2016, 22:28
por Solostreaming
fossero tutti come solo-streaming :D :D