105 Commits
test ... alpha

Author SHA1 Message Date
Alhaziel01
1e1787e9e9 Playback Monitor as a service,
Global search fix
other minimal fix
2021-11-27 11:58:20 +01:00
Alhaziel01
5257183fb7 Modifiche del 26/11/2021 2021-11-26 18:55:51 +01:00
Alhaziel01
48996688a6 Riscritto News e fix vari 2021-10-23 10:51:56 +02:00
Alhaziel01
123bf489ac Fix linkup e styonline 2021-10-23 09:55:26 +02:00
Alhaziel01
55dbf957c0 fix 2021-10-23 09:10:12 +02:00
Alhaziel01
526bbdd4d1 Chiusure videolibrarybd in videolibrary 2021-10-06 19:04:32 +02:00
Alhaziel01
a578a095ff DB Compresso 2021-10-06 18:58:36 +02:00
Alhaziel01
ca29ea7216 Fix Visualizzazione 2021-10-01 19:53:16 +02:00
Alhaziel01
3c60b5c710 Fix News 2021-10-01 19:23:19 +02:00
Alhaziel01
f2177d7ffd ops 2021-10-01 09:50:19 +02:00
Alhaziel01
003f3905f0 - Fix AltadefinizioneCommunity
- Fix HDmario e Streamtape
2021-10-01 09:41:31 +02:00
Alhaziel01
5348eebe19 - Riscritto News
- Finzioni peliculas -> movies, episodios -> episodes
 - Aggiornato sqlitedict
 - fix minori
2021-09-30 19:41:46 +02:00
Alhaziel01
52c74d3852 Fix Altadefinizione Click 2021-09-29 16:34:36 +02:00
Alhaziel01
6639b5aaca Fix AnimeSaturn e serverWindow 2021-09-29 12:00:59 +02:00
Alhaziel01
fee7a27758 - Fix Videoteca
- Aggiunti server VOE e HighLoad
 - dbg spostato in logger
 - altre migliorie
2021-09-29 10:35:21 +02:00
Alhaziel01
4046014220 Piccola modifica 2021-09-25 17:21:48 +02:00
Alhaziel01
3838a22089 aggiornamento ricerca alternativa 2021-09-25 11:12:31 +02:00
mac12m99
32d88dc77c Update updater.py 2021-09-23 19:13:12 +02:00
Alhaziel01
69a6a98a56 Fix e migliorie Paginazione 2021-09-18 12:32:37 +02:00
Alhaziel01
7196425322 - Migliorie InfoPlus
- Fix Ricerca Globale
- Inizio riscrittura Ricerca Alternativa
2021-09-17 19:11:20 +02:00
Alhaziel01
b80e6295ff Fix e Migliorie a:
- Ricerca Globale
 - InfoPlus
2021-09-16 20:03:51 +02:00
Alhaziel01
938b8e6355 Fix vari 2021-09-14 08:27:59 +02:00
Alhaziel01
10ee3d0425 Fix Played Time 2021-09-09 20:20:03 +02:00
Alhaziel01
dd309c307e Fix Ricerca Globale 2021-09-09 20:10:04 +02:00
Alhaziel01
b84f682461 Scrape come Classe 2021-09-08 18:57:42 +02:00
Alhaziel01
2a5a83c767 Modifiche e Fix a segna come già visto 2021-09-04 20:08:30 +02:00
Alhaziel01
905e1ad6ee - Vai a pagina come lista se presente numero massimo di pagine
- Fix vai a primo episodio non visto in videoteca
 - Migliorata grafica Ricerca Globale
 - Altri piccoli cambiamenti
2021-09-03 20:22:51 +02:00
Alhaziel01
dc93170fd5 - Vai a primo episodio non visto in videoteca
- piccoli aggiustamenti
2021-08-28 19:45:22 +02:00
Alhaziel01
60ec158008 Risposta server come Dict e modifiche varie 2021-08-28 18:10:47 +02:00
Alhaziel01
8975f950c5 Merge branch 'master' into alpha 2021-08-28 16:43:20 +02:00
Alhaziel01
27562cad4d alcuni fix 2021-08-24 19:27:41 +02:00
Alhaziel01
dfeec60fe3 Modifiche ad Alpha 2021-08-24 17:38:44 +02:00
Alhaziel01
2764c48805 Fix e migliorie Videoteca
- aggiunti in settings:
   - Converti Videoteca
   - Ripristina Videoteca da DB
2021-07-14 19:19:32 +02:00
Alhaziel01
b3eff4bb07 Fix trakt 2021-07-13 12:15:07 +02:00
Alhaziel01
ed6c7caa91 Icone Automatiche (continua) 2021-07-08 20:06:54 +02:00
Alhaziel01
132301b06d Alcuni Fix e cambiamenti 2021-07-08 19:26:35 +02:00
Alhaziel01
841c68fb86 Fix Videoteca per Py2 2021-07-08 18:37:35 +02:00
Alhaziel01
17edb2d69f icone Automatiche (continua) 2021-07-08 17:58:10 +02:00
Alhaziel01
f9223c7a48 Gestione icone automatico (Inizio) 2021-07-08 17:28:24 +02:00
Alhaziel01
bbc79ec2bb alcuni Fix 2021-07-07 16:39:21 +02:00
Alhaziel01
66def5c3a1 Fix streamZ 2021-07-06 17:26:09 +02:00
Alhaziel01
9041d4c1b7 Fix Nuovo Tema 2021-07-06 17:25:50 +02:00
Alhaziel01
4db8d3a388 Altadefinizione Click e aggiungi alla videoteca per contentTpe non definiti 2021-07-06 10:04:54 +02:00
Alhaziel01
3103864308 Fix 2021-07-05 19:51:47 +02:00
Alhaziel01
2662277a71 Fix aggiunta alla videoteca tramite Ricerca Globale 2021-07-05 17:00:38 +02:00
Alhaziel01
f9a4d0dbbb Fix Configurazione Videoteca 2021-07-02 18:15:35 +02:00
Alhaziel01
c86cdab9da Fix Episodio Successivo 2021-07-01 19:48:26 +02:00
Alhaziel01
1e2f88c47a Fix Sincorinizzazione Videoteca 2021-07-01 17:10:02 +02:00
Alhaziel01
fc0822f93a Fix Sincronizzazione Libreria 2021-07-01 12:59:55 +02:00
Alhaziel01
fc1ca5435f Bozza Sincronizzazione serie TV con libreria 2021-06-30 19:20:57 +02:00
Alhaziel01
60bf2d670a Fix Ordinamento Server 2021-06-21 10:57:37 +02:00
Alhaziel01
acaed1c036 Pulizia settings e immagini registi in videoteca 2021-06-18 20:04:44 +02:00
Alhaziel01
7965daf524 fix Videoteca 2021-06-18 19:44:36 +02:00
Alhaziel01
8b1e6acc6e Fix Videolibrarytools 2021-06-18 19:34:32 +02:00
Alhaziel01
0367ea31a7 Fix Render Items 2021-06-18 14:51:00 +02:00
Alhaziel01
658666bd6b Fix Render Items e ordinamento 2021-06-18 12:19:42 +02:00
Alhaziel01
b32b500b07 Ordinamento Server 2021-06-18 10:32:54 +02:00
Alhaziel01
ea5f4de258 Fix support.servers 2021-06-18 10:32:25 +02:00
Alhaziel01
002d4bd32a Fix Render Items 2021-06-18 10:31:46 +02:00
Alhaziel01
e6c09ab8bb - Nuovo InfoPlus
- Piccole Migliorie
2021-06-16 18:42:31 +02:00
Alhaziel01
3d61f5dc54 Fix Impostazioni server 2021-06-16 09:33:30 +02:00
Alhaziel01
0cceffea0c Nuova Videoteca Gestione episodi locali (Inizio) 2021-06-10 19:07:53 +02:00
Alhaziel01
3fd09dbb11 - Fix aggiunta episodi presenti in Libreria
- fix Nomi episodi in ricerca globale
2021-06-10 16:57:12 +02:00
Alhaziel01
4b1cb8f9a8 Piccoli Fix 2021-06-10 16:01:58 +02:00
Alhaziel01
a04aa7cb73 Merge branch 'master' into alpha 2021-06-10 16:01:03 +02:00
Alhaziel01
3c05a3cd0c Piccoli Fix render items 2021-06-09 20:09:34 +02:00
Alhaziel01
eb0aa3cafe Piccoli Fix 2021-06-08 20:11:56 +02:00
mac12m99
34c438d01b ops 2021-06-08 19:55:53 +02:00
mac12m99
b845810d7e Conversione videoteca: cambio scraper e progresso 2021-06-08 19:54:51 +02:00
mac12m99
89c8de9522 Merge remote-tracking branch 'origin/alpha' into alpha 2021-06-08 19:49:31 +02:00
mac12m99
46b8eb945a Merge branch 'alpha' of /home/marco/.kodi/addons/plugin.video.kod with conflicts. 2021-06-08 19:49:30 +02:00
Alhaziel01
ec850dc045 Fix Conversione Videoteca 2021-06-08 19:46:08 +02:00
Alhaziel01
5f16ff4121 - Fix Render Items
- Fix Autorenumber
 - Fix Conversione Videoteca
2021-06-08 18:07:40 +02:00
mac12m99
dbc2ecd57e Bozza conversione videoteca 2021-06-05 20:41:17 +02:00
Alhaziel01
1868420425 Formattazione Titoli in render_items + correzione di alcuni canali 2021-06-05 15:51:46 +02:00
Alhaziel01
ab8136e326 Piccolo fix 2021-06-04 15:39:45 +02:00
Alhaziel01
608b6e6a15 ops 2021-06-04 11:18:30 +02:00
Alhaziel01
e6b28189dd - Fix e Migliorie Videoteca
- Server in finestra come default (per canali e videoteca)
2021-06-04 10:57:45 +02:00
Alhaziel01
ef8f78ea07 Fix aggiornamento Videoteca 2021-05-29 19:04:59 +02:00
Alhaziel01
f7fd28e9d1 Fix CB01 2021-05-29 18:35:00 +02:00
Alhaziel01
01059eb373 - Migliorie Videoteca
- Finestra selezione server
 - Fix Autorenumber (sincronizzazione fra videoteca a canali)
 - Fix Autoplay
2021-05-29 18:17:40 +02:00
Alhaziel01
dc2140f2ca Fix e migliorie Videoteca 2021-05-27 20:35:42 +02:00
Alhaziel01
753f915e5a Migliorie e correzioni alla videoteca 2021-05-25 20:00:11 +02:00
mac12m99
228c7bbd79 pulizia 2021-05-22 17:43:43 +02:00
Alhaziel01
ba98922a9c Fix e migliorie Videoteca + Inizio filtraggio risultati 2021-05-22 16:49:04 +02:00
mac12m99
a4e2278122 Merge branch 'master' into alpha
# Conflicts:
#	service.py
2021-05-21 20:34:14 +02:00
Alhaziel01
529e24e4c1 Correzioni videoteca 2021-05-21 17:35:03 +02:00
Alhaziel01
6b8305f7ae Merge branch 'alpha' of https://github.com/kodiondemand/addon into alpha 2021-05-20 20:26:09 +02:00
Alhaziel01
b0d3dd2fa7 Alcune migliorie alla videoteca 2021-05-20 20:23:21 +02:00
mac12m99
f1d8873fa4 Rimosse alcune opzioni dal menu contestuale 2021-05-19 21:30:58 +02:00
mac12m99
b773164dad Httptools: popolo url e headers anche se la richiesta fallisce 2021-05-16 10:23:09 +02:00
mac12m99
b6dcb8f716 Ottimizzazione remove_host e contenuto dell'item al primo posto nella schermata InfoWindow 2021-05-15 20:37:00 +02:00
Alhaziel01
8eb5881559 dbconverter, piccole correzioni 2021-05-15 19:45:49 +02:00
Alhaziel01
057f94027a dbconverter reload Skin 2021-05-15 19:15:20 +02:00
Alhaziel01
5403e65895 piccole correzioni dbconverter 2021-05-15 18:02:07 +02:00
mac12m99
ae06db005b Ottimizzazioni dbconverter 2021-05-15 16:52:27 +02:00
mac12m99
57814f6e7c Merge remote-tracking branch 'origin/alpha' into alpha
# Conflicts:
#	platformcode/dbconverter.py
2021-05-15 16:30:26 +02:00
mac12m99
f52ce7f9d3 Ottimizzazioni dbconverter 2021-05-15 16:25:33 +02:00
Alhaziel01
551e89e0f5 alcune migliorie a dbconverter 2021-05-15 16:19:50 +02:00
mac12m99
273fff7c48 Riutilizzo connessione al db di kodi 2021-05-15 14:10:53 +02:00
Alhaziel01
b37cf50261 Test sincronizzazione libreria kodi 2021-05-15 12:18:59 +02:00
Alhaziel01
d925f26c8d Alcuni fix 2021-05-15 12:18:34 +02:00
Alhaziel01
5e3fd956b9 migliorie tmdb 2021-05-13 12:24:06 +02:00
Alhaziel01
4e980e426c Più informazioni da TMDB 2021-05-11 20:35:36 +02:00
Alhaziel01
c942f9b4ec Videoteca DB 2021-05-11 18:56:11 +02:00
1428 changed files with 29253 additions and 38219 deletions

View File

@@ -1,34 +0,0 @@
name: Update channel domains
on:
workflow_dispatch:
schedule:
- cron: '30 17 * * *'
push:
branches:
- master
jobs:
update:
runs-on: ubuntu-latest
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
with:
python-version: '3.7'
architecture: 'x64'
- name: Install dependencies
run: pip install requests
- name: Update domains
run: python tools/updateDomains.py
- name: Commit & Push changes
uses: actions-js/push@master
with:
message: "Aggiornamento domini"
branch: "master"
github_token: ${{ secrets.API_TOKEN_GITHUB }}

0
.github/ISSUE_TEMPLATE/canale-non-funzionante.md vendored Executable file → Normal file
View File

0
.github/ISSUE_TEMPLATE/server-non-funzionante.md vendored Executable file → Normal file
View File

2
.github/ISSUE_TEMPLATE/test-canale.md vendored Executable file → Normal file
View File

@@ -67,7 +67,7 @@ Controlla sia presente qualcosa, tra le " " di thumbnail e banner, e che le imma
Riepilogo voci: Riepilogo voci:
movie, tvshow, anime, documentary, vos, adult movie, tvshow, anime, documentary, sub, adult
(se il sito contiene film e serie, devono esserci sia movie che tvshow, se contiene solo film, solo movie) (se il sito contiene film e serie, devono esserci sia movie che tvshow, se contiene solo film, solo movie)

13
.github/workflows/tests.yml vendored Executable file → Normal file
View File

@@ -1,25 +1,28 @@
name: Test Suite name: Test Suite
on: on:
workflow_dispatch: workflow_dispatch:
schedule:
- cron: '00 15 * * *'
jobs: jobs:
tests: tests:
runs-on: macos-latest runs-on: ubuntu-latest
steps: steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v3 - uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }} - name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4.3.0 uses: actions/setup-python@v1
with: with:
python-version: 3.9 python-version: 3.8
- name: Run tests - name: Run tests
run: | run: |
export KODI_INTERACTIVE=0
./tests/run.sh ./tests/run.sh
- name: Commit & Push changes - name: Commit & Push changes
uses: dmnemec/copy_file_to_another_repo_action@main uses: dmnemec/copy_file_to_another_repo_action@v1.0.4
env: env:
API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }}
with: with:

0
.github/workflows/updateDomains.yml vendored Executable file → Normal file
View File

0
.github/workflows/updateDomainsStable.yml vendored Executable file → Normal file
View File

4
.gitignore vendored Executable file → Normal file
View File

@@ -7,7 +7,3 @@ custom_code.json
last_commit.txt last_commit.txt
__pycache__/ __pycache__/
.vscode/settings.json .vscode/settings.json
bin/
lib/abi
tests/home/
reports/

0
CONTRIBUTING.md Executable file → Normal file
View File

0
LICENSE Executable file → Normal file
View File

0
README.md Executable file → Normal file
View File

0
__init__.py Executable file → Normal file
View File

15
addon.xml Executable file → Normal file
View File

@@ -1,10 +1,7 @@
<addon id="plugin.video.kod" name="Kodi on Demand" version="1.7.7" provider-name="KoD Team"> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.kod" name="Kodi on Demand ALPHA" version="2.0" provider-name="KoD Team">
<requires> <requires>
<!-- <import addon="script.module.libtorrent" optional="true"/> --> <import addon="script.module.web-pdb" />
<import addon="metadata.themoviedb.org" optional="true"/>
<import addon="metadata.tvshows.themoviedb.org" optional="true"/>
<!-- <import addon="metadata.tvdb.com"/> -->
</requires> </requires>
<extension point="xbmc.python.pluginsource" library="default.py"> <extension point="xbmc.python.pluginsource" library="default.py">
<provides>video</provides> <provides>video</provides>
@@ -22,12 +19,14 @@
<summary lang="it">Kodi on Demand è un addon di Kodi per cercare e guardare contenuti sul web.</summary> <summary lang="it">Kodi on Demand è un addon di Kodi per cercare e guardare contenuti sul web.</summary>
<assets> <assets>
<icon>resources/media/logo.png</icon> <icon>resources/media/logo.png</icon>
<fanart>resources/media/fanart.jpg</fanart> <fanart>resources/media/dark_background.jpg</fanart>
<screenshot>resources/media/screenshot-1.png</screenshot> <screenshot>resources/media/screenshot-1.png</screenshot>
<screenshot>resources/media/screenshot-2.png</screenshot> <screenshot>resources/media/screenshot-2.png</screenshot>
<screenshot>resources/media/screenshot-3.png</screenshot> <screenshot>resources/media/screenshot-3.png</screenshot>
</assets> </assets>
<news>- fix di routine ai canali/server <news>- Aggiunto menu globale "opzioni di KoD"
- Aggiunto canale tapmovie e server annessi
- Notifica quando il tipo di vista viene salvata (con indicazione del tipo di contenuto)
</news> </news>
<description lang="it">Naviga velocemente sul web e guarda i contenuti presenti</description> <description lang="it">Naviga velocemente sul web e guarda i contenuti presenti</description>
<disclaimer>[COLOR red]The owners and submitters to this addon do not host or distribute any of the content displayed by these addons nor do they have any affiliation with the content providers.[/COLOR] <disclaimer>[COLOR red]The owners and submitters to this addon do not host or distribute any of the content displayed by these addons nor do they have any affiliation with the content providers.[/COLOR]

67
channels.json Executable file → Normal file
View File

@@ -1,44 +1,53 @@
{ {
"direct": { "direct": {
"altadefinizione01": "https://altadefinizione01.pet", "altadefinizione01": "https://www.altadefinizione01.plus",
"animealtadefinizione": "http://ww38.animealtadefinizione.it", "altadefinizione01_link": "https://altadefinizione01.travel",
"animealtadefinizione": "https://www.animealtadefinizione.it",
"animeforce": "https://www.animeforce.it", "animeforce": "https://www.animeforce.it",
"animesaturn": "https://www.animesaturn.cx", "animeleggendari": "https://animezeus.com",
"animesaturn": "https://www.animesaturn.it",
"animeunity": "https://www.animeunity.tv", "animeunity": "https://www.animeunity.tv",
"animeworld": "https://www.animeworld.so", "animeuniverse": "https://www.animeuniverse.it",
"aniplay": "https://aniplay.co", "animeworld": "https://www.animeworld.tv",
"casacinema": "https://casacinema.media", "aniplay": "https://aniplay.it",
"cb01anime": "https://cb01new.one", "casacinema": "https://www.casacinema.page",
"cinemalibero": "https://cinemalibero.cafe", "cb01anime": "https://www.cineblog01.red",
"cineblog01": "https://cb01.uno",
"cinemalibero": "https://cinemalibero.surf",
"cinetecadibologna": "http://cinestore.cinetecadibologna.it", "cinetecadibologna": "http://cinestore.cinetecadibologna.it",
"dinostreaming": "https://dinostreaming.it",
"discoveryplus": "https://www.discoveryplus.com", "discoveryplus": "https://www.discoveryplus.com",
"dreamsub": "https://www.animeworld.so", "dreamsub": "https://dreamsub.stream",
"eurostreaming": "https://eurostreaming.lifestyle", "dsda": "https://www.dsda.press",
"eurostreaming_actor": "https://eurostreaming.my", "eurostreaming": "https://eurostreaming.world",
"filmstreaming": "https://film-streaming-ita.cam", "filmigratis": "https://filmigratis.org",
"guardaseriecam": "https://guardaserie.kitchen", "guardaseriecam": "https://guardaserie.cam",
"guardaserieclick": "https://www.guardaserie.builders",
"guardaserieicu": "https://guardaserie.center",
"hd4me": "https://hd4me.net", "hd4me": "https://hd4me.net",
"ilcorsaronero": "https://ilcorsaronero.link", "ilcorsaronero": "https://ilcorsaronero.link",
"ilgeniodellostreaming_cam": "https://ilgeniodellostreaming.foo", "ilgeniodellostreaming": "https://ilgeniodellostreaming.bet",
"italiafilm": "https://italia-film.biz", "ilgeniodellostreaming_cam": "https://ilgeniodellostreaming.city",
"mediasetplay": "https://mediasetinfinity.mediaset.it", "italiaserie": "https://italiaserie.men",
"mondoserietv": "http://ww25.mondoserietv.club/?subid1=20230304-0434-261c-9cb0-a0044930e0a9", "mediasetplay": "https://www.mediasetplay.mediaset.it",
"paramount": "https://www.mtv.it", "mondoserietv": "https://mondoserietv.club",
"piratestreaming": "https://piratestreaming.design", "paramount": "https://www.paramountnetwork.it",
"plutotv": "https://pluto.tv", "piratestreaming": "https://www.piratestreaming.design",
"polpotv": "https://roma.polpo.tv",
"raiplay": "https://www.raiplay.it", "raiplay": "https://www.raiplay.it",
"serietvu": "http://ww1.serietvu.live/?sub1=47fb879a-5325-11ee-94a7-cc35006f53d1", "seriehd": "https://altadefinizionecommunity.casa",
"streamingcommunity": "https://streamingcommunity.ooo", "serietvonline": "https://serietvonline.art",
"streamingita": "https://streamingita.click", "serietvsubita": "http://serietvsubita.xyz",
"tantifilm": "https://tantifilm.name", "serietvu": "https://www.serietvu.live",
"toonitalia": "https://toonitalia.xyz" "streamtime": "https://t.me/s/StreamTime",
"tantifilm": "https://www.tantifilm.cfd",
"tapmovie": "https://it.tapmovie.net",
"toonitalia": "https://toonitalia.co",
"vvvvid": "https://www.vvvvid.it"
}, },
"findhost": { "findhost": {
"altadefinizione": "https://altadefinizione.nuovo.live",
"altadefinizionecommunity": "https://altaregistrazione.net", "altadefinizionecommunity": "https://altaregistrazione.net",
"animealtadefinizione": "https://www.animealtadefinizione.it", "animealtadefinizione": "https://www.animealtadefinizione.it",
"cineblog01": "https://cb01.uno", "filmpertutti": "https://filmpertuttiii.nuovo.live",
"filmpertutti": "https://filmpertuttiii.nuovo.live" "streamingcommunity": "https://t.me/s/StreamingCommunity_nuovo_link"
} }
} }

4
channels/0example.json.txt Executable file → Normal file
View File

@@ -23,7 +23,7 @@ se vanno cancellati tutti deve rimanere la voce:
"active": false, "active": false,
"thumbnail": "", "thumbnail": "",
"banner": "", "banner": "",
"categories": ["movie", "tvshow", "anime", "vos", "documentary"], "categories": ["movie", "tvshow", "anime", "sub, "documentary"],
"not_active": ["include_in_newest"], "not_active": ["include_in_newest"],
"settings": [ "settings": [
{ {
@@ -35,7 +35,7 @@ se vanno cancellati tutti deve rimanere la voce:
"visible": false "visible": false
}, },
{ {
"id": "include_in_newest_peliculas", "id": "include_in_newest_movie",
"type": "bool", "type": "bool",
"label": "@70727", "label": "@70727",
"default": false, "default": false,

62
channels/0example.py.txt Executable file → Normal file
View File

@@ -9,7 +9,7 @@
# fix: # fix:
# 1. aggiunto pagination e sistemate alcune voci # 1. aggiunto pagination e sistemate alcune voci
# 2. modificato problemi in eccezioni # 2. modificato problemi in eccezioni
# 3. aggiunta la def check # 3. aggiunta la def select
# 4. modifica alla legenda e altre aggiunte # 4. modifica alla legenda e altre aggiunte
# Questo vuole solo essere uno scheletro per velocizzare la scrittura di un canale. # Questo vuole solo essere uno scheletro per velocizzare la scrittura di un canale.
@@ -75,20 +75,19 @@ headers = [['Referer', host]]
@support.menu @support.menu
def mainlist(item): def mainlist(item):
support.info(item)
# Ordine delle voci # Ordine delle voci
# Voce FILM, puoi solo impostare l'url # Voce FILM, puoi solo impostare l'url
film = ['', # url per la voce FILM, se possibile la pagina principale con le ultime novità film = ['', # url per la voce FILM, se possibile la pagina principale con le ultime novità
#Voce Menu,['url','action','args',contentType] #Voce Menu,['url','action','args',contentType]
('Al Cinema', ['', 'peliculas', '']), ('Al Cinema', ['', 'movies', '']),
('Generi', ['', 'genres', 'genres']), ('Generi', ['', 'genres', 'genres']),
('Per Lettera', ['', 'genres', 'letters']), ('Per Lettera', ['', 'genres', 'letters']),
('Anni', ['', 'genres', 'years']), ('Anni', ['', 'genres', 'years']),
('Qualità', ['', 'genres', 'quality']), ('Qualità', ['', 'genres', 'quality']),
('Mi sento fortunato', ['', 'genres', 'lucky']), ('Mi sento fortunato', ['', 'genres', 'lucky']),
('Popolari', ['', 'peliculas', '']), ('Popolari', ['', 'movies', '']),
('Sub-ITA', ['', 'peliculas', '']) ('Sub-ITA', ['', 'movies', ''])
] ]
# Voce SERIE, puoi solo impostare l'url # Voce SERIE, puoi solo impostare l'url
@@ -145,31 +144,29 @@ def mainlist(item):
# lang = lingua del video. Es: ITA, Sub-ITA, Sub, SUB ITA. # lang = lingua del video. Es: ITA, Sub-ITA, Sub, SUB ITA.
# AVVERTENZE: Se il titolo è trovato nella ricerca TMDB/TVDB/Altro allora le locandine e altre info non saranno quelle recuperate nel sito.!!!! # AVVERTENZE: Se il titolo è trovato nella ricerca TMDB/TVDB/Altro allora le locandine e altre info non saranno quelle recuperate nel sito.!!!!
@support.scrape @support.scrape
def peliculas(item): def movies(item):
support.info(item) #logger.dbg() # decommentare per attivare web_pdb
#support.dbg() # decommentare per attivare web_pdb
action = '' action = ''
blacklist = [''] blacklist = ['']
patron = r'' patron = r''
patronBlock = r'' patronBlock = r''
patronNext = '' patronNext = ''
pagination = '' pagination = True
#debug = True # True per testare le regex sul sito #debug = True # True per testare le regex sul sito
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodes(item):
support.info(item) #logger.dbg()
#support.dbg()
action = '' action = ''
blacklist = [''] blacklist = ['']
patron = r'' patron = r''
patronBlock = r'' patronBlock = r''
patronNext = '' patronNext = ''
pagination = '' pagination = True
#debug = True #debug = True
return locals() return locals()
@@ -178,15 +175,14 @@ def episodios(item):
# per genere, per anno, per lettera, per qualità ecc ecc # per genere, per anno, per lettera, per qualità ecc ecc
@support.scrape @support.scrape
def genres(item): def genres(item):
support.info(item) #logger.dbg()
#support.dbg()
action = '' action = ''
blacklist = [''] blacklist = ['']
patron = r'' patron = r''
patronBlock = r'' patronBlock = r''
patronNext = '' patronNext = ''
pagination = '' pagination = True
#debug = True #debug = True
return locals() return locals()
@@ -196,18 +192,18 @@ def genres(item):
# per quei casi dove il sito non differenzia film e/o serie e/o anime # per quei casi dove il sito non differenzia film e/o serie e/o anime
# e la ricerca porta i titoli mischiati senza poterli distinguere tra loro # e la ricerca porta i titoli mischiati senza poterli distinguere tra loro
# andranno modificate anche le def peliculas e episodios ove occorre # andranno modificate anche le def movies e episodes ove occorre
def check(item): def select(item):
support.info('select --->', item) logger.debug()
#support.dbg() #logger.dbg()
data = httptools.downloadpage(item.url, headers=headers).data data = httptools.downloadpage(item.url, headers=headers).data
# pulizia di data, in caso commentare le prossime 2 righe # pulizia di data, in caso commentare le prossime 2 righe
data = re.sub('\n|\t', ' ', data) data = re.sub('\n|\t', ' ', data)
data = re.sub(r'>\s+<', '> <', data) data = re.sub(r'>\s+<', '> <', data)
block = scrapertools.find_single_match(data, r'') block = scrapertools.find_single_match(data, r'')
if re.findall('', data, re.IGNORECASE): if re.findall('', data, re.IGNORECASE):
support.info('select = ### è una serie ###') logger.debug('select = ### è una serie ###')
return episodios(Item(channel=item.channel, return episodes(Item(channel=item.channel,
title=item.title, title=item.title,
fulltitle=item.fulltitle, fulltitle=item.fulltitle,
url=item.url, url=item.url,
@@ -219,7 +215,7 @@ def check(item):
############## Fondo Pagina ############## Fondo Pagina
# da adattare al canale # da adattare al canale
def search(item, text): def search(item, text):
support.info('search', item) logger.debug(text)
itemlist = [] itemlist = []
text = text.replace(' ', '+') text = text.replace(' ', '+')
item.url = host + '/index.php?do=search&story=%s&subaction=search' % (text) item.url = host + '/index.php?do=search&story=%s&subaction=search' % (text)
@@ -227,35 +223,35 @@ def search(item, text):
# se il canale è solo film, si può omettere, altrimenti bisgona aggiungerlo e discriminare. # se il canale è solo film, si può omettere, altrimenti bisgona aggiungerlo e discriminare.
item.contentType = item.contentType item.contentType = item.contentType
try: try:
return peliculas(item) return movies(item)
# Se captura la excepcion, para no interrumpir al buscador global si un canal falla # Se captura la excepcion, para no interrumpir al buscador global si un canal falla
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
info('search log:', line) logger.error('search log:', line)
return [] return []
# da adattare al canale # da adattare al canale
# inserire newest solo se il sito ha la pagina con le ultime novità/aggiunte # inserire newest solo se il sito ha la pagina con le ultime novità/aggiunte
# altrimenti NON inserirlo # altrimenti NON inserirlo
def newest(categoria): def newest(category):
support.info('newest ->', categoria) logger.debug(category)
itemlist = [] itemlist = []
item = Item() item = Item()
try: try:
if categoria == 'peliculas': if category == 'movie':
item.url = host item.url = host
item.action = 'peliculas' item.action = 'movies'
itemlist = peliculas(item) itemlist = movies(item)
if itemlist[-1].action == 'peliculas': if itemlist[-1].action == 'movies':
itemlist.pop() itemlist.pop()
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.info('newest log: ', {0}.format(line)) logger.debug('newest log: ', {0}.format(line))
return [] return []
return itemlist return itemlist
@@ -265,5 +261,5 @@ def newest(categoria):
# sia per i siti con hdpass # sia per i siti con hdpass
#support.server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=True) #support.server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=True)
def findvideos(item): def findvideos(item):
support.info('findvideos ->', item) logger.debug()
return support.server(item, headers=headers) return support.server(item, headers=headers)

View File

@@ -1,20 +0,0 @@
{
"id": "1337x",
"name": "1337x",
"language": ["ita", "sub-ita", "eng"],
"active": true,
"thumbnail": "1337x.png",
"banner": "1337x.png",
"categories": ["movie", "tvshow", "torrent"],
"not_active": ["include_in_newest"],
"settings": [
{
"id": "itaSearch",
"type": "bool",
"label": "Cerca contenuti in italiano",
"default": false,
"enabled": true,
"visible": true
}
]
}

View File

@@ -1,193 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per 1337x
# ------------------------------------------------------------
import inspect
from core import support
from platformcode import logger, config
# host = support.config.get_channel_url()
host = 'https://www.1337x.to'
@support.menu
def mainlist(item):
menu = [('Film ITA {bullet bold}',['/movie-lib-sort/all/it/popularity/desc/all/1/', 'peliculas', '', 'movie']),
('Film {submenu}',['/movie-library/1/', 'peliculas', 'filter', 'movie']),
('Serie TV {bullet bold}',['/series-library/', 'az', '', 'tvshow'])]
search = ''
return locals()
def moviefilter(item):
if logger.testMode:
return host +'/movie-lib-sort/all/all/score/desc/all/1/'
from platformcode import platformtools
item.args = ''
controls = []
data = support.match(item).data
patronBlock = r'<select name="{}"[^>]+>(.+?)</select>'
patron = r'value="([^"]+)">([^<]+)'
genres = support.match(data, patronBlock=patronBlock.format('genre'), patron=patron).matches
years = support.match(data, patronBlock=patronBlock.format('year'), patron=patron).matches
langs = support.match(data, patronBlock=patronBlock.format('lang'), patron=patron).matches
sorts = support.match(data, patronBlock=patronBlock.format('sortby'), patron=patron).matches
orders = support.match(data, patronBlock=patronBlock.format('sort'), patron=patron).matches
item.genreValues = [x[0] for x in genres]
item.yearValues = [x[0] for x in years]
item.langValues = [x[0] for x in langs]
item.sortValues = [x[0] for x in sorts]
item.orderValues = [x[0] for x in orders]
genres = [g[1] for g in genres]
years = [g[1] for g in years]
langs = [g[1] for g in langs]
sorts = [g[1] for g in sorts]
orders = [g[1] for g in orders]
controls.append({'id': 'lang', 'label': 'Lingua', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':langs, 'default': 0})
controls.append({'id': 'genre', 'label': 'Genere', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':genres, 'default': 0})
controls.append({'id': 'year', 'label': 'Anno', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':years, 'default': 0})
controls.append({'id': 'sort', 'label': 'Anno', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':sorts, 'default': 0})
controls.append({'id': 'order', 'label': 'Anno', 'type': 'list', 'enabled':True, 'visible':True, 'lvalues':orders, 'default': 0})
return platformtools.show_channel_settings(list_controls=controls, item=item, caption='Filtro', callback='filtered')
def filtered(item, values):
genre = item.genreValues[values['genre']]
lang = item.langValues[values['lang']]
sortby = item.sortValues[values['sort']]
order = item.orderValues[values['order']]
year = item.yearValues[values['year']]
return '{}/movie-lib-sort/{}/{}/{}/{}/{}/1/'.format(host, genre, lang, sortby, order, year)
def az(item):
import string
itemlist = [item.clone(title='1-9', url=item.url +'num/1/', action='peliculas', thumbnail=support.thumb('az'))]
for letter in list(string.ascii_lowercase):
itemlist.append(item.clone(title=letter.upper(), url=item.url + letter +'/1/', action='peliculas', thumbnail=support.thumb('az')))
return itemlist
def search(item, text):
support.info('search', text)
item.args = 'search'
if config.get_setting('itaSearch', channel=item.channel, default=False):
text += ' ita'
text = text.replace(' ', '+')
item.url = '{}/search/{}/1/'.format(host, text)
try:
return peliculas(item)
# Cattura la eccezione così non interrompe la ricerca globle se il canale si rompe!
except:
import sys
for line in sys.exc_info():
support.logger.error("search except: ", line)
return []
@support.scrape
def peliculas(item):
if item.args == 'filter':
item.url = moviefilter(item)
if not item.url:
data = ' '
else:
data = support.match(item).data
# debug = True
if item.args == 'search':
sceneTitle = 'undefined'
patron = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)<(?:[^>]+>){3,7}(?P<seed>[^<]+)<(?:[^>]+>){6}(?P<size>[^<]+)<span'
patronNext = r'"([^"]+)">&gt;&gt;'
elif item.contentType == 'movie':
patron = r'<img[^>]+data-original="(?P<thumb>[^"]+)(?:[^>]+>){15}(?P<title>[^<]+).*?<p>(?P<plot>[^<]+).*?<a href="(?P<url>[^"]+)'
patronNext = r'"([^"]+)">&gt;&gt;'
else:
action = 'seasons'
patron = r'<img src="(?P<thumb>[^"]+)(?:[^>]+>){4}\s*<a href="(?P<url>[^"]+)[^>]+>(?P<title>[^<]+)'
if (item.args == 'search' or item.contentType != 'movie') and not support.stackCheck(['get_channel_results']):
patronNext = None
def itemlistHook(itemlist):
lastUrl = support.match(data, patron=r'href="([^"]+)">Last').match
if lastUrl:
currentPage = support.match(item.url, string=True, patron=r'/(\d+)/').match
nextPage = int(currentPage) + 1
support.nextPage(itemlist, item, next_page=item.url.replace('/{}'.format(currentPage), '/{}'.format(nextPage)), function_or_level='peliculas')
return itemlist
return locals()
@support.scrape
def seasons(item):
item.contentType = 'season'
action = 'episodios'
patron = r'<li>\s*<a href="(?P<url>[^"]+)[^>]+>\s*<img alt="[^"]*"\ssrc="(?P<thumb>[^"]+)(?:([^>]+)>){2}\s*(?P<title>\w+ (?P<season>\d+))'
return locals()
@support.scrape
def episodios(item):
patron = r'<img src="(?P<thumb>[^"]+)(?:[^>]+>){13}\s*(?P<season>\d+)x(?P<episode>\d+)\s*<span class="seperator">(?:[^>]+>){2}\s*<a href="(?P<url>[^"]+)">(?P<title>[^<]+)'
def itemlistHook(itemlist):
itemlist.reverse()
return itemlist
return locals()
def findvideos(item):
itemlist = []
item.disableAutoplay = True
if item.args == 'search':
itemlist.append(item.clone(server='torrent', action='play'))
else:
from lib.guessit import guessit
items = support.match(item.url, patron=r'<a href="([^"]+)">([^<]+)<(?:[^>]+>){3}([^<]+)<(?:[^>]+>){6}([^<]+)<span').matches
for url, title, seed, size in items:
parsedTitle = guessit(title)
title = support.scrapertools.unescape(parsedTitle.get('title', ''))
lang = ''
if parsedTitle.get('language'):
langs = parsedTitle.get('language')
if isinstance(langs, list):
lang = 'MULTI'
else:
lang = vars(langs).get('alpha3').upper()
if not (lang.startswith('MUL') or lang.startswith('ITA')):
subs = parsedTitle.get('subtitle_language')
if isinstance(subs, list):
lang = 'Multi-Sub'
else:
lang = vars(subs).get('alpha3').upper()
if lang:
title = '{} [{}]'.format(title, lang)
sizematch = support.match(size, patron='(\d+(?:\.\d+)?)\s* (\w+)').match
sizenumber = float(sizematch[0])
if sizematch[1].lower() == 'gb':
sizenumber = sizenumber * 1024
itemlist.append(item.clone(title = '{} [{} SEEDS] [{}]'.format(title, seed, size), seed=int(seed), size=sizenumber, url=host + url, server='torrent', action='play'))
itemlist.sort(key=lambda it: (it.seed, it.size), reverse=True)
Videolibrary = True if 'movie' in item.args else False
return support.server(item, itemlist=itemlist, Videolibrary=Videolibrary, Sorted=False)
def play(item):
from core import servertools
data = support.match(item.url, patron=r'href="(magnet[^"]+)').match
return servertools.find_video_items(item, data=data)

2
channels/__init__.py Executable file → Normal file
View File

@@ -3,6 +3,7 @@
import os import os
import sys import sys
# Appends the main plugin dir to the PYTHONPATH if an internal package cannot be imported. # Appends the main plugin dir to the PYTHONPATH if an internal package cannot be imported.
# Examples: In Plex Media Server all modules are under "Code.*" package, and in Enigma2 under "Plugins.Extensions.*" # Examples: In Plex Media Server all modules are under "Code.*" package, and in Enigma2 under "Plugins.Extensions.*"
try: try:
@@ -10,3 +11,4 @@ try:
import core import core
except: except:
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))) sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))

0
channels/accuradio.json Executable file → Normal file
View File

33
channels/accuradio.py Executable file → Normal file
View File

@@ -4,7 +4,7 @@
# ------------------------------------------------------------ # ------------------------------------------------------------
import random import random
from core import httptools, support from core import httptools, support, config
from platformcode import logger from platformcode import logger
host = 'https://www.accuradio.com' host = 'https://www.accuradio.com'
@@ -12,32 +12,29 @@ api_url = host + '/c/m/json/{}/'
headers = [['Referer', host]] headers = [['Referer', host]]
def mainlist(item): def mainlist(item):
itemlist = []
item.action = 'peliculas'
js = httptools.downloadpage(api_url.format('brands')).json js = httptools.downloadpage(api_url.format('brands')).json
for it in js.get('features',[]): itemlist = []
item.action = 'movies'
js = httptools.downloadpage(api_url.format('brands')).json
for it in js.get('features',[]) + js.get('brands',[]):
itemlist.append( itemlist.append(
item.clone(url= '{}/{}'.format(host,it.get('canonical_url','')), item.clone(url= '{}/{}'.format(host,it.get('canonical_url','')),
title=support.typo(it['name'],'italic') + support.typo(it.get('channels',''),'_ [] color kod') extraInfo = it.get('channels',''),
)) title=it['name'],
for it in js.get('brands',[]): thumbnail = support.thumb('music')
itemlist.append(
item.clone(url= '{}/{}'.format(host,it.get('canonical_url','')),
title=support.typo(it['name'],'bullet bold') + support.typo(it.get('channels',''),'_ [] color kod')
)) ))
itemlist.append(item.clone(title=support.typo('Cerca...', 'bold color kod'), action='search', thumbnail=support.thumb('search'))) itemlist.append(item.clone(title=support.typo(config.getLocalizedString(70741) % 'Musica… ', 'bold'), action='search', thumbnail=support.thumb('music_search')))
support.channel_config(item, itemlist) support.channel_config(item, itemlist)
return itemlist return itemlist
@support.scrape @support.scrape
def peliculas(item): def movies(item):
# debug=True tmdbEnabled = False
action = 'playradio' action = 'playradio'
patron = r'data-id="(?P<id>[^"]+)"\s*data-oldid="(?P<oldid>[^"]+)".*?data-name="(?P<title>[^"]+)(?:[^>]+>){2}<img src="(?P<thumb>[^"]+)(?:[^>]+>){16}\s*(?P<plot>[^<]+)' patron = r'data-id="(?P<id>[^"]+)"\s*data-oldid="(?P<oldid>[^"]+)".*?data-name="(?P<title>[^"]+)(?:[^>]+>){5}<img class="[^"]+"\s*src="(?P<thumb>[^"]+)(?:[^>]+>){6}\s*(?P<plot>[^<]+)'
return locals() return locals()
@@ -69,7 +66,7 @@ def playradio(item):
def search(item, text): def search(item, text):
support.info(text) logger.debug(text)
item.url = host + '/search/' + text item.url = host + '/search/' + text
itemlist = [] itemlist = []
try: try:
@@ -77,9 +74,9 @@ def search(item, text):
artists = support.match(data, patronBlock=r'artistResults(.*?)</ul', patron=r'href="(?P<url>[^"]+)"\s*>(?P<title>[^<]+)').matches artists = support.match(data, patronBlock=r'artistResults(.*?)</ul', patron=r'href="(?P<url>[^"]+)"\s*>(?P<title>[^<]+)').matches
if artists: if artists:
for url, artist in artists: for url, artist in artists:
itemlist.append(item.clone(title=support.typo(artist,'bullet bold'), thumbnail=support.thumb('music'), url=host+url, action='peliculas')) itemlist.append(item.clone(title=support.typo(artist,'bullet bold'), thumbnail=support.thumb('music'), url=host+url, action='movies'))
item.data = data item.data = data
itemlist += peliculas(item) itemlist += movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys

View File

@@ -1,11 +0,0 @@
{
"id": "altadefinizione",
"name": "Altadefinizione",
"language": ["ita", "sub-ita"],
"active": true,
"thumbnail": "altadefinizione.png",
"banner": "altadefinizione.png",
"categories": ["movie", "tvshow", "vos"],
"settings": [],
"not_active": ["include_in_newest"]
}

View File

@@ -1,136 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per altadefinizione
# ------------------------------------------------------------
from core import httptools, support, tmdb, scrapertools
from platformcode import config, logger
import re
def findhost(url):
host = support.match(url, patron=r'<h2[^>]+><a href="([^"]+)').match.rstrip('/')
permUrl = httptools.downloadpage(host, follow_redirects=False, only_headers=True).headers
if 'location' in permUrl.keys(): # handle redirection
return permUrl['location']
return host
host = config.get_channel_url(findhost)
headers = [['Referer', host]]
@support.menu
def mainlist(item):
menu = [('Film',['/category/film/', 'peliculas', '', 'movie']),
('Film al cinema {submenu}',['/category/ora-al-cinema/', 'peliculas', '', 'movie']),
('Generi',['', 'genres', '', 'undefined']),
('Saghe',['', 'genres', 'saghe', 'undefined']),
('Serie TV',['/category/serie-tv/', 'peliculas', '', 'tvshow']),
#('Aggiornamenti Serie TV', ['/aggiornamenti-serie-tv/', 'peliculas']) da fixare
]
search = ''
return locals()
@support.scrape
def genres(item):
action = 'peliculas'
blacklist = ['Scegli il Genere', 'Film', 'Serie Tv', 'Sub-Ita', 'Anime', "Non reperibile", 'Anime Sub-ITA', 'Prossimamente',]
wantSaga = True if item.args == 'saghe' else False
patronBlock = r'<div class=\"categories-buttons-container\"(?P<block>.*?)</div>'
if not wantSaga: # se non richiedo le sage carico le icone in automatico
patronMenu = r'<a href=\"(?P<url>https:\/\/.*?)\".*?>(?P<title>.*?)</a>'
else: # mantengo l'icona del padre
patron = r'<a href=\"(?P<url>https:\/\/.*?)\".*?>(?P<title>.*?)</a>'
def itemlistHook(itemlist):
itl = []
for item in itemlist:
isSaga = item.fulltitle.startswith('Saga')
if len(item.fulltitle) != 3:
if (isSaga and wantSaga) or (not isSaga and not wantSaga):
itl.append(item)
return itl
return locals()
def search(item, text):
item.url = "{}/?{}".format(host, support.urlencode({'s': text}))
item.args = 'search'
try:
return peliculas(item)
except:
import sys
for line in sys.exc_info():
logger.error("search except: %s" % line)
return []
@support.scrape
def peliculas(item):
if not item.args == 'search': # pagination not works
if not item.nextpage:
item.page = 1
else:
item.page = item.nextpage
if not item.parent_url:
item.parent_url = item.url
item.nextpage = item.page + 1
nextPageUrl = "{}/page/{}".format(item.parent_url, item.nextpage)
resp = httptools.downloadpage(nextPageUrl, only_headers = True)
if (resp.code > 399): # no more elements
nextPageUrl = ''
else:
action = 'check'
patron= r'<article class=\"elementor-post.*?(<img .*?src=\"(?P<thumb>[^\"]+).*?)?<h1 class=\"elementor-post__title\".*?<a href=\"(?P<url>[^\"]+)\" >\s*(?P<title>[^<]+?)\s*(\((?P<lang>Sub-[a-zA-Z]+)*\))?\s*(\[(?P<quality>[A-Z]*)\])?\s*(\((?P<year>[0-9]{4})\))?\s+<'
return locals()
def episodios(item):
item.quality = ''
data = item.data if item.data else httptools.downloadpage(item.url).data
itemlist = []
for it in support.match(data, patron=[r'div class=\"single-season.*?(?P<id>season_[0-9]+).*?>Stagione:\s(?P<season>[0-9]+).*?(\s-\s(?P<lang>[a-zA-z]+?))?<']).matches:
block = support.match(data, patron = r'div id=\"'+ it[0] +'\".*?</div').match
for ep in support.match(block, patron=[r'<li><a href=\"(?P<url>[^\"]+).*?img\" src=\"(?P<thumb>[^\"]+).*?title\">(?P<episode>[0-9]+)\.\s+(?P<title>.*?)</span>']).matches:
itemlist.append(item.clone(contentType = 'episode',
action='findvideos',
thumb = ep[1],
title = support.format_longtitle(support.cleantitle(ep[3]), season = it[1], episode = ep[2], lang= it[3]),
url = ep[0], data = '')
)
support.check_trakt(itemlist)
support.videolibrary(itemlist, item)
if (config.get_setting('downloadenabled')):
support.download(itemlist, item)
return itemlist
def check(item):
item.data = httptools.downloadpage(item.url).data
if 'season-details' in item.data.lower():
item.contentType = 'tvshow'
return episodios(item)
else:
return findvideos(item)
def findvideos(item):
video_url = item.url
if item.contentType == 'movie':
video_url = support.match(item, patron=[r'<div class="video-wrapper">.*?<iframe src=\"(https://.*?)\"',
r'window.open\(\'([^\']+).*?_blank']).match
if (video_url == ''):
return []
itemlist = [item.clone(action="play", url=srv) for srv in support.match(video_url, patron='<div class="megaButton" meta-type="v" meta-link="([^"]+).*?(?=>)>').matches]
itemlist = support.server(item,itemlist=itemlist)
return itemlist

2
channels/altadefinizione01.json Executable file → Normal file
View File

@@ -5,6 +5,6 @@
"active": true, "active": true,
"thumbnail": "altadefinizione01.png", "thumbnail": "altadefinizione01.png",
"banner": "altadefinizione01.png", "banner": "altadefinizione01.png",
"categories": ["movie", "vos"], "categories": ["movie", "sub"],
"settings": [] "settings": []
} }

80
channels/altadefinizione01.py Executable file → Normal file
View File

@@ -2,22 +2,11 @@
# ------------------------------------------------------------ # ------------------------------------------------------------
# Canale per altadefinizione01 # Canale per altadefinizione01
# ------------------------------------------------------------ # ------------------------------------------------------------
"""
Eccezioni note che non superano il test del canale:
Avvisi:
- L'url si prende da questo file.
- è presente nelle novità-> Film.
Ulteriori info:
"""
from core import scrapertools, httptools, support from core import scrapertools, httptools, support
from core.item import Item from core.item import Item
from platformcode import config, logger from platformcode import config, logger
# def findhost(url): # def findhost(url):
# data = httptools.downloadpage(url).data # data = httptools.downloadpage(url).data
# host = scrapertools.find_single_match(data, '<div class="elementor-button-wrapper"> <a href="([^"]+)"') # host = scrapertools.find_single_match(data, '<div class="elementor-button-wrapper"> <a href="([^"]+)"')
@@ -32,86 +21,81 @@ headers = [['Referer', host]]
def mainlist(item): def mainlist(item):
film = [ film = [
('Al Cinema', ['/cinema/', 'peliculas', 'pellicola']), ('Al Cinema', ['/cinema/', 'movies', 'pellicola']),
('Ultimi Aggiornati-Aggiunti', ['','peliculas', 'update']), ('Ultimi Aggiornati-Aggiunti', ['','movies', 'update']),
('Generi', ['', 'genres', 'genres']), ('Generi', ['', 'genres', 'genres']),
('Lettera', ['/catalog/a/', 'genres', 'orderalf']), ('Lettera', ['/catalog/a/', 'genres', 'az']),
('Anni', ['', 'genres', 'years']), ('Anni', ['', 'genres', 'years']),
('Sub-ITA', ['/sub-ita/', 'peliculas', 'pellicola']) ('Sub-ITA', ['/sub-ita/', 'movies', 'pellicola'])
] ]
return locals() return locals()
@support.scrape @support.scrape
def peliculas(item): def movies(item):
support.info('peliculas', item)
## deflang = 'ITA'
action="findvideos" action="findvideos"
patron = r'<div class="cover boxcaption"> +<h2>\s*<a href="(?P<url>[^"]+)">(?P<title>[^<]+).*?src="(?P<thumb>[^"]+).*?<div class="trdublaj">(?P<quality>[^<]+).*?<span class="ml-label">(?P<year>[0-9]+).*?<span class="ml-label">(?P<duration>[^<]+).*?<p>(?P<plot>[^<]+)' patron = r'<div class="cover boxcaption"> +<h2>\s*<a href="(?P<url>[^"]+)">(?P<title>[^<]+).*?src="(?P<thumb>[^"]+).*?<div class="trdublaj">(?P<quality>[^<]+).*?<span class="ml-label">(?P<year>[0-9]+).*?<span class="ml-label">(?P<duration>[^<]+).*?<p>(?P<plot>[^<]+)'
patronNext = '<span>\d</span> <a href="([^"]+)">'
if item.args == "search": if item.args == "search":
patronBlock = r'</script> <div class="boxgrid caption">(?P<block>.*)<div id="right_bar">' patronBlock = r'</script> <div class="boxgrid caption">(?P<block>.*)<div id="right_bar">'
elif item.args == 'update': elif item.args == 'update':
patronBlock = r'<div class="widget-title">Ultimi Film Aggiunti/Aggiornati</div>(?P<block>.*?)<div id="alt_menu">' patronBlock = r'<div class="widget-title">Ultimi Film Aggiunti/Aggiornati</div>(?P<block>.*?)<div id="alt_menu">'
patron = r'style="background-image:url\((?P<thumb>[^\)]+).+?<p class="h4">(?P<title>.*?)</p>[^>]+> [^>]+> [^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+> [^>]+> [^>]+>[^>]+>(?P<year>\d{4})[^>]+>[^>]+> [^>]+>[^>]+>(?P<duration>\d+|N/A)?.+?>.*?(?:>Film (?P<lang>Sub ITA)</a></p> )?<p>(?P<plot>[^<]+)<.*?href="(?P<url>[^"]+)' patron = r'style="background-image:url\((?P<thumb>[^\)]+).+?<p class="h4">(?P<title>.*?)</p>[^>]+> [^>]+> [^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+> [^>]+> [^>]+>[^>]+>(?P<year>\d{4})[^>]+>[^>]+> [^>]+>[^>]+>(?P<duration>\d+|N/A).+?>.*?(?:>Film (?P<lang>Sub ITA)</a></p> )?<p>(?P<plot>[^<]+)<.*?href="(?P<url>[^"]+)'
patronNext = '' # non ha nessuna paginazione elif item.args == 'az':
elif item.args == 'orderalf':
patron = r'<td class="mlnh-thumb"><a href="(?P<url>[^"]+)".*?src="(?P<thumb>[^"]+)"' \ patron = r'<td class="mlnh-thumb"><a href="(?P<url>[^"]+)".*?src="(?P<thumb>[^"]+)"' \
'.+?[^>]+>[^>]+ [^>]+[^>]+ [^>]+>(?P<title>[^<]+).*?[^>]+>(?P<year>\d{4})<' \ '.+?[^>]+>[^>]+ [^>]+[^>]+ [^>]+>(?P<title>[^<]+).*?[^>]+>(?P<year>\d{4})<' \
'[^>]+>[^>]+>(?P<quality>[A-Z]+)[^>]+> <td class="mlnh-5">(?P<lang>.*?)</td>' '[^>]+>[^>]+>(?P<quality>[A-Z]+)[^>]+> <td class="mlnh-5">(?P<lang>.*?)</td>'
else: else:
patronBlock = r'<div class="cover_kapsul ml-mask">(?P<block>.*)<div class="page_nav">' patronBlock = r'<div class="cover_kapsul ml-mask">(?P<block>.*)<div class="page_nav">'
# debug = True patronNext = r'<a href="([^"]+)">&raquo;'
patronTotalPages = r'>(\d+)(?:[^>]+>){3}&raquo;'
return locals() return locals()
@support.scrape @support.scrape
def genres(item): def genres(item):
support.info('genres',item) action = "movies"
action = "peliculas"
blacklist = ['Altadefinizione01'] blacklist = ['Altadefinizione01']
if item.args == 'genres': if item.args == 'genres':
patronBlock = r'<ul class="kategori_list">(?P<block>.*?)<div class="tab-pane fade" id="wtab2">' patronBlock = r'<ul class="kategori_list">(?P<block>.*?)<div class="tab-pane fade" id="wtab2">'
patronMenu = '<li><a href="(?P<url>[^"]+)">(?P<title>.*?)</a>' patronGenreMenu = '<li><a href="(?P<url>[^"]+)">(?P<title>.*?)</a>'
elif item.args == 'years': elif item.args == 'years':
patronBlock = r'<ul class="anno_list">(?P<block>.*?)</li> </ul> </div>' patronBlock = r'<ul class="anno_list">(?P<block>.*?)</li> </ul> </div>'
patronMenu = '<li><a href="(?P<url>[^"]+)">(?P<title>.*?)</a>' patronMenu = '<li><a href="(?P<url>[^"]+)">(?P<title>.*?)</a>'
elif item.args == 'orderalf': elif item.args == 'az':
patronBlock = r'<div class="movies-letter">(?P<block>.*?)<div class="clearfix">' patronBlock = r'<div class="movies-letter">(?P<block>.*?)<div class="clearfix">'
patronMenu = '<a title=.*?href="(?P<url>[^"]+)"><span>(?P<title>.*?)</span>' patronMenu = '<a title=.*?href="(?P<url>[^"]+)"><span>(?P<title>.*?)</span>'
#debug = True
return locals() return locals()
@support.scrape @support.scrape
def orderalf(item): def az(item):
support.info('orderalf',item)
action = 'findvideos' action = 'findvideos'
patron = r'<td class="mlnh-thumb"><a href="(?P<url>[^"]+)".*?src="(?P<thumb>[^"]+)"'\ patron = r'<td class="mlnh-thumb"><a href="(?P<url>[^"]+)".*?src="(?P<thumb>[^"]+)"'\
'.+?[^>]+>[^>]+ [^>]+[^>]+ [^>]+>(?P<title>[^<]+).*?[^>]+>(?P<year>\d{4})<'\ '.+?[^>]+>[^>]+ [^>]+[^>]+ [^>]+>(?P<title>[^<]+).*?[^>]+>(?P<year>\d{4})<'\
'[^>]+>[^>]+>(?P<quality>[A-Z]+)[^>]+> <td class="mlnh-5">(?P<lang>.*?)</td>' '[^>]+>[^>]+>(?P<quality>[A-Z]+)[^>]+> <td class="mlnh-5">(?P<lang>.*?)</td>'
patronNext = r'<span>[^<]+</span>[^<]+<a href="(.*?)">'
return locals() return locals()
def search(item, text): def search(item, text):
support.info(item, text) logger.debug(text)
itemlist = [] itemlist = []
text = text.replace(" ", "+") text = text.replace(" ", "+")
item.url = host + "/index.php?do=search&story=%s&subaction=search" % (text) item.url = host + "/index.php?do=search&story=%s&subaction=search" % (text)
item.args = "search" item.args = "search"
try: try:
return peliculas(item) return movies(item)
# Cattura la eccezione così non interrompe la ricerca globle se il canale si rompe! # Cattura la eccezione così non interrompe la ricerca globle se il canale si rompe!
except: except:
import sys import sys
@@ -119,18 +103,18 @@ def search(item, text):
logger.error("search except: %s" % line) logger.error("search except: %s" % line)
return [] return []
def newest(categoria): def newest(category):
support.info(categoria) logger.debug(category)
itemlist = [] itemlist = []
item = Item() item = Item()
try: try:
if categoria == "peliculas": if category == "movie":
item.url = host item.url = host
item.action = "peliculas" item.action = "movies"
item.contentType = 'movie' item.contentType = 'movie'
itemlist = peliculas(item) itemlist = movies(item)
if itemlist[-1].action == "peliculas": if itemlist[-1].action == "movies":
itemlist.pop() itemlist.pop()
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
@@ -141,17 +125,13 @@ def newest(categoria):
return itemlist return itemlist
def findvideos(item): def findvideos(item):
support.info('findvideos', item) logger.debug()
data = httptools.downloadpage(item.url).data data = httptools.downloadpage(item.url).data
iframe = support.match(data, patron='src="(http[^"]+)" frameborder=\"0\" allow=\"accelerometer; autoplay;').match iframe = support.match(data, patron='player-container[^>]+>\s*<iframe[^>]+src="([^"]+)').match
if iframe: if iframe:
item.url = iframe item.url = iframe
return support.server(item) return support.server(item)
else:
# TODO: verificare se si puo' reinsierire il trailer youtube itemlist = [item.clone(action="play", url=srv[0], quality=srv[1]) for srv in support.match(item, patron='<a href="#" data-link="([^"]+).*?<span class="d">([^<]+)').matches]
#itemlist = [item.clone(action="play", url=srv[0], quality=srv[1]) for srv in support.match(item, patron='<a href="#" data-link="([^"]+).*?<span class="d">([^<]+)').matches] return support.server(item, itemlist=itemlist, headers=headers)
#itemlist = support.server(item, itemlist=itemlist, headers=headers)
#return itemlist

View File

@@ -0,0 +1,10 @@
{
"id": "altadefinizione01_link",
"name": "Altadefinizione01 L",
"active": false,
"language": ["ita","sub-ita"],
"thumbnail": "altadefinizione01_L.png",
"banner": "altadefinizione01_L.png",
"categories": ["movie","sub"],
"settings" :[]
}

View File

@@ -0,0 +1,96 @@
# -*- coding: utf-8 -*-
# -*- Channel altadefinizione01_link -*-
from core import support
from core.item import Item
from platformcode import config, logger
__channel__ = "altadefinizione01_link"
# ======== def per utility INIZIO ============================
host = config.get_channel_url()
headers = [['Referer', host]]
# =========== home menu ===================
@support.menu
def mainlist(item):
film = [
('Al Cinema', ['/film-del-cinema', 'movies', '']),
('Generi', ['', 'genres', 'genres']),
('Anni', ['', 'genres', 'years']),
('Qualità', ['/piu-visti.html', 'genres', 'quality']),
('Mi sento fortunato', ['/piu-visti.html', 'genres', 'lucky']),
('Popolari', ['/piu-visti.html', 'movies', '']),
('Sub-ITA', ['/film-sub-ita/', 'movies', ''])
]
return locals()
# ======== def in ordine di action dal menu ===========================
@support.scrape
def movies(item):
patron = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)(?:[^>]+>){5}\s*<div class="[^"]+" style="background-image:url\((?P<thumb>[^\)]+)(?:[^>]+>){6}\s*(?P<year>\d{4})[^>]+>[^>]+>(?:\s*(?P<duration>\d+))?(?:[^>]+>){0,2}\s+(?P<quality>[a-zA-Z]+)\s+(?:[^>]+>){2}\s*(?P<lang>[^>]+)\s+[^>]+>'
patronNext = r'<span>\d</span> <a href="([^"]+)">'
return locals()
# =========== def pagina categorie ======================================
@support.scrape
def genres(item):
action = 'movies'
if item.args == 'genres':
patronBlock = r'<ul class="listSubCat" id="Film">(?P<block>.*)<ul class="listSubCat" id="Anno">'
elif item.args == 'years':
patronBlock = r'<ul class="listSubCat" id="Anno">(?P<block>.*)<ul class="listSubCat" id="Qualita">'
elif item.args == 'quality':
patronBlock = r'<ul class="listSubCat" id="Qualita">(?P<block>.*)<blockquote'
elif item.args == 'lucky': # sono i titoli random nella pagina
patronBlock = r'FILM RANDOM.*?class="listSubCat">(?P<block>.*)</ul>'
action = 'findvideos'
patronMenu = r'<li><a href="(?P<url>[^"]+)">(?P<title>[^<]+)<'
return locals()
# =========== def per cercare film/serietv =============
#host+/index.php?do=search&story=avatar&subaction=search
def search(item, text):
logger.debug(text)
itemlist = []
text = text.replace(" ", "+")
item.url = host+"/index.php?do=search&story=%s&subaction=search" % (text)
try:
return movies(item)
# Se captura la excepcion, para no interrumpir al buscador global si un canal falla
except:
import sys
for line in sys.exc_info():
logger.error("%s" % line)
return []
# =========== def per le novità nel menu principale =============
def newest(category):
logger.debug(category)
itemlist = []
item = Item()
try:
if category == "movie":
item.url = host
item.action = "movies"
item.contentType='movie'
itemlist = movies(item)
if itemlist[-1].action == "movies":
itemlist.pop()
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
logger.error("{0}".format(line))
return []
return itemlist
def findvideos(item):
logger.debug('findvideos', item)
return support.server(item, support.match(item, patron='<ul class="playernav">.*?</ul>', headers=headers).match)

6
channels/altadefinizioneclick.json Executable file → Normal file
View File

@@ -1,11 +1,11 @@
{ {
"id": "altadefinizioneclick", "id": "altadefinizioneclick",
"name": "AltadefinizioneClick", "name": "AltadefinizioneClick",
"active": false, "active": true,
"language": ["ita","sub-ita"], "language": ["ita","sub-ita"],
"thumbnail": "altadefinizioneclick.png", "thumbnail": "altadefinizioneclick.png",
"bannermenu": "altadefinizioneciclk.png", "bannermenu": "altadefinizioneciclk.png",
"categories": ["tvshow","movie","vos"], "categories": ["tvshow","movie","sub"],
"not_active":["include_in_newest_series"], "not_active":["include_in_newest_tvshow"],
"settings": [] "settings": []
} }

241
channels/altadefinizioneclick.py Executable file → Normal file
View File

@@ -1,151 +1,178 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# ------------------------------------------------------------ # ------------------------------------------------------------
# Canale per Altadefinizione Click # Canale per altadefinizioneclick
# ---------------------------------------------------------- # ----------------------------------------------------------
from platformcode import logger
from core import support from core import support
from platformcode import config, logger from core.item import Item
from platformcode import config
def findhost(url): def findhost(url):
return support.match(url, patron=r'<div class="elementor-button-wrapper">\s*<a href="([^"]+)"').match data = support.httptools.downloadpage(url).data
host = support.scrapertools.find_single_match(data, '<div class="elementor-button-wrapper">\s*<a href="([^"]+)"')
return host
host = config.get_channel_url(findhost) host = config.get_channel_url(findhost)
if host.endswith('/'): headers = [['Referer', host]]
host = host[:-1]
headers = {'Referer': host, 'x-requested-with': 'XMLHttpRequest'}
order = ['', 'i_piu_visti', 'i_piu_votati', 'i_piu_votati_dellultimo_mese', 'titolo_az', 'voto_imdb_piu_alto'][config.get_setting('order', 'altadefinizionecommunity')]
@support.menu @support.menu
def mainlist(item): def mainlist(item):
logger.debug(item) film = ['',
('Novità', ['/nuove-uscite/', 'movies', 'news']),
('Al Cinema', ['/al-cinema/', 'movies', 'cinema']),
('A-Z',['/lista-film/', 'genres', 'az']),
('Generi', ['', 'genres', 'genres']),
('Anni', ['', 'genres', 'years']),
('Qualità', ['', 'genres', 'quality']),
('Mi sento Fortunato',[ '', 'genres', 'lucky']),
('Sub-ITA', ['/sub-ita/', 'movies', 'sub'])
]
film = ['/type/movie', tvshow = ['/serie-tv/']
('Generi', ['/type/movie', 'genres', 'genres']),
('Anni', ['/type/movie', 'genres', 'year']),]
tvshow = ['/serie-tv/tvshow', search = ''
('Generi', ['/serie-tv/tvshow', 'genres', 'genres']), return locals()
('Anni', ['/serie-tv/tvshow', 'genres', 'year'])]
@support.scrape
def movies(item):
action = 'check'
patron = r'<div class="wrapperImage">\s*(?:<span class="year">(?P<year>[^<]+)[^>]+>)?(?:<span class="hd">(?P<quality>[^<>]+))?.+?href="(?P<url>[^"]+)".+?src="(?P<thumb>[^"]+)".+?<h2 class="titleFilm">[^>]+>(?P<title>.+?)[ ]?(?:|\[(?P<lang>[^\]]+)\])?</a>.*?(?:IMDB\:</strong>[ ](?P<rating>.+?)<|</div>)'
if item.args == 'az':
patron = r'<img style="[^"]+" src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+><a href="(?P<url>[^"]+)" [^>]+>(?P<title>[^<\[]+)(?:\[(?P<lang>[^\]]+)\]\s*)?<'\
r'[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<year>\d{4})[^>]+>[^>]+>\s*(?P<quality>[^<]+).*?<span class="label">(?P<ratting>[^<]+)<'
patronBlock =''
elif item.args == 'search':
patronBlock = r'<section id="lastUpdate">(?P<block>.*?)(?:<div class="row ismobile">|<section)'
patron = r'<a href="(?P<url>[^"]+)">\s*<div class="wrapperImage">(?:\s*<span class="year">(?P<year>[^<]+)<\/span>)?(?:\s*<span class="hd">(?P<quality>[^<]+)<\/span>)?[^>]+>\s*<img[^s]+src="(?P<thumb>[^"]+)"(?:(?:[^>]+>){5}\s*(?P<rating>[^<]+))?(?:[^>]+>){4}(?P<title>[^<]+)'
if not item.args:
# patronBlock = r'(?:ULTIMI INSERITI|Serie TV)(?P<block>.*?)</section'
patronBlock = r'({})(?P<block>.*?)</section'.format('ULTIMI INSERITI' if item.contentType == 'movie' else 'Serie TV')
# debugBlock = True
patronNext = r'<a class="next page-numbers" href="([^"]+)">'
patronTotalPages = r'>(\d+)(?:[^>]+>){3}<a class="next'
return locals() return locals()
@support.scrape
def genres(item):
action = 'movies'
patronGenreMenu = r'<li><a href="(?P<url>[^"]+)">(?P<title>[^<]+)<'
def search(item, texto): if item.args == 'genres':
logger.debug("search ", texto) patronBlock = r'<ul class="listSubCat" id="Film">(?P<block>.*)<ul class="listSubCat" id="Anno">'
elif item.args == 'years':
patronBlock = r'<ul class="listSubCat" id="Anno">(?P<block>.*)<ul class="listSubCat" id="Qualita">'
elif item.args == 'quality':
patronBlock = r'<ul class="listSubCat" id="Qualita">(?P<block>.*)</li>\s*?</ul>\s*?</div>\s*?</div>\s*?</div>\s*?<a'
elif item.args == 'lucky': # sono i titoli random nella pagina
patronBlock = r'<h3 class="titleSidebox dado">FILM RANDOM</h3>(?P<block>.*)</section>'
patron = r'<li><a href="(?P<url>[^"]+)">(?P<title>[^<[]+)(?:\[(?P<lang>.+?)\])?<'
action = 'findvideos'
elif item.args == 'az':
blacklist = ['FILM 4K IN STREAMING']
patron = r'<a title="(?P<title>[^"]+)" href="(?P<url>[^"]+)"'
item.args = 'az'
if not item.args == 'az':
item.args = 'genres'
return locals()
def search(item, text):
logger.debug(text)
item.args = 'search' item.args = 'search'
item.url = host + "/search?s={}&f={}&page=1".format(texto, item.contentType) item.url = host + "?s=" + text
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("%s" % line) logger.error("%s" % line)
return [] return []
def newest(category):
@support.scrape logger.debug(category)
def genres(item): itemlist = []
logger.debug(item) item = Item()
data = support.httptools.downloadpage(item.url, cloudscraper=True).data
blacklist= ['Film', 'Serie TV']
if item.args == 'genres':
categories ={}
res = support.match(host + '/cerca', patron=r'for="cat-(\d+)[^>]+>([^<]+)').matches
for _id, name in res:
categories[name] = _id
patronBlock = r'{}<span></span>(?P<block>.*?)</ul>\s*</li'.format('Film' if item.contentType == 'movie' else 'Serie TV')
patronMenu = r'<a href="[^"]+">(?P<title>[^<]+)'
def itemHook(it):
it.cat_id = categories[it.fulltitle]
return it
if item.args == 'year':
patron = r'value="(?P<year_id>[^"]+)"[^>]*>(?P<title>\d+)'
patronBlock = r'Anno</option>(?P<block>.*?</select>)'
elif item.args == 'quality':
patronMenu = r'quality/(?P<quality_id>[^"]+)">(?P<title>[^<]+)'
patronBlock = r'Risoluzione(?P<block>.*?)</ul>'
action = 'peliculas'
return locals()
@support.scrape
def peliculas(item):
item.quality = 'HD'
json = {}
params ={'type':item.contentType, 'anno':item.year_id, 'quality':item.quality_id, 'cat':item.cat_id, 'order':order}
if item.contentType == 'movie':
action = 'findvideos'
else:
action = 'episodios'
if not item.page: item.page = 1
try: try:
# support.dbg() if category == "movie":
if item.args in ['search']: item.args = 'news'
page = support.httptools.downloadpage(item.url, headers=headers) item.contentType = 'movie'
if page.json: item.url = host + "/nuove-uscite/"
data = "\n".join(page.json['data']) item.action = "movies"
else: itemlist = movies(item)
data = page.data
else:
params['page'] = item.page
url = '{}/load-more-film?{}'.format(host, support.urlencode(params)) if itemlist[-1].action == "movies":
json = support.httptools.downloadpage(url, headers=headers).json itemlist.pop()
data = "\n".join(json['data'])
# Continua la ricerca in caso di errore
except: except:
data = ' ' import sys
for line in sys.exc_info():
from platformcode import logger
logger.error("{0}".format(line))
return []
patron = r'wrapFilm">\s*<a href="(?P<url>[^"]+)">[^>]+>(?P<year>\d+)(?:[^>]+>){2}(?P<rating>[^<]+)(?:[^>]+>){4}\s*<img src="(?P<thumb>[^"]+)(?:[^>]+>){3}(?P<title>[^<[]+)(?:\[(?P<lang>[sSuUbBiItTaA-]+))?' return itemlist
# patron = r'wrapFilm">\s*<a href="(?P<url>[^"]+)">[^>]+>(?P<year>\d+)(?:[^>]+>){2}(?P<rating>[^<]+)(?:[^>]+>){2}(?P<quality>[^<]+)(?:[^>]+>){2}\s*<img src="(?P<thumb>[^"]+)(?:[^>]+>){3}(?P<title>[^<[]+)(?:\[(?P<lang>[sSuUbBiItTaA-]+))?'
# paginazione
if json.get('have_next') or 'have_next_film=true' in data:
def fullItemlistHook(itemlist):
cat_id = support.match(data, patron=r''''cat':"(\d+)"''').match
if cat_id: item.cat_id = cat_id
item.page += 1
support.nextPage(itemlist, item, function_or_level='peliculas')
return itemlist
return locals() def check(item):
item.contentType = 'tvshow'
def get_season(pageData, seas_url, season):
data = ''
episodes = support.match(pageData if pageData else seas_url, patronBlock=patron_episode, patron=patron_option).matches
for episode_url, episode in episodes:
title = season + "x" + episode.zfill(2) + ' - ' + item.fulltitle
data += title + '|' + episode_url + '\n'
return data
patron_season = '<div class="[^"]+" id="seasonsModal"[^>]+>(.*?)</ul>'
patron_episode = '<div class="[^"]+" id="episodesModal"[^>]+>(.*?)</ul>'
patron_option = r'<a href="([^"]+?)".*?>(?:Stagione |Episodio )([^<]+?)</a>'
url = support.match(item, patron=r'<iframe id="iframeVid" width="[^"]+" height="[^"]+" src="([^"]+)" allowfullscreen')
seasons = support.match(url.match, patronBlock=patron_season, patron=patron_option)
if not seasons.match:
item.contentType = 'tvshow'
item.data = url.data
return findvideos(item)
data = ''
import sys
if sys.version_info[0] >= 3: from concurrent import futures
else: from concurrent_py2 import futures
with futures.ThreadPoolExecutor() as executor:
thL = []
for i, season in enumerate(seasons.matches):
thL.append(executor.submit(get_season, seasons.data if i == 0 else '', season[0], season[1]))
for res in futures.as_completed(thL):
if res.result():
data += res.result()
item.data = data
return episodes(item)
@support.scrape @support.scrape
def episodios(item): def episodes(item):
logger.debug(item)
# debug = True
data = item.data data = item.data
patron = r'class="playtvshow "\s+data-href="(?P<url>[^"]+)'
def itemHook(it): patron = r'(?P<season>\d+)x(?P<episode>\d+)\s*-\s*(?P<title>[^\|]+)\|(?P<url>[^ ]+)'
spl = it.url.split('/')[-2:] action = 'findvideos'
it.infoLabels['season'] = int(spl[0])+1
it.infoLabels['episode'] = int(spl[1])+1 def itemlistHook(itemlist):
it.url = it.url.replace('/watch-unsubscribed', '/watch-external') itemlist.sort(key=lambda item: (item.infoLabels['season'], item.infoLabels['episode']))
it.title = '{}x{:02d} - {}'.format(it.contentSeason, it.contentEpisodeNumber, it.fulltitle) return itemlist
return it
return locals() return locals()
def findvideos(item): def findvideos(item):
itemlist = [] logger.debug()
playWindow = support.match(item, patron='(?:playWindow|iframe)" (?:href|src)="([^"]+)').match return support.hdpass_get_servers(item, item.data)
if host in playWindow:
url = support.match(playWindow, patron='allowfullscreen[^<]+src="([^"]+)"').match
else:
url = playWindow
itemlist.append(item.clone(action='play', url=url, quality=''))
return support.server(item, itemlist=itemlist)

16
channels/altadefinizionecommunity.json Executable file → Normal file
View File

@@ -2,10 +2,10 @@
"id": "altadefinizionecommunity", "id": "altadefinizionecommunity",
"name": "Altadefinizione Community", "name": "Altadefinizione Community",
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"active": false, "active": true,
"thumbnail": "altadefinizionecommunity.png", "thumbnail": "altadefinizionecommunity.png",
"banner": "", "banner": "",
"categories": ["movie", "tvshow", "vos"], "categories": ["movie", "tvshow", "sub"],
"not_active": ["include_in_newest"], "not_active": ["include_in_newest"],
"settings": [ "settings": [
{ {
@@ -23,15 +23,5 @@
"label": "password", "label": "password",
"type": "text", "type": "text",
"visible": true "visible": true
}, }]
{
"id": "order",
"type": "list",
"label": "Ordine di Visualizzazione",
"default": 0,
"enabled": true,
"visible": true,
"lvalues": [ "Nessuno", "I più visti", "I più votati", "I più votati dell'ultimo mese", "Titolo A-Z", "Voto IMDB più alto"]
}
]
} }

57
channels/altadefinizionecommunity.py Executable file → Normal file
View File

@@ -22,7 +22,7 @@ if host.endswith('/'):
host = host[:-1] host = host[:-1]
headers = {'Referer': host} headers = {'Referer': host}
order = ['', 'i_piu_visti', 'i_piu_votati', 'i_piu_votati_dellultimo_mese', 'titolo_az', 'voto_imdb_piu_alto'][config.get_setting('order', 'altadefinizionecommunity')] order = ['', 'i_piu_visti', 'i_piu_votati', 'i_piu_votati_dellultimo_mese', 'titolo_az', 'voto_imdb_piu_alto'][config.getSetting('order', 'altadefinizionecommunity')]
@support.menu @support.menu
@@ -49,7 +49,7 @@ def search(item, text):
item.args = 'search' item.args = 'search'
item.url = host + "/search?s={}&f={}".format(text.replace(' ', '+'), item.contentType) item.url = host + "/search?s={}&f={}".format(text.replace(' ', '+'), item.contentType)
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
@@ -87,19 +87,19 @@ def genres(item):
patronMenu = r'quality/(?P<quality_id>[^"]+)">(?P<title>[^<]+)' patronMenu = r'quality/(?P<quality_id>[^"]+)">(?P<title>[^<]+)'
patronBlock = r'Risoluzione(?P<block>.*?)</ul>' patronBlock = r'Risoluzione(?P<block>.*?)</ul>'
action = 'peliculas' action = 'movies'
return locals() return locals()
@support.scrape @support.scrape
def peliculas(item): def movies(item):
item.quality = 'HD' item.quality = 'HD'
json = {} json = {}
if not item.page: item.page = 1 if not item.page: item.page = 1
params ={'type':item.contentType, 'anno':item.year_id, 'quality':item.quality_id, 'cat':item.cat_id, 'order':order, 'page':item.page} params ={'type':item.contentType, 'anno':item.year_id, 'quality':item.quality_id, 'cat':item.cat_id, 'order':order, 'page':item.page}
# debug = True # debug = True
action = 'findvideos' if item.contentType == 'movie' else 'episodios' action = 'findvideos' if item.contentType == 'movie' else 'episodes'
try: try:
# support.dbg() # support.dbg()
@@ -132,15 +132,14 @@ def peliculas(item):
cat_id = support.match(data, patron=r''''cat':"(\d+)"''').match cat_id = support.match(data, patron=r''''cat':"(\d+)"''').match
if cat_id: item.cat_id = cat_id if cat_id: item.cat_id = cat_id
item.page += 1 item.page += 1
support.nextPage(itemlist, item, function_or_level='peliculas') support.nextPage(itemlist, item, function_or_level='movies')
return itemlist return itemlist
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodes(item):
registerOrLogin()
logger.debug(item) logger.debug(item)
# debug = True # debug = True
data = item.data data = item.data
@@ -169,9 +168,9 @@ def findvideos(item):
def play(item): def play(item):
if host in item.url: # intercetto il server proprietario if host in item.url: # intercetto il server proprietario
# if registerOrLogin(): # if registerOrLogin():
return support.get_jwplayer_mediaurl(support.httptools.downloadpage(item.url, cloudscraper=True).data, 'Diretto') return support.get_jwplayer_mediaUrl(support.httptools.downloadpage(item.url, cloudscraper=True).data, 'Diretto')
# else: # else:
# platformtools.play_canceled = True # platformtools.playCanceled = True
# return [] # return []
else: else:
return [item] return [item]
@@ -181,9 +180,9 @@ def resolve_url(item):
registerOrLogin() registerOrLogin()
if '/watch-unsubscribed' not in item.url and '/watch-external' not in item.url: if '/watch-unsubscribed' not in item.url and '/watch-external' not in item.url:
playWindow = support.match(support.httptools.downloadpage(item.url, cloudscraper=True).data, patron='playWindow" href="([^"]+)') playWindow = support.match(support.httptools.downloadpage(item.url, cloudscraper=True).data, patron='playWindow" href="([^"]+)')
video_url = playWindow.match videoUrl = playWindow.match
item.data = playWindow.data item.data = playWindow.data
item.url = video_url.replace('/watch-unsubscribed', '/watch-external') item.url = videoUrl.replace('/watch-unsubscribed', '/watch-external')
return item return item
@@ -196,33 +195,33 @@ def login():
logger.info('Login in corso') logger.info('Login in corso')
post = {'_token': '', post = {'_token': '',
'form_action':'login', 'form_action':'login',
'email': config.get_setting('username', channel='altadefinizionecommunity'), 'email': config.getSetting('username', channel='altadefinizionecommunity'),
'password':config.get_setting('password', channel='altadefinizionecommunity')} 'password':config.getSetting('password', channel='altadefinizionecommunity')}
r = support.httptools.downloadpage(host + '/login', post=post, headers={'referer': host}, cloudscraper=True) r = support.httptools.downloadpage(host + '/login', post=post, headers={'referer': host}, cloudscraper=True)
if r.code not in [200, 302] or 'Email o Password non validi' in r.data: if r.code not in [200, 302] or 'Email o Password non validi' in r.data:
platformtools.dialog_ok('AltadefinizioneCommunity', 'Username/password non validi') platformtools.dialogOk('AltadefinizioneCommunity', 'Username/password non validi')
return False return False
return 'id="logged"' in r.data return 'id="logged"' in r.data
def registerOrLogin(): def registerOrLogin():
if config.get_setting('username', channel='altadefinizionecommunity') and config.get_setting('password', channel='altadefinizionecommunity'): if config.getSetting('username', channel='altadefinizionecommunity') and config.getSetting('password', channel='altadefinizionecommunity'):
if login(): if login():
return True return True
action = platformtools.dialog_yesno('AltadefinizioneCommunity', action = platformtools.dialogYesNo('AltadefinizioneCommunity',
'Questo server necessita di un account, ne hai già uno oppure vuoi tentare una registrazione automatica?', 'Questo server necessita di un account, ne hai già uno oppure vuoi tentare una registrazione automatica?',
yeslabel='Accedi', nolabel='Tenta registrazione', customlabel='Annulla') yeslabel='Accedi', nolabel='Tenta registrazione', customlabel='Annulla')
if action == 1: # accedi if action == 1: # accedi
from specials import setting from specials import setting
from core.item import Item from core.item import Item
user_pre = config.get_setting('username', channel='altadefinizionecommunity') user_pre = config.getSetting('username', channel='altadefinizionecommunity')
password_pre = config.get_setting('password', channel='altadefinizionecommunity') password_pre = config.getSetting('password', channel='altadefinizionecommunity')
setting.channel_config(Item(config='altadefinizionecommunity')) setting.channel_config(Item(config='altadefinizionecommunity'))
user_post = config.get_setting('username', channel='altadefinizionecommunity') user_post = config.getSetting('username', channel='altadefinizionecommunity')
password_post = config.get_setting('password', channel='altadefinizionecommunity') password_post = config.getSetting('password', channel='altadefinizionecommunity')
if user_pre != user_post or password_pre != password_post: if user_pre != user_post or password_pre != password_post:
return registerOrLogin() return registerOrLogin()
@@ -236,7 +235,7 @@ def registerOrLogin():
randPsw = ''.join(random.choice(string.ascii_letters + string.digits) for i in range(10)) randPsw = ''.join(random.choice(string.ascii_letters + string.digits) for i in range(10))
logger.debug('email: ' + mailbox.address) logger.debug('email: ' + mailbox.address)
logger.debug('pass: ' + randPsw) logger.debug('pass: ' + randPsw)
reg = platformtools.dialog_register(register_url, email=True, password=True, email_default=mailbox.address, password_default=randPsw) reg = platformtools.dialogRegister(register_url, email=True, password=True, email_default=mailbox.address, password_default=randPsw)
if not reg: if not reg:
return False return False
regPost = httptools.downloadpage(register_url, post={'email': reg['email'], 'password': reg['password']}, cloudscraper=True) regPost = httptools.downloadpage(register_url, post={'email': reg['email'], 'password': reg['password']}, cloudscraper=True)
@@ -244,27 +243,27 @@ def registerOrLogin():
if regPost.url == register_url: if regPost.url == register_url:
error = scrapertools.htmlclean(scrapertools.find_single_match(regPost.data, 'Impossibile proseguire.*?</div>')) error = scrapertools.htmlclean(scrapertools.find_single_match(regPost.data, 'Impossibile proseguire.*?</div>'))
error = scrapertools.unescape(scrapertools.re.sub('\n\s+', ' ', error)) error = scrapertools.unescape(scrapertools.re.sub('\n\s+', ' ', error))
platformtools.dialog_ok('AltadefinizioneCommunity', error) platformtools.dialogOk('AltadefinizioneCommunity', error)
return False return False
if reg['email'] == mailbox.address: if reg['email'] == mailbox.address:
if "L'indirizzo email risulta già registrato" in regPost.data: if "L'indirizzo email risulta già registrato" in regPost.data:
# httptools.downloadpage(baseUrl + '/forgotPassword', post={'email': reg['email']}) # httptools.downloadpage(baseUrl + '/forgotPassword', post={'email': reg['email']})
platformtools.dialog_ok('AltadefinizioneCommunity', 'Indirizzo mail già utilizzato') platformtools.dialogOk('AltadefinizioneCommunity', 'Indirizzo mail già utilizzato')
return False return False
mail = mailbox.waitForMail() mail = mailbox.waitForMail()
if mail: if mail:
checkUrl = scrapertools.find_single_match(mail.body, '<a href="([^"]+)[^>]+>Verifica').replace(r'\/', '/') checkUrl = scrapertools.find_single_match(mail.body, '<a href="([^"]+)[^>]+>Verifica').replace(r'\/', '/')
logger.debug('CheckURL: ' + checkUrl) logger.debug('CheckURL: ' + checkUrl)
httptools.downloadpage(checkUrl, cloudscraper=True) httptools.downloadpage(checkUrl, cloudscraper=True)
config.set_setting('username', mailbox.address, channel='altadefinizionecommunity') config.setSetting('username', mailbox.address, channel='altadefinizionecommunity')
config.set_setting('password', randPsw, channel='altadefinizionecommunity') config.setSetting('password', randPsw, channel='altadefinizionecommunity')
platformtools.dialog_ok('AltadefinizioneCommunity', platformtools.dialogOk('AltadefinizioneCommunity',
'Registrato automaticamente con queste credenziali:\nemail:' + mailbox.address + '\npass: ' + randPsw) 'Registrato automaticamente con queste credenziali:\nemail:' + mailbox.address + '\npass: ' + randPsw)
else: else:
platformtools.dialog_ok('AltadefinizioneCommunity', 'Impossibile registrarsi automaticamente') platformtools.dialogOk('AltadefinizioneCommunity', 'Impossibile registrarsi automaticamente')
return False return False
else: else:
platformtools.dialog_ok('AltadefinizioneCommunity', 'Hai modificato la mail quindi KoD non sarà in grado di effettuare la verifica in autonomia, apri la casella ' + reg['email'] platformtools.dialogOk('AltadefinizioneCommunity', 'Hai modificato la mail quindi KoD non sarà in grado di effettuare la verifica in autonomia, apri la casella ' + reg['email']
+ ' e clicca sul link. Premi ok quando fatto') + ' e clicca sul link. Premi ok quando fatto')
logger.debug('Registrazione completata') logger.debug('Registrazione completata')
else: else:

6
channels/animealtadefinizione.json Executable file → Normal file
View File

@@ -1,11 +1,11 @@
{ {
"id": "animealtadefinizione", "id": "animealtadefinizione",
"name": "AnimealtAdefinizione", "name": "AnimealtaDefinizione",
"active": false, "active": true,
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"thumbnail": "animealtadefinizione.png", "thumbnail": "animealtadefinizione.png",
"banner": "animealtadefinizione.png", "banner": "animealtadefinizione.png",
"categories": ["anime", "sub-ita"], "categories": ["anime", "sub"],
"default_off": ["include_in_newest"], "default_off": ["include_in_newest"],
"settings": [ "settings": [
{ {

68
channels/animealtadefinizione.py Executable file → Normal file
View File

@@ -3,14 +3,16 @@
# Canale per animealtadefinizione # Canale per animealtadefinizione
# ---------------------------------------------------------- # ----------------------------------------------------------
from platformcode import platformtools
from core import support from core import support
from platformcode import logger
host = support.config.get_channel_url() host = support.config.get_channel_url()
headers = [['Referer', host]] headers = [['Referer', host]]
perpage_list = ['20','30','40','50','60','70','80','90','100'] perpage_list = ['20','30','40','50','60','70','80','90','100']
perpage = perpage_list[support.config.get_setting('perpage' , 'animealtadefinizione')] perpage = perpage_list[support.config.getSetting('perpage' , 'animealtadefinizione')]
epPatron = r'<td>\s*(?P<title>[^<]+)[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>\s*<img[^>]+/Streaming' epPatron = r'<td>\s*(?P<title>[^<]+)[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)"'
@support.menu @support.menu
@@ -19,91 +21,92 @@ def mainlist(item):
('Tipo',['', 'menu', 'Anime']), ('Tipo',['', 'menu', 'Anime']),
('Anno',['', 'menu', 'Anno']), ('Anno',['', 'menu', 'Anno']),
('Genere', ['', 'menu','Genere']), ('Genere', ['', 'menu','Genere']),
('Ultimi Episodi',['', 'peliculas', 'last'])] ('Ultimi Episodi',['', 'movies', 'last'])]
return locals() return locals()
@support.scrape @support.scrape
def menu(item): def menu(item):
action = 'peliculas' action = 'movies'
patronBlock= r'<a href="' + host + r'/category/' + item.args.lower() + r'/">' + item.args + r'</a>\s*<ul class="sub-menu">(?P<block>.*?)</ul>' patronBlock= r'<a href="' + host + r'/category/' + item.args.lower() + r'/">' + item.args + r'</a>\s*<ul class="sub-menu">(?P<block>.*?)</ul>'
patronMenu = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)<' patronMenu = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)<'
if 'genere' in item.args.lower():
patronGenreMenu = patronMenu
return locals() return locals()
def search(item, texto): def search(item, text):
support.info(texto) logger.debug(text)
item.search = texto item.search = text
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("%s" % line) logger.error("%s" % line)
return [] return []
def newest(categoria): def newest(category):
support.info(categoria) logger.debug(category)
item = support.Item() item = support.Item()
try: try:
if categoria == "anime": if category == "anime":
item.url = host item.url = host
item.args = "last" item.args = "last"
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("{0}".format(line)) logger.error("{0}".format(line))
return [] return []
@support.scrape @support.scrape
def peliculas(item): def movies(item):
if '/movie/' in item.url: if '/movie/' in item.url:
item.contentType = 'movie' item.contentType = 'movie'
action='findvideos' action='findvideos'
elif item.args == 'last': elif item.args == 'last':
item.contentType = 'episode' item.contentType = 'episode'
action='episodios' action='findvideos'
else: else:
item.contentType = 'tvshow' item.contentType = 'tvshow'
action='episodios' action='episodes'
if item.search: if item.search:
query = 's' query = 's'
searchtext = item.search searchtext = item.search
else: else:
query='category_name' query='category_name'
searchtext = item.url.split('/')[-2] searchtext = item.url.split('/')[-2]
if not item.pag: item.pag = 1
# debug = True page = 1 if not item.page else item.page
anime = True
data = support.match(host + '/wp-admin/admin-ajax.php', post='action=itajax-sort&loop=main+loop&location=&thumbnail=1&rating=1sorter=recent&columns=4&numarticles='+perpage+'&paginated='+str(item.pag)+'&currentquery%5B'+query+'%5D='+searchtext).data.replace('\\','') numerationEnabled = True
post = 'action=itajax-sort&loop=main+loop&location=&thumbnail=1&rating=1sorter=recent&columns=4&numarticles={}&paginated={}&currentquery%5B{}%5D={}'.format(perpage, page, query, searchtext)
res = support.match(host + '/wp-admin/admin-ajax.php', post=post, patron=r'"pages":(\d+)')
data= res.data.replace('\\','')
# item.total_pages = int(res.match)
patron = r'<a href="(?P<url>[^"]+)"><img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)" class="[^"]+" alt="" title="(?P<title>[^"]+?)\s+(?P<type>Movie)?\s*(?P<lang>Sub Ita|Ita)?\s*[sS]treaming' patron = r'<a href="(?P<url>[^"]+)"><img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)" class="[^"]+" alt="" title="(?P<title>[^"]+?)\s+(?P<type>Movie)?\s*(?P<lang>Sub Ita|Ita)?\s*[sS]treaming'
typeContentDict = {'movie':['movie']} typeContentDict = {'movie':['movie']}
typeActionDict = {'findvideos':['movie']} typeActionDict = {'findvideos':['movie']}
def itemHook(item):
item.url = support.re.sub('episodio-[0-9-]+', '', item.url)
return item
def itemlistHook(itemlist): def itemlistHook(itemlist):
if item.search: if item.search:
itemlist = [ it for it in itemlist if ' Episodio ' not in it.title ] itemlist = [ it for it in itemlist if ' Episodio ' not in it.title ]
if len(itemlist) == int(perpage): if len(itemlist) == int(perpage):
item.pag += 1 support.nextPage(itemlist, item, 'movies', page=page + 1, total_pages=int(res.match))
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), action='peliculas'))
return itemlist return itemlist
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodes(item):
anime = True numerationEnabled = True
# debug = True pagination = True
pagination = int(perpage)
patron = epPatron patron = epPatron
return locals() return locals()
@@ -113,10 +116,9 @@ def findvideos(item):
if item.contentType == 'movie': if item.contentType == 'movie':
matches = support.match(item, patron=epPatron).matches matches = support.match(item, patron=epPatron).matches
for title, url in matches: for title, url in matches:
# support.dbg()
get_video_list(item, url, title, itemlist) get_video_list(item, url, title, itemlist)
else: else:
get_video_list(item, item.url, support.config.get_localized_string(30137), itemlist) get_video_list(item, item.url, support.config.getLocalizedString(30137), itemlist)
return support.server(item, itemlist=itemlist) return support.server(item, itemlist=itemlist)

2
channels/animeforce.json Executable file → Normal file
View File

@@ -2,7 +2,7 @@
"id": "animeforce", "id": "animeforce",
"name": "AnimeForce", "name": "AnimeForce",
"language": ["ita"], "language": ["ita"],
"active": false, "active": true,
"thumbnail": "animeforce.png", "thumbnail": "animeforce.png",
"banner": "animeforce.png", "banner": "animeforce.png",
"categories": ["anime"], "categories": ["anime"],

167
channels/animeforce.py Executable file → Normal file
View File

@@ -3,7 +3,8 @@
# Canale per AnimeForce # Canale per AnimeForce
# ------------------------------------------------------------ # ------------------------------------------------------------
from core import support from core import scrapertools, support
from platformcode import logger
host = support.config.get_channel_url() host = support.config.get_channel_url()
headers = [['Referer', host]] headers = [['Referer', host]]
@@ -11,83 +12,85 @@ headers = [['Referer', host]]
@support.menu @support.menu
def mainlist(item): def mainlist(item):
anime = ['/anime', anime = ['/lista-anime/',
('In Corso',['/anime/anime-status/in-corso/', 'peliculas', 'status']), ('In Corso',['/anime/anime-status/in-corso/', 'movies', 'status']),
('Completi',['/anime/anime-status/completo/', 'peliculas', 'status']), ('Completi',['/anime/anime-status/completo/', 'movies', 'status']),
('Genere',['/anime', 'submenu', 'genre']), ('Genere',['/anime', 'submenu', 'genre']),
('Anno',['/anime', 'submenu', 'anime-year']), ('Anno',['/anime', 'submenu', 'anime-year']),
('Tipologia',['/anime', 'submenu', 'anime-type']), ('Tipologia',['/anime', 'submenu', 'anime-type']),
('Stagione',['/anime', 'submenu', 'anime-season']), ('Stagione',['/anime', 'submenu', 'anime-season']),
('Ultime Serie',['/category/anime/articoli-principali/','peliculas','last']) ('Ultime Serie',['/category/anime/articoli-principali/','movies','last'])
] ]
return locals() return locals()
@support.scrape @support.scrape
def submenu(item): def submenu(item):
action = 'peliculas' action = 'movies'
patronBlock = r'data-taxonomy="' + item.args + r'"(?P<block>.*?)</select' patronBlock = r'data-taxonomy="' + item.args + r'"(?P<block>.*?)</select'
patronMenu = r'<option class="level-\d+ (?P<url>[^"]+)"[^>]+>(?P<t>[^(]+)[^\(]+\((?P<num>\d+)' patronMenu = r'<option class="level-\d+ (?P<u>[^"]+)"[^>]+>(?P<title>[^(]+)[^\(]+\((?P<num>\d+)'
if 'genre' in item.args:
patronGenreMenu = patronMenu
def itemHook(item): def itemHook(item):
if not item.url.startswith('http'): item.url += host + '/anime/' + item.args + '/' + item.u
item.url = host + '/anime/' + item.args + '/' + item.url # item.title = support.typo(item.t, 'bold')
item.title = support.typo(item.t, 'bold')
return item return item
return locals() return locals()
def newest(categoria): def newest(category):
support.info(categoria) logger.debug(category)
itemlist = [] itemlist = []
item = support.Item() item = support.Item()
try: try:
if categoria == "anime": if category == "anime":
item.contentType = 'tvshow' item.contentType = 'tvshow'
item.url = host item.url = host
item.args = 'newest' item.args = 'newest'
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("{0}".format(line)) logger.error("{0}".format(line))
return [] return []
return itemlist return itemlist
def search(item, text): def search(item, text):
support.info('search',text) logger.debug(text)
item.search = text item.search = text
item.url = host + '/lista-anime/' item.url = host + '/lista-anime/'
item.contentType = 'tvshow' item.contentType = 'tvshow'
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("%s" % line) logger.error("%s" % line)
return [] return []
@support.scrape @support.scrape
def peliculas(item): def movies(item):
search = item.search search = item.search
anime = True numerationEnabled = True
action = 'check' if 'movie' in item.url:
action = 'findvideos'
else:
action = 'check'
patron = r'<a href="(?P<url>[^"]+)"[^>]+>\s*<img src="(?P<thumb>[^"]+)" alt="(?P<title>.*?)(?: Sub| sub| SUB|")' if not item.args:
pagination = True
if search: patron = r'<a\s*href="(?P<url>[^"]+)"\s*title="(?P<title>[^"]+)">'
patron = r'<a href="(?P<url>[^"]+)"\s*title="(?P<title>.*?)(?: Sub| sub| SUB|")' else:
patron = r'<a href="(?P<url>[^"]+)"[^>]+>\s*<img src="(?P<thumb>[^"]+)" alt="(?P<title>.*?)(?: Sub| sub| SUB|")'
if item.args == 'newest': item.action = 'findvideos' if item.args == 'newest': item.action = 'findvideos'
patronNext = '<li class="page-item disabled">(?:[^>]+>){4}<a class="page-link" href="([^"]+)'
def itemHook(item): def itemHook(item):
if 'sub-ita' in item.url: if 'sub-ita' in item.url:
if item.args != 'newest': item.title = item.title + support.typo('Sub-ITA','_ [] color kod')
item.contentLanguage = 'Sub-ITA' item.contentLanguage = 'Sub-ITA'
return item return item
@@ -95,68 +98,76 @@ def peliculas(item):
def check(item): def check(item):
m = support.match(item, headers=headers, patron=r'Tipologia[^>]+>\s*<a href="([^"]+)"') m = support.match(item, headers=headers, patron=r'Tipologia[^>]+><a href="([^"]+)"')
item.data = m.data item.data = m.data
if 'movie' in m.match: if 'movie' in m.match:
item.contentType = 'movie' item.contentType = 'movie'
return findvideos(item) return findvideos(item)
else: else:
return episodios(item) return episodes(item)
def episodes(item):
@support.scrape
def _episodes(item):
actLike = 'episodes'
disableAll = True
data = item.data
if '<h6>Streaming</h6>' in data:
patron = r'<td style[^>]+>\s*.*?(?:<span[^>]+)?<strong>(?P<episode>[^<]+)<\/strong>.*?<td style[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>'
else:
patron = r'<a\s*href="(?P<url>[^"]+)"[^>]+>(?P<episode>\d+)[<-](?P<episode2>\d+)?'
def itemHook(item):
if item.url.startswith('//'): item.url= 'https:' + item.url
elif item.url.startswith('/'): item.url= 'https:/' + item.url
return item
action = 'findvideos'
return locals()
itemlist = support.itemlistdb() if item.itemlist else []
groups = support.match(item.data, patron=[r'"tabpanel">.*?</div', r'Special-tab">.*?</div']).matches
for group in groups:
item.data = group
if 'Special' in group:
item.contentSeason = 0
itemlist.extend(_episodes(item))
from platformcode.autorenumber import start
start(itemlist, item)
itemlist = support.season_pagination(itemlist, item, function_level='episodes')
return itemlist
@support.scrape
def episodios(item):
anime = True
pagination = 50
data = item.data
if '<h6>Streaming</h6>' in data:
patron = r'<td style[^>]+>\s*.*?(?:<span[^>]+)?<strong>(?P<title>[^<]+)<\/strong>.*?<td style[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>(?P<episode>\d+)'
else:
patron = r'<a\s*href="(?P<url>[^"]+)"\s*title="(?P<title>[^"]+)"\s*class="btn btn-dark mb-1">(?P<episode>\d+)'
def itemHook(item):
support.info(item)
if item.url.startswith('//'): item.url= 'https:' + item.url
elif item.url.startswith('/'): item.url= 'https:/' + item.url
return item
action = 'findvideos'
return locals()
def findvideos(item): def findvideos(item):
support.info(item) logger.debug()
itemlist = [] itemlist = []
if item.data:
url = support.match(item.data, patron=r'<a\s*href="([^"]+)"\s*title="[^"]+"\s*class="btn btn-dark mb-1">').match if 'adf.ly' in item.url:
from servers.decrypters import adfly
url = adfly.get_long_url(item.url)
elif 'bit.ly' in item.url:
url = support.httptools.downloadpage(item.url, only_headers=True, follow_redirects=False).headers.get("location")
else: else:
url = item.url url = host
for u in item.url.split('/'):
if u and 'animeforce' not in u and 'http' not in u:
url += '/' + u
# if 'adf.ly' in item.url: if 'php?' in url:
# from servers.decrypters import adfly url = support.httptools.downloadpage(url, only_headers=True, follow_redirects=False).headers.get("location")
# url = adfly.get_long_url(item.url) url = support.match(url, patron=r'class="button"><a href=(?:")?([^" ]+)', headers=headers).match
else:
# elif 'bit.ly' in item.url: if item.data: url = item.data
# url = support.httptools.downloadpage(item.url, only_headers=True, follow_redirects=False).headers.get("location") url = support.match(url, patron=r'data-href="([^"]+)" target').match
if not url: url = support.match(url, patron=[r'<source src=(?:")?([^" ]+)',r'name="_wp_http_referer" value="([^"]+)"']).match
# else: if url.startswith('//'): url = 'https:' + url
# url = host elif url.startswith('/'): url = 'https:/' + url
# for u in item.url.split('/'): if 'vvvvid' in url: itemlist.append(item.clone(action="play", title='VVVVID', url=url, server='vvvvid'))
# if u and 'animeforce' not in u and 'http' not in u: else: itemlist.append(item.clone(action="play", title=support.config.getLocalizedString(30137), url=url, server='directo'))
# url += '/' + u
# if 'php?' in url:
# url = support.httptools.downloadpage(url, only_headers=True, follow_redirects=False).headers.get("location")
# url = support.match(url, patron=r'class="button"><a href=(?:")?([^" ]+)', headers=headers).match
# else:
# if item.data: url = item.data
# if item.contentType == 'movie': url = support.match()
# url = support.match(url, patron=r'data-href="([^"]+)" target').match
# if not url: url = support.match(url, patron=[r'<source src=(?:")?([^" ]+)',r'name="_wp_http_referer" value="([^"]+)"']).match
# if url.startswith('//'): url = 'https:' + url
# elif url.startswith('/'): url = 'https:/' + url
url = support.match(url, patron=r'data-href="([^"]+)" target').match
if 'vvvvid' in url: itemlist.append(item.clone(action="play", title='VVVVID', url=url, server='vvvvid'))
else: itemlist.append(item.clone(action="play", title=support.config.get_localized_string(30137), url=url, server='directo'))
return support.server(item, itemlist=itemlist) return support.server(item, itemlist=itemlist)

View File

@@ -0,0 +1,11 @@
{
"id": "animeleggendari",
"name": "AnimePerTutti",
"active": false,
"language": ["ita", "sub-ita"],
"thumbnail": "animepertutti.png",
"bannermenu": "animepertutti.png",
"categories": ["anime", "sub"],
"not_active":["include_in_newest_movie", "include_in_newest_tvshow", "include_in_newest_anime"],
"settings": []
}

142
channels/animeleggendari.py Normal file
View File

@@ -0,0 +1,142 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per animeleggendari
# ------------------------------------------------------------
from core import support
from platformcode import logger
from lib.js2py.host import jsfunctions
host = support.config.get_channel_url()
headers = [['User-Agent', 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'],
['Referer', host]]
@support.menu
def mainlist(item):
anime = [
# ('Leggendari', ['/category/anime-leggendari/', 'movies']),
('ITA', ['/category/anime-ita/', 'movies']),
('SUB-ITA', ['/category/anime-sub-ita/', 'movies']),
('Conclusi', ['/category/serie-anime-concluse/', 'movies']),
('in Corso', ['/category/serie-anime-in-corso/', 'movies']),
('Genere', ['', 'genres'])
]
return locals()
def search(item, text):
logger.debug(text)
item.url = host + "/?s=" + text
try:
return movies(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
logger.error("%s" % line)
return []
@support.scrape
def genres(item):
blacklist = ['Contattaci','Privacy Policy', 'DMCA']
patronMenu = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)<'
patronBlock = r'Generi</a>\s*<ul[^>]+>(?P<block>.*?)<\/ul>'
action = 'movies'
return locals()
@support.scrape
def movies(item):
numerationEnabled = True
blacklist = ['top 10 anime da vedere']
if item.url != host: patronBlock = r'<div id="main-content(?P<block>.*?)<aside'
patron = r'<figure class="(?:mh-carousel-thumb|mh-posts-grid-thumb)">\s*<a (?:class="[^"]+" )?href="(?P<url>[^"]+)" title="(?P<title>.*?)(?: \((?P<year>\d+)\))? (?:(?P<lang>SUB ITA|ITA))(?: (?P<title2>[Mm][Oo][Vv][Ii][Ee]))?[^"]*"><img (?:class="[^"]+"|width="[^"]+" height="[^"]+") src="(?P<thumb>[^"]+)"[^>]+'
def itemHook(item):
if 'movie' in item.title.lower():
item.title = support.re.sub(' - [Mm][Oo][Vv][Ii][Ee]|[Mm][Oo][Vv][Ii][Ee]','',item.title)
# item.title += support.typo('Movie','_ () bold')
item.contentType = 'movie'
item.action = 'findvideos'
return item
def itemlistHook(itemlist):
itlist = []
for item in itemlist:
if 'nuovo episodio:' not in item.title.lower():
itlist += [item]
return itlist
patronNext = r'<a class="next page-numbers" href="([^"]+)">'
action = 'episodes'
return locals()
@support.scrape
def episodes(item):
data = support.match(item, headers=headers, patronBlock=r'entry-content clearfix">(.*?)class="mh-widget mh-posts-2 widget_text').block
if not 'pagination clearfix' in data:
logger.debug('NOT IN DATA')
patron = r'<iframe.*?src="(?P<url>[^"]+)"'
title = item.title
def fullItemlistHook(itemlist):
if len(itemlist) > 0:
urls = []
for item in itemlist:
urls.append(item.url)
item = itemlist[0]
item.data = urls
item.title = title
item.contentType = 'movie'
itemlist = []
itemlist.append(item)
return itemlist
else:
url = item.url
numerationEnabled = True
patronBlock = r'(?:<p style="text-align: left;">|<div class="pagination clearfix">\s*)(?P<block>.*?)</span></a></div>'
patron = r'(?:<a href="(?P<url>[^"]+)"[^>]+>)?<span class="pagelink">(?P<episode>\d+)'
def itemHook(item):
if not item.url:
item.url = url
if 'Movie Parte' in data:
item.title = item.fulltitle + ' - Part ' + item.title
item.contentType = 'movie'
else:
item.title = 'Episodio ' + item.title
return item
return locals()
def check(item):
data = support.match(item, headers=headers).data
if 'Lista Episodi' not in data:
item.data = data
return findvideos(item)
data = ''
return data
def findvideos(item):
logger.debug()
if item.data:
data = item.data
else:
matches = support.match(item, patron=r'<iframe.*?src="(?P<url>[^"]+)"').matches
data = ''
if matches:
for match in matches:
try: data += str(jsfunctions.unescape(support.re.sub('@|g','%', match)))
except: data += ''
data += str(match)
else:
data = ''
return support.server(item,data)

0
channels/animesaturn.json Executable file → Normal file
View File

72
channels/animesaturn.py Executable file → Normal file
View File

@@ -4,23 +4,22 @@
# ---------------------------------------------------------- # ----------------------------------------------------------
from core import support from core import support
from platformcode import logger
host = support.config.get_channel_url() host = support.config.get_channel_url()
__channel__ = 'animesaturn' __channel__ = 'animesaturn'
cookie = support.config.get_setting('cookie', __channel__) cookie = support.config.getSetting('cookie', __channel__)
headers = {'X-Requested-With': 'XMLHttpRequest', 'Cookie': cookie} headers = {'X-Requested-With': 'XMLHttpRequest', 'Cookie': cookie}
def get_cookie(data): def get_cookie(data):
global cookie, headers global cookie, headers
cookie = support.match(data, patron=r'document.cookie="([^\s]+)').match cookie = support.match(data, patron=r'document.cookie="([^\s]+)').match
support.config.set_setting('cookie', cookie, __channel__) support.config.setSetting('cookie', cookie, __channel__)
headers = [['Cookie', cookie]] headers = [['Cookie', cookie]]
def get_data(item): def get_data(item):
# support.dbg()
# url = support.match(item.url, headers=headers, follow_redirects=True, only_headers=True).url
data = support.match(item.url, headers=headers, follow_redirects=True).data data = support.match(item.url, headers=headers, follow_redirects=True).data
if 'ASCookie' in data: if 'ASCookie' in data:
get_cookie(data) get_cookie(data)
@@ -35,40 +34,40 @@ def mainlist(item):
('ITA',['', 'submenu', '/filter?language%5B0%5D=1']), ('ITA',['', 'submenu', '/filter?language%5B0%5D=1']),
('SUB-ITA',['', 'submenu', '/filter?language%5B0%5D=0']), ('SUB-ITA',['', 'submenu', '/filter?language%5B0%5D=0']),
('Più Votati',['/toplist','menu', 'top']), ('Più Votati',['/toplist','menu', 'top']),
('In Corso',['/animeincorso','peliculas','incorso']), ('In Corso',['/animeincorso','movies','incorso']),
('Ultimi Episodi',['/fetch_pages.php?request=episodes&d=1','peliculas','updated'])] ('Ultimi Episodi',['/fetch_pages.php?request=episodes&d=1','movies','updated'])]
return locals() return locals()
def search(item, texto): def search(item, text):
support.info(texto) logger.debug(text)
item.url = host + '/animelist?search=' + texto item.url = host + '/animelist?search=' + text
item.contentType = 'tvshow' item.contentType = 'tvshow'
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("%s" % line) logger.error("%s" % line)
return [] return []
def newest(categoria): def newest(category):
support.info() logger.debug(category)
itemlist = [] itemlist = []
item = support.Item() item = support.Item()
try: try:
if categoria == "anime": if category == "anime":
item.url = host + '/fetch_pages.php?request=episodes&d=1' item.url = host + '/fetch_pages.php?request=episodes&d=1'
item.args = "updated" item.args = "updated"
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("{0}".format(line)) logger.error("{0}".format(line))
return [] return []
return itemlist return itemlist
@@ -80,7 +79,7 @@ def submenu(item):
action = 'filter' action = 'filter'
patronMenu = r'<h5 class="[^"]+">(?P<title>[^<]+)[^>]+>[^>]+>\s*<select id="(?P<parameter>[^"]+)"[^>]+>(?P<data>.*?)</select>' patronMenu = r'<h5 class="[^"]+">(?P<title>[^<]+)[^>]+>[^>]+>\s*<select id="(?P<parameter>[^"]+)"[^>]+>(?P<data>.*?)</select>'
def itemlistHook(itemlist): def itemlistHook(itemlist):
itemlist.insert(0, item.clone(title=support.typo('Tutti','bold'), url=item.url + item.args, action='peliculas')) itemlist.insert(0, item.clone(title=support.typo('Tutti','bold'), url=item.url + item.args, action='movies'))
return itemlist[:-1] return itemlist[:-1]
return locals() return locals()
@@ -89,15 +88,15 @@ def filter(item):
itemlist = [] itemlist = []
matches = support.match(item.data if item.data else item.url, patron=r'<option value="(?P<value>[^"]+)"[^>]*>(?P<title>[^<]+)').matches matches = support.match(item.data if item.data else item.url, patron=r'<option value="(?P<value>[^"]+)"[^>]*>(?P<title>[^<]+)').matches
for value, title in matches: for value, title in matches:
itemlist.append(item.clone(title= support.typo(title,'bold'), url='{}{}&{}%5B0%5D={}'.format(host, item.args, item.parameter, value), action='peliculas', args='filter')) itemlist.append(item.clone(title= support.typo(title,'bold'), url='{}{}&{}%5B0%5D={}'.format(host, item.args, item.parameter, value), action='movies', args='filter'))
support.thumb(itemlist, genre=True) support.thumb(itemlist, mode='genre')
return itemlist return itemlist
@support.scrape @support.scrape
def menu(item): def menu(item):
patronMenu = r'<div class="col-md-13 bg-dark-as-box-shadow p-2 text-white text-center">(?P<title>[^"<]+)<(?P<other>.*?)(?:"lista-top"|"clearfix")' patronMenu = r'<div class="col-md-13 bg-dark-as-box-shadow p-2 text-white text-center">(?P<title>[^"<]+)<(?P<other>.*?)(?:"lista-top"|"clearfix")'
action = 'peliculas' action = 'movies'
item.args = 'top' item.args = 'top'
def itemHook(item2): def itemHook(item2):
item2.url = item.url item2.url = item.url
@@ -107,8 +106,8 @@ def menu(item):
@support.scrape @support.scrape
def peliculas(item): def movies(item):
anime = True numerationEnabled = True
deflang= 'Sub-ITA' deflang= 'Sub-ITA'
action = 'check' action = 'check'
@@ -130,7 +129,7 @@ def peliculas(item):
action = 'findvideos' action = 'findvideos'
def itemlistHook(itemlist): def itemlistHook(itemlist):
if page: if page:
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'),page= page, thumbnail=support.thumb())) itemlist.append(item.clone(title=support.typo(support.config.getLocalizedString(30992), 'color kod bold'),page= page, thumbnail=support.thumb()))
return itemlist return itemlist
elif 'filter' in item.args: elif 'filter' in item.args:
page = support.match(data, patron=r'totalPages:\s*(\d+)').match page = support.match(data, patron=r'totalPages:\s*(\d+)').match
@@ -139,11 +138,11 @@ def peliculas(item):
if item.nextpage: item.nextpage += 1 if item.nextpage: item.nextpage += 1
else: item.nextpage = 2 else: item.nextpage = 2
if page and item.nextpage < int(page): if page and item.nextpage < int(page):
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), url= '{}&page={}'.format(item.url, item.nextpage), infoLabels={}, thumbnail=support.thumb())) itemlist.append(item.clone(title=support.typo(support.config.getLocalizedString(30992), 'color kod bold'), url= '{}&page={}'.format(item.url, item.nextpage), infoLabels={}, thumbnail=support.thumb()))
return itemlist return itemlist
else: else:
# pagination = '' pagination = True
if item.args == 'incorso': if item.args == 'incorso':
patron = r'<a href="(?P<url>[^"]+)"[^>]+>(?P<title>[^<(]+)(?:\s*\((?P<year>\d+)\))?(?:\s*\((?P<lang>[A-za-z-]+)\))?</a>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*<img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]+)<' patron = r'<a href="(?P<url>[^"]+)"[^>]+>(?P<title>[^<(]+)(?:\s*\((?P<year>\d+)\))?(?:\s*\((?P<lang>[A-za-z-]+)\))?</a>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*<img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]+)<'
else: else:
@@ -156,27 +155,26 @@ def peliculas(item):
def check(item): def check(item):
movie = support.match(item, patron=r'Episodi:</b> (\d*) Movie') movie = support.match(item, patron=r'Episodi:</b> (\d*) Movie')
if movie.match: if movie.match:
episodes = episodios(item) episodes = episodes(item)
if len(episodes) > 0: if len(episodes) > 0:
it = episodes[0].clone(contentType = 'movie', contentTitle=item.fulltitle, contentSerieName='') it = episodes[0].clone(contentType = 'movie', contentTitle=item.fulltitle, contentSerieName='')
return findvideos(it) return findvideos(it)
else: else:
item.contentType = 'tvshow' item.contentType = 'tvshow'
return episodios(item) return episodes(item)
@support.scrape @support.scrape
def episodios(item): def episodes(item):
if item.contentType != 'movie': anime = True if item.contentType != 'movie': numerationEnabled = True
patron = r'episodi-link-button">\s*<a href="(?P<url>[^"]+)"[^>]+>\s*(?P<title>[^\d<]+(?P<episode>\d+))\s*</a>' patron = r'episodi-link-button">\s*<a href="(?P<url>[^"]+)"[^>]+>\s*(?P<title>[^<]+)</a>'
return locals() return locals()
def findvideos(item): def findvideos(item):
support.info() logger.debug()
itemlist = [] itemlist = []
links = [] links = []
main_url = support.match(item, patron=r'<a href="([^"]+)">[^>]+>[^>]+>G').match main_url = support.match(item, patron=r'<a href="([^"]+)">[^>]+>[^>]+>G').match
urls = support.match(support.match(main_url, headers=headers).data, patron=r'<a class="dropdown-item"\s*href="([^"]+)', headers=headers).matches urls = support.match(support.match(main_url, headers=headers).data, patron=r'<a class="dropdown-item"\s*href="([^"]+)', headers=headers).matches
itemlist.append(item.clone(action="play", title='Primario', url=main_url, server='directo')) itemlist.append(item.clone(action="play", title='Primario', url=main_url, server='directo'))
@@ -187,8 +185,16 @@ def findvideos(item):
links.append(link) links.append(link)
return support.server(item, data=links, itemlist=itemlist) return support.server(item, data=links, itemlist=itemlist)
def play(item): def play(item):
if item.server == 'directo': if item.server == 'directo':
item.url = support.match(item.url, patron=r'(?:source type="[^"]+"\s*src=|file:[^"]+)"([^"]+)').match item.url = support.match(item.url, patron=r'(?:source type="[^"]+"\s*src=|file:[^"]+)"([^"]+)').match
return[item] return[item]

0
channels/animeunity.json Executable file → Normal file
View File

512
channels/animeunity.py Executable file → Normal file
View File

@@ -1,268 +1,244 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# ------------------------------------------------------------ # ------------------------------------------------------------
# Canale per AnimeUnity # Canale per AnimeUnity
# ------------------------------------------------------------ # ------------------------------------------------------------
import cloudscraper, json, copy, inspect import cloudscraper, json, copy, inspect
from core import jsontools, support, httptools, scrapertools from core import jsontools, support, config
from platformcode import autorenumber from core.httptools import downloadpage
from platformcode import autorenumber, logger
# support.dbg()
host = support.config.get_channel_url() session = cloudscraper.create_scraper()
response = httptools.downloadpage(host + '/archivio')
csrf_token = support.match(response.data, patron='name="csrf-token" content="([^"]+)"').match host = support.config.get_channel_url()
headers = {'content-type': 'application/json;charset=UTF-8', response = session.get(host + '/archivio')
'x-csrf-token': csrf_token, csrf_token = support.match(response.text, patron='name="csrf-token" content="([^"]+)"').match
'Cookie' : '; '.join([x.name + '=' + x.value for x in response.cookies])} headers = {'content-type': 'application/json;charset=UTF-8',
'Referer': host,
'x-csrf-token': csrf_token,
@support.menu 'Cookie' : '; '.join([x.name + '=' + x.value for x in response.cookies])}
def mainlist(item):
top = [('Ultimi Episodi', ['', 'news'])] @support.menu
def mainlist(item):
menu = [('Anime {bullet bold}',['', 'menu', {}, 'tvshow']), top = [('Ultimi Episodi', ['', 'news'])]
('Film {submenu}',['', 'menu', {'type': 'Movie'}]),
('TV {submenu}',['', 'menu', {'type': 'TV'}, 'tvshow']), menu = [('Anime {bullet bold}',['', 'menu', {}, 'tvshow']),
('OVA {submenu} {tv}',['', 'menu', {'type': 'OVA'}, 'tvshow']), ('Film {submenu}',['', 'menu', {'type': 'Movie'}]),
('ONA {submenu} {tv}',['', 'menu', {'type': 'ONA'}, 'tvshow']), ('TV {submenu}',['', 'menu', {'type': 'TV'}, 'tvshow']),
('Special {submenu} {tv}',['', 'menu', {'type': 'Special'}, 'tvshow'])] ('OVA {submenu} {tv}',['', 'menu', {'type': 'OVA'}, 'tvshow']),
search ='' ('ONA {submenu} {tv}',['', 'menu', {'type': 'ONA'}, 'tvshow']),
return locals() ('Special {submenu} {tv}',['', 'menu', {'type': 'Special'}, 'tvshow'])]
search =''
def menu(item): return locals()
item.action = 'peliculas'
ITA = copy.copy(item.args)
ITA['title'] = '(ita)' def menu(item):
InCorso = copy.copy(item.args) item.action = 'movies'
InCorso['status'] = 'In Corso' ITA = copy.copy(item.args)
Terminato = copy.copy(item.args) ITA['title'] = '(ita)'
Terminato['status'] = 'Terminato' InCorso = copy.copy(item.args)
itemlist = [item.clone(title=support.typo('Tutti','bold')), InCorso['status'] = 'In Corso'
item.clone(title=support.typo('ITA','bold'), args=ITA), Terminato = copy.copy(item.args)
item.clone(title=support.typo('Genere','bold'), action='genres'), Terminato['status'] = 'Terminato'
item.clone(title=support.typo('Anno','bold'), action='years')] itemlist = [item.clone(title=support.typo('Tutti','bold')),
if item.contentType == 'tvshow': item.clone(title='ITA', args=ITA),
itemlist += [item.clone(title=support.typo('In Corso','bold'), args=InCorso), item.clone(title='Genere', action='genres'),
item.clone(title=support.typo('Terminato','bold'), args=Terminato)] item.clone(title='Anno', action='years')]
itemlist +=[item.clone(title=support.typo('Cerca...','bold'), action='search', thumbnail=support.thumb('search'))] if item.contentType == 'tvshow':
return itemlist itemlist += [item.clone(title='In Corso', args=InCorso),
item.clone(title='Terminato', args=Terminato)]
itemlist +=[item.clone(title=support.typo(config.getLocalizedString(70741).replace(' %s', ''),'bold'), action='search', thumbnail=support.thumb('search'))]
def genres(item): return itemlist
support.info()
# support.dbg()
itemlist = [] def genres(item):
logger.debug()
genres = json.loads(support.match(response.data, patron='genres="([^"]+)').match.replace('&quot;','"')) itemlist = []
for genre in genres: genres = json.loads(support.match(response.text, patron='genres="([^"]+)').match.replace('&quot;','"'))
item.args['genres'] = [genre]
itemlist.append(item.clone(title=support.typo(genre['name'],'bold'), action='peliculas')) for genre in genres:
return support.thumb(itemlist) item.args['genres'] = [genre]
itemlist.append(item.clone(title=genre['name'], action='movies'))
def years(item): return support.thumb(itemlist)
support.info()
itemlist = [] def years(item):
logger.debug()
from datetime import datetime itemlist = []
next_year = datetime.today().year + 1
oldest_year = int(support.match(response.data, patron='anime_oldest_date="([^"]+)').match) from datetime import datetime
current_year = datetime.today().year
for year in list(reversed(range(oldest_year, next_year + 1))): oldest_year = int(support.match(response.text, patron='anime_oldest_date="([^"]+)').match)
item.args['year']=year
itemlist.append(item.clone(title=support.typo(year,'bold'), action='peliculas')) for year in list(reversed(range(oldest_year, current_year + 1))):
return itemlist item.args['year']=year
itemlist.append(item.clone(title=year, action='movies'))
return itemlist
def search(item, text):
support.info('search', item)
if not item.args: def search(item, text):
item.args = {'title':text} logger.debug(text)
else: if not item.args:
item.args['title'] = text item.args = {'title':text}
item.search = text else:
item.args['title'] = text
try: item.search = text
return peliculas(item)
# Continua la ricerca in caso di errore try:
except: return movies(item)
import sys # Continua la ricerca in caso di errore
for line in sys.exc_info(): except:
support.info('search log:', line) import sys
return [] for line in sys.exc_info():
logger.debug('search log:', line)
return []
def newest(categoria):
support.info(categoria)
itemlist = [] def newest(category):
item = support.Item() logger.debug(category)
item.url = host itemlist = []
item = support.Item()
try: item.url = host
itemlist = news(item)
try:
if itemlist[-1].action == 'news': itemlist = news(item)
itemlist.pop()
# Continua la ricerca in caso di errore if itemlist[-1].action == 'news':
except: itemlist.pop()
import sys # Continua la ricerca in caso di errore
for line in sys.exc_info(): except:
support.info(line) import sys
return [] for line in sys.exc_info():
logger.debug(line)
return itemlist return []
def news(item): return itemlist
support.info()
item.contentType = 'episode' def news(item):
itemlist = [] logger.debug()
item.contentType = 'episode'
fullJs = json.loads(support.match(httptools.downloadpage(item.url).data, headers=headers, patron=r'items-json="([^"]+)"').match.replace('&quot;','"')) itemlist = []
js = fullJs['data'] import cloudscraper
session = cloudscraper.create_scraper()
for it in js:
if it.get('anime', {}).get('title') or it.get('anime', {}).get('title_eng'): fullJs = json.loads(support.match(session.get(item.url).text, headers=headers, patron=r'items-json="([^"]+)"').match.replace('&quot;','"'))
title_name = it['anime']['title'] if it.get('anime', {}).get('title') else it['anime']['title_eng'] # logger.debug(jsontools.dump(fullJs))
pattern = r'[sS](?P<season>\d+)[eE](?P<episode>\d+)' js = fullJs['data']
match = scrapertools.find_single_match(it['file_name'], pattern)
full_episode = '' for it in js:
if match: itemlist.append(
season, episode = match item.clone(title=it['anime']['title'],
full_episode = ' - S' + season + ' E' + episode contentTitle = it['anime']['title'],
else: contentEpisodeNumber = int(it['number']),
pattern = r'[._\s]Ep[._\s]*(?P<episode>\d+)' fulltitle=it['anime']['title'],
episode = scrapertools.find_single_match(it['file_name'], pattern) thumbnail=it['anime']['imageurl'],
if episode: forcethumb = True,
full_episode = ' - E' + episode videoUrl=it['scws_id'],
itemlist.append( plot=it['anime']['plot'],
item.clone(title = support.typo(title_name + full_episode, 'bold'), action='findvideos')
fulltitle = it['anime']['title'], )
thumbnail = it['anime']['imageurl'], if fullJs.get('next_page_url'):
forcethumb = True, support.nextPage(itemlist, item, 'news', next_page=fullJs['next_page_url'], total_pages=int(fullJs['last_page_url'].split('=')[-1]))
scws_id = it.get('scws_id', ''), return itemlist
url = '{}/anime/{}-{}'.format(item.url, it['anime']['id'],it['anime']['slug']),
plot = it['anime']['plot'],
action = 'findvideos') def movies(item):
) logger.debug()
if 'next_page_url' in fullJs: itemlist = []
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'),thumbnail=support.thumb(), url=fullJs['next_page_url']))
return itemlist page = item.page if item.page else 0
item.args['offset'] = page * 30
def peliculas(item): order = support.config.getSetting('order', item.channel)
support.info() if order:
itemlist = [] order_list = [ "Standard", "Lista A-Z", "Lista Z-A", "Popolarità", "Valutazione" ]
item.args['order'] = order_list[order]
page = item.page if item.page else 0
item.args['offset'] = page * 30 payload = json.dumps(item.args)
js = session.post(host + '/archivio/get-animes', headers=headers, data=payload).json()
order = support.config.get_setting('order', item.channel) records = js['records']
if order: total_pages = int(js['tot'] / 30)
order_list = [ "Standard", "Lista A-Z", "Lista Z-A", "Popolarità", "Valutazione" ]
item.args['order'] = order_list[order] for it in records:
logger.debug(jsontools.dump(it))
payload = json.dumps(item.args) lang = support.match(it['title'], patron=r'\(([It][Tt][Aa])\)').match
records = httptools.downloadpage(host + '/archivio/get-animes', headers=headers, post=payload).json['records'] title = support.re.sub(r'\s*\([^\)]+\)', '', it['title'])
# support.dbg()
if 'ita' in lang.lower(): language = 'ITA'
for it in records: else: language = 'Sub-ITA'
if not it['title']:
it['title'] = '' itm = item.clone(title=title,
lang = support.match(it['title'], patron=r'\(([It][Tt][Aa])\)').match contentLanguage = language,
title = support.re.sub(r'\s*\([^\)]+\)', '', it['title']) type = it['type'],
thumbnail = it['imageurl'],
if 'ita' in lang.lower(): language = 'ITA' plot = it['plot'],
else: language = 'Sub-ITA' url = '{}/{}-{}'.format(item.url, it['id'], it['slug'])
)
if title: # itm.contentLanguage = language
itm = item.clone(title=support.typo(title,'bold') + support.typo(language,'_ [] color kod') + (support.typo(it['title_eng'],'_ ()') if it['title_eng'] else '')) # itm.type = it['type']
else: # itm.thumbnail = it['imageurl']
itm = item.clone(title=support.typo(it['title_eng'],'bold') + support.typo(language,'_ [] color kod')) # itm.plot = it['plot']
itm.contentLanguage = language # itm.url = item.url
itm.type = it['type']
itm.thumbnail = it['imageurl'] if it['episodes_count'] == 1:
itm.plot = it['plot'] itm.contentType = 'movie'
itm.url = '{}/anime/{}-{}'.format(item.url, it.get('id'), it.get('slug')) itm.fulltitle = itm.show = itm.contentTitle = title
itm.contentSerieName = ''
if it['episodes_count'] == 1: itm.action = 'play'
itm.contentType = 'movie' item.forcethumb=True
itm.fulltitle = itm.show = itm.contentTitle = title itm.videoUrl = it['episodes'][0]['scws_id']
itm.contentSerieName = ''
itm.action = 'findvideos' else:
itm.scws_id = it['episodes'][0].get('scws_id', '') itm.contentType = 'tvshow'
# itm.video_url = it['episodes'][0].get('link', '') itm.contentTitle = ''
itm.fulltitle = itm.show = itm.contentSerieName = title
else: itm.action = 'episodes'
itm.contentType = 'tvshow' itm.episodes = it['episodes'] if 'episodes' in it else it['scws_id']
itm.contentTitle = '' # itm.videoUrl = item.url
itm.fulltitle = itm.show = itm.contentSerieName = title
itm.action = 'episodios' itemlist.append(itm)
itm.episodes = it['episodes'] if 'episodes' in it else it.get('scws_id', '')
autorenumber.start(itemlist)
itemlist.append(itm) if len(itemlist) == 30:
support.nextPage(itemlist, item, 'movies', page=page + 1, total_pages=total_pages)
autorenumber.start(itemlist)
if len(itemlist) >= 30: return itemlist
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), thumbnail=support.thumb(), page=page + 1))
def episodes(item):
return itemlist logger.debug()
itemlist = []
def episodios(item): # title = 'Parte ' if item.type.lower() == 'movie' else 'Episodio '
support.info() for it in item.episodes:
itemlist = []
title = 'Parte' if item.type.lower() == 'movie' else 'Episodio' episode2 = it['number'].split('.')[-1]
for it in item.episodes: episode = it['number'].split('.')[0]
itemlist.append( itemlist.append(
item.clone(title=support.typo('{}. {} {}'.format(it['number'], title, it['number']), 'bold'), item.clone(episodes = [],
episode = it['number'], contentEpisodeNumber=int(float(it['number'])),
fulltitle=item.title, episodeExtra = '.' + it['number'].split('.')[-1] if '.' in it['number'] else '',
show=item.title, action='play',
contentTitle='', contentType='episode',
contentSerieName=item.contentSerieName, forcethumb=True,
thumbnail=item.thumbnail, videoUrl=it['scws_id']))
plot=item.plot,
action='findvideos', if inspect.stack()[1][3] not in ['find_episodes']:
contentType='episode', autorenumber.start(itemlist, item)
url = '{}/{}'.format(item.url, it['id']) support.videolibrary(itemlist, item)
) support.download(itemlist, item)
# video_url=it.get('link', '')) return itemlist
)
if inspect.stack(0)[1][3] not in ['find_episodes']: def play(item):
autorenumber.start(itemlist, item) from time import time
support.videolibrary(itemlist, item) from base64 import b64encode
support.download(itemlist, item) from hashlib import md5
return itemlist
# Calculate Token
client_ip = support.httptools.downloadpage('https://scws.xyz/videos/{}'.format(item.videoUrl), headers=headers).json.get('client_ip')
def findvideos(item): expires = int(time() + 172800)
# if item.scws_id: token = b64encode(md5('{}{} Yc8U6r8KjAKAepEA'.format(expires, client_ip).encode('utf-8')).digest()).decode('utf-8').replace('=', '').replace('+', '-').replace('/', '_')
# from time import time
# from base64 import b64encode url = 'https://scws.xyz/master/{}?token={}&expires={}&n=1'.format(item.videoUrl, token, expires)
# from hashlib import md5
# return [item.clone(server='directo', url=url, manifest='hls')]
# client_ip = support.httptools.downloadpage('http://ip-api.com/json/').json.get('query')
#
# expires = int(time() + 172800)
# token = b64encode(md5('{}{} Yc8U6r8KjAKAepEA'.format(expires, client_ip).encode('utf-8')).digest()).decode('utf-8').replace('=', '').replace('+', '-').replace('/', '_')
#
# url = 'https://scws.work/master/{}?token={}&expires={}&n=1'.format(item.scws_id, token, expires)
#
# itemlist = [item.clone(title=support.config.get_localized_string(30137), url=url, server='directo', action='play')]
from core import channeltools
itemlist = [item.clone(title=channeltools.get_channel_parameters(item.channel)['title'],
url=item.url, server='streamingcommunityws')]
return support.server(item, itemlist=itemlist, referer=False)
# return support.server(item, itemlist=itemlist)
#
# def play(item):
# urls = list()
# info = support.match(item.url, patron=r'(http.*?rendition=(\d+)[^\s]+)').matches
#
# if info:
# for url, res in info:
# urls.append(['hls [{}]'.format(res), url])
# return urls

6
channels/animeuniverse.json Executable file → Normal file
View File

@@ -1,11 +1,11 @@
{ {
"id": "animeuniverse", "id": "animeuniverse",
"name": "AnimeHDitalia", "name": "AnimeUniverse",
"active": false, "active": true,
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"thumbnail": "animeuniverse.png", "thumbnail": "animeuniverse.png",
"banner": "animeuniverse.png", "banner": "animeuniverse.png",
"categories": ["anime", "sub-ita"], "categories": ["anime", "sub"],
"default_off": ["include_in_newest"], "default_off": ["include_in_newest"],
"settings": [ "settings": [
{ {

50
channels/animeuniverse.py Executable file → Normal file
View File

@@ -4,13 +4,14 @@
# ---------------------------------------------------------- # ----------------------------------------------------------
from core import support from core import support
from platformcode import logger
host = support.config.get_channel_url() host = support.config.get_channel_url()
headers = {} headers = {}
perpage_list = ['20','30','40','50','60','70','80','90','100'] perpage_list = ['20','30','40','50','60','70','80','90','100']
perpage = perpage_list[support.config.get_setting('perpage' , 'animeuniverse')] perpage = perpage_list[support.config.getSetting('perpage' , 'animeuniverse')]
epPatron = r'<td>\s*(?P<title>[^<]+)[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>\s*<img [^>]+Streaming' epPatron = r'<td>\s*(?P<title>[^ <]+)\s*(?P<episode>\d+)?[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)"'
@support.menu @support.menu
@@ -19,50 +20,52 @@ def mainlist(item):
('Tipo',['', 'menu', 'Anime']), ('Tipo',['', 'menu', 'Anime']),
('Anno',['', 'menu', 'Anno']), ('Anno',['', 'menu', 'Anno']),
('Genere', ['', 'menu','Genere']), ('Genere', ['', 'menu','Genere']),
('Ultimi Episodi',['/2/', 'peliculas', 'last']), ('Ultimi Episodi',['/2/', 'movies', 'last']),
('Hentai', ['/hentai/', 'peliculas'])] ('Hentai', ['/hentai/', 'movies'])]
return locals() return locals()
@support.scrape @support.scrape
def menu(item): def menu(item):
action = 'peliculas' action = 'movies'
patronBlock = item.args + r'</a>\s*<ul class="sub-menu">(?P<block>.*?)</ul>' patronBlock = item.args + r'</a>\s*<ul class="sub-menu">(?P<block>.*?)</ul>'
patronMenu = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)<' patronMenu = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)<'
if 'genere' in item.args.lower():
patronGenreMenu = patronMenu
return locals() return locals()
def search(item, texto): def search(item, text):
support.info(texto) logger.debug(text)
item.search = texto item.search = text
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("%s" % line) logger.error("%s" % line)
return [] return []
def newest(categoria): def newest(category):
support.info(categoria) logger.debug(category)
item = support.Item() item = support.Item()
try: try:
if categoria == "anime": if category == "anime":
item.url = host item.url = host
item.args = "last" item.args = "last"
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("{0}".format(line)) logger.error("{0}".format(line))
return [] return []
@support.scrape @support.scrape
def peliculas(item): def movies(item):
query = '' query = ''
if '/mos/' in item.url: if '/mos/' in item.url:
item.contentType = 'movie' item.contentType = 'movie'
@@ -74,7 +77,7 @@ def peliculas(item):
action='findvideos' action='findvideos'
else: else:
item.contentType = 'tvshow' item.contentType = 'tvshow'
action='episodios' action='episodes'
if item.search: if item.search:
query = 's' query = 's'
searchtext = item.search searchtext = item.search
@@ -83,7 +86,7 @@ def peliculas(item):
searchtext = item.url.split('/')[-2] if item.url != host else '' searchtext = item.url.split('/')[-2] if item.url != host else ''
if not item.pag: item.pag = 1 if not item.pag: item.pag = 1
anime=True numerationEnabled = False
# blacklist=['Altri Hentai'] # blacklist=['Altri Hentai']
data = support.match(host + '/wp-content/themes/animeuniverse/functions/ajax.php', post='sorter=recent&location=&loop=main+loop&action=sort&numarticles='+perpage+'&paginated='+str(item.pag)+'&currentquery%5B'+query+'%5D='+searchtext+'&thumbnail=1').data.replace('\\','') data = support.match(host + '/wp-content/themes/animeuniverse/functions/ajax.php', post='sorter=recent&location=&loop=main+loop&action=sort&numarticles='+perpage+'&paginated='+str(item.pag)+'&currentquery%5B'+query+'%5D='+searchtext+'&thumbnail=1').data.replace('\\','')
patron=r'<a href="(?P<url>[^"]+)"><img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)" class="[^"]+" alt="" title="(?P<title>.*?)\s*(?P<lang>Sub ITA|ITA)?(?:"| \[)' patron=r'<a href="(?P<url>[^"]+)"><img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)" class="[^"]+" alt="" title="(?P<title>.*?)\s*(?P<lang>Sub ITA|ITA)?(?:"| \[)'
@@ -91,7 +94,7 @@ def peliculas(item):
def itemlistHook(itemlist): def itemlistHook(itemlist):
if len(itemlist) == int(perpage): if len(itemlist) == int(perpage):
item.pag += 1 item.pag += 1
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), action='peliculas')) itemlist.append(item.clone(title=support.typo(support.config.getLocalizedString(30992), 'color kod bold'), action='movies'))
return itemlist return itemlist
return locals() return locals()
@@ -99,11 +102,10 @@ def peliculas(item):
@support.scrape @support.scrape
def episodios(item): def episodes(item):
anime = True numerationEnabled = True
pagination = int(perpage) pagination = True
patron = epPatron patron = epPatron
# debug = True
return locals() return locals()
@@ -114,7 +116,7 @@ def findvideos(item):
for title, url in matches: for title, url in matches:
get_video_list(url, title, itemlist) get_video_list(url, title, itemlist)
else: else:
get_video_list(item.url, support.config.get_localized_string(30137), itemlist) get_video_list(item.url, support.config.getLocalizedString(30137), itemlist)
return support.server(item, itemlist=itemlist) return support.server(item, itemlist=itemlist)

11
channels/animeworld.json Executable file → Normal file
View File

@@ -5,17 +5,8 @@
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"thumbnail": "animeworld.png", "thumbnail": "animeworld.png",
"banner": "animeworld.png", "banner": "animeworld.png",
"categories": ["anime", "vos"], "categories": ["anime", "sub"],
"settings": [ "settings": [
{
"id": "lang",
"type": "list",
"label": "Lingua di Ricerca",
"default": 0,
"enabled": true,
"visible": true,
"lvalues": [ "Tutte", "Ita", "Sub-Ita"]
},
{ {
"id": "order", "id": "order",
"type": "list", "type": "list",

116
channels/animeworld.py Executable file → Normal file
View File

@@ -4,55 +4,56 @@
# thanks to fatshotty # thanks to fatshotty
# ---------------------------------------------------------- # ----------------------------------------------------------
from core import httptools, support, config, jsontools from core import httptools, support, jsontools
from platformcode import logger
host = support.config.get_channel_url() host = support.config.get_channel_url()
__channel__ = 'animeworld' __channel__ = 'animeworld'
cookie = support.config.get_setting('cookie', __channel__) cookie = support.config.getSetting('cookie', __channel__)
headers = [['Cookie', cookie]] headers = [['Cookie', cookie]]
def get_cookie(data): def get_cookie(data):
global cookie, headers global cookie, headers
cookie = support.match(data, patron=r'document.cookie="([^\s]+)').match cookie = support.match(data, patron=r'document.cookie="([^\s]+)').match
support.config.set_setting('cookie', cookie, __channel__) support.config.setSetting('cookie', cookie, __channel__)
headers = [['Cookie', cookie]] headers = [['Cookie', cookie]]
def get_data(item): def get_data(item):
# support.dbg() data = ''
url = httptools.downloadpage(item.url, headers=headers, follow_redirects=True, only_headers=True).url if item.url:
data = support.match(url, headers=headers, follow_redirects=True).data url = httptools.downloadpage(item.url, headers=headers, follow_redirects=True, only_headers=True).url
if 'SecurityAW' in data: data = support.match(url, headers=headers, follow_redirects=True).data
get_cookie(data) if 'AWCookieVerify' in data:
data = get_data(item) get_cookie(data)
data = get_data(item)
return data return data
def order(): def order():
# Seleziona l'ordinamento dei risultati # Seleziona l'ordinamento dei risultati
return str(support.config.get_setting("order", __channel__)) return str(support.config.getSetting("order", __channel__))
@support.menu @support.menu
def mainlist(item): def mainlist(item):
anime=['/filter?sort=', anime=['/filter?sort=',
('ITA',['/filter?dub=1&sort=', 'menu', 'dub=1']), ('ITA',['/filter?dub=1&sort=', 'menu', '1']),
('SUB-ITA',['/filter?dub=0&sort=', 'menu', 'dub=0']), ('SUB-ITA',['/filter?dub=0&sort=', 'menu', '0']),
('In Corso', ['/ongoing', 'peliculas','noorder']), ('In Corso', ['/ongoing', 'movies','noorder']),
('Ultimi Episodi', ['/updated', 'peliculas', 'updated']), ('Ultimi Episodi', ['/updated', 'movies', 'updated']),
('Nuove Aggiunte',['/newest', 'peliculas','noorder' ]), ('Nuove Aggiunte',['/newest', 'movies','noorder' ]),
('Generi',['/?d=1','genres',])] ('Generi',['/?d=1','genres',])]
return locals() return locals()
@support.scrape @support.scrape
def genres(item): def genres(item):
action = 'peliculas' action = 'movies'
data = get_data(item) data = get_data(item)
patronBlock = r'dropdown[^>]*>\s*Generi\s*<span.[^>]+>(?P<block>.*?)</ul>' patronBlock = r'dropdown[^>]*>\s*Generi\s*<span.[^>]+>(?P<block>.*?)</ul>'
patronMenu = r'<input.*?name="(?P<name>[^"]+)" value="(?P<value>[^"]+)"\s*>[^>]+>(?P<title>[^<]+)</label>' patronGenreMenu = r'<input.*?name="(?P<name>[^"]+)" value="(?P<value>[^"]+)"\s*>[^>]+>(?P<title>[^<]+)</label>'
def itemHook(item): def itemHook(item):
item.url = host + '/filter?' + item.name + '=' + item.value + '&sort=' item.url = host + '/filter?' + item.name + '=' + item.value + '&sort='
@@ -64,65 +65,66 @@ def genres(item):
def menu(item): def menu(item):
action = 'submenu' action = 'submenu'
data = get_data(item) data = get_data(item)
patronMenu=r'<button[^>]+>\s*(?P<title>[A-Za-z0-9]+)\s*<span.[^>]+>(?P<other>.*?)</ul>' patronMenu = r'<button[^>]+>\s*(?P<title>[A-Za-z0-9]+)\s*<span.[^>]+>(?P<other>.*?)</ul>'
genre = False
def itemlistHook(itemlist): def itemlistHook(itemlist):
itemlist.insert(0, item.clone(title=support.typo('Tutti','bold'), action='peliculas')) for item in itemlist:
itemlist.append(item.clone(title=support.typo('Cerca...','bold'), action='search', search=True, thumbnail=support.thumb('search.png'))) item.title += ' {anime}'
itemlist.insert(0, item.clone(title=support.typo('Tutti {anime}','bold'), action='movies'))
itemlist.append(item.clone(title=support.typo('Cerca... {anime}','bold'), action='search', search=True, thumbnail=support.thumb('search.png')))
return itemlist return itemlist
return locals() return locals()
@support.scrape @support.scrape
def submenu(item): def submenu(item):
action = 'peliculas' action = 'movies'
data = item.other data = item.other
# debug=True
patronMenu = r'<input.*?name="(?P<name>[^"]+)" value="(?P<value>[^"]+)"\s*>[^>]+>(?P<title>[^<]+)<\/label>' patronMenu = r'<input.*?name="(?P<name>[^"]+)" value="(?P<value>[^"]+)"\s*>[^>]+>(?P<title>[^<]+)<\/label>'
def itemHook(item): def itemHook(item):
item.url = '{}/filter?{}={}&{}{}'.format(host, item.name, item.value, item.args, ('&sort=' if item.name != 'sort' else '')) item.url = host + '/filter?' + item.name + '=' + item.value + '&dub=' + item.args + ('&sort=' if item.name != 'sort' else '')
return item return item
return locals() return locals()
def newest(categoria): def newest(category):
support.info(categoria) logger.debug(category)
item = support.Item() item = support.Item()
lang = config.get_setting('lang', channel=item.channel)
try: try:
if categoria == "anime": if category == "anime":
item.url = host item.url = host + '/updated'
item.args = "updated" item.args = "updated"
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("{0}".format(line)) logger.error("{0}".format(line))
return [] return []
def search(item, text): def search(item, texto):
support.info(text) logger.debug(texto)
if item.search: if item.search:
item.url = '{}/filter?{}&keyword={}&sort='.format(host, item.args, text) item.url = host + '/filter?dub=' + item.args + '&keyword=' + texto + '&sort='
else: else:
lang = ['?', '?dub=1&', '?dub=0&'][config.get_setting('lang', channel=item.channel)] item.args = 'noorder'
item.url = '{}/filter{}&keyword={}&sort='.format(host, lang, text) item.url = host + '/search?keyword=' + texto
item.contentType = 'tvshow' item.contentType = 'tvshow'
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("%s" % line) logger.error("%s" % line)
return [] return []
@support.scrape @support.scrape
def peliculas(item): def movies(item):
data = get_data(item) numerationEnabled = True
anime = True # debug = True
if item.args not in ['noorder', 'updated'] and not item.url[-1].isdigit(): item.url += order() # usa l'ordinamento di configura canale if item.args not in ['noorder', 'updated'] and not item.url[-1].isdigit(): item.url += order() # usa l'ordinamento di configura canale
data = get_data(item) data = get_data(item)
@@ -132,42 +134,42 @@ def peliculas(item):
action='findvideos' action='findvideos'
else: else:
patron= r'<div class="inner">\s*<a href="(?P<url>[^"]+)" class[^>]+>\s*<img.*?src="(?P<thumb>[^"]+)" alt?="(?P<title>[^\("]+)(?:\((?P<year>\d+)\) )?(?:\((?P<lang>[^\)]+)\))?(?P<title2>[^"]+)?[^>]+>[^>]+>(?:\s*<div class="(?P<l>[^"]+)">[^>]+>)?\s*(?:<div class="[^"]+">(?P<type>[^<]+)</div>)?' patron= r'<div class="inner">\s*<a href="(?P<url>[^"]+)" class[^>]+>\s*<img.*?src="(?P<thumb>[^"]+)" alt?="(?P<title>[^\("]+)(?:\((?P<year>\d+)\) )?(?:\((?P<lang>[^\)]+)\))?(?P<title2>[^"]+)?[^>]+>[^>]+>(?:\s*<div class="(?P<l>[^"]+)">[^>]+>)?\s*(?:<div class="[^"]+">(?P<type>[^<]+)</div>)?'
action='episodios' action='episodes'
# Controlla la lingua se assente # Controlla la lingua se assente
patronNext=r'<a href="([^"]+)" class="[^"]+" id="go-next' patronNext=r'<a href="([^"]+)" class="[^"]+" id="go-next'
patronTotalPages=r'<span class="total">(\d+)</span>'
typeContentDict={'movie':['movie', 'special']} typeContentDict={'movie':['movie', 'special']}
typeActionDict={'findvideos':['movie', 'special']} typeActionDict={'findvideos':['movie', 'special']}
def itemHook(item): def itemHook(item):
if not item.contentLanguage: if not item.contentLanguage:
if 'dub=1' in item.url or item.l == 'dub': if 'dub=1' in item.url or item.l == 'dub':
item.contentLanguage = 'ITA' item.contentLanguage = 'ITA'
item.title += support.typo(item.contentLanguage,'_ [] color kod') # item.title += support.typo(item.contentLanguage,'_ [] color kod')
else: else:
item.contentLanguage = 'Sub-ITA' item.contentLanguage = 'Sub-ITA'
item.title += support.typo(item.contentLanguage,'_ [] color kod') # item.title += support.typo(item.contentLanguage,'_ [] color kod')
return item return item
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodes(item):
data = get_data(item) data = get_data(item)
anime = True numerationEnabled = True
pagination = 50 # pagination = True
patronBlock= r'<div class="server\s*active\s*"(?P<block>.*?)(?:<div class="server|<link)' patronBlock= r'<div class="server\s*active\s*"(?P<block>.*?)(?:<div class="server|<link)'
patron = r'<li[^>]*>\s*<a.*?href="(?P<url>[^"]+)"[^>]*>(?P<episode>[^-<]+)(?:-(?P<episode2>[^<]+))?' patron = r'<li[^>]*>\s*<a.*?href="(?P<url>[^"]+)"[^>]*>(?P<episode>[^-<]+)(?:-(?P<episode2>[^<]+))?'
def itemHook(item): # def itemHook(item):
item.number = support.re.sub(r'\[[^\]]+\]', '', item.title) # item.title = item.fulltitle
item.title += support.typo(item.fulltitle,'-- bold') # return item
return item
action='findvideos' action='findvideos'
return locals() return locals()
def findvideos(item): def findvideos(item):
import time import time
support.info(item) logger.debug()
itemlist = [] itemlist = []
urls = [] urls = []
# resp = support.match(get_data(item), headers=headers, patron=r'data-name="(\d+)">([^<]+)<') # resp = support.match(get_data(item), headers=headers, patron=r'data-name="(\d+)">([^<]+)<')
@@ -175,8 +177,9 @@ def findvideos(item):
data = resp.data data = resp.data
for ID, name in resp.matches: for ID, name in resp.matches:
if not item.number: item.number = support.match(item.title, patron=r'(\d+) -').match # if not item.number: item.number = support.match(item.title, patron=r'(\d+) -').match
match = support.match(data, patronBlock=r'data-name="' + ID + r'"[^>]+>(.*?)(?:<div class="(?:server|download)|link)', patron=r'data-id="([^"]+)" data-episode-num="' + (item.number if item.number else '1') + '"' + r'.*?href="([^"]+)"').match match = support.match(data, patronBlock=r'data-name="{}"[^>]+>(.*?)(?:<div class="(?:server|download)|link)'.format(ID), patron=r'data-id="([^"]+)" data-episode-num="{}".*?href="([^"]+)"'.format(item.contentEpisodeNumber if item.contentEpisodeNumber else 1)).match
if match: if match:
epID, epurl = match epID, epurl = match
# if 'vvvvid' in name.lower(): # if 'vvvvid' in name.lower():
@@ -186,11 +189,8 @@ def findvideos(item):
title = support.match(url, patron=r'http[s]?://(?:www.)?([^.]+)', string=True).match title = support.match(url, patron=r'http[s]?://(?:www.)?([^.]+)', string=True).match
itemlist.append(item.clone(action="play", title=title, url=url, server='directo')) itemlist.append(item.clone(action="play", title=title, url=url, server='directo'))
else: else:
dataJson = support.match(host + '/api/episode/info?id=' + epID + '&alt=0', headers=headers).data json = support.match(host + '/api/episode/info?id=' + epID + '&alt=0', headers=headers).response.json
json = jsontools.load(dataJson)
title = support.match(json['grabber'], patron=r'server\d+.([^.]+)', string=True).match title = support.match(json['grabber'], patron=r'server\d+.([^.]+)', string=True).match
if title: itemlist.append(item.clone(action="play", title=title, url=json['grabber'].split('=')[-1], server='directo')) if title: itemlist.append(item.clone(action="play", title=title, url=json['grabber'].split('=')[-1], server='directo'))
else: urls.append(json['grabber']) else: urls.append(json['grabber'])
# support.info(urls)
return support.server(item, urls, itemlist) return support.server(item, urls, itemlist)

6
channels/aniplay.json Executable file → Normal file
View File

@@ -1,11 +1,11 @@
{ {
"id": "aniplay", "id": "aniplay",
"name": "AniPlay", "name": "AniPlay",
"active": false, "active": true,
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"thumbnail": "aniplay.png", "thumbnail": "aniplay.png",
"banner": "aniplay.png", "banner": "aniplay.png",
"categories": ["anime", "vos"], "categories": ["anime", "sub"],
"settings": [ "settings": [
{ {
"id": "sort", "id": "sort",
@@ -34,4 +34,4 @@
"lvalues": ["10", "20", "30", "40", "50", "60", "80", "90"] "lvalues": ["10", "20", "30", "40", "50", "60", "80", "90"]
} }
] ]
} }

122
channels/aniplay.py Executable file → Normal file
View File

@@ -1,5 +1,5 @@
from platformcode import config, logger, autorenumber from platformcode import config, logger, autorenumber
from core import httptools, scrapertools, support, tmdb, jsontools from core import httptools, jsontools, scrapertools, support, tmdb
from inspect import stack from inspect import stack
import sys import sys
@@ -9,9 +9,9 @@ else:
from concurrent_py2 import futures from concurrent_py2 import futures
host = config.get_channel_url() host = config.get_channel_url()
sort = ['views', 'title', 'episodeNumber', 'startDate', 'endDate', 'createdDate'][config.get_setting('sort', 'aniplay')] sort = ['views', 'title', 'episodeNumber', 'startDate', 'endDate', 'createdDate'][config.getSetting('sort', 'aniplay')]
order = 'asc' if config.get_setting('order', 'aniplay') else 'desc' order = 'asc' if config.getSetting('order', 'aniplay') else 'desc'
perpage = [10, 20, 30 ,40, 50, 60, 70, 80, 90][config.get_setting('perpage', 'aniplay')] perpage = [10, 20, 30 ,40, 50, 60, 70, 80, 90][config.getSetting('perpage', 'aniplay')]
@support.menu @support.menu
@@ -27,38 +27,35 @@ def mainlist(item):
def submenu_az(item): def submenu_az(item):
itemlist = [] itemlist = []
for letter in ['0-9'] + list('ABCDEFGHIJKLMNOPQRSTUVWXYZ'): for letter in ['0-9'] + list('ABCDEFGHIJKLMNOPQRSTUVWXYZ'):
itemlist.append(item.clone(title = support.typo(letter, 'bold'), itemlist.append(item.clone(title = letter,
url= host + '/api/anime/find-by-char', url= host + '/api/anime/find-by-char',
action= 'peliculas', action= 'movies',
variable= '&character=' + letter, variable= '&character=' + letter,
thumbnail=support.thumb('az'))) thumbnail=support.thumb('az')))
return itemlist return itemlist
def submenu_year(item): def submenu_year(item):
itemlist = [] itemlist = []
from datetime import date from datetime import date
current = date.today().year current = date.today().year
first = int(httptools.downloadpage('{}/api/anime/advanced-search?page=0&size=1&sort=startDate,asc&sort=id'.format(host)).json[0]['startDate'].split('-')[0]) -1 first = int(httptools.downloadpage('{}/api/anime/advanced-search?page=0&size=1&sort=startDate,asc&sort=id'.format(host)).json[0]['startDate'].split('-')[0]) -1
for year in range(current, first, -1): for year in range(current, first, -1):
itemlist.append(item.clone(title = support.typo(year, 'bold'), itemlist.append(item.clone(title = year,
action= 'submenu_season', action= 'submenu_season',
variable= year, variable= year,
thumbnail=support.thumb('year'))) thumbnail=support.thumb('year')))
return itemlist return itemlist
def submenu_top(item): def submenu_top(item):
itemlist = [] itemlist = []
links = {'Top del giorno':'daily-top', 'Top della settimana':'weekly-top', 'Top del mese':'monthly-top'} links = {'Top del giorno':'daily-top', 'Top della settimana':'weekly-top', 'Top del mese':'monthly-top'}
for label in links: for label in links:
link = links[label] link = links[label]
itemlist.append(item.clone(title = support.typo(label, 'bold'), itemlist.append(item.clone(title = label,
action= 'submenu_top_of', action= 'submenu_top_of',
variable= link)) variable= link))
return itemlist return itemlist
def submenu_season(item): def submenu_season(item):
itemlist = [] itemlist = []
seasons = {'winter':'Inverno', 'spring':'Primavera', 'summer':'Estate', 'fall':'Autunno'} seasons = {'winter':'Inverno', 'spring':'Primavera', 'summer':'Estate', 'fall':'Autunno'}
@@ -68,13 +65,12 @@ def submenu_season(item):
s = season['season'].split('.')[-1] s = season['season'].split('.')[-1]
title = seasons[s] title = seasons[s]
itemlist.append(item.clone(title=title, itemlist.append(item.clone(title=title,
url = '{}/api/seasonal-view/{}-{}'.format(host, s, item.variable), url = '{}/api/seasonal-view/{}-{}'.format(host, s, item.variable),
thumbnail = support.thumb(s), thumbnail = support.thumb(s),
action = 'peliculas', action = 'movies',
variable='')) variable=''))
return itemlist return itemlist
def submenu_top_of(item): def submenu_top_of(item):
itemlist = [] itemlist = []
url= '{}/api/home/{}'.format(host, item.variable) url= '{}/api/home/{}'.format(host, item.variable)
@@ -84,69 +80,72 @@ def submenu_top_of(item):
title = fulltitle.split('(')[0].strip() title = fulltitle.split('(')[0].strip()
scrapedlang = scrapertools.find_single_match(fulltitle, r'\(([^\)]+)') scrapedlang = scrapertools.find_single_match(fulltitle, r'\(([^\)]+)')
lang = scrapedlang.upper() if scrapedlang else 'Sub-ITA' lang = scrapedlang.upper() if scrapedlang else 'Sub-ITA'
long_title = support.typo(title, 'bold') + support.typo(lang, '_ [] color kod') # long_title = support.typo(title, 'bold') + support.typo(lang, '_ [] color kod')
itemlist.append(item.clone(title=long_title, itemlist.append(item.clone(title=title,
url = '{}/anime/{}'.format(host, anime['animeId']), id=anime['animeId'],
video_url = '{}/api/anime/{}'.format(host, anime['animeId']), url = '{}/api/anime/{}'.format(host, anime['animeId']),
thumbnail = get_thumbnail(anime, 'animeHorizontalImages'), thumbnail = get_thumbnail(anime, 'animeHorizontalImages'),
action = 'episodios', action = 'episodes',
variable=anime['animeId'])) variable=anime['animeId']))
return itemlist return itemlist
def search(item, texto): def search(item, texto):
support.info(texto) logger.debug(texto)
item.url = host + '/api/anime/advanced-search' item.url = host + '/api/anime/advanced-search'
item.variable = '&query=' + texto item.variable = '&query=' + texto
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("%s" % line) logger.error("%s" % line)
return [] return []
def newest(categoria): def newest(category):
support.info(categoria) logger.debug(category)
item = support.Item() item = support.Item()
try: try:
if categoria == "anime": if category == "anime":
return latest_added(item) return latest_added(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("{0}".format(line)) logger.error("{0}".format(line))
return [] return []
def latest_added(item): def latest_added(item):
itemlist = [] itemlist = []
page = item.page if item.page else 0 page = item.page if item.page else 0
url= '{}/api/home/latest-episodes?page={}'.format(host, page) url= '{}/api/home/latest-episodes?page={}'.format(host, page)
js = httptools.downloadpage(url).json js = httptools.downloadpage(url).json
for episode in js: for episode in js:
title = episode['title'] if episode['title'] else '' logger.debug(jsontools.dump(episode))
title = episode['title'] if episode['title'] else episode['animeTitle']
animeTitle, lang = get_lang(episode['animeTitle']) animeTitle, lang = get_lang(episode['animeTitle'])
quality = 'Full HD' if episode['fullHd'] else 'HD' quality = 'Full HD' if episode['fullHd'] else 'HD'
long_title = support.typo('{}. {}{}'.format(int(float(episode['episodeNumber'])), title + ' - ' if title else '', animeTitle), 'bold') + support.typo(lang, '_ [] color kod') + support.typo(quality, '_ [] color kod')
image = get_thumbnail(episode, 'episodeImages') image = get_thumbnail(episode, 'episodeImages')
itemlist.append(item.clone(title=long_title, itemlist.append(item.clone(title=title,
fulltitle=title, fulltitle=title,
url='{}/play/{}'.format(host, episode['id']), animeId = episode['animeId'],
id=episode['id'],
contentType = 'episode', contentType = 'episode',
contentTitle = title, contentTitle = title,
contentSerieName = animeTitle, contentSerieName = animeTitle,
contentLanguage = lang, contentLanguage = lang,
quality = quality, quality = quality,
contentEpisodeNumber = int(float(episode['episodeNumber'])), contentEpisodeNumber = int(float(episode['episodeNumber'])),
video_url = '{}/api/episode/{}'.format(host, episode['id']), animeUrl = '{}/api/anime/{}'.format(host, episode['animeId']),
thumbnail = image, thumbnail = image,
fanart = image, fanart = image,
action = 'findvideos')) action = 'findvideos'))
@@ -157,7 +156,7 @@ def latest_added(item):
return itemlist return itemlist
def peliculas(item): def movies(item):
logger.debug() logger.debug()
itemlist = [] itemlist = []
@@ -165,22 +164,19 @@ def peliculas(item):
js = httptools.downloadpage('{}?page={}&size={}{}&sort={},{}&sort=id'.format(item.url, page, perpage, item.variable, sort, order)).json js = httptools.downloadpage('{}?page={}&size={}{}&sort={},{}&sort=id'.format(item.url, page, perpage, item.variable, sort, order)).json
for it in js: for it in js:
logger.debug(jsontools.dump(js))
title, lang = get_lang(it['title']) title, lang = get_lang(it['title'])
long_title = support.typo(title, 'bold') + support.typo(lang, '_ [] color kod') itemlist.append(item.clone(title = title,
itemlist.append(item.clone(title = long_title,
fulltitle = title, fulltitle = title,
show = title, show = title,
contentLanguage = lang, contentLanguage = lang,
contentType = 'movie' if it['type'] == 'Movie' else 'tvshow', contentType = 'movie' if it['type'] == 'Movie' else 'tvshow',
contentTitle = title, contentTitle = title,
contentSerieName = title if it['type'] == 'Serie' else '', contentSerieName = title if it['type'] == 'Serie' else '',
action ='findvideos' if it['type'] == 'Movie' else 'episodios', action ='findvideos' if it['type'] == 'Movie' else 'episodes',# '' if not active else 'findvideos' if it['type'] == 'Movie' else 'episodes',
plot = it['storyline'], plot = it['storyline'],
url = '{}/anime/{}'.format(host, it['id']), year = it['startDate'].split('-')[0],
video_url = '{}/api/anime/{}'.format(host, it.get('animeId', it.get('id'))), url = '{}/api/anime/{}'.format(host, it['id']),
thumbnail = get_thumbnail(it), thumbnail = get_thumbnail(it),
fanart = get_thumbnail(it, 'horizontalImages'))) fanart = get_thumbnail(it, 'horizontalImages')))
@@ -192,13 +188,12 @@ def peliculas(item):
return itemlist return itemlist
def episodios(item): def episodes(item):
logger.debug() logger.debug()
itemlist = [] itemlist = []
if not item.video_url:
item.video_url = item.url.replace('/anime/', '/api/anime/')
# url = '{}/api/anime/{}'.format(host, item.id) # url = '{}/api/anime/{}'.format(host, item.id)
json = httptools.downloadpage(item.video_url, CF=False ).json json = httptools.downloadpage(item.url, CF=False ).json
if type(json) == list: if type(json) == list:
item.show_renumber = False item.show_renumber = False
@@ -212,7 +207,8 @@ def episodios(item):
title = it['name'] title = it['name']
itemlist.append(item.clone(title = title, itemlist.append(item.clone(title = title,
video_url = '{}/api/anime/{}/season/{}'.format(host, it['animeId'], it['id']), contentTitle = title,
id= '{}/season/{}'.format(it['animeId'], it['id']),
contentType = 'season', contentType = 'season',
action = 'list_episodes', action = 'list_episodes',
plot = json['storyline'], plot = json['storyline'],
@@ -249,7 +245,8 @@ def list_episodes(item, json=None):
itemlist = [] itemlist = []
if not json: if not json:
json = httptools.downloadpage(item.video_url, CF=False ).json url = '{}/api/anime/{}'.format(host, item.id)
json = httptools.downloadpage(url, CF=False ).json
episodes = json['episodes'] if 'episodes' in json else json episodes = json['episodes'] if 'episodes' in json else json
episodes.sort(key=lambda ep: int(ep['episodeNumber'].split('.')[0])) episodes.sort(key=lambda ep: int(ep['episodeNumber'].split('.')[0]))
@@ -262,12 +259,13 @@ def list_episodes(item, json=None):
else: else:
episode = '{:02d}'.format(int(it['episodeNumber'].split('.')[0])) episode = '{:02d}'.format(int(it['episodeNumber'].split('.')[0]))
title = support.typo('{}. {}'.format(episode, it['title']), 'bold') # title = support.typo('{}. {}'.format(episode, it['title']), 'bold')
image = get_thumbnail(it, 'episodeImages') image = get_thumbnail(it, 'episodeImages')
itemlist.append(item.clone(title = title, itemlist.append(item.clone(title = it['title'],
url= '{}/play/{}'.format(host, it['id']), contentTitle = it['title'],
video_url= '{}/api/episode/{}'.format(host, it['id']), id= it['id'],
url= 'api/episode/{}'.format(it['id']),
contentType = 'episode', contentType = 'episode',
contentEpisodeNumber = int(it['episodeNumber'].split('.')[0]), contentEpisodeNumber = int(it['episodeNumber'].split('.')[0]),
contentSeason = item.contentSeason if item.contentSeason else '', contentSeason = item.contentSeason if item.contentSeason else '',
@@ -286,18 +284,20 @@ def list_episodes(item, json=None):
def findvideos(item): def findvideos(item):
logger.debug() logger.debug()
res = httptools.downloadpage(item.video_url, CF=False ).json url = '{}/api/{}/{}'.format(host, 'episode' if item.contentType != 'movie' else 'anime', item.id)
if res.get('episodes', []): json = httptools.downloadpage(url, CF=False ).json
res = httptools.downloadpage('{}/api/episode/{}'.format(host, res['episodes'][0]['id'])).json
item.url = res['videoUrl'] if json.get('episodes', []):
item.server = 'directo' json = httptools.downloadpage('{}/api/episode/{}'.format(host, json['episodes'][0]['id'])).json
if '.m3u' in item.url: videourl = json['episodeVideo']
item.manifest = 'hls'
return support.server(item, itemlist=[item]) itemlist = [item.clone(title=config.getLocalizedString(30137),
url=videourl,
server='directo')]
return support.server(item, itemlist=itemlist)
def get_thumbnail(data, prop = 'verticalImages', key = 'full'): def get_thumbnail(data, prop = 'verticalImages', key = 'full'):

4
channels/casacinema.json Executable file → Normal file
View File

@@ -2,10 +2,10 @@
"id": "casacinema", "id": "casacinema",
"name": "Casacinema", "name": "Casacinema",
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"active": false, "active": true,
"thumbnail": "casacinema.png", "thumbnail": "casacinema.png",
"banner": "casacinema.png", "banner": "casacinema.png",
"categories": ["tvshow", "movie","vos"], "categories": ["tvshow", "movie","sub"],
"settings": [ "settings": [
] ]
} }

84
channels/casacinema.py Executable file → Normal file
View File

@@ -5,6 +5,7 @@
from core import support from core import support
from platformcode import logger
host = support.config.get_channel_url() host = support.config.get_channel_url()
headers = [['Referer', host]] headers = [['Referer', host]]
@@ -14,10 +15,11 @@ headers = [['Referer', host]]
def mainlist(item): def mainlist(item):
film = ['/category/film', film = ['/category/film',
('Generi', ['', 'genres', 'genres']), ('Generi', ['', 'genres', 'genres']),
('Sub-ITA', ['/category/sub-ita/', 'movies', 'sub'])
] ]
tvshow = ['/category/serie-tv', tvshow = ['/category/serie-tv',
('Novità', ['/aggiornamenti-serie-tv', 'peliculas', '']), ('Novità', ['/aggiornamenti-serie-tv', 'movies', '']),
] ]
search = '' search = ''
@@ -27,47 +29,47 @@ def mainlist(item):
@support.scrape @support.scrape
def genres(item): def genres(item):
action = 'peliculas' action = 'movies'
blacklist = ['PRIME VISIONI', 'ULTIME SERIE TV', 'ULTIMI FILM'] blacklist = ['PRIME VISIONI', 'ULTIME SERIE TV', 'ULTIMI FILM']
patronMenu = r'<li><a href="(?P<url>[^"]+)">(?P<title>[^<>]+)</a></li>' patronGenreMenu = r'<li><a href="(?P<url>[^"]+)">(?P<title>[^<>]+)</a></li>'
patronBlock = r'<div class="container home-cats">(?P<block>.*?)<div class="clear">' patronBlock = r'<div class="container home-cats">(?P<block>.*?)<div class="clear">'
return locals() return locals()
def check(item): def select(item):
item.data = support.match(item).data item.data = support.match(item).data
if 'episodi e stagioni' in item.data.lower(): if 'continua con il video' in item.data.lower():
support.info('select = ### è una serie ###') logger.debug('select = ### è un film ###')
item.contentType = 'tvshow'
return episodios(item)
else:
support.info('select = ### è un film ###')
item.contentType = 'movie' item.contentType = 'movie'
return findvideos(item) return findvideos(item)
else:
logger.debug('select = ### è una serie ###')
item.contentType = 'tvshow'
return episodes(item)
def search(item, text): def search(item, text):
support.info(text) logger.debug(text)
text = text.replace(' ', '+') text = text.replace(' ', '+')
item.url = host + '/?a=b&s=' + text item.url = host + '/?s=' + text
item.args = 'search' item.args = 'search'
try: try:
return peliculas(item) return movies(item)
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.info('search log:', line) logger.error(line)
return [] return []
def newest(categoria): def newest(category):
itemlist = [] itemlist = []
item = support.Item() item = support.Item()
item.args = 'newest' item.args = 'newest'
try: try:
if categoria == 'series': if category == 'tvshow':
item.contentType = 'tvshow' item.contentType = 'tvshow'
item.url = host+'/aggiornamenti-serie-tv' item.url = host+'/aggiornamenti-serie-tv'
@@ -75,63 +77,66 @@ def newest(categoria):
item.contentType = 'movie' item.contentType = 'movie'
item.url = host+'/category/film' item.url = host+'/category/film'
item.action = 'peliculas' item.action = 'movies'
itemlist = peliculas(item) itemlist = movies(item)
if itemlist[-1].action == 'peliculas': if itemlist[-1].action == 'movies':
itemlist.pop() itemlist.pop()
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.info("%s" % line) logger.error(line)
return [] return []
return itemlist return itemlist
@support.scrape @support.scrape
def peliculas(item): def movies(item):
# debug = True
if item.contentType == 'movie': if item.contentType == 'movie':
action = 'findvideos' action = 'findvideos'
elif item.contentType == 'tvshow': elif item.contentType == 'tvshow':
action = 'episodios' action = 'episodes'
pagination = '' pagination = True
else: else:
action = 'check' action = 'select'
if item.args == 'newest': if item.args == 'newest':
patron = r'<li><a href="(?P<url>[^"]+)"[^=]+="(?P<thumb>[^"]+)"><div>\s*?<div[^>]+>(?P<title>[^\(\[<]+)(?:\[(?P<quality1>HD)\])?[ ]?(?:\(|\[)?(?P<lang>[sS]ub-[iI][tT][aA])?(?:\)|\])?[ ]?(?:\[(?P<quality>.+?)\])?[ ]?(?:\((?P<year>\d+)\))?<(?:[^>]+>.+?(?:title="Nuovi episodi">(?P<episode>\d+x\d+)[ ]?(?P<lang2>Sub-Ita)?|title="IMDb">(?P<rating>[^<]+)))?' patron = r'<li><a href="(?P<url>[^"]+)"[^=]+="(?P<thumb>[^"]+)"><div>\s*?<div[^>]+>(?P<title>[^\(\[<]+)(?:\[(?P<quality1>HD)\])?[ ]?(?:\(|\[)?(?P<lang>[sS]ub-[iI][tT][aA])?(?:\)|\])?[ ]?(?:\[(?P<quality>.+?)\])?[ ]?(?:\((?P<year>\d+)\))?<(?:[^>]+>.+?(?:title="Nuovi episodi">(?P<episode>\d+x\d+)[ ]?(?P<lang2>Sub-Ita)?|title="IMDb">(?P<rating>[^<]+)))?'
else: else:
# patron = r'<li><a href="(?P<url>[^"]+)"[^=]+="(?P<thumb>[^"]+)"><div>\s*?<div[^>]+>(?P<title>[^\(\[<]+)(?:\[(?P<quality1>HD)\])?\s?(?:[\(\[])?(?P<lang>[sS]ub-[iI][tT][aA])?(?:[\)\]])?\s?(?:\[(?P<quality>.+?)\])?\s?(?:\((?P<year>\d+)\))?<'
patron = r'<li><a href="(?P<url>[^"]+)"[^=]+="(?P<thumb>[^"]+)"><div>\s*?<div[^>]+>(?P<title>[^\(\[<]+)(?P<title2>\([\D*]+\))?(?:\[(?P<quality1>HD)\])?\s?(?:[\(\[])?(?P<lang>[sS]ub-[iI][tT][aA])?(?:[\)\]])?\s?(?:\[(?P<quality>.+?)\])?\s?(?:\((?P<year>\d+)\))?(?:\(\D{2}\s\d{4}\))?<' patron = r'<li><a href="(?P<url>[^"]+)"[^=]+="(?P<thumb>[^"]+)"><div>\s*?<div[^>]+>(?P<title>[^\(\[<]+)(?P<title2>\([\D*]+\))?(?:\[(?P<quality1>HD)\])?\s?(?:[\(\[])?(?P<lang>[sS]ub-[iI][tT][aA])?(?:[\)\]])?\s?(?:\[(?P<quality>.+?)\])?\s?(?:\((?P<year>\d+)\))?(?:\(\D{2}\s\d{4}\))?<'
patronNext = r'<a href="([^"]+)"\s*>Pagina' patronNext = r'<a href="([^"]+)"\s*>Pagina'
patronTotalPages = r'>(\d+)(?:[^>]+>){4}Pagina'
def itemHook(item): def itemHook(item):
if item.quality1: if item.quality1:
item.quality = item.quality1 item.quality = item.quality1
item.title += support.typo(item.quality, '_ [] color kod') # item.title += support.typo(item.quality, '_ [] color kod')
if item.lang2: if item.lang2:
item.contentLanguage = item.lang2 item.contentLanguage = item.lang2
item.title += support.typo(item.lang2, '_ [] color kod') # item.title += support.typo(item.lang2, '_ [] color kod')
if item.args == 'novita': # if item.args == 'novita':
item.title = item.title # item.title = item.title
# if 'wp-content' in item.thumbnail and not item.infoLabels['year']:
# item.infoLabels['year'] = item.thumbnail.split('/')[5]
return item return item
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodes(item):
if item.data: if item.data:
data = item.data data = item.data
action = 'findvideos' action = 'findvideos'
item.contentType = 'tvshow' item.contentType = 'tvshow'
blacklist = [''] blacklist = ['']
patron = r'"season-no">(?P<season>\d+)x(?P<episode>\d+)(?:[^>]+>){5}\s*(?P<title>[^<]+)(?P<data>.*?)</table>' patron = r'(?P<episode>\d+(?:&#215;|×)?\d+\-\d+|\d+(?:&#215;|×)\d+)[;]?(?:(?P<title>[^<]+)<(?P<data>.*?)|(\2[ ])(?:<(\3.*?)))(?:<br />|</p>)'
patronBlock = r'<span>(?:.+?Stagione*.+?(?P<lang>[Ii][Tt][Aa]|[Ss][Uu][Bb][\-]?[iI][tT][aA]))?.*?</span>.*?class="content(?P<block>.*?)(?:"accordion-item|<script>)' patronBlock = r'<strong>(?P<block>(?:.+?Stagione*.+?(?P<lang>[Ii][Tt][Aa]|[Ss][Uu][Bb][\-]?[iI][tT][aA]))?(?:.+?|</strong>)(/?:</span>)?</p>.*?</p>)'
return locals() return locals()
@@ -139,7 +144,12 @@ def findvideos(item):
if item.contentType != 'movie': if item.contentType != 'movie':
links = support.match(item.data, patron=r'href="([^"]+)"').matches links = support.match(item.data, patron=r'href="([^"]+)"').matches
else: else:
matchData = item.data if item.data else support.match(item.url, headers=headers).data matchData = item.data if item.data else item
links = support.match(matchData, patron=r'data-id="([^"]+)"').matches links = support.match(matchData, patron=r'(?:SRC|href)="([^"]+)"', patronBlock=r'<div class="col-md-10">(.+?)<div class="ads">').matches
data = ''
return support.server(item, links) from lib.unshortenit import unshorten_only
for link in links:
logger.debug('URL=',link)
url, c = unshorten_only(link.replace('#', 'speedvideo.net'))
data += url + '\n'
return support.server(item, data)

18
channels/cb01anime.json Executable file → Normal file
View File

@@ -1,10 +1,10 @@
{ {
"id": "cb01anime", "id": "cb01anime",
"name": "Cb01anime", "name": "Cb01anime",
"language": ["ita", "vos", "sub-ita"], "language": ["ita", "sub, "sub-ita"],
"active": false, "active": true,
"thumbnail": "cb01anime.png", "thumbnail": "cb01anime.png",
"banner": "cb01anime.png", "banner": "cb01anime.png",
"categories": ["anime"], "categories": ["anime"],
"settings": [] "settings": []
} }

34
channels/cb01anime.py Executable file → Normal file
View File

@@ -5,6 +5,7 @@
# ------------------------------------------------------------ # ------------------------------------------------------------
from core import support from core import support
from platformcode import logger
host = support.config.get_channel_url() + '/cb01-anime-cartoon' host = support.config.get_channel_url() + '/cb01-anime-cartoon'
@@ -18,7 +19,7 @@ def mainlist(item):
anime = [('Genere',['','menu', '2']), anime = [('Genere',['','menu', '2']),
('Per Lettera',['','menu', '1']), ('Per Lettera',['','menu', '1']),
('Per Anno',['','menu', '3']), ('Per Anno',['','menu', '3']),
('Ultimi Anime Aggiornati',['','peliculas', 'newest'])] ('Ultimi Anime Aggiornati',['','movies', 'newest'])]
return locals() return locals()
@@ -27,7 +28,9 @@ def menu(item):
blacklist = ['Anime per Genere', 'Anime per Anno', 'Anime per Lettera'] blacklist = ['Anime per Genere', 'Anime per Anno', 'Anime per Lettera']
patronBlock = r'<select name="select%s"(?P<block>.*?)</select>' % item.args patronBlock = r'<select name="select%s"(?P<block>.*?)</select>' % item.args
patronMenu = r'<option value="(?P<url>[^"]+)">(?P<title>[^<]+)</option>' patronMenu = r'<option value="(?P<url>[^"]+)">(?P<title>[^<]+)</option>'
action = 'peliculas' if '2' in item.args:
patronGenreMenu = patronMenu
action = 'movies'
def itemHook(item): def itemHook(item):
item.url = item.url.replace('cb01-anime/','cb01-anime-cartoon/') item.url = item.url.replace('cb01-anime/','cb01-anime-cartoon/')
return item return item
@@ -35,37 +38,37 @@ def menu(item):
def search(item, texto): def search(item, texto):
support.info(texto) logger.debug(texto)
item.url = host + "/search/" + texto item.url = host + "/search/" + texto
try: try:
return peliculas(item) return movies(item)
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.info('search log:', line) logger.error(line)
return [] return []
def newest(categoria): def newest(category):
support.info(categoria) logger.debug(category)
itemlist = [] itemlist = []
item = support.Item() item = support.Item()
try: try:
if categoria == "anime": if category == "anime":
item.url = host item.url = host
item.args = 'newest' item.args = 'newest'
itemlist = peliculas(item) itemlist = movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("{0}".format(line)) logger.error("{0}".format(line))
return [] return []
return itemlist return itemlist
@support.scrape @support.scrape
def peliculas(item): def movies(item):
# debug=True # debug=True
blacklist = Blacklist blacklist = Blacklist
item.contentType = 'tvshow' item.contentType = 'tvshow'
@@ -78,20 +81,19 @@ def peliculas(item):
return locals() return locals()
def check(item): def check(item):
# support.dbg()
item.url = support.match(item, patron=r'(?:<p>|/>)(.*?)(?:<br|</td>|</p>)', patronBlock=r'Streaming:(.*?)</tr>').matches item.url = support.match(item, patron=r'(?:<p>|/>)(.*?)(?:<br|</td>|</p>)', patronBlock=r'Streaming:(.*?)</tr>').matches
if 'Episodio' in str(item.url): if 'Episodio' in str(item.url):
item.contentType = 'tvshow' item.contentType = 'tvshow'
item.action ='episodios' item.action ='episodes'
return episodios(item) return episodes(item)
else: else:
item.contentType = 'movie' item.contentType = 'movie'
item.action = 'findvideos' item.action = 'findvideos'
return findvideos(item) return findvideos(item)
@support.scrape @support.scrape
def episodios(item): def episodes(item):
support.info('EPISODIOS ', item.data) logger.debug('EPISODIOS ', item.data)
data = '' data = ''
matches = item.data matches = item.data
season = 1 season = 1

2
channels/cineblog01.json Executable file → Normal file
View File

@@ -5,6 +5,6 @@
"active": true, "active": true,
"thumbnail": "cb01.png", "thumbnail": "cb01.png",
"banner": "cb01.png", "banner": "cb01.png",
"categories": ["tvshow", "movie", "vos", "documentary"], "categories": ["tvshow", "movie", "sub", "documentary"],
"settings": [] "settings": []
} }

234
channels/cineblog01.py Executable file → Normal file
View File

@@ -2,20 +2,21 @@
# ------------------------------------------------------------ # ------------------------------------------------------------
# Canale per cineblog01 # Canale per cineblog01
# ------------------------------------------------------------ # ------------------------------------------------------------
import re import re
from core import scrapertools, httptools, servertools, support from core import scrapertools, httptools, servertools, support
from platformcode import logger, config from platformcode import logger, config
def findhost(url): # def findhost(url):
host = httptools.downloadpage(url, follow_redirect=True).url # host = httptools.downloadpage(url, follow_redirect=True).url
if host == 'https://cb01.uno/': # if host == 'https://cb01.uno/':
host = support.match(host, patron=r'<a href="([^"]+)').match # host = support.match(host, patron=r'<a href="([^"]+)').match
return host # return host
host = config.get_channel_url(findhost) host = config.get_channel_url()
headers = [['Referer', host]] headers = [['Referer', host]]
@@ -23,22 +24,20 @@ headers = [['Referer', host]]
def mainlist(item): def mainlist(item):
film = [ film = [
('HD', ['', 'menu', 'Film HD Streaming']), ('HD', ['', 'menu', 'Film HD Streaming']),
('Genere', ['', 'menu', 'Film per Genere']), ('Generi', ['', 'menu', 'Film per Genere']),
('Anni', ['', 'menu', 'Film per Anno']), ('Anni', ['', 'menu', 'Film per Anno']),
('Popolari per Genere', ['', 'menu', 'Film Popolari']), ('Paese', ['', 'menu', 'Film per Paese']),
('Ultimi Aggiunti', ['/ultimi-100-film-aggiunti/', 'peliculas', 'newest']), ('Ultimi Aggiornati', ['/ultimi-100-film-aggiornati/', 'movies', 'newest']),
('Popolari', ['/category/film-popolari/']), ('Ultimi Aggiunti', ['/lista-film-ultimi-100-film-aggiunti/', 'movies', 'newest'])
('Italiani', ['/category/nazione/italia/'])
# ('Film in Lista', ['/lista-film/', 'peliculas', 'newest'])
] ]
tvshow = ['/serietv/', tvshow = ['/serietv/',
('Per Lettera', ['/serietv/', 'menu', 'Serie-TV x Lettera']), ('Per Lettera', ['/serietv/', 'menu', 'Serie-Tv per Lettera']),
('Per Genere', ['/serietv/', 'menu', 'Serie-TV x Genere']), ('Per Genere', ['/serietv/', 'menu', 'Serie-Tv per Genere']),
('Per anno', ['/serietv/', 'menu', 'Serie-TV x Anno']), ('Per anno', ['/serietv/', 'menu', 'Serie-Tv per Anno']),
('Ultime Aggiunte', ['/serietv/ultime-100-serie-tv-aggiunte/', 'peliculas', 'newest']) ('Ultime Aggiornate', ['/serietv/ultime-100-serie-tv-aggiornate/', 'movies', 'newest'])
] ]
docu = [('Documentari {bullet bold}', ['/category/documentario/', 'peliculas']), docu = [('Documentari {bullet bold}', ['/category/documentario/', 'movies']),
('HD {submenu} {documentari}', ['/category/hd-alta-definizione/documentario-hd/', 'peliculas']) ('HD {submenu} {documentari}', ['/category/hd-alta-definizione/documentario-hd/', 'movies'])
] ]
return locals() return locals()
@@ -46,27 +45,28 @@ def mainlist(item):
@support.scrape @support.scrape
def menu(item): def menu(item):
# debug = True
patronBlock = item.args + r'<span.*?><\/span>.*?<ul.*?>(?P<block>.*?)<\/ul>' patronBlock = item.args + r'<span.*?><\/span>.*?<ul.*?>(?P<block>.*?)<\/ul>'
patronMenu = r'href="?(?P<url>[^">]+)"?[^>]+>(?P<title>[^<»]+)' patronMenu = r'href="?(?P<url>[^">]+)"?>(?P<title>.*?)<\/a>'
action = 'peliculas' if 'genere' in item.args.lower():
patronGenreMenu = patronMenu
action = 'movies'
return locals() return locals()
def newest(categoria): def newest(category):
support.info(categoria) logger.debug(category)
item = support.Item() item = support.Item()
try: try:
if categoria == "series": if category == 'tvshow':
item.contentType = 'tvshow' item.contentType = 'tvshow'
item.url = host + '/serietv/' # aggiornamento-quotidiano-serie-tv/' item.url = host + '/serietv/' # aggiornamento-quotidiano-serie-tv/'
else: else:
item.contentType = 'movie' item.contentType = 'movie'
item.url = host + '/ultimi-100-film-aggiunti/' item.url = host + '/lista-film-ultimi-100-film-aggiunti/'
item.args = "newest" item.args = "newest"
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
@@ -76,12 +76,13 @@ def newest(categoria):
def search(item, text): def search(item, text):
logger.info("search", text)
logger.info("search", item, text)
if item.contentType == 'tvshow': item.url = host + '/serietv' if item.contentType == 'tvshow': item.url = host + '/serietv'
else: item.url = host else: item.url = host
try: try:
item.url = item.url + "/search/" + text.replace(' ', '+') item.url = item.url + "/search/" + text.replace(' ', '+')
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
@@ -92,8 +93,8 @@ def search(item, text):
@support.scrape @support.scrape
def peliculas(item): def movies(item):
#debug = True # debug = True
# esclusione degli articoli 'di servizio' # esclusione degli articoli 'di servizio'
# curYear = datetime.date.today().year # curYear = datetime.date.today().year
# blacklist = ['BENVENUTI', 'Richieste Serie TV', 'CB01.UNO &#x25b6; TROVA L&#8217;INDIRIZZO UFFICIALE ', # blacklist = ['BENVENUTI', 'Richieste Serie TV', 'CB01.UNO &#x25b6; TROVA L&#8217;INDIRIZZO UFFICIALE ',
@@ -103,25 +104,26 @@ def peliculas(item):
# 'Auguri di Buon Natale e Felice Anno Nuovo! &#8211; ' + str(curYear) + '!'] # 'Auguri di Buon Natale e Felice Anno Nuovo! &#8211; ' + str(curYear) + '!']
if 'newest' in item.args: if 'newest' in item.args:
pagination = '' pagination = True
patronBlock = r'sequex-page-left(?P<block>.*?)sequex-page-right' patronBlock = r'sequex-page-left(?P<block>.*?)sequex-page-right'
if '/serietv/' not in item.url: if '/serietv/' not in item.url:
patron = r'src="?(?P<thumb>[^ "]+)"? alt="?(?P<title>.*?)(?:\[(?P<quality>[a-zA-Z]+(?:[/]?3D)?)\]\s*)?(?:\[(?P<lang>Sub-ITA|ITA)\]\s*)?(?:\[(?P<quality2>[a-zA-Z]+(?:[/]?3D)?)\]\s*)?\((?P<year>\d{4})[^\)]*\)[^>]*>.*?<a href=(?:")?(?P<url>[^" ]+)(?:")?.*?rpwe-summary[^>]*>(?P<genre>\w+) [^ ]+ DURATA (?P<duration>[0-9]+)[^ ]+ [^ ]+ [A-Z ]+ (?P<plot>[^<]+)<' patron = r'src="?(?P<thumb>[^ "]+)"? alt="?(?P<title>.*?)(?:\[(?P<quality>[a-zA-Z/]+)\]\s*)?(?:\[(?P<lang>Sub-ITA|ITA)\]\s*)?(?:\[(?P<quality2>[a-zA-Z/]+)\]\s*)?\((?P<year>\d{4})[^\)]*\)[^>]*>.*?<a href=(?:")?(?P<url>[^" ]+)(?:")?.*?rpwe-summary[^>]*>(?P<genre>\w+) [^ ]+ DURATA (?P<duration>[0-9]+)[^ ]+ [^ ]+ [A-Z ]+ (?P<plot>[^<]+)<'
action = 'findvideos' action = 'findvideos'
else: else:
patron = r'src=(?:")?(?P<thumb>[^ "]+)(?:")? alt=(?:")?(?P<title>.*?)(?: &#8211; \d+&#215;\d+)?(?:>|"| &#8211; )(?:(?P<lang>Sub-ITA|ITA))?[^>]*>.*?<a href=(?:")?(?P<url>[^" ]+)(?:")?.*?rpwe-summary[^>]*>(?P<genre>[^\(]*)\((?P<year>\d{4})[^\)]*\) (?P<plot>[^<]+)<' patron = r'src=(?:")?(?P<thumb>[^ "]+)(?:")? alt=(?:")?(?P<title>.*?)(?: &#8211; \d+&#215;\d+)?(?:>|"| &#8211; )(?:(?P<lang>Sub-ITA|ITA))?[^>]*>.*?<a href=(?:")?(?P<url>[^" ]+)(?:")?.*?rpwe-summary[^>]*>(?P<genre>[^\(]*)\((?P<year>\d{4})[^\)]*\) (?P<plot>[^<]+)<'
action = 'episodios' action = 'episodes'
elif '/serietv/' not in item.url: elif '/serietv/' not in item.url:
patron = r'(?<!sticky )hentry.*?<div class="card-image">\s*<a[^>]+>\s*<img src="(?P<thumb>[^" ]+)" alt[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+><a href="?(?P<url>[^" >]+)(?:\/|"|\s+)>(?P<title>[^<[(]+)(?:\[(?P<quality>[a-zA-Z]+(?:[/]?3D)?)\]\s*)?(?:\[(?P<lang>Sub-ITA|ITA)\]\s*)?(?:\[(?P<quality2>[a-zA-Z/]+)\]\s*)? (?:\((?P<year>[0-9]{4})\))?[^>]+>[^>]+>[^>]+>[^>]+>(?P<genre>[^<>&‖“]+)(?:[^ ]+\s*DURATA\s*(?P<duration>[0-9]+)[^>]+>[^>]+>[^>]+>(?P<plot>[^<>]+))?' patron = r'(?<!sticky )hentry.*?<div class="card-image">\s*<a[^>]+>\s*<img src="(?P<thumb>[^" ]+)" alt[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+><a href="?(?P<url>[^" >]+)(?:\/|"|\s+)>(?P<title>[^<[(]+)(?:\[(?P<quality>[a-zA-Z/]+)\]\s*)?(?:\[(?P<lang>Sub-ITA|ITA)\]\s*)?(?:\[(?P<quality2>[a-zA-Z/]+)\]\s*)? (?:\((?P<year>[0-9]{4})\))?[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<genre>[^<>&‖“]+)(?:[^ ]+\s*DURATA\s*(?P<duration>[0-9]+)[^>]+>[^>]+>[^>]+>(?P<plot>[^<>]+))?'
action = 'findvideos' action = 'findvideos'
else: else:
patron = r'(?<!sticky )hentry.*?card-image[^>]*>\s*<a href=(?:")?(?P<url>[^" >]+)(?:")?\s*>\s*<img src=(?:")?(?P<thumb>[^" ]+)(?:")? alt="(?P<title>.*?)(?: &#8211; \d+&#215;\d+)?(?:"| &#8211; )(?:(?P<lang>Sub-ITA|ITA))?[^>]*>[^>]+>[^>]+>[^>]*>[^>]+>[^>]+>[^>]*>[^>]+>[^>]+>[^>]*>[^>]+>[^>]+>[^>]*>(?P<genre>[^\(]+)\((?P<year>\d{4})[^>]*>[^>]+>[^>]+>[^>]+>(?:<p>)?(?P<plot>[^<]+)' patron = r'(?<!sticky )hentry.*?card-image[^>]*>\s*<a href=(?:")?(?P<url>[^" >]+)(?:")?\s*>\s*<img src=(?:")?(?P<thumb>[^" ]+)(?:")? alt="(?P<title>.*?)(?: &#8211; \d+&#215;\d+)?(?:"| &#8211; )(?:(?P<lang>Sub-ITA|ITA))?[^>]*>[^>]+>[^>]+>[^>]*>[^>]+>[^>]+>[^>]*>[^>]+>[^>]+>[^>]*>[^>]+>[^>]+>[^>]*>(?P<genre>[^\(]+)\((?P<year>\d{4})[^>]*>[^>]+>[^>]+>[^>]+>(?:<p>)?(?P<plot>[^<]+)'
action = 'episodios' action = 'episodes'
item.contentType = 'tvshow' item.contentType = 'tvshow'
patronNext = '<a class="?page-link"? href="?([^>"]+)"?><i class="fa fa-angle-right">' patronNext = '<a class="?page-link"? href="?([^>"]+)"?><i class="fa fa-angle-right">'
patronTotalPages = '(\d+[\.]?\d+)</option>\s*</sele'
def itemHook(item): def itemHook(item):
if item.quality2: if item.quality2:
@@ -132,109 +134,117 @@ def peliculas(item):
return locals() return locals()
@support.scrape
def episodios(item): def episodes(item):
@support.scrape @support.scrape
def folder(item, url): def listed(item, data):
""" actLike = 'episodes'
Quando c'è un link ad una cartella contenente più stagioni disableAll = True
"""
if url:
data = support.match(url).data
actLike = 'episodios'
addVideolibrary = False
downloadEnabled = False
patron = r'<tr><td>(?P<title>[^<]+)<td><span [^>].+?><a [^>]+href="(?P<url>[^"]+)[^>]+>' patronBlock = r'(?P<block>sp-head[^>]+>\s*(?:STAGION[EI]\s*(?:(?:DA)?\s*[0-9]+\s*A)?\s*[0-9]+|MINISSERIE)(?::\s*PARTE\s*[0-9]+)? - (?P<lang>[^-<]+)(?:- (?P<quality>[^-<]+))?.*?<\/div>.*?)spdiv[^>]*>'
sceneTitle = True patron = r'(?:/>|<p>|<strong>)(?P<data>.*?(?P<episode>[0-9]+(?:&#215;|×)[0-9]+)\s*(?P<title2>.*?)?(?:\s*&#8211;|\s*-|\s*<).*?)(?:<\/p>|<br)'
# debug = True
def itemHook(item):
item.serieFolder = True
return item
return locals() return locals()
# debugBlock=True @support.scrape
def folder(item, data):
# Quando c'è un link ad una cartella contenente più stagioni
actLike = 'episodes'
disableAll = True
sceneTitle = True
folderUrl = scrapertools.find_single_match(data, r'TUTT[EA] L[EA] \w+\s+(?:&#8211;|-)\s+<a href="?([^" ]+)')
data = httptools.downloadpage(folderUrl, disable_directIP=True).data
patron = r'<td>(?P<title>[^<]+)<td><a [^>]+href="(?P<folderdata>[^"]+)[^>]+>'
return locals()
data = support.match(item.url, headers=headers).data data = support.match(item.url, headers=headers).data
folderItemlist = folder(item, scrapertools.find_single_match(data, r'TUTT[EA] L[EA] \w+\s+(?:&#8211;|-)\s+<a href="?([^" ]+)'))
patronBlock = r'(?P<block>sp-head[^>]+>\s*(?:STAGION[EI]\s*(?:(?:DA)?\s*[0-9]+\s*A)?\s*[0-9]+|MINISSERIE)(?::\s*PARTE\s*[0-9]+)? - (?P<lang>[^-<]+)(?:- (?P<quality>[^-<]+))?.*?<\/div>.*?)spdiv[^>]*>' itemlist = listed(item, data)
patron = r'(?:/>|<p>|<strong>)(?P<other>.*?(?P<episode>[0-9]+(?:&#215;|×)[0-9]+)\s*(?P<title2>.*?)?(?:\s*&#8211;|\s*-|\s*<).*?)(?:<\/p>|<br)' itemlist.extend(folder(item, data) if 'TUTTE LE' in data or 'TUTTA LA' in data else [])
def itemlistHook(itemlist):
title_dict = {}
itlist = []
for i in itemlist:
i.url = item.url
i.title = re.sub(r'\.(\D)',' \\1', i.title)
match = support.match(i.title, patron=r'(\d+.\d+)').match.replace('x','')
i.order = match
if match not in title_dict:
title_dict[match] = i
elif match in title_dict and i.contentLanguage == title_dict[match].contentLanguage \
or i.contentLanguage == 'ITA' and not title_dict[match].contentLanguage \
or title_dict[match].contentLanguage == 'ITA' and not i.contentLanguage:
title_dict[match].url = i.url
else:
title_dict[match + '1'] = i
for key, value in title_dict.items(): itemDict = {'ITA':{}, 'Sub-ITA':{}}
itlist.append(value) seasons = []
itlist = sorted(itlist, key=lambda it: (it.contentLanguage, int(it.order))) for it in itemlist:
it.contentType = 'episode'
if it.contentSeason and it.contentSeason not in seasons:
seasons.append(it.contentSeason)
itemDict['ITA'][it.contentSeason] = []
itemDict['Sub-ITA'][it.contentSeason] = []
if it.contentSeason:
if not it.contentLanguage: it.contentLanguage = 'ITA'
itemDict[it.contentLanguage][it.contentSeason].append(it)
itlist.extend(folderItemlist)
return itlist itlist = []
return locals() for season in sorted(seasons):
itlist.extend(sorted(itemDict['ITA'].get(season, []), key=lambda it: (it.contentSeason, it.contentEpisodeNumber)))
itlist.extend(sorted(itemDict['Sub-ITA'].get(season, []), key=lambda it: (it.contentSeason, it.contentEpisodeNumber)))
itemlist = itlist
if not support.stackCheck(['add_tvshow', 'get_episodes', 'update', 'find_episodes']):
if len(seasons) > 1:
itemlist = support.season_pagination(itemlist, item, [], 'episodes')
else:
itemlist = support.pagination(itemlist, item, 'episodes')
if config.getSetting('episode_info'):
support.tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
support.videolibrary(itemlist, item)
support.download(itemlist, item)
return itemlist
def findvideos(item): def findvideos(item):
if item.serieFolder:
return support.server(item, data=item.url)
if item.contentType == "episode":
return findvid_serie(item)
def load_links(itemlist, re_txt, desc_txt, quality=""):
streaming = scrapertools.find_single_match(data, re_txt).replace('"', '')
logger.debug('STREAMING=', streaming)
matches = support.match(streaming, patron = r'<td><a.*?href=([^ ]+) [^>]+>([^<]+)<').matches
for scrapedurl, scrapedtitle in matches:
logger.debug("##### findvideos %s ## %s ## %s ##" % (desc_txt, scrapedurl, scrapedtitle))
itemlist.append(item.clone(action="play", title=scrapedtitle, url=scrapedurl, server=scrapedtitle, quality=quality))
logger.debug() logger.debug()
if item.folderdata:
return support.server(item, data=item.folderdata)
elif item.data:
return support.server(item, data=re.sub(r'((?:<p>|<strong>)?[^\d]*\d*(?:&#215;|×)[0-9]+[^<]+)', '', item.data))
else:
itemlist = [] def load_links(itemlist, re_txt, desc_txt, quality=""):
streaming = scrapertools.find_single_match(data, re_txt).replace('"', '')
logger.debug('STREAMING', streaming)
logger.debug('STREAMING=', streaming)
matches = support.match(streaming, patron = r'<td><a.*?href=([^ ]+) [^>]+>([^<]+)<').matches
for scrapedurl, scrapedtitle in matches:
logger.debug("##### findvideos %s ## %s ## %s ##" % (desc_txt, scrapedurl, scrapedtitle))
itemlist.append(item.clone(action="play", title=scrapedtitle, url=scrapedurl, server=scrapedtitle, quality=quality))
# Carica la pagina logger.debug()
data = httptools.downloadpage(item.url).data
data = re.sub('\n|\t', '', data)
# Estrae i contenuti - Streaming itemlist = []
load_links(itemlist, '<strong>Streamin?g:</strong>(.*?)cbtable', "Streaming", "SD")
# Estrae i contenuti - Streaming HD # Carica la pagina
load_links(itemlist, '<strong>Streamin?g HD[^<]+</strong>(.*?)cbtable', "Streaming HD", "HD") data = httptools.downloadpage(item.url).data
data = re.sub('\n|\t', '', data)
# Estrae i contenuti - Streaming 3D # Estrae i contenuti - Streaming
load_links(itemlist, '<strong>Streamin?g 3D[^<]+</strong>(.*?)cbtable', "Streaming 3D") load_links(itemlist, '<strong>Streamin?g:</strong>(.*?)cbtable', "Streaming", "SD")
# Extract the quality format # Estrae i contenuti - Streaming HD
patronvideos = r'([\w.]+)</strong></div></td>' load_links(itemlist, '<strong>Streamin?g HD[^<]+</strong>(.*?)cbtable', "Streaming HD", "HD")
return support.server(item, itemlist=itemlist, patronTag=patronvideos)
# Estrae i contenuti - Download # Estrae i contenuti - Streaming 3D
# load_links(itemlist, '<strong>Download:</strong>(.*?)<tableclass=cbtable height=30>', "aqua", "Download") load_links(itemlist, '<strong>Streamin?g 3D[^<]+</strong>(.*?)cbtable', "Streaming 3D")
# Estrae i contenuti - Download HD itemlist = support.server(item, itemlist=itemlist)
# load_links(itemlist, '<strong>Download HD[^<]+</strong>(.*?)<tableclass=cbtable width=100% height=20>', "azure", "Download HD") # Extract the quality format
patronvideos = r'([\w.]+)</strong></div></td>'
support.addQualityTag(item, itemlist, data, patronvideos)
return itemlist
def findvid_serie(item): # Estrae i contenuti - Download
logger.debug() # load_links(itemlist, '<strong>Download:</strong>(.*?)<tableclass=cbtable height=30>', "aqua", "Download")
data = re.sub(r'((?:<p>|<strong>)?[^\d]*\d*(?:&#215;|×)[0-9]+[^<]+)', '', item.other)
return support.server(item, data=data) # Estrae i contenuti - Download HD
# load_links(itemlist, '<strong>Download HD[^<]+</strong>(.*?)<tableclass=cbtable width=100% height=20>', "azure", "Download HD")
def play(item): def play(item):

4
channels/cinemalibero.json Executable file → Normal file
View File

@@ -2,10 +2,10 @@
"id": "cinemalibero", "id": "cinemalibero",
"name": "Cinemalibero", "name": "Cinemalibero",
"language": ["ita"], "language": ["ita"],
"active": false, "active": true,
"thumbnail": "cinemalibero.png", "thumbnail": "cinemalibero.png",
"banner": "cinemalibero.png", "banner": "cinemalibero.png",
"categories": ["movie","tvshow","anime"], "categories": ["movie","tvshow","anime"],
"not_active": ["include_in_newest_anime", "include_in_newest_peliculas"], "not_active": ["include_in_newest_anime", "include_in_newest_movie"],
"settings": [] "settings": []
} }

208
channels/cinemalibero.py Executable file → Normal file
View File

@@ -7,15 +7,8 @@ import re
from core import httptools, support, scrapertools from core import httptools, support, scrapertools
from core.item import Item from core.item import Item
from core.support import typo
from platformcode import config, logger from platformcode import config, logger
import sys
from platformcode.logger import debug
if sys.version_info[0] >= 3:
from concurrent import futures
else:
from concurrent_py2 import futures
# rimanda a .today che contiene tutti link a .plus # rimanda a .today che contiene tutti link a .plus
# def findhost(url): # def findhost(url):
@@ -36,15 +29,15 @@ headers = [['Referer', host]]
def mainlist(item): def mainlist(item):
film = ['/category/film/', film = ['/category/film/',
('Novità', ['', 'peliculas', 'update']), ('Novità', ['', 'movies', 'update']),
('Generi', ['', 'genres'])] ('Generi', ['', 'genres'])]
tvshow = ['/category/serie-tv/'] tvshow = ['/category/serie-tv/']
anime = ['/category/anime-giapponesi/'] anime = ['/category/anime-giapponesi/']
## Sport = [(support.typo('Sport', 'bullet bold'), ['/category/sport/', 'peliculas', 'sport', 'tvshow'])] ## Sport = [(support.typo('Sport', 'bullet bold'), ['/category/sport/', 'movies', 'sport', 'tvshow'])]
news = [('Ultimi episodi Serie/Anime', ['/aggiornamenti-serie-tv/', 'peliculas', 'update', 'tvshow'])] news = [('Ultimi episodi Serie/Anime', ['/aggiornamenti-serie-tv/', 'movies', 'update', 'tvshow'])]
search = '' search = ''
@@ -52,24 +45,22 @@ def mainlist(item):
@support.scrape @support.scrape
def peliculas(item): def movies(item):
# debug = True # debug = True
action = 'check' action = 'check'
patronBlock = r'<div class="container">.*?class="col-md-12[^"]*?">(?P<block>.*?)<div class=(?:"container"|"bg-dark ")>' patronBlock = r'<div class="container">.*?class="col-md-12[^"]*?">(?P<block>.*?)<div class=(?:"container"|"bg-dark ")>'
if item.args == 'newest': if item.args == 'newest':
patron = r'<div class="col-lg-3">[^>]+>[^>]+>\s<a href="(?P<url>[^"]+)".+?url\((?P<thumb>[^\)]+)\)">[^>]+>(?P<title>[^<]+)<[^>]+>[^>]+>(?:[^>]+>)?\s?(?P<rating>[\d\.]+)?[^>]+>.+?(?:[ ]\((?P<year>\d{4})\))?<[^>]+>[^>]+>(.?[\d\-x]+\s\(?(?P<lang>[sSuUbBiItTaA\-]+)?\)?\s?(?P<quality>[\w]+)?[|]?\s?(?:[fFiInNeE]+)?\s?\(?(?P<lang2>[sSuUbBiItTaA\-]+)?\)?)?' patron = r'<div class="col-lg-3">[^>]+>[^>]+>\s<a href="(?P<url>[^"]+)".+?url\((?P<thumb>[^\)]+)\)">[^>]+>(?P<title>[^<]+)<[^>]+>[^>]+>(?:[^>]+>)?\s?(?P<rating>[\d\.]+)?[^>]+>.+?(?:[ ]\((?P<year>\d{4})\))?<[^>]+>[^>]+>(.?[\d\-x]+\s\(?(?P<lang>[sSuUbBiItTaA\-]+)?\)?\s?(?P<quality>[\w]+)?[|]?\s?(?:[fFiInNeE]+)?\s?\(?(?P<lang2>[sSuUbBiItTaA\-]+)?\)?)?'
pagination = 25 pagination = True
elif item.contentType == 'movie': elif item.contentType == 'movie':
# action = 'findvideos' patron = r'<a href="(?P<url>[^"]+)" title="(?P<title>.+?)(?:[ ]\[(?P<lang>[sSuUbB\-iItTaA]+)\])?(?:[ ]\((?P<year>\d{4})\))?"\s*alt="[^"]+"\s*class="[^"]+"(?: style="background-image: url\((?P<thumb>.+?)\)">)?\s*<div class="voto">[^>]+>[^>]+>.(?P<rating>[\d\.a-zA-Z\/]+)?[^>]+>[^>]+>[^>]+>(?:<div class="genere">(?P<quality>[^<]+)</div>)?'
patron = r'<a href="(?P<url>[^"]+)" title="(?P<title>.+?)(?:[ ]\[(?P<lang>[sSuUbB\-iItTaA]+)\])?(?:[ ]\((?P<year>\d{4})?\))?"\s*alt="[^"]+"\s*class="[^"]+"(?: style="background-image: url\((?P<thumb>.+?)\)">)?\s*<div class="voto">[^>]+>[^>]+>.(?P<rating>[\d\.a-zA-Z\/]+)?[^>]+>[^>]+>[^>]+>(?:<div class="genere">(?P<quality>[^<]+)</div>)?'
if item.args == 'update': if item.args == 'update':
patronBlock = r'<section id="slider">(?P<block>.*?)</section>' patronBlock = r'<section id="slider">(?P<block>.*?)</section>'
patron = r'<a href="(?P<url>(?:https:\/\/.+?\/(?P<title>[^\/]+[a-zA-Z0-9\-]+)(?P<year>\d{4})?))/".+?url\((?P<thumb>[^\)]+)\)">' patron = r'<a href="(?P<url>(?:https:\/\/.+?\/(?P<title>[^\/]+[a-zA-Z0-9\-]+)(?P<year>\d{4})))/".+?url\((?P<thumb>[^\)]+)\)">'
elif item.contentType == 'tvshow': elif item.contentType == 'tvshow':
# action = 'episodios'
if item.args == 'update': if item.args == 'update':
patron = r'<a href="(?P<url>[^"]+)"[^<]+?url\((?P<thumb>.+?)\)">\s*?<div class="titolo">(?P<title>.+?)(?: &#8211; Serie TV)?(?:\([sSuUbBiItTaA\-]+\))?[ ]?(?P<year>\d{4})?</div>\s*?(?:<div class="genere">)?(?:[\w]+?\.?\s?[\s|S]?[\dx\-S]+?\s\(?(?P<lang>[iItTaA]+|[sSuUbBiItTaA\-]+)\)?\s?(?P<quality>[HD]+)?|.+?\(?(?P<lang2>[sSuUbBiItTaA\-]+)?\)?</div>)' patron = r'<a href="(?P<url>[^"]+)"[^<]+?url\((?P<thumb>.+?)\)">\s*?<div class="titolo">(?P<title>.+?)(?: &#8211; Serie TV)?(?:\([sSuUbBiItTaA\-]+\))?[ ]?(?P<year>\d{4})?</div>\s*?(?:<div class="genere">)?(?:[\w]+?\.?\s?[\s|S]?[\dx\-S]+?\s\(?(?P<lang>[iItTaA]+|[sSuUbBiItTaA\-]+)\)?\s?(?P<quality>[HD]+)?|.+?\(?(?P<lang2>[sSuUbBiItTaA\-]+)?\)?</div>)'
pagination = 25 pagination = True
else: else:
patron = r'<a href="(?P<url>[^"]+)"\s*title="(?P<title>[^"\(]+)(?:"|\()(?:(?P<year>\d+)[^"]+)?.*?url\((?P<thumb>[^\)]+)\)(?:.*?<div class="voto">[^>]+>[^>]+>\s*(?P<rating>[^<]+))?.*?<div class="titolo">[^>]+>(?:<div class="genere">[^ ]*(?:\s\d+)?\s*(?:\()?(?P<lang>[^\)< ]+))?' patron = r'<a href="(?P<url>[^"]+)"\s*title="(?P<title>[^"\(]+)(?:"|\()(?:(?P<year>\d+)[^"]+)?.*?url\((?P<thumb>[^\)]+)\)(?:.*?<div class="voto">[^>]+>[^>]+>\s*(?P<rating>[^<]+))?.*?<div class="titolo">[^>]+>(?:<div class="genere">[^ ]*(?:\s\d+)?\s*(?:\()?(?P<lang>[^\)< ]+))?'
else: else:
@@ -86,8 +77,8 @@ def peliculas(item):
item.title += support.typo(item.lang2, '_ [] color kod') item.title += support.typo(item.lang2, '_ [] color kod')
if item.args == 'update': if item.args == 'update':
item.title = item.title.replace('-', ' ') item.title = item.title.replace('-', ' ')
# if item.args == 'search': if item.args == 'search':
# item.contentType = 'tvshow' if 'serie-' in item.url else 'movie' item.contentType = 'undefined'
return item return item
@@ -95,97 +86,50 @@ def peliculas(item):
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodes(item):
data = item.data data=item.data
# debug=True # debug=True
if item.args == 'anime': if item.args == 'anime':
logger.debug("Anime :", item) logger.debug("Anime :", item)
patron = r'<a target=(?P<url>[^>]+>(?P<title>Episodio\s(?P<episode>\d+))(?::)?(?:(?P<title2>[^<]+))?.*?(?:<br|</p))|(?P<data>.+)' # blacklist = ['Clipwatching', 'Verystream', 'Easybytez', 'Flix555', 'Cloudvideo']
patron = r'<a target=(?P<url>[^>]+>(?P<title>Episodio\s(?P<episode>\d+))(?::)?(?:(?P<title2>[^<]+))?.*?(?:<br|</p))'
patronBlock = r'(?:Stagione (?P<season>\d+))?(?:</span><br />|</span></p>|strong></p>)(?P<block>.*?)(?:<div style="margin-left|<span class="txt_dow">)' patronBlock = r'(?:Stagione (?P<season>\d+))?(?:</span><br />|</span></p>|strong></p>)(?P<block>.*?)(?:<div style="margin-left|<span class="txt_dow">)'
item.contentType = 'tvshow' # item.contentType = 'tvshow'
elif item.args == 'sport': elif item.args == 'serie':
logger.debug("Sport :", item)
patron = r'(?:/>|<p>)\s*(?P<title>[^-]+)-(?P<data>.+?)(?:<br|</p)'
patronBlock = r'</strong>\s*</p>(?P<block>.*?</p>)'
item.contentType = 'tvshow'
elif item.args == 'serie' or item.contentType == 'tvshow':
logger.debug("Serie :", item) logger.debug("Serie :", item)
patron = r'(?:/>|<p>)\s*(?:(?P<episode>\d+(?:x|×|&#215;)\d+|Puntata \d+)(?:-(?P<episode2>\d+))?[;]?[ ]?(?P<title>[^<-]+))?(?P<data>.*?)(?:<br|</p)' patron = r'(?:>| )(?P<episode>\d+(?:x|×|&#215;)\d+)[;]?[ ]?(?:(?P<title>[^<-]+)(?P<data>.*?)|(\2[ ])(?:<(\3.*?)))(?:</a><br /|</a></p|$)'
patronBlock = r'Stagione\s(?:[Uu]nica)?(?:(?P<lang>iTA|ITA|Sub-ITA|Sub-iTA))?.*?</strong>(?P<block>.+?)(?:strong>|<div class="at-below)' patronBlock = r'>(?:[^<]+[Ss]tagione\s|[Ss]tagione [Uu]nica)(?:(?P<lang>iTA|ITA|Sub-ITA|Sub-iTA))?.*?</strong>(?P<block>.+?)(?:<strong|<div class="at-below)'
item.contentType = 'tvshow' # item.contentType = 'tvshow'
else: else:
patron = r'(?P<title>\s*[0-9]{2}/[0-9]{2}/[0-9]{4})(?P<data>.*?)(?:<br|</p)' patron = r'(?P<title>\s*[0-9]{2}/[0-9]{2}/[0-9]{4})(?P<data>.*?)(?:<br|</p)'
def itemHook(it): def itemHook(item):
if not scrapertools.find_single_match(it.title, r'(\d+x\d+)'): if not scrapertools.find_single_match(item.title, r'(\d+x\d+)'):
it.title = re.sub(r'(\d+) -', '1x\\1', it.title) item.title = re.sub(r'(\d+) -', '1x\\1', item.title)
return it return item
def itemlistHook(itl):
ret = []
if item.args == 'sport':
return itl
# support.dbg()
for it in itl:
ep = scrapertools.find_single_match(it.title, r'(\d+x\d+)')
if not ep and 'http' in it.data: # stagione intera
# from lib import unshortenit
# data = unshortenit.findlinks(it.data)
episodes = {}
def get_ep(s):
srv_mod = __import__('servers.%s' % s.server, None, None, ["servers.%s" % s.server])
if hasattr(srv_mod, 'get_filename'):
title = srv_mod.get_filename(s.url)
if item.args == 'anime':
ep = title
else:
ep = scrapertools.get_season_and_episode(title)
if ep:
if ep not in episodes:
episodes[ep] = []
episodes[ep].append(s)
servers = support.server(item, it.data, CheckLinks=False, Download=False, Videolibrary=False)
# for s in servers:
# get_ep(s)
# ottengo l'episodio dal nome del file
with futures.ThreadPoolExecutor() as executor:
for s in servers:
executor.submit(get_ep, s)
# logger.debug(it.contentLanguage)
if item.args != 'anime':
for ep in episodes:
ret.append(it.clone(title=typo(ep, 'bold') + typo(it.contentLanguage, '_ [] color kod bold'),
servers=[srv.tourl() for srv in episodes[ep]], contentSeason=int(ep.split('x')[0]), contentEpisodeNumber=int(ep.split('x')[1])))
else:
ret.extend([it.clone(title=typo(ep, 'bold') + typo(it.contentLanguage, '_ [] color kod bold'),
servers=[srv.tourl() for srv in episodes[ep]]) for ep in episodes])
elif ep:
ret.append(it)
return sorted(ret, key=lambda i: i.title)
return locals() return locals()
@support.scrape @support.scrape
def genres(item): def genres(item):
action='peliculas'
action='movies'
patron_block=r'<div id="bordobar" class="dropdown-menu(?P<block>.*?)</li>' patron_block=r'<div id="bordobar" class="dropdown-menu(?P<block>.*?)</li>'
patronMenu=r'<a class="dropdown-item" href="(?P<url>[^"]+)" title="(?P<title>[A-z]+)"' patronGenreMenu=r'<a class="dropdown-item" href="(?P<url>[^"]+)" title="(?P<title>[A-z]+)"'
return locals() return locals()
def search(item, texto): def search(item, texto):
logger.debug(item.url,texto) logger.debug(item.url,texto)
item.contentType = 'undefined'
texto = texto.replace(' ', '+') texto = texto.replace(' ', '+')
item.url = host + "/?s=" + texto item.url = host + "/?s=" + texto
# item.contentType = 'tv' # item.contentType = 'tv'
item.args = 'search' item.args = 'search'
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
@@ -193,19 +137,18 @@ def search(item, texto):
logger.error("%s" % line) logger.error("%s" % line)
return [] return []
def newest(category):
def newest(categoria): logger.debug('newest ->', category)
logger.debug('newest ->', categoria)
itemlist = [] itemlist = []
item = Item() item = Item()
item.args = 'newest' item.args = 'newest'
try: try:
if categoria == 'series' or categoria == 'anime': if category == 'tvshow' or category == 'anime':
item.args = 'update' item.args = 'update'
item.url = host+'/aggiornamenti-serie-tv/' item.url = host+'/aggiornamenti-serie-tv/'
item.contentType = 'tvshow' item.contentType = 'tvshow'
item.action = 'peliculas' item.action = 'movies'
itemlist = peliculas(item) itemlist = movies(item)
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
@@ -216,77 +159,40 @@ def newest(categoria):
def check(item): def check(item):
logger.debug()
data = support.match(item.url, headers=headers).data data = support.match(item.url, headers=headers).data
if data: if data:
ck = str(support.match(data, patronBlock=r'Genere:(.*?)</span>', patron=r'tag">([^<]+)').matches).lower() ck = support.match(data, patron=r'Supportaci condividendo quest[oa] ([^:]+)').match.lower()
if 'serie tv' in ck or 'anime' in ck or 'wrestling wwe' in ck :# in ['serie tv', 'wrestling wwe', 'anime']: if ck == 'serie tv':
if 'anime' in ck:
item.args = 'anime'
elif 'sport' in ck or 'wrestling' in ck:
item.args = 'sport'
else:
item.args = 'serie'
item.contentType = 'tvshow' item.contentType = 'tvshow'
item.args = 'serie'
item.data = data item.data = data
itemlist = episodios(item) return episodes(item)
if not itemlist:
item.data = data elif ck == 'anime':
return findvideos(item) item.contentType = 'tvshow'
else: item.args = 'anime'
item.data = data
return episodes(item)
elif ck == 'film':
item.contentType = 'movie' item.contentType = 'movie'
item.data = data item.data = data
# item.action = 'findvideos'
return findvideos(item) return findvideos(item)
return itemlist else:
item.contentType = 'tvshow'
item.data = data
itemlist = episodes(item)
if not itemlist:
item.contentType = 'movie'
item.data = data
return findvideos(item)
return itemlist
def findvideos(item): def findvideos(item):
def filter_ep(s):
srv_mod = __import__('servers.%s' % s.server, None, None, ["servers.%s" % s.server])
if hasattr(srv_mod, 'get_filename'):
title = srv_mod.get_filename(s.url)
# support.dbg()
if scrapertools.get_season_and_episode(title) == str(item.contentSeason) + "x" + str(
item.contentEpisodeNumber).zfill(2):
servers.append(s)
logger.debug() logger.debug()
# support.dbg() item.data = item.data.replace('http://rapidcrypt.net/verys/', '').replace('http://rapidcrypt.net/open/', '') #blocca la ricerca
if item.servers: return support.server(item, data=item.data)
return support.server(item, itemlist=[Item().fromurl(s) for s in item.servers])
if not item.data:
item.data = httptools.downloadpage(item.url)
data = scrapertools.find_single_match(item.data, '<div class="at-above-post addthis_tool"(.*?)(?:<div class="at-below-post|[dD][oO][wW][nN][lL][oO][aA][dD])')
if data:
item.data = data
servers = []
# if item.args == 'anime':
# if item.urls: # this is a episode
# return support.server(item, itemlist=[Item(url=support.unshortenit.FileCrypt().unshorten(u)) for u in item.urls])
# itemlist = []
# episodes = {}
# for uri in support.unshortenit.FileCrypt().find(item.data):
# for ep in support.unshortenit.FileCrypt(uri).list_files():
# ep = ('.'.join(ep[0].split('.')[:-1]), ep[1]) # remove extension
# if not ep[0] in episodes:
# episodes[ep[0]] = []
# episodes[ep[0]].append(ep[1])
# for ep in episodes.keys():
# itemlist.append(item.clone(title=ep, urls=episodes[ep], action='findvideos', data=''))
# return itemlist
total_servers = support.server(item, data=item.data)
if item.contentType == 'episode' and len(set([srv.server for srv in total_servers])) < len([srv.server for srv in total_servers]):
# i link contengono più puntate, cerco quindi quella selezionata
with futures.ThreadPoolExecutor() as executor:
for s in total_servers:
if s.server:
executor.submit(filter_ep, s)
else:
servers.append(s)
return servers
else:
return total_servers

2
channels/cinetecadibologna.json Executable file → Normal file
View File

@@ -6,6 +6,6 @@
"thumbnail": "cinetecadibologna.png", "thumbnail": "cinetecadibologna.png",
"banner": "cinetecadibologna.png", "banner": "cinetecadibologna.png",
"categories": ["documentary"], "categories": ["documentary"],
"not_active":["include_in_newest_peliculas", "include_in_newest_series", "include_in_newest_anime", "include_in_global_search"], "not_active":["include_in_newest_movie", "include_in_newest_tvshow", "include_in_newest_anime"],
"settings": [] "settings": []
} }

16
channels/cinetecadibologna.py Executable file → Normal file
View File

@@ -2,9 +2,9 @@
# ------------------------------------------------------------ # ------------------------------------------------------------
# Canale per cinetecadibologna # Canale per cinetecadibologna
# ------------------------------------------------------------ # ------------------------------------------------------------
from core.item import Item
from core import support from core import support
from platformcode import logger
host = support.config.get_channel_url() host = support.config.get_channel_url()
@@ -22,7 +22,7 @@ def mainlist(item):
@support.scrape @support.scrape
def menu(item): def menu(item):
action = 'peliculas' action = 'movies'
if 'epoche' in item.url: if 'epoche' in item.url:
patronMenu =r'<li>\s*<a href="(?P<url>[^"]+)">(?P<title>[^>]+)<' patronMenu =r'<li>\s*<a href="(?P<url>[^"]+)">(?P<title>[^>]+)<'
elif 'percorsi' in item.url: elif 'percorsi' in item.url:
@@ -34,23 +34,23 @@ def menu(item):
def search(item, text): def search(item, text):
support.info(text) logger.debug(text)
item.args = 'noorder' item.args = 'noorder'
item.url = host + '/ricerca/type_ALL/ricerca_' + text item.url = host + '/ricerca/type_ALL/ricerca_' + text
item.contentType = 'movie' item.contentType = 'movie'
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("%s" % line) logger.error("%s" % line)
return [] return []
@support.scrape @support.scrape
def peliculas(item): def movies(item):
if 'alfabetico' in item.url: if 'alfabetico' in item.url:
patron = r'<img src="(?P<thumb>[^"]+)"[^>]+>\s*[^>]+>\s*<div[^>]+>\s*<div[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>(?:\[)?(?P<title>[^\]<]+)(?:\]|<)' patron = r'<img src="(?P<thumb>[^"]+)"[^>]+>\s*[^>]+>\s*<div[^>]+>\s*<div[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>(?:\[)?(?P<title>[^\]<]+)(?:\]|<)'
else: else:
@@ -62,13 +62,13 @@ def peliculas(item):
def findvideos(item): def findvideos(item):
support.info() logger.debug()
itemlist = [] itemlist = []
matches = support.match(item, patron=r'filename: "(.*?)"').matches matches = support.match(item, patron=r'filename: "(.*?)"').matches
for url in matches: for url in matches:
itemlist.append(item.clone(action="play", title=support.config.get_localized_string(30137), server='directo', url=host + url)) itemlist.append(item.clone(action="play", title=support.config.getLocalizedString(30137), server='directo', url=host + url))
return support.server(item, itemlist=itemlist) return support.server(item, itemlist=itemlist)

View File

@@ -1,11 +0,0 @@
{
"id": "dinostreaming",
"name": "DinoStreaming",
"language": ["ita"],
"active": true,
"thumbnail": "dinostreaming.png",
"banner": "dinostreaming.png",
"categories": ["movie"],
"settings": [],
"not_active": ["include_in_newest"]
}

View File

@@ -1,77 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per Dinostreaming
# by ilmich
# ------------------------------------------------------------
from core import httptools, support
from core.item import Item
from platformcode import logger
host = support.config.get_channel_url()
headers = [['Referer', host]]
@support.menu
def mainlist(item):
film = [('Film al cinema',['/film-category/al-cinema/', 'peliculas']),
('Generi',['', 'genres']),
]
search = ''
return locals()
@support.scrape
def genres(item):
action = 'peliculas'
blacklist = ['Seguici su Telegram',]
patronMenu = r'<li class="elementor-icon-list-item">.*?href="(?P<url>.*?)".*?text">(?P<title>.*?)</span>'
return locals()
@support.scrape
def peliculas(item):
if not item.args == 'search': # pagination not works
if not item.nextpage:
item.page = 1
else:
item.page = item.nextpage
if not item.parent_url:
item.parent_url = item.url
item.nextpage = item.page + 1
nextPageUrl = "{}/page/{}".format(item.parent_url, item.nextpage)
resp = httptools.downloadpage(nextPageUrl, only_headers = True)
if (resp.code > 399): # no more elements
nextPageUrl = ''
patron = r'<div data-elementor-type="loop-item".*?<a.*?url="(?P<thumb>[^"]+).*?<a href=\"(?P<url>[^"]+)\">(?P<title>.*?)</a>.*?<span class="elementor-heading-title elementor-size-default">(?P<year>.*?)</span>'
def itemlistHook(itemlist):
return itemlist[:-1:]
return locals()
def search(item, text):
item.url = "{}/?{}".format(host, support.urlencode({'s': text}))
item.args = 'search'
try:
return peliculas(item)
except:
import sys
for line in sys.exc_info():
logger.error("search except: %s" % line)
return []
def findvideos(item):
support.info()
data = httptools.downloadpage(item.url).data
video_url = support.match(data, patron=r'<a href="([^"]+)" rel="nofollow" title="Guarda il film in streaming">' ).match
if (video_url == ''):
return []
item.url = video_url
itemlist = support.server(item)
return itemlist

0
channels/discoveryplus.json Executable file → Normal file
View File

349
channels/discoveryplus.py Executable file → Normal file
View File

@@ -2,34 +2,30 @@
# ------------------------------------------------------------ # ------------------------------------------------------------
# Canale per Rai Play # Canale per Rai Play
# ------------------------------------------------------------ # ------------------------------------------------------------
import functools
import requests, uuid import requests
from core import jsontools, support, httptools from core import support
from platformcode import logger, config from platformcode import logger
typo = support.typo
session = requests.Session() session = requests.Session()
session.request = functools.partial(session.request, timeout=httptools.HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT)
host = support.config.get_channel_url() host = support.config.get_channel_url()
deviceId = uuid.uuid4().hex
# domain = 'https://eu1-prod-direct.discoveryplus.com' token = session.get('https://disco-api.discoveryplus.it/token?realm=dplayit').json()['data']['attributes']['token']
domain = 'https://' + session.get("https://prod-realmservice.mercury.dnitv.com/realm-config/www.discoveryplus.com%2Fit%2Fepg").json()["domain"]
token = session.get('{}/token?deviceId={}&realm=dplay&shortlived=true'.format(domain, deviceId)).json()['data']['attributes']['token'] api = "https://disco-api.discoveryplus.it"
session.headers = {'User-Agent': httptools.get_user_agent(), #'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0', headers = {'User-Agent': 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0',
'Referer': host, 'Referer': host,
'Origin': host, 'Cookie' : 'st=' + token}
'Cookie': 'st={}'.format(token),
'content-type': 'application/json', def Dict(item):
'x-disco-client': 'WEB:UNKNOWN:dplus_us:2.46.0', global pdict
'x-disco-params': 'realm=dplay,siteLookupKey=dplus_it'} pdict = session.get(api + '/cms/routes/{}?decorators=viewingHistory&include=default'.format(item.args), headers=headers).json()['included']
@support.menu @support.menu
def mainlist(item): def mainlist(item):
top = [('Dirette {bold}', ['', 'live']), top = [('Dirette {bullet bold}', ['', 'live']),
('Programmi {bullet bold tv}', ['', 'programs', 'programmi'])] ('Programmi {bullet bold tv}', ['', 'movies', 'programmi']),
('Generi {bullet bold tv}', ['', 'genres'])]
search = '' search = ''
@@ -38,243 +34,158 @@ def mainlist(item):
def search(item, text): def search(item, text):
itemlist = [] itemlist = []
item.args = 'search'
item.text = text item.text = text
try: try:
itemlist = peliculas(item) itemlist = movies(item)
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
logger.error(line) logger.error("%s" % line)
return itemlist return itemlist
def live(item): def live(item):
logger.debug() logger.debug()
itemlist =[] itemlist =[]
# data = session.get(domain + '/cms/routes/epg?include=default').json()['included'] for key in session.get(api + '/cms/routes/canali?decorators=viewingHistory&include=default', headers=headers).json()['included']:
data = session.get(domain + '/cms/routes/home?include=default&decorators=playbackAllowed').json()['included']
for key in data:
if key['type'] == 'channel' and key.get('attributes',{}).get('hasLiveStream', '') and 'Free' in key.get('attributes',{}).get('packages', []): if key['type'] == 'channel' and key.get('attributes',{}).get('hasLiveStream', '') and 'Free' in key.get('attributes',{}).get('packages', []):
itemlist.append(item.clone(title = typo(key['attributes']['name'], 'bold'), title = key['attributes']['name']
fulltitle = key['attributes']['name'], plot = key['attributes']['description']
plot = key['attributes'].get('description', ''), url = '{}/canali/{}'.format(host, key['attributes']['alternateId'])
url = "{}/canali/{}".format(host, key['attributes']['alternateId']), _id = key['id']
id = key['id'],
action = 'findvideos'))
return support.thumb(itemlist, live=True)
itemlist.append(item.clone(title=title, fulltitle=title, plot=plot, url=url, id=_id, action='findvideos', forcethumb=True))
def programs(item): return support.thumb(itemlist, mode='live')
logger.debug()
itemlist = []
data = session.get(domain + '/cms/routes/browse?include=default').json()['included']
images = {key['id'] : key['attributes']['src'] for key in data if key['type'] == 'image'}
channels = {}
for key in data:
if key['type'] == 'link' and 'Free' in key['attributes']['packages']:
logger.debug(jsontools.dump(key))
_title = key['attributes'].get('title', key['attributes'].get('name',''))
_id = key['relationships']['linkedContent']['data']['id']
_thumb = images.get(key['relationships'].get('images', {}).get('data',[{}])[0].get('id'))
channels[_title] ={'id':_id, 'thumb':_thumb}
itemlist = [item.clone(title='Tutti', id=channels['Tutti']['id'], action='peliculas'),
item.clone(title='Generi', id=channels['Tutti']['id'], action='genres'),
item.clone(title='Per canale', channels=channels, action='channels')]
return support.thumb(itemlist)
def genres(item): def genres(item):
logger.debug() item.action = 'movies'
itemlist = [
itemlist = [] item.clone(title='Attualità e inchiesta', args='genere/attualita-e-inchiesta'),
data = session.get('{}/cms/collections/{}?include=default'. format(domain, item.id)).json()['included'] item.clone(title='Beauty and style', args='genere/beauty-and-style'),
collection = {k['id']: k['relationships'].get('show', k['relationships'].get('collection'))['data']['id'] for k in data if k['type'] == 'collectionItem'} item.clone(title='Serie TV', args='genere/serie-tv'),
item.clone(title='Casa', args='genere/casa'),
included = {} item.clone(title='Comedy', args='genere/comedy'),
for key in data: item.clone(title='Crime', args='genere/crime'),
if key.get('relationships', {}).get('items') and key['type'] == 'collection' and key['attributes']['title'] not in ['A-Z', 'I più visti']: item.clone(title='Documentari', args='genere/documentari'),
included[key['attributes']['title']] = [k['id'] for k in key['relationships']['items']['data']] # item.clone(title='Discovery + Originals', args='genere/discoveryplus-original'),
item.clone(title='Food', args='genere/food'),
for title, values in included.items(): item.clone(title='Medical', args='genere/medical'),
itemlist.append(item.clone(title=title, action='peliculas', filter=[collection[k] for k in values])) item.clone(title='Motori', args='genere/motori'),
item.clone(title='Natura', args='genere/natura'),
itemlist.sort(key=lambda it: it.title) item.clone(title='Paranormal', args='genere/paranormal'),
item.clone(title='People', args='genere/people'),
return support.thumb(itemlist, genre=True) item.clone(title='Real Adventure', args='genere/real-adventure'),
item.clone(title='Real Life', args='genere/real-life'),
item.clone(title='Scienza e Spazio', args='genere/scienza-e-spazio'),
def channels(item): item.clone(title='Sex and love', args='genere/sex-and-love'),
logger.debug() item.clone(title='Sport', args='genere/sport'),
item.clone(title='Talent Show', args='genere/talent-show'),
itemlist = [item.clone(title=k, id=v['id'], thumbnail=v['thumb'], action='peliculas') for k, v in item.channels.items() if k !='Tutti'] ]
itemlist.sort(key=lambda it: it.title)
return itemlist return itemlist
def peliculas(item): def movies(item):
logger.debug() logger.debug()
itemlist =[] itemlist =[]
if 'search' in item.args:
if item.text: pdict = session.get('{}/content/shows?include=genres,images,primaryChannel.images,contentPackages&page[size]=12&query={}'.format(api, item.text), headers=headers).json()['data']
data = session.get('{}/cms/routes/search/result?include=default&contentFilter[query]={}'.format(domain, item.text)).json()['included']
else: else:
data = session.get('{}/cms/collections/{}?include=default'.format(domain, item.id)).json()['included'] pdict = session.get('{}/cms/routes/{}?decorators=viewingHistory&include=default'.format(api, item.args), headers=headers).json()['included']
images = list(filter(lambda x: x['type'] == 'image', pdict))
images = {key['id'] : key['attributes']['src'] for key in data if key['type'] == 'image'} for key in pdict:
if key['type'] == 'show' and 'Free' in str(key.get('relationships',{}).get('contentPackages',{}).get('data',[])):
for key in data: title = key['attributes']['name']
if key['type'] == 'show' and 'Free' in str(key.get('relationships',{}).get('contentPackages',{}).get('data',[])) and key['attributes']['episodeCount']: plot = key['attributes'].get('description','')
url = '{}/programmi/{}'.format(host, key['attributes']['alternateId'])
if item.filter and key['id'] not in item.filter: seasons = key['attributes']['seasonNumbers']
continue thumbs = [image['attributes']['src'] for image in images if image['id'] == key['relationships']['images']['data'][0]['id']]
thumb = thumbs[0] if thumbs else item.thumbnail
thumbId = key['relationships'].get('images',{}).get('data', [{},{},{}])[2].get('id', '') fanarts = [image['attributes']['src'] for image in images if len(key['relationships']['images']['data']) > 1 and image['id'] == key['relationships']['images']['data'][1]['id']]
fanartId = key['relationships'].get('images',{}).get('data', [{}])[0].get('id', '') fanart = fanarts[0] if fanarts else item.fanart
itemlist.append( itemlist.append(
item.clone(title=typo(key['attributes']['name'],'bold'), item.clone(title=title,
plot=key['attributes'].get('description',''), fulltitle=title,
programid=key['attributes']['alternateId'], plot=plot,
seasons=key['attributes']['seasonNumbers'], url=url,
action='seasons', programid=key['attributes']['alternateId'],
thumbnail=images[thumbId] if thumbId else item.thumbnail, id=key['id'],
fanart=images[fanartId] if fanartId else item.fanart, seasons=seasons,
contentType='tvshow')) action='episodes',
thumbnail=thumb,
itemlist.sort(key=lambda it: it.title) fanart=fanart,
contentType='tvshow'))
if not itemlist:
from core.item import Item
itemlist = [Item(title='Nessun Contenuto Free Disponibile', thumbnail=support.thumb('info'))]
return itemlist return itemlist
def seasons(item): def episodes(item):
logger.debug() logger.debug()
itemlist = []
data = session.get('{}/cms/routes/show/{}?include=default'.format(domain, item.programid)).json()['included']
for key in data:
if key['type'] == 'collection' and 'filters' in key['attributes']['component']:
for option in key['attributes']['component']['filters'][0]['options']:
itemlist.append(item.clone(title="Stagione {}".format(option['value']),
season=int(option['value']),
seasonparams=option['parameter'],
showparams=key['attributes']['component']['mandatoryParams'],
id=key['id'],
contentType='season',
action='episodios'))
break
if key['type'] == 'collection' and 'title' in key['attributes']:
itemlist.append(
item.clone(title=typo(key['attributes']['title'],'bold'),
plot=key['attributes'].get('description',''),
programid=key['attributes']['alias'],
id=key['id'],
action='episodios',
contentType='season'))
return itemlist
def episodios(item):
logger.debug()
itemlist =[] itemlist =[]
data = session.get('{}/cms/collections/{}?include=default&{}&{}'.format(domain, item.id, item.seasonparams, item.showparams)).json()['included'] pdict = session.get(api + '/cms/routes/programmi/{}?decorators=viewingHistory&include=default'.format(item.programid), headers=headers).json()['included']
images = {key['id'] : key['attributes']['src'] for key in data if key['type'] == 'image'}
for key in data: for key in pdict:
if key['type'] == 'video' and 'Free' in str(key.get('relationships',{}).get('contentPackages',{}).get('data',[])): if key['type'] == 'collection' and key.get('attributes',{}).get('component',{}).get('id', '') == 'tabbed-content':
if item.season: mandatory = key['attributes']['component'].get('mandatoryParams','')
itemlist.append(item.clone(title = "{}x{:02d} - {}".format(item.season, key['attributes']['episodeNumber'], key['attributes']['name']), if not mandatory: return [support.Item(title='CONTENUTO PLUS')]
plot = key['attributes']['description'], for option in key['attributes']['component']['filters'][0]['options']:
episode = key['attributes']['episodeNumber'], url = '{}/cms/collections/{}?decorators=viewingHistory&include=default&{}&{}'.format(api, key['id'], mandatory, option['parameter'])
contentType = 'episode', seasons = []
action = 'findvideos', season = {}
thumbnail = images[key['relationships']['images']['data'][0]['id']], try:
id=key['id'])) season = session.get(url, headers=headers).json()
else: seasons.append(season['included'])
itemlist.append(item.clone(title = key['attributes']['name'], pages = season['data'].get('meta',{}).get('itemsTotalPages', 0)
plot = key['attributes']['longDescription'], if pages:
contentType = 'episode', for page in range(2,pages + 1):
action = 'findvideos', url = '{}/cms/collections/{}?decorators=viewingHistory&include=default&{}&{}&page[items.number]={}'.format(api, key['id'], mandatory, option['parameter'], page)
thumbnail = images[key['relationships']['images']['data'][0]['id']], logger.debug(url)
id=key['id'])) season = session.get(url, headers=headers).json()['included']
seasons.append(season)
except:
pass
itemlist.sort(key=lambda it: it.episode) for season in seasons:
for episode in season:
if not itemlist: if episode['type'] == 'video' and 'Free' in episode['attributes']['packages']:
from core.item import Item title = '{}x{:02d} - {}'.format(option['id'], episode['attributes']['episodeNumber'], episode['attributes']['name'])
itemlist = [Item(title='Nessun Episodio Free Disponibile', thumbnail=support.thumb('info'))] plot = episode['attributes']['description']
itemlist.append(
item.clone(title=title,
fulltitle=title,
plot=plot,
id=episode['id'],
action='findvideos',
contentType='episode',
season=option['id'],
episode=episode['attributes']['episodeNumber'],
forcethumb=True,
no_return=True))
if itemlist: itemlist.sort(key=lambda it: (int(it.season), int(it.episode)))
return itemlist return itemlist
def findvideos(item): def findvideos(item):
logger.debug() logger.debug()
return support.server(item, itemlist=[item.clone(server='directo', action='play')])
content = 'video' if item.contentType == 'episode' else 'channel' def play(item):
if item.livefilter:
post = {content + 'Id': item.id, item.id = liveDict()[item.livefilter]['id']
'deviceInfo': { item.fulltitle = item.livefilter
'adBlocker': 'true', item.forcethumb = True
'drmSupported': 'true', item.no_return = True
'hwDecodingCapabilities': [], support.thumb(item, mode='live')
'screen':{ if item.contentType == 'episode': data = session.get('{}/playback/v2/videoPlaybackInfo/{}?usePreAuth=true'.format(api, item.id), headers=headers).json().get('data',{}).get('attributes',{})
'width':1920, else: data = session.get('{}/playback/v2/channelPlaybackInfo/{}?usePreAuth=true'.format(api, item.id), headers=headers).json().get('data',{}).get('attributes',{})
'height':1080 if data.get('protection', {}).get('drm_enabled',True):
}, item.url = data['streaming']['dash']['url']
'player':{
'width':1920,
'height':1080
}
},
'wisteriaProperties':{
'advertiser': {
'firstPlay': 0,
'fwIsLat': 0
},
'device':{
'browser':{
'name': 'chrome',
'version': config.get_setting("chrome_ua_version")
},
'type': 'desktop'
},
'platform': 'desktop',
'product': 'dplus_emea',
'sessionId': deviceId,
'streamProvider': {
'suspendBeaconing': 0,
'hlsVersion': 6,
'pingConfig': 1
}
}
}
data = session.post('{}/playback/v3/{}PlaybackInfo'.format(domain, content), json=post).json().get('data',{}).get('attributes',{})
if data.get('streaming', [{}])[0].get('protection', {}).get('drmEnabled',False):
item.url = data['streaming'][0]['url']
item.drm = 'com.widevine.alpha' item.drm = 'com.widevine.alpha'
item.license ="{}|PreAuthorization={}|R{{SSM}}|".format(data['streaming'][0]['protection']['schemes']['widevine']['licenseUrl'], item.license = data['protection']['schemes']['widevine']['licenseUrl'] + '|PreAuthorization=' + data['protection']['drmToken'] + '|R{SSM}|'
data['streaming'][0]['protection']['drmToken'])
else: else:
item.url = data['streaming'][0]['url'] item.url = data['streaming']['hls']['url']
item.manifest = 'hls' item.manifest = 'hls'
return [item]
return support.server(item, itemlist=[item], Download=False, Videolibrary=False)

6
channels/dreamsub.json Executable file → Normal file
View File

@@ -2,9 +2,9 @@
"id": "dreamsub", "id": "dreamsub",
"name": "DreamSub", "name": "DreamSub",
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"active": false, "active": true,
"thumbnail": "dreamsub.png", "thumbnail": "dreamsub.png",
"banner": "dreamsub.png", "banner": "dreamsub.png",
"categories": ["anime", "vos"], "categories": ["anime", "sub"],
"settings": [] "settings": []
} }

60
channels/dreamsub.py Executable file → Normal file
View File

@@ -4,22 +4,21 @@
# ------------------------------------------------------------ # ------------------------------------------------------------
from core import support from core import support
from platformcode import logger
host = support.config.get_channel_url() host = support.config.get_channel_url()
headers = [['Referer', host]] headers = [['Referer', host]]
@support.menu @support.menu
def mainlist(item): def mainlist(item):
support.info(item)
anime = ['/search?typeY=tv', anime = ['/search?typeY=tv',
('Movie', ['/search?typeY=movie', 'peliculas', '', 'movie']), ('Movie', ['/search?typeY=movie', 'movies', '', 'movie']),
('OAV', ['/search?typeY=oav', 'peliculas', '', 'tvshow']), ('OAV', ['/search?typeY=oav', 'movies', '', 'tvshow']),
('Spinoff', ['/search?typeY=spinoff', 'peliculas', '', 'tvshow']), ('Spinoff', ['/search?typeY=spinoff', 'movies', '', 'tvshow']),
('Generi', ['','menu','Generi']), ('Generi', ['','menu','Generi']),
('Stato', ['','menu','Stato']), ('Stato', ['','menu','Stato']),
('Ultimi Episodi', ['', 'peliculas', ['last', 'episodiRecenti']]), ('Ultimi Episodi', ['', 'movies', ['last', 'episodiRecenti']]),
('Ultimi Aggiornamenti', ['', 'peliculas', ['last', 'episodiNuovi']]) ('Ultimi Aggiornamenti', ['', 'movies', ['last', 'episodiNuovi']])
] ]
return locals() return locals()
@@ -28,14 +27,15 @@ def mainlist(item):
@support.scrape @support.scrape
def menu(item): def menu(item):
item.contentType = '' item.contentType = ''
action = 'peliculas' action = 'movies'
patronBlock = r'<div class="filter-header"><b>%s</b>(?P<block>.*?)<div class="filter-box">' % item.args patronBlock = r'<div class="filter-header"><b>%s</b>(?P<block>.*?)<div class="filter-box">' % item.args
patronMenu = r'<a class="[^"]+" data-state="[^"]+" (?P<other>[^>]+)>[^>]+></i>[^>]+></i>[^>]+></i>(?P<title>[^>]+)</a>' patronMenu = r'<a class="[^"]+" data-state="[^"]+" (?P<other>[^>]+)>[^>]+></i>[^>]+></i>[^>]+></i>(?P<title>[^>]+)</a>'
if 'generi' in item.args.lower():
patronGenreMenu = patronMenu
def itemHook(item): def itemHook(item):
support.info(item.type)
for Type, ID in support.match(item.other, patron=r'data-type="([^"]+)" data-id="([^"]+)"').matches: for Type, ID in support.match(item.other, patron=r'data-type="([^"]+)" data-id="([^"]+)"').matches:
item.url = host + '/search?' + Type + 'Y=' + ID item.url = host + '/search?' + Type + 'Y=' + ID
return item return item
@@ -43,52 +43,52 @@ def menu(item):
def search(item, text): def search(item, text):
support.info(text) logger.debug(text)
text = text.replace(' ', '+') text = text.replace(' ', '+')
item.url = host + '/search/' + text item.url = host + '/search/' + text
item.args = 'search' item.args = 'search'
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.info('search log:', line) logger.error('search log:', line)
return [] return []
def newest(categoria): def newest(category):
support.info(categoria) logger.debug(category)
item = support.Item() item = support.Item()
try: try:
if categoria == "anime": if category == "anime":
item.url = host item.url = host
item.args = ['last', 'episodiNuovi'] item.args = ['last', 'episodiNuovi']
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("{0}".format(line)) logger.error("{0}".format(line))
return [] return []
@support.scrape @support.scrape
def peliculas(item): def movies(item):
# debug = True # debug = True
anime = True numerationEnabled = True
if 'movie' in item.url: if 'movie' in item.url:
item.contentType = 'movie' item.contentType = 'movie'
action = 'findvideos' action = 'findvideos'
else: else:
item.contentType = 'tvshow' item.contentType = 'tvshow'
action = 'episodios' action = 'episodes'
if len(item.args) > 1 and item.args[0] == 'last': if len(item.args) > 1 and item.args[0] == 'last':
patronBlock = r'<div id="%s"[^>]+>(?P<block>.*?)<div class="vistaDettagliata"' % item.args[1] patronBlock = r'<div id="%s"[^>]+>(?P<block>.*?)<div class="vistaDettagliata"' % item.args[1]
patron = r'<li>\s*<a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)" class="thumb">[^>]+>[^>]+>[^>]+>\s*[EePp]+\s*(?P<episode>\d+)[^>]+>\s+<img src="(?P<thumb>[^"]+)"' patron = r'<li>\s*<a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)" class="thumb">[^>]+>[^>]+>[^>]+>\s*[EePp]+\s*(?P<episode>\d+)[^>]+>\s<img src="(?P<thumb>[^"]+)"'
else: else:
patron = r'<div class="showStreaming">\s*<b>(?P<title>[^<]+)[^>]+>[^>]+>\s*<span>Lingua:\s*(?:DUB|JAP)?\s*(?P<lang>(?:SUB )?ITA)[^>]+>[<>br\s]+a href="(?P<url>[^"]+)"[^>]+>.*?--image-url:url\(/*(?P<thumb>[^\)]+).*?Anno di inizio</b>:\s*(?P<year>[0-9]{4})' patron = r'<div class="showStreaming">\s*<b>(?P<title>[^<]+)[^>]+>[^>]+>\s*<span>Lingua:\s*(?:DUB|JAP)?\s*(?P<lang>(?:SUB )?ITA)[^>]+>[<>br\s]+a href="(?P<url>[^"]+)"[^>]+>.*?--image-url:url\(/*(?P<thumb>[^\)]+).*?Anno di inizio</b>:\s*(?P<year>[0-9]{4})'
patronNext = '<li class="currentPage">[^>]+><li[^<]+<a href="([^"]+)">' patronNext = '<li class="currentPage">[^>]+><li[^<]+<a href="([^"]+)">'
@@ -102,35 +102,33 @@ def peliculas(item):
@support.scrape @support.scrape
def episodios(item): def episodes(item):
anime = True numerationEnabled = True
# debug = True pagination = True
pagination = 100
if item.data: if item.data:
data = item.data data = item.data
patron = r'<div class="sli-name">\s*<a\s+href="(?P<url>[^"]+)"[^>]+>(?P<title>[^<]+)<' patron = r'<div class="sli-name">\s*<a href="(?P<url>[^"]+)"[^>]+>(?P<title>[^<]+)<'
return locals() return locals()
def findvideos(item): def findvideos(item):
itemlist = [] itemlist = []
support.info() logger.debug()
# support.dbg()
matches = support.match(item, patron=r'href="([^"]+)"', patronBlock=r'<div style="white-space: (.*?)<div id="main-content"') matches = support.match(item, patron=r'href="([^"]+)"', patronBlock=r'<div style="white-space: (.*?)<div id="main-content"')
if not matches.matches and item.contentType != 'episode': if not matches.matches and item.contentType != 'episode':
item.data = matches.data item.data = matches.data
item.contentType = 'tvshow' item.contentType = 'tvshow'
return episodios(item) return episodes(item)
if 'vvvvid' in matches.data: if 'vvvvid' in matches.data:
itemlist.append(item.clone(action="play", title='VVVVID', url=support.match(matches.data, patron=r'(http://www.vvvvid[^"]+)').match, server='vvvvid')) itemlist.append(item.clone(action="play", title='VVVVID', url=support.match(matches.data, patron=r'(http://www.vvvvid[^"]+)').match, server='vvvvid'))
else: else:
support.info('VIDEO') logger.debug('VIDEO')
for url in matches.matches: for url in matches.matches:
lang = url.split('/')[-2] lang = url.split('/')[-2]
if 'ita' in lang.lower(): if 'ita' in lang.lower():

10
channels/dsda.json Normal file
View File

@@ -0,0 +1,10 @@
{
"id": "dsda",
"name": "D.S.D.A",
"language": ["ita"],
"active": false,
"thumbnail": "dsda.png",
"banner": "dsda.png",
"categories": ["documentary"],
"settings": []
}

140
channels/dsda.py Normal file
View File

@@ -0,0 +1,140 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per documentaristreamingda
# ------------------------------------------------------------
from core import support
from core.item import Item
from platformcode import logger, config
host = config.get_channel_url()
@support.menu
def mainlist(item):
docu = [('Documentari {bullet bold}',('/elenco-documentari','movies')),
('Categorie {submenu documentary}',('','menu')),
('Cerca... {bullet bold documentary}',('','search')),]
return locals()
@support.scrape
def menu(item):
action = 'movies'
patronMenu = r'<li class="menu-item menu-item-type-taxonomy[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>(?P<title>[^<]+)<'
def fullItemlistHook(itemlist):
item_list = []
title_list = []
for item in itemlist:
if item.title not in title_list:
item_list.append(item)
title_list.append(item.title)
itemlist = item_list
return itemlist
return locals()
def newest(category):
logger.debug()
item = Item()
try:
if category == "documentales":
item.url = host + "/elenco-documentari"
item.action = "movies"
return movies(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
logger.error("{0}".format(line))
return []
def search(item, texto):
logger.debug(texto)
item.url = host + "/?s=" + texto
try:
return movies(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
logger.error("%s" % line)
return []
@support.scrape
def movies(item):
blacklist = ['GUIDA PRINCIPIANTI Vedere film e documentari streaming gratis', 'Guida Dsda']
data = support.match(item).data
# debug =True
if item.args == 'collection':
if 'class="panel"' in data:
item.args = 'raccolta'
patron = r'class="title-episodio">(?P<title>[^<]+)<(?P<url>.*?)<p'
# patron = r'<a (?:style="[^"]+" )?href="(?P<url>[^"]+)"[^>]+>(?:[^>]+><strong>)?(?P<title>[^<]+)(?:</a>)?</strong'
else:
patron = r'<div class="cover-racolta">\s*<a href="(?P<url>[^"]+)"[^>]+>\s*<img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)".*?<p class="title[^>]+>(?P<title>[^<]+)<'
else:
patron = r'<article[^>]+>[^>]+>[^>]+>(?:<img width="[^"]+" height="[^"]+" src="(?P<thumb>[^"]+)"[^>]+>)?.*?<a href="(?P<url>[^"]+)"[^>]*>\s*(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*<p>(?P<plot>[^<]+)<'
patronNext = r'<a class="page-numbers next" href="([^"]+)">'
# select category
def itemHook(item):
title = support.re.sub(r'(?:[Ss]erie\s*|[Ss]treaming(?:\s*[Dd][Aa])?\s*|[Cc]ollezione\s*|[Rr]accolta\s*|[Dd]ocumentari(?:o)?\s*)?','',item.fulltitle).strip()
if 'serie' in item.fulltitle.lower():
item.contentType = 'tvshow'
item.action = 'episodes'
item.contentSerieName = title
item.contentTitle = ''
elif 'collezion' in item.fulltitle.lower() or \
'raccolt' in item.fulltitle.lower() or \
'filmografia' in item.fulltitle.lower():
item.args = 'collection'
item.action = 'movies'
item.contentTitle = title
item.contentSerieName = ''
else:
item.contentTitle = title
item.contentSerieName = ''
item.title = support.typo(title,'bold')
item.fulltitle = item.show = title
return item
# remove duplicates
def fullItemlistHook(itemlist):
item_list = []
title_list = []
for item in itemlist:
if item.title not in title_list:
item_list.append(item)
title_list.append(item.title)
itemlist = item_list
return itemlist
return locals()
@support.scrape
def episodes(item):
html = support.match(item, patron=r'class="title-episodio">(\d+x\d+)')
data = html.data
if html.match:
patron = r'class="title-episodio">(?P<episode>[^<]+)<(?P<url>.*?)<p'
else:
patron = r'class="title-episodio">(?P<title>[^<]+)<(?P<url>.*?)<p'
# def itemlistHook(itemlist):
# counter = 0
# for item in itemlist:
# episode = support.match(item.title, patron=r'\d+').match
# if episode == '1':
# counter += 1
# item.title = support.typo(str(counter) + 'x' + episode.zfill(2) + support.re.sub(r'\[[^\]]+\](?:\d+)?','',item.title),'bold')
# return itemlist
return locals()
def findvideos(item):
logger.debug()
if item.args == 'raccolta' or item.contentType == 'episode':
return support.server(item, item.url)
else:
return support.server(item)

6
channels/eurostreaming.json Executable file → Normal file
View File

@@ -1,10 +1,10 @@
{ {
"id": "eurostreaming", "id": "eurostreaming",
"name": "Eurostreaming", "name": "Eurostreaming",
"active": false, "active": true,
"language": ["ita", "sub-ita"], "language": ["ita","sub-ita"],
"thumbnail": "eurostreaming.png", "thumbnail": "eurostreaming.png",
"banner": "eurostreaming.png", "banner": "eurostreaming.png",
"categories": ["tvshow", "anime", "vos"], "categories": ["tvshow","anime","sub"],
"settings": [] "settings": []
} }

52
channels/eurostreaming.py Executable file → Normal file
View File

@@ -6,6 +6,7 @@
from core import support from core import support
from core.item import Item from core.item import Item
from platformcode import logger
# def findhost(url): # def findhost(url):
# permUrl = httptools.downloadpage(url, follow_redirects=False, only_headers=True).headers # permUrl = httptools.downloadpage(url, follow_redirects=False, only_headers=True).headers
@@ -17,41 +18,38 @@ headers = [['Referer', host]]
@support.menu @support.menu
def mainlist(item): def mainlist(item):
support.info()
tvshow = [] tvshow = []
anime = ['/category/anime-cartoni-animati/'] anime = ['/category/anime-cartoni-animati/']
mix = [('Aggiornamenti {bullet bold} {TV}', ['/aggiornamento-episodi-nuovi/', 'peliculas', 'newest']), mix = [('Aggiornamenti {bullet bold} {TV}', ['/aggiornamento-episodi/', 'movies', 'newest']),
('Archivio {bullet bold} {TV}', ['/category/serie-tv-archive/', 'peliculas'])] ('Archivio {bullet bold} {TV}', ['/category/serie-tv-archive/', 'movies'])]
search = '' search = ''
return locals() return locals()
@support.scrape @support.scrape
def peliculas(item): def movies(item):
# debug = True # debug = True
action = 'episodios' action = 'episodes'
if item.args == 'newest': if item.args == 'newest':
item.contentType = 'episode' item.contentType = 'episode'
patron = r'<span class="serieTitle" style="font-size:20px">(?P<title>[^<]+) \s*<a href="(?P<url>[^"]+)"[^>]*>\s+?(?P<episode>\d+[×x]\d+-\d+|\d+[×x]\d+) (?P<title2>[^<\(]+)\s?\(?(?P<lang>SUB ITA)?\)?</a>' patron = r'<span class="serieTitle" style="font-size:20px">(?P<title>[^<]+) \s*<a href="(?P<url>[^"]+)"[^>]*>\s+?(?P<episode>\d+[×x]\d+-\d+|\d+[×x]\d+) (?P<title2>[^<\(]+)\s?\(?(?P<lang>SUB ITA)?\)?</a>'
pagination = '' pagination = True
else: else:
patron = r'<div class="post-thumb">.*?<img src="(?P<thumb>[^"]+)".*?><a href="(?P<url>[^"]+)"[^>]+>(?P<title>.+?)\s?(?: Serie Tv)?\s?\(?(?P<year>\d{4})?\)?<\/a><\/h2>' patron = r'<div class="post-thumb">.*?<img src="(?P<thumb>[^"]+)".*?><a href="(?P<url>[^"]+)"[^>]+>(?P<title>.+?)\s?(?: Serie Tv)?\s?\(?(?P<year>\d{4})?\)?<\/a><\/h2>'
patronNext=r'a class="next page-numbers" href="?([^>"]+)">Avanti &raquo;</a>' patronNext=r'a class="next page-numbers" href="?([^>"]+)">Avanti &raquo;</a>'
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodes(item):
# debug = True # debug = True
data = support.match(item, headers=headers).data data = support.match(item, headers=headers).data
if 'clicca qui per aprire' in data.lower(): data = support.match(support.match(data, patron=r'"go_to":"([^"]+)"').match.replace('\\',''), headers=headers).data if 'clicca qui per aprire' in data.lower(): data = support.match(support.match(data, patron=r'"go_to":"([^"]+)"').match.replace('\\',''), headers=headers).data
elif 'clicca qui</span>' in data.lower(): data = support.match(support.match(data, patron=r'<h2 style="text-align: center;"><a href="([^"]+)">').match, headers=headers).data elif 'clicca qui</span>' in data.lower(): data = support.match(support.match(data, patron=r'<h2 style="text-align: center;"><a href="([^"]+)">').match, headers=headers).data
patronBlock = r'</span>(?P<block>[a-zA-Z\s]+\d+(.+?)?(?:\()?(?P<lang>ITA|SUB ITA)(?:\))?.*?)</div></div>' patronBlock = r'</span>(?P<block>[a-zA-Z\s]+\d+(.+?)?(?:\()?(?P<lang>ITA|SUB ITA)(?:\))?.*?)</div></div>'
patron = r'(?P<season>\d+)&#215;(?P<episode>\d+)(</strong>)*(?P<title>.*?)<(?P<other>.*?br/>)' patron = r'(?P<season>\d+)&#\d+;(?P<episode>\d+(?:-\d+)?)\s*(?:</strong>|<em>)?\s*(?P<title>.*?)(?:–|-.+?-|–.+?–|–|em|.)?(?:/em.*?)?(?:<a (?P<data>.*?))<br />'
def itemHook(i): def itemHook(i):
i.url = item.url i.url = item.url
@@ -60,50 +58,44 @@ def episodios(item):
return locals() return locals()
def search(item, texto): def search(item, text):
support.info() logger.debug(text)
item.url = "%s/?s=%s" % (host, texto) item.url = "%s/?s=%s" % (host, text)
item.contentType = 'tvshow' item.contentType = 'tvshow'
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.info(line) logger.error(line)
return [] return []
def newest(categoria): def newest(category):
support.info() logger.debug()
itemlist = [] itemlist = []
item = Item() item = Item()
item.contentType = 'tvshow' item.contentType = 'tvshow'
item.args = 'newest' item.args = 'newest'
try: try:
item.url = "%s/aggiornamento-episodi-nuovi/" % host item.url = "%s/aggiornamento-episodi/" % host
item.action = "peliculas" item.action = "movies"
itemlist = peliculas(item) itemlist = movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.info("{0}".format(line)) logger.error("{0}".format(line))
return [] return []
return itemlist return itemlist
def findvideos(item): def findvideos(item):
support.info() logger.debug()
itemlist = support.server(item, item.other) return support.server(item, item.data)
# testo che tutti i link siano stati risolti
if support.logger.testMode:
if len(itemlist) < len(support.match(item.other, patron='<a href="([^"]+)').matches):
raise Exception('Manca qualche server')
return itemlist

View File

@@ -1,10 +0,0 @@
{
"id": "eurostreaming_actor",
"name": "Eurostreaming Actor",
"active": true,
"language": ["ita","sub-ita"],
"thumbnail": "eurostreaming.png",
"banner": "eurostreaming.png",
"categories": ["tvshow","anime","vos"],
"settings": []
}

View File

@@ -1,97 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per Eurostreaming.Actor
# by Napster32
# ------------------------------------------------------------
from core import support
from core.item import Item
host = support.config.get_channel_url()
headers = [['Referer', host]]
@support.menu
def mainlist(item):
support.info()
tvshow = []
anime = ['/animazione/']
mix = [('Aggiornamenti {bullet bold} {TV}', ['/aggiornamento-episodi/', 'peliculas', 'newest'])]
search = ''
return locals()
@support.scrape
def peliculas(item):
action = 'episodios'
if item.args == 'newest':
item.contentType = 'episode'
patron = r'<span class="serieTitle" style="font-size:20px">(?P<title>[^<]+) \s*<a href="(?P<url>[^"]+)"[^>]*>(?P<episode>\d+[×x]\d+-\d+|\d+[×x]\d+) (?P<title2>[^<\(]+)\s?\(?(?P<lang>SUB ITA)?\)?</a>'
patronNext = r'class="next".*?"(.+?)"'
else:
patron = r'<div class="post-thumb">.*?<img src="(?P<thumb>[^"]+)".*?><a href="(?P<url>[^"]+)"[^>]+>(?P<title>.+?)[\<]'
patronNext = r'next.*?href="(.*?)"'
# debug = True
return locals()
@support.scrape
def episodios(item):
# debug = True
data = support.match(item, headers=headers).data
if 'clicca qui per aprire' in data.lower():
data = support.match(support.match(data, patron=r'"go_to":"([^"]+)"').match.replace('\\',''), headers=headers).data
elif 'clicca qui</span>' in data.lower():
data = support.match(support.match(data, patron=r'<h2 style="text-align: center;"><a href="([^"]+)">').match, headers=headers).data
patronBlock = r'tab-content(?P<block>.*?)serie-player'
patron = r'data.num..(?P<season>\d+)x(?P<episode>\d+)" data-title="(?P<title>[^"]+).*?data-link="(?P<url>http.*?)</li>'
return locals()
def search(item, texto):
support.info()
item.url = host + '/index.php?story=%s&do=search&subaction=search' % (texto)
item.contentType = 'tvshow'
try:
return peliculas(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
support.info(line)
return []
def newest(categoria):
support.info()
itemlist = []
item = Item()
item.contentType = 'tvshow'
item.args = 'newest'
try:
item.url = "%s/aggiornamento-episodi/" % host
item.action = "peliculas"
itemlist = peliculas(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
support.info("{0}".format(line))
return []
return itemlist
def findvideos(item):
support.info()
itemlist = support.server(item, item.url)
return itemlist

11
channels/fastsubita.json Normal file
View File

@@ -0,0 +1,11 @@
{
"id": "fastsubita",
"name": "Fastsubita",
"language": ["sub-ita"],
"active": false,
"thumbnail": "fastsubita.png",
"banner": "fastsubita.png",
"categories": ["tvshow", "sub"],
"not_active": ["include_in_newest_movie", "include_in_newest_anime"],
"settings": []
}

208
channels/fastsubita.py Normal file
View File

@@ -0,0 +1,208 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per fastsubita.py
# ------------------------------------------------------------
"""
Su questo canale, nella category 'Ricerca Globale'
non saranno presenti le voci 'Aggiungi alla Videoteca'
e 'Scarica Film'/'Scarica Serie', dunque,
la loro assenza, nel Test, NON dovrà essere segnalata come ERRORE.
Novità. Indicare in quale/i sezione/i è presente il canale:
- serie
Ulteriori info:
- SOLO SUB-ITA
"""
from core import support, httptools
from core.item import Item
from platformcode import config, logger
host = config.get_channel_url()
headers = [['Referer', host]]
@support.menu
def mainlist(item):
Tvshow = [
('Aggiornamenti', ['', 'movies', 'update']),
('Cerca... {bold}{TV}', ['', 'search'])
]
# search = ''
return locals()
@support.scrape
def movies(item):
deflang = 'Sub-ITA'
# è una singola pagina con tutti gli episodi
if item.grouped and not support.scrapertools.find_single_match(item.url, '-[0-9]+x[0-9]+-'):
item.grouped = False
return episodes_args(item)
# ogni puntata è un articolo a se
if item.fulltitle:
item.url = host + '?s=' + item.fulltitle
actLike = 'episodes'
action = 'findvideos'
blacklist = ['']
if item.args == 'genres':
patronBlock = r'<h4 id="mctm1-.">'+item.fulltitle+'</h4>(?P<block>.+?)</div>'
patron = r'[^>]+>[^>]+>.+?href="(?P<url>[^"]+)[^>]>(?P<title>[^<]+)\s<'
action = 'episodes'
elif item.args == 'search':
group = True
patronBlock = r'</header>(?P<block>.*?)</main>'
patron = '(?:<img[^>]+src="(?P<thumb>[^"]+)".*?)?<a href="(?P<url>[^"]+)"[^>]+>(?P<title>[^<]+?)(?:(?P<episode>\d+&#215;\d+|\d+×\d+)|\[[sS](?P<season>[0-9]+)[^]]+\])\s?(?:(?P<lang>\([a-zA-Z\s]+\)) (?:[Ss]\d+[Ee]\d+)?\s?(?:[&#\d;|.{3}]+)(?P<title2>[^”[<]+)(?:&#\d)?)?'
else:
# è una singola pagina con tutti gli episodi
if item.args != 'update' and not support.scrapertools.find_single_match(item.url, '-[0-9]+x[0-9]+-'):
return episodes_args(item)
patron = r'<div class="featured-thumb"> +<a href="(?P<url>[^"]+)" title="(?P<title>[^[]+)\[(?P<episode>\d+&#215;\d+)?'
patronBlock = r'<main id="main"[^>]+>(?P<block>.*?)<div id="secondary'
# def itemlistHook(itemlist):
# from core import scraper
# return scraper.sort_episode_list(itemlist)
patronNext = '<a class="next page-numbers" href="(.*?)">Successivi'
# debug = True
return locals()
def episodes_args(item):
actLike = 'episodes'
deflang = 'Sub-ITA'
action = 'findvideos'
patron = '(?P<episode>\d+&#215;\d+|\d+[×.]+\d+)(?:\s?\((?P<lang>[a-zA-Z ]+)\))?(?:\s[Ss]\d+[Ee]+\d+)? +(?:“|&#8220;)(?P<title2>.*?)(?:”|&#8221;).*?(?P<other>.*?)(?:/>|<p)'
patronBlock = r'<main id="main" class="site-main" role="main">(?P<block>.*?)</main>'
patronNext = '<a class="next page-numbers" href="(.*?)">Successivi'
# debug = True
return locals()
@support.scrape
def episodes(item):
return episodes_args(item)
@support.scrape
def genres(item):
logger.debug()
action = 'movies'
patronBlock = r'<div id="mcTagMapNav">(?P<block>.+?)</div>'
patron = r'<a href="(?P<url>[^"]+)">(?P<title>.+?)</a>'
def itemHook(item):
item.url = host+'/elenco-serie-tv/'
item.contentType = 'tvshow'
return item
#debug = True
return locals()
def search(item, text):
logger.debug('search', text)
text = text.replace(' ', '+')
item.url = host + '?s=' + text
try:
item.args = 'search'
item.contentType = 'tvshow'
return movies(item)
# Se captura la excepcion, para no interrumpir al buscador global si un canal falla
except:
import sys
for line in sys.exc_info():
logger.error('search log:', line)
return []
def newest(category):
logger.debug('newest ->', category)
itemlist = []
item = Item()
if category == 'tvshow':
try:
item.contentType = 'tvshow'
item.args = 'newest'
item.url = host
item.action = 'movies'
itemlist = movies(item)
if itemlist[-1].action == 'movies':
itemlist.pop()
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
logger.error('newest log: ', line)
return []
return itemlist
def findvideos(item):
logger.debug('findvideos ->', item)
patron = r'<a href="([^"]+)">'
itemlist = []
if item.other.startswith('http'):
resp = httptools.downloadpage(item.url, follow_redirects=False)
data = resp.headers.get("location", "") + '\n'
elif item.other:
html = support.match(item.other, patron=patron, headers=headers)
matches = html.matches
data = html.data
for scrapedurl in matches:
if 'is.gd' in scrapedurl:
resp = httptools.downloadpage(scrapedurl, follow_redirects=False)
data += resp.headers.get("location", "") + '\n'
elif not support.scrapertools.find_single_match(item.url, '-[0-9]+x[0-9]+-'):
return episodes(item)
else:
patronBlock = '<div class="entry-content">(?P<block>.*)<footer class="entry-footer">'
html = support.match(item, patron=patron, patronBlock=patronBlock, headers=headers)
matches = html.matches
data= html.data
if item.args != 'episodes':
item.infoLabels['mediatype'] = 'episode'
for scrapedurl in matches:
if 'is.gd' in scrapedurl:
resp = httptools.downloadpage(scrapedurl, follow_redirects=False)
data += resp.headers.get("location", "") + '\n'
itemlist += support.server(item, data)
# data = support.match(item.url).data
# patron = r'>Posted in <a href="https?://fastsubita.com/serietv/([^/]+)/(?:[^"]+)?"'
# series = scrapertools.find_single_match(data, patron)
# titles = support.typo(series.upper().replace('-', ' '), 'bold color kod')
# goseries = support.typo("Vai alla Serie:", ' bold color kod')
# itemlist.append(
# item.clone(channel=item.channel,
# # title=goseries + titles,
# title=titles,
# fulltitle=titles,
# show=series,
# contentType='tvshow',
# contentSerieName=series,
# url=host+"/serietv/"+series,
# action='episodes',
# contentTitle=titles,
# plot = "Vai alla Serie " + titles + " con tutte le puntate",
# ))
return itemlist

11
channels/film4k.json Normal file
View File

@@ -0,0 +1,11 @@
{
"id": "film4k",
"name": "Film4k",
"language": ["ita"],
"active": false,
"thumbnail": "film4k.png",
"banner": "film4k.png",
"categories": ["tvshow", "movie", "anime"],
"not_active": ["include_in_newest_movie", "include_in_newest_anime", "include_in_newest_tvshow"],
"settings": []
}

82
channels/film4k.py Normal file
View File

@@ -0,0 +1,82 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per film4k
# ------------------------------------------------------------
from core import support
from platformcode import logger, config
def findhost(url):
return support.httptools.downloadpage(url).url
host = config.get_channel_url(findhost)
@support.menu
def mainlist(item):
film = ['movies',
('Qualità', ['', 'menu', 'quality']),
('Generi', ['movies', 'menu', 'genres']),
('Anno', ['movies', 'menu', 'releases']),
('Più popolari', ['trending/?get=movies', 'movies']),
('Più votati', ['ratings/?get=movies', 'movies'])]
tvshow = ['/tvshows',
('Più popolari', ['trending/?get=tv', 'movies']),
('Più votati', ['ratings/?get=tv', 'movies'])]
return locals()
def search(item, text):
logger.info('search', text)
item.url = item.url + "/?s=" + text
try:
return support.dooplay_search(item)
except:
import sys
for line in sys.exc_info():
logger.error("%s" % line)
return []
def movies(item):
if 'anime' in item.url:
return support.dooplay_movies(item, True)
else:
return support.dooplay_movies(item, False)
def episodes(item):
itemlist = support.dooplay_get_episodes(item)
return itemlist
def findvideos(item):
itemlist = []
if item.contentType == 'episode':
linkHead = support.httptools.downloadpage(item.url, only_headers=True).headers['link']
epId = support.scrapertools.find_single_match(linkHead, r'\?p=([0-9]+)>')
for link in support.dooplay_get_links(item, host, paramList=[['tv', epId, 1, 'title', 'server']]):
itemlist.append(
item.clone(action="play", url=link['url']))
else:
for link, quality in support.match(item.url, patron="(" + host + """links/[^"]+).*?class="quality">([^<]+)""").matches:
srv = support.servertools.find_video_items(data=support.httptools.downloadpage(link).data)
for s in srv:
s.quality = quality
itemlist.extend(srv)
return support.server(item, itemlist=itemlist)
@support.scrape
def menu(item):
action = 'movies'
if item.args in ['genres','releases']:
patronBlock = r'<nav class="' + item.args + r'">(?P<block>.*?)</nav'
patronMenu= r'<a href="(?P<url>[^"]+)"[^>]*>(?P<title>[^<]+)<'
else:
patronBlock = r'class="main-header">(?P<block>.*?)headitems'
patronMenu = r'(?P<url>' + host + r'quality/[^/]+/\?post_type=movies)">(?P<title>[^<]+)'
return locals()

35
channels/filmigratis.json Normal file
View File

@@ -0,0 +1,35 @@
{
"id": "filmigratis",
"name": "Filmi Gratis",
"active": false,
"language": ["ita", "sub-ita"],
"thumbnail": "filmigratis.png",
"banner": "filmigratis.png",
"categories": ["movie","tvshow"],
"settings": [
{
"id": "include_in_newest_movie",
"type": "bool",
"label": "@70727",
"default": false,
"enabled": false,
"visible": false
},
{
"id": "include_in_newest_tvshow",
"type": "bool",
"label": "@70727",
"default": false,
"enabled": false,
"visible": false
},
{
"id": "include_in_newest_anime",
"type": "bool",
"label": "@70727",
"default": false,
"enabled": false,
"visible": false
}
]
}

151
channels/filmigratis.py Normal file
View File

@@ -0,0 +1,151 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per Filmi Gratis
# ------------------------------------------------------------
"""
La voce "Al cinema" si riferisce ai titoli che scorrono nella home page
Problemi:
- Nessuno noto
Novità, il canale, è presente in:
- FILM
"""
import re
from core import httptools, support
from core.item import Item
from platformcode import config, logger
host = config.get_channel_url()
headers = [['Referer', host]]
@support.menu
def mainlist(item):
film = [
('Al Cinema ', ['', 'movies', 'cinema']),
('Categorie', ['', 'genres', 'genres']),
]
tvshow = ['/serie/ALL',
('Generi', ['', 'genres', 'genres'])
]
search = ''
return locals()
@support.scrape
def movies(item):
if item.args == 'search':
action = ''
patron = r'<div class="cnt">.*?src="([^"]+)"[^>]+>[^>]+>[^>]+>\s+(?P<title>.+?)(?:\[(?P<lang>Sub-ITA|SUB-ITA|SUB)\])?\s?(?:\[?(?P<quality>HD).+\]?)?\s?(?:\(?(?P<year>\d+)?\)?)?\s+<[^>]+>[^>]+>[^>]+>\s<a href="(?P<url>[^"]+)"[^<]+<'
patronBlock = r'<div class="container">(?P<block>.*?)</main>'
elif item.contentType == 'movie':
if not item.args:
# voce menu: Film
patronBlock = r'<h1>Film streaming ita in alta definizione</h1>(?P<block>.*?)<div class="content-sidebar">'
patron = r'<div class="timeline-right">[^>]+>\s<a href="(?P<url>.*?)".*?src="(?P<thumb>.*?)".*?<h3 class="timeline-post-title">(?:(?P<title>.+?)\s\[?(?P<lang>Sub-ITA)?\]?\s?\[?(?P<quality>HD)?\]?\s?\(?(?P<year>\d+)?\)?)<'
patronNext = r'<a class="page-link" href="([^"]+)">>'
elif item.args == 'cinema':
patronBlock = r'<div class="owl-carousel" id="postCarousel">(?P<block>.*?)<section class="main-content">'
patron = r'background-image: url\((?P<thumb>.*?)\).*?<h3.*?>(?:(?P<title>.+?)\s\[?(?P<lang>Sub-ITA)?\]?\s?\[?(?P<quality>HD)?\]?\s?\(?(?P<year>\d+)?\)?)<.+?<a.+?<a href="(?P<url>[^"]+)"[^>]+>'
elif item.args == 'genres':
# ci sono dei titoli dove ' viene sostituito con " da support
data = httptools.downloadpage(item.url, headers=headers, ignore_response_code=True).data
data = re.sub('\n|\t', ' ', data)
patron = r'<div class="cnt">\s.*?src="([^"]+)".+?title="((?P<title>.+?)(?:[ ]\[(?P<lang>Sub-ITA|SUB-ITA)\])?(?:[ ]\[(?P<quality>.*?)\])?(?:[ ]\((?P<year>\d+)\))?)"\s*[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s+<a href="(?P<url>[^"]+)"'
patronBlock = r'<div class="container">(?P<block>.*?)</main>'
pagination = True
patronNext = '<a class="page-link" href="([^"]+)">>>'
else:
action = 'episodes'
patron = r'<div class="cnt">\s.*?src="([^"]+)".+?title="((?P<title>.+?)(?:[ ]\[(?P<lang>Sub-ITA|SUB-ITA)\])?(?:[ ]\[(?P<quality>.*?)\])?(?:[ ]\((?P<year>\d+)\))?)"\s*[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s+<a href="(?P<url>[^"]+)"'
## if item.args == 'search':
## patron = r'<div class="cnt">.*?src="([^"]+)".+?[^>]+>[^>]+>[^>]+>\s+((?P<title>.+?)(?:[ ]\[(?P<lang>Sub-ITA|SUB-ITA)\])?(?:[ ]\[(?P<quality>.*?)\])?(?:[ ]\((?P<year>\d+)\))?)\s+<[^>]+>[^>]+>[^>]+>[ ]<a href="(?P<url>[^"]+)"'
patronBlock = r'<div class="container">(?P<block>.*?)</main>'
def itemHook(item):
if item.args == 'search':
if 'series' in item.url:
item.action = 'episodes'
item.contentType = 'tvshow'
else:
item.action = 'findvideos'
item.contentType = 'movie'
return item
#debug = True
return locals()
@support.scrape
def episodes(item):
action = 'findvideos'
patronBlock = r'<div class="row">(?P<block>.*?)<section class="main-content">'
patron = r'href="(?P<url>.*?)">(?:.+?)?\s+S(?P<season>\d+)\s\-\sEP\s(?P<episode>\d+)[^<]+<'
return locals()
@support.scrape
def genres(item):
if item.contentType == 'movie':
action = 'movies'
patron = r'<a href="(?P<url>.*?)">(?P<title>.*?)<'
patronBlock = r'CATEGORIES.*?<ul>(?P<block>.*?)</ul>'
else:
item.contentType = 'tvshow'
action = 'movies'
blacklist = ['Al-Cinema']
patron = r'<a href="(?P<url>.*?)">(?P<title>.*?)<'
patronBlock = r'class="material-button submenu-toggle"> SERIE TV.*?<ul>.*?</li>(?P<block>.*?)</ul>'
return locals()
def search(item, text):
logger.debug('search', text)
text = text.replace(' ', '+')
item.url = host + '/search/?s=' + text
try:
item.args = 'search'
return movies(item)
# Se captura la excepcion, para no interrumpir al buscador global si un canal falla
except:
import sys
for line in sys.exc_info():
logger.error('search log:', line)
return []
def newest(category):
logger.debug('newest ->', category)
itemlist = []
item = Item()
try:
if category == 'movie':
item.url = host
item.contentType = 'movie'
item.action = 'movies'
itemlist = movies(item)
if itemlist[-1].action == 'movies':
itemlist.pop()
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
logger.error({0}.format(line))
return []
return itemlist
def findvideos(item):
logger.debug()
return support.server(item)

2
channels/filmpertutti.json Executable file → Normal file
View File

@@ -5,6 +5,6 @@
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"thumbnail": "filmpertutti.png", "thumbnail": "filmpertutti.png",
"banner": "filmpertutti.png", "banner": "filmpertutti.png",
"categories": ["anime", "tvshow","movie"], "categories": ["tvshow","movie"],
"settings": [] "settings": []
} }

188
channels/filmpertutti.py Executable file → Normal file
View File

@@ -3,32 +3,27 @@
# Canale per filmpertutti.py # Canale per filmpertutti.py
# ------------------------------------------------------------ # ------------------------------------------------------------
from core import httptools, support, scrapertools from core import support
from core.item import Item from core.item import Item
from platformcode import config, logger from platformcode import config, logger
def findhost(url): def findhost(url):
page = httptools.downloadpage(url).data return support.match(url, patron=r'Il nuovo indirizzo di FILMPERTUTTI è ?<a href="([^"]+)').match
url = support.scrapertools.find_single_match(page, 'Il nuovo indirizzo di FILMPERTUTTI è ?<a href="([^"]+)')
return url
host = config.get_channel_url(findhost) host = config.get_channel_url(findhost)
headers = [['Referer', host]] headers = [['Referer', host]]
@support.menu @support.menu
def mainlist(item): def mainlist(item):
film = ['/category/film/feed/', film = ['/category/film/',
('Film al cinema', ['/category/ora-al-cinema/feed/', 'peliculas']), ('Generi', ['/category/film/', 'genres', 'lettersF'])
('Generi', ['/', 'genres']),
('Saghe', ['/', 'genres', 'saghe']),
] ]
tvshow = ['/category/serie-tv/feed/', tvshow = ['/category/serie-tv/',
] ('Aggiornamenti', ['/aggiornamenti-serie-tv/', 'movies', 'newest']),
('Per Lettera', ['/category/serie-tv/', 'genres', 'lettersS'])
anime = ['/category/anime/feed/',
('SUB-ITA',['/category/anime-sub-ita/feed/', 'peliculas']),
] ]
search = '' search = ''
@@ -36,150 +31,125 @@ def mainlist(item):
@support.scrape @support.scrape
def peliculas(item): def movies(item):
if not item.args == 'search': # pagination not works
if not item.nextpage:
item.page = 1
else:
item.page = item.nextpage
if not item.parent_url: if item.args != 'newest':
item.parent_url = item.url patronBlock = r'<ul class="posts">(?P<block>.*)<\/ul>'
patron = r'<li><a href="(?P<url>[^"]+)" data-thumbnail="(?P<thumb>[^"]+)">.*?<div class="title[^"]*">(?P<title>.+?)(?:\[(?P<lang>Sub-ITA)\])?(?:[ ]\[?(?P<quality>[HD]+)?\])?(?:[ ]\((?P<year>\d+)\)?)?<\/div>'
patronNext = r'<a href="([^"]+)[^>]+>Pagina'
else:
patronBlock = r'<ul class="posts">(?P<block>.*)<div class="clear[^"]*">'
patron = r'<li>\s?<a href="(?P<url>[^"]+)" data-thumbnail="(?P<thumb>[^"]+)">.*?<div class="title[^"]*">(?P<title>.+?)(?:\s\[(?P<quality>HD)\])?<\/div>\s*<div class="episode[^"]*"[^>]+>(?P<episode>[^<(]+)(?:\((?P<lang>[a-zA-Z\-]+)\))?'
if item.args == 'genres': if item.args == 'search':
action = 'check' action = 'check'
elif item.contentType == 'tvshow':
item.nextpage = item.page + 1 action = 'episodes'
nextPageUrl = "{}/?paged={}".format(item.parent_url, item.nextpage) elif item.contentType == 'movie':
patron= r'<item>\s<title>(?P<title>[^<]+?)\s*(\((?P<lang>Sub-[a-zA-Z]+)*\))?\s*(\[(?P<quality>[A-Z]*)\])?\s*(\((?P<year>[0-9]{4})\))?</title>.*?<link>(?P<url>.*?)</link>' action ='findvideos'
def fullItemlistHook(itemlist):
if len(itemlist) < 10:
return itemlist[:-1:]
else:
return itemlist
else: else:
action = 'check' action = 'check'
patron= r'<article class=\"elementor-post.*?(<img .*?src=\"(?P<thumb>[^\"]+).*?)?<h3 class=\"elementor-post__title\".*?<a href=\"(?P<url>[^\"]+)\" >\s*(?P<title>[^<]+?)\s*(\((?P<lang>Sub-[a-zA-Z]+)*\))?\s*(\[(?P<quality>[A-Z]*)\])?\s*(\((?P<year>[0-9]{4})\))?\s+<'
def itemHook(item):
item.title = item.title.replace(' - La Serie', '')
return item
return locals() return locals()
def episodios(item): @support.scrape
item.quality = '' def episodes(item):
data = item.data if item.data else httptools.downloadpage(item.url).data # debug=True
itemlist = [] data = support.match(item.url, headers=headers).data
if 'accordion-item' in data:
patronBlock = r'<span class="season[^>]*>\d+[^>]+>[^>]+>[^>]+>[^>]+>\D*(?:STAGIONE|Stagione)[ -]+(?P<lang>[a-zA-Z\- ]+)[^<]*</span>(?P<block>.*?)<div id="(?:season|disqus)'
patron = r'data-src="(?P<thumb>[^"]+)"[^>]*>.*?<li class="season-no">(?P<season>\d+)(?:&#215;|×|x)(?P<episode>\d+)[^<0-9]*<\/li>(?P<data>.*?javascript:;">(?P<title>[^<]+).*?</tbody>)'
else:
patronBlock = r'(?:STAGIONE|Stagione)(?:<[^>]+>)?\s*(?:(?P<lang>[A-Za-z- ]+))?(?P<block>.*?)(?:&nbsp;|<strong>|<div class="addtoany)'
patron = r'(?:/>|p>)\s*(?P<season>\d+)(?:&#215;|×|x)(?P<episode>\d+)[^<]+(?P<data>.*?)(?:<br|</p)'
for it in support.match(data, patron=[r'div class=\"single-season.*?(?P<id>season_[0-9]+).*?>Stagione:\s(?P<season>[0-9]+).*?(\s-\s(?P<lang>[a-zA-z]+?))?<']).matches: def itemHook(i):
block = support.match(data, patron = r'div id=\"'+ it[0] +'\".*?</div').match i.url = item.url
for ep in support.match(block, patron=[r'<li><a href=\"(?P<url>[^\"]+).*?img\" src=\"(?P<thumb>[^\"]+).*?title\">(?P<episode>[0-9]+)\.\s+(?P<title>.*?)</span>']).matches: i.title.replace('&#215;','x')
itemlist.append(item.clone(contentType = 'episode', if not i.contentLanguage:
action='findvideos', i.contentLanguage = 'ITA'
thumb=ep[1], return i
episode=ep[2], return locals()
season=it[1],
contentSeason=it[1],
contentEpisodeNumber=ep[2],
title = support.format_longtitle(support.cleantitle(ep[3]), season = it[1], episode = ep[2], lang= it[3]),
url = scrapertools.unescape(ep[0]), data = '')
)
if config.get_setting('episode_info') and not support.stackCheck(['add_tvshow', 'get_newest']):
support.tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
support.check_trakt(itemlist)
support.videolibrary(itemlist, item)
if (config.get_setting('downloadenabled')):
support.download(itemlist, item)
return itemlist
@support.scrape @support.scrape
def genres(item): def genres(item):
action = 'peliculas'
blacklist = ['Tutti i film',]
wantSaga = True if item.args == 'saghe' else False
item.args = 'genres'
patronBlock = r'<nav class="elementor-nav-menu--main (?P<block>.*?)</nav>' if item.args == 'lettersF':
patronMenu = r'<li class="menu-item.*?<a href="(?P<url>https:\/\/.*?)".*?>(?P<title>.*?)</a></li>' item.contentType = 'movie'
else:
item.contentType = 'tvshow'
def itemHook(item): action = 'movies'
item.url = "{}/feed/".format(item.url) patronBlock = r'<select class="cats">(?P<block>.*?)<\/select>'
return item patronGenreMenu = r'<option data-src="(?P<url>[^"]+)">(?P<title>[^<]+)<\/option>'
def itemlistHook(itemlist):
itl = []
for item in itemlist:
isSaga = item.fulltitle.startswith('Saga')
if len(item.fulltitle) != 3:
if (isSaga and wantSaga) or (not isSaga and not wantSaga):
itl.append(item)
return itl
return locals() return locals()
def check(item): def check(item):
item.data = httptools.downloadpage(item.url).data logger.debug()
if 'season-details' in item.data.lower(): patron=r'class="taxonomy category"\s*><span property="name">([^>]+)</span></a><meta property="position" content="2">'
item.contentType = 'tvshow' block = support.match(item.url, patron=patron,headers=headers).match
return episodios(item) if block.lower() != 'film':
logger.debug('### è una Serie ###')
item.contentType='tvshow'
return episodes(item)
else: else:
item.contentType = 'movie' logger.debug(' ### è un Film ###')
item.contentType='movie'
return findvideos(item) return findvideos(item)
def search(item, text): def search(item, texto):
item.url = "{}/?{}".format(host, support.urlencode({'s': text})) logger.debug()
item.url = host + "/?s=" + texto
item.args = 'search' item.args = 'search'
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
logger.error("search except: %s" % line) logger.error("%s" % line)
return [] return []
def newest(categoria): def newest(category):
support.info() logger.debug()
itemlist = [] itemlist = []
item = Item() item = Item()
try: try:
if categoria == "peliculas": if category == "movie":
item.url = host + "/category/film/feed/" item.url = host + "/category/film/"
item.action = "peliculas" item.action = "movies"
item.extra = "movie" item.extra = "movie"
item.contentType = 'movie' item.contentType = 'movie'
itemlist = peliculas(item) itemlist = movies(item)
else: else:
item.url = host + "/category/serie-tv/feed/" item.url = host + "/aggiornamenti-serie-tv/"
item.action = "peliculas" item.action = "movies"
item.args = "newest" item.args = "newest"
item.contentType = 'tvshow' item.contentType = 'tvshow'
itemlist = peliculas(item) itemlist = movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.info("{0}".format(line)) logger.error("{0}".format(line))
return [] return []
return itemlist return itemlist
def findvideos(item): def findvideos(item):
video_url = item.url
if item.contentType == 'movie': if item.contentType == 'movie':
video_url = support.match(item.url, patron=r'<a href="([^"]+)" rel="nofollow">').match data = support.match(item.url, patron=r'<a target="_blank" rel="nofollow" href="([^"]+)">').matches
return support.server(item, data=data, patronTag='Versione: <[^>]+>([^<]+)')
video_url = support.match(video_url, patron=r'<iframe src=\"(https://.*?)\"').match else:
return support.server(item, item.data)
if (video_url == ''):
return []
itemlist = [item.clone(action="play", url=srv) for srv in support.match(video_url, patron='<div class=\"megaButton\" meta-type=\"v\" meta-link=\"([^\"]+).*?(?=>)>').matches]
itemlist = support.server(item,itemlist=itemlist)
return itemlist

View File

@@ -1,10 +0,0 @@
{
"id": "filmstreaming",
"name": "Film Streaming",
"language": ["ita"],
"active": false,
"thumbnail": "filmstreaming.png",
"banner": "filmstreaming.png",
"categories": ["movie"],
"settings": []
}

View File

@@ -1,94 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per filmstreaming
# ------------------------------------------------------------
from core import support
from core.item import Item
from platformcode import config, logger
host = config.get_channel_url()
headers = [['Referer', host]]
@support.menu
def mainlist(item):
film = ['/film',
('Al Cinema', ['/cinema', 'peliculas']),
('Ultimi Inseriti', ['', 'peliculas', 'last']),
('Generi', ['', 'genres', 'genres']),
('Anno', ['', 'genres', 'years'])]
return locals()
def search(item, text):
logger.debug('search', text)
itemlist = []
text = text.replace(" ", "+")
item.url = '{}/index.php?do=search&subaction=search&story={}'.format(host, text)
try:
return peliculas(item)
except:
import sys
for line in sys.exc_info():
logger.error("search except: %s" % line)
return []
def newest(categoria):
logger.debug(categoria)
itemlist = []
item = Item()
try:
if categoria == "peliculas":
item.url = host
item.action = "peliculas"
item.contentType = 'movie'
item.args = 'last'
itemlist = peliculas(item)
if itemlist[-1].action == "peliculas":
itemlist.pop()
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
logger.error("{0}".format(line))
return []
return itemlist
@support.scrape
def peliculas(item):
# debug=True
if item.args == 'last':
patronBlock = r'inseriti:(?P<block>.*?)<div class="block-showmore'
patron = r'item-movie">[^>]+><a href="(?P<url>[^"]+)[^>]+><img data-src="(?P<thumb>[^"]+)(?:[^>]+>){6}(?P<title>[^<]+)(?:[^>]+>){4}(?P<year>\d+)?(?:[^>]+>){2}(?P<quality>[^<]+)'
# patron = r'item-movie">[^>]+><a href="(?P<url>[^"]+)[^>]+><img data-src="(?P<thumb>[^"]+)(?:[^>]+>){6}(?P<title>[^<]+)(?:[^>]+>){6}(?P<quality>[^<]+)'
patronNext = r'<a href="([^"]+)">&rarr'
return locals()
@support.scrape
def genres(item):
action = "peliculas"
_type ={'years':'Anno', 'genres':'Categorie'}
patronBlock = _type[item.args] + r'(?:[^>]+>){4}(?P<block>.*?)</ul>'
patronMenu = '<li><a href="(?P<url>[^"]+)">(?P<title>.*?)</a>'
return locals()
def findvideos(item):
urls = []
data = support.match(item.url).data
urls += support.match(data, patron=r'<span data-link="([^"]+)').matches
url = support.match(data, patron='<iframe [^>]+src="([^"]+)').match
if url:
urls.append(support.match(url).data)
return support.server(item, urls)

2
channels/guardaseriecam.json Executable file → Normal file
View File

@@ -2,7 +2,7 @@
"id": "guardaseriecam", "id": "guardaseriecam",
"name": "GuardaSerie Cam", "name": "GuardaSerie Cam",
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"active": true, "active": false,
"thumbnail": "https://raw.githubusercontent.com/32Dexter/DexterRepo/master/media/guardaserie_live.png", "thumbnail": "https://raw.githubusercontent.com/32Dexter/DexterRepo/master/media/guardaserie_live.png",
"banner": "", "banner": "",
"categories": ["tvshow"], "categories": ["tvshow"],

26
channels/guardaseriecam.py Executable file → Normal file
View File

@@ -11,7 +11,6 @@
# possibilità di miglioramento: inserire menu per genere - lista serie tv e gestire le novità # possibilità di miglioramento: inserire menu per genere - lista serie tv e gestire le novità
from core import support from core import support
from core.support import info
from platformcode import logger, config from platformcode import logger, config
host = config.get_channel_url() host = config.get_channel_url()
@@ -29,43 +28,42 @@ def mainlist(item):
@support.scrape @support.scrape
def list(item): def list(item):
patronMenu = r'<a title="(?P<title>[^"]+)" href="(?P<url>[^"]+)' patronMenu = r'<a title="(?P<title>[^"]+)" href="(?P<url>[^"]+)'
action = 'peliculas' action = 'movies'
return locals() return locals()
@support.scrape @support.scrape
def peliculas(item): def movies(item):
# debug = True patron = r'<div class="mlnh-thumb"><a href="(?P<url>[^"]+).*?title="(?P<title>[^"]+).*?src="(?P<thumb>[^"]+).*?hdn">(?P<year>[0-9]{4})'
patron = r'<div class="mlnh-thumb"><a href="(?P<url>[^"]+)[^>]+title="(?P<title>[^"]+).*?<img src="(?P<thumb>[^"]+).*?hdn">[^<]*(?P<year>[0-9]{4})' patronNext = 'pagenavi.*?<span>.</span>.*?<a href="([^"]+)'
patronNext = 'pagenavi.*?<a href="([^"]+)">\d+' action = 'episodes'
action = 'episodios'
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodes(item):
patronBlock = r'<div class="tab-pane fade" id="season-(?P<season>.)"(?P<block>.*?)</ul>\s*</div>' patronBlock = r'<div class="tab-pane fade" id="season-(?P<season>.)"(?P<block>.*?)</div>'
patron = r'(?P<data><a href="#" allowfullscreen data-link="[^"]+.*?title="(?P<title>[^"]+)(?P<lang>[sS][uU][bB]-?[iI][tT][aA])?\s*">(?P<episode>[^<]+).*?</li>)' patron = r'<a href="#" allowfullscreen data-link="(?P<url>[^"]+).*?title="(?P<title>[^"]+)(?P<lang>[sS][uU][bB]-?[iI][tT][aA])?\s*">(?P<episode>[^<]+)'
action = 'findvideos' action = 'findvideos'
# debug = True # debug = True
return locals() return locals()
def search(item, text): def search(item, text):
support.info('search', text) logger.debug('search', text)
item.contentType = 'tvshow' item.contentType = 'tvshow'
itemlist = [] itemlist = []
text = text.replace(' ', '+') text = text.replace(' ', '+')
item.url = host + '/index.php?story=%s&do=search&subaction=search' % (text) item.url = host + '/index.php?story=%s&do=search&subaction=search' % (text)
try: try:
return peliculas(item) return movies(item)
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
info('search log:', line) logger.error('search log:', line)
return [] return []
def findvideos(item): def findvideos(item):
logger.debug() logger.debug()
return support.server(item, item.data) return support.server(item, item.url)

8
channels/guardaserieclick.json Executable file → Normal file
View File

@@ -1,15 +1,15 @@
{ {
"id": "guardaserieclick", "id": "guardaserieclick",
"name": "GuardaSerie.click", "name": "GuardaSerie.click",
"active": false, "active": true,
"language": ["ita", "vos"], "language": ["ita", "sub-ita"],
"thumbnail": "guardaserieclick.png", "thumbnail": "guardaserieclick.png",
"bannermenu": "guardaserieclick.png", "bannermenu": "guardaserieclick.png",
"categories": ["tvshow", "anime"], "categories": ["tvshow", "anime"],
"not_active": ["include_in_newest_peliculas", "include_in_newest_anime"], "not_active": ["include_in_newest_movie", "include_in_newest_anime"],
"settings": [ "settings": [
{ {
"id": "include_in_newest_peliculas", "id": "include_in_newest_movie",
"type": "bool", "type": "bool",
"label": "@70727", "label": "@70727",
"default": false, "default": false,

69
channels/guardaserieclick.py Executable file → Normal file
View File

@@ -16,8 +16,7 @@
from core import support from core import support
from core.item import Item from core.item import Item
from platformcode import config from platformcode import config, logger
from core.support import info
host = config.get_channel_url() host = config.get_channel_url()
headers = [['Referer', host]] headers = [['Referer', host]]
@@ -26,28 +25,28 @@ headers = [['Referer', host]]
@support.menu @support.menu
def mainlist(item): def mainlist(item):
tvshow = ['', tvshow = ['',
('Aggiornamenti', ['', 'peliculas', 'update']), ('Aggiornamenti', ['', 'movies', 'update']),
('Generi', ['', 'genres', 'genres']), ('Generi', ['', 'genres', 'genres']),
('News Sub-ITA', ['', 'peliculas', 'ined']), ('News Sub-ITA', ['', 'movies', 'ined']),
('Anime/Cartoni', ["/category/animazione/", 'peliculas', 'genres']) ('Anime/Cartoni', ["/category/animazione/", 'movies', 'genres'])
] ]
return locals() return locals()
##@support.scrape ##@support.scrape
##def peliculas(item): ##def movies(item):
#### import web_pdb; web_pdb.set_trace() #### import web_pdb; web_pdb.set_trace()
## info('peliculas ->\n', item) ## logger.debug('movies ->\n', item)
## ##
## action = 'episodios' ## action = 'episodes'
## block = r'(?P<block>.*?)<div\s+class="btn btn-lg btn-default btn-load-other-series">' ## block = r'(?P<block>.*?)<div\s+class="btn btn-lg btn-default btn-load-other-series">'
## ##
## if item.args == 'ined': ## if item.args == 'ined':
## deflang = 'SUB-ITA' ## deflang = 'SUB-ITA'
## patronBlock = r'<span\s+class="label label-default label-title-typology">'+block ## patronBlock = r'<span\s+class="label label-default label-title-typology">'+block
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' ## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
## pagination = 25 ## pagination = True
## elif item.args == 'update': ## elif item.args == 'update':
## patronBlock = r'<div\s+class="container-fluid greybg title-serie-lastep title-last-ep fixed-title-wrapper containerBottomBarTitle">'+block ## patronBlock = r'<div\s+class="container-fluid greybg title-serie-lastep title-last-ep fixed-title-wrapper containerBottomBarTitle">'+block
## patron = r'<a(?: rel="[^"]+")? href="(?P<url>[^"]+)"(?: class="[^"]+")?>[ ]<img class="[^"]+"[ ]title="[^"]+"[ ]alt="[^"]+"[ ]src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<episode>\d+.\d+)[ ]\((?P<lang>[a-zA-Z\-]+)[^<]+<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+)<' ## patron = r'<a(?: rel="[^"]+")? href="(?P<url>[^"]+)"(?: class="[^"]+")?>[ ]<img class="[^"]+"[ ]title="[^"]+"[ ]alt="[^"]+"[ ]src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<episode>\d+.\d+)[ ]\((?P<lang>[a-zA-Z\-]+)[^<]+<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+)<'
@@ -59,25 +58,25 @@ def mainlist(item):
## elif item.args == 'nolost': ## elif item.args == 'nolost':
## patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-danonperd">'+block ## patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-danonperd">'+block
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' ## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
## pagination = 25 ## pagination = True
## elif item.args == 'classic': ## elif item.args == 'classic':
## patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-classiche">'+block ## patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-classiche">'+block
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' ## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
## pagination = 25 ## pagination = True
## else: ## else:
## patronBlock = r'<div\s+class="container container-title-serie-new container-scheda" meta-slug="new">'+block ## patronBlock = r'<div\s+class="container container-title-serie-new container-scheda" meta-slug="new">'+block
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' ## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
## pagination = 25 ## pagination = True
## ##
## debug = True ## debug = True
## return locals() ## return locals()
@support.scrape @support.scrape
def peliculas(item): def movies(item):
## import web_pdb; web_pdb.set_trace() ## import web_pdb; web_pdb.set_trace()
info('peliculas ->\n', item) logger.debug('movies ->\n', item)
action = 'episodios' action = 'episodes'
blacklist = ['DMCA'] blacklist = ['DMCA']
if item.args == 'genres' or item.args == 'search': if item.args == 'genres' or item.args == 'search':
@@ -91,36 +90,36 @@ def peliculas(item):
else: else:
end_block = r'(?P<block>.*?)<div\s+class="btn btn-lg btn-default btn-load-other-series">' end_block = r'(?P<block>.*?)<div\s+class="btn btn-lg btn-default btn-load-other-series">'
patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
pagination = 25 pagination = True
if item.args == 'ined': if item.args == 'ined':
deflang = 'SUB-ITA' deflang = 'SUB-ITA'
patronBlock = r'<span\s+class="label label-default label-title-typology">' + end_block patronBlock = r'<span\s+class="label label-default label-title-typology">' + end_block
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' ## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
## pagination = 25 ## pagination = True
elif item.args == 'update': elif item.args == 'update':
patronBlock = r'<div\s+class="container-fluid greybg title-serie-lastep title-last-ep fixed-title-wrapper containerBottomBarTitle">' + end_block patronBlock = r'<div\s+class="container-fluid greybg title-serie-lastep title-last-ep fixed-title-wrapper containerBottomBarTitle">' + end_block
patron = r'href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>.+?class="strongText">(?P<title>.+?)<' patron = r'href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>.+?class="strongText">(?P<title>.+?)<'
# elif item.args == 'nolost': # elif item.args == 'nolost':
# patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-danonperd">' + end_block # patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-danonperd">' + end_block
# pagination = 25 # pagination = True
# elif item.args == 'classic': # elif item.args == 'classic':
# patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-classiche">' + end_block # patronBlock = r'<h2 class="title-typology styck-top" meta-class="title-serie-classiche">' + end_block
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' ## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
## pagination = 25 ## pagination = True
## elif item.args == 'anime': ## elif item.args == 'anime':
## ##
else: else:
patronBlock = r'<div\s+class="container container-title-serie-new container-scheda" meta-slug="new">' + end_block patronBlock = r'<div\s+class="container container-title-serie-new container-scheda" meta-slug="new">' + end_block
## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<' ## patron = r'<a href="(?P<url>[^"]+)".*?>\s<img\s.*?src="(?P<thumb>[^"]+)"\s/>[^>]+>[^>]+>\s[^>]+>\s(?P<year>\d{4})?\s.+?class="strongText">(?P<title>.+?)<'
## pagination = 25 ## pagination = True
# support.regexDbg(item, patronBlock, headers) # support.regexDbg(item, patronBlock, headers)
# debug = True # debug = True
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodes(item):
info() logger.debug()
action = 'findvideos' action = 'findvideos'
patron = r'<div class="number-episodes-on-img">\s?\d+.\d+\s?(?:\((?P<lang>[a-zA-Z\-]+)\))?</div>.+?(?:<span class="pull-left bottom-year">(?P<title2>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]+)<[^>]+>[^>]+>[^>]+>\s?)?<span(?: meta-nextep="[^"]+")? class="[^"]+" meta-serie="(?P<title>[^"]+)" meta-stag="(?P<season>\d+)" meta-ep="(?P<episode>\d+)" meta-embed="(?P<url>[^>]+)">' patron = r'<div class="number-episodes-on-img">\s?\d+.\d+\s?(?:\((?P<lang>[a-zA-Z\-]+)\))?</div>.+?(?:<span class="pull-left bottom-year">(?P<title2>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]+)<[^>]+>[^>]+>[^>]+>\s?)?<span(?: meta-nextep="[^"]+")? class="[^"]+" meta-serie="(?P<title>[^"]+)" meta-stag="(?P<season>\d+)" meta-ep="(?P<episode>\d+)" meta-embed="(?P<url>[^>]+)">'
@@ -136,9 +135,9 @@ def episodios(item):
@support.scrape @support.scrape
def genres(item): def genres(item):
info() logger.debug()
action = 'peliculas' action = 'movies'
patronMenu = r'<li>\s<a\shref="(?P<url>[^"]+)"[^>]+>(?P<title>[^<]+)</a></li>' patronMenu = r'<li>\s<a\shref="(?P<url>[^"]+)"[^>]+>(?P<title>[^<]+)</a></li>'
patron_block = r'<ul\sclass="dropdown-menu category">(?P<block>.*?)</ul>' patron_block = r'<ul\sclass="dropdown-menu category">(?P<block>.*?)</ul>'
# debug = True # debug = True
@@ -146,42 +145,42 @@ def genres(item):
def search(item, text): def search(item, text):
info(text) logger.debug(text)
item.url = host + "/?s=" + text item.url = host + "/search/" + text
item.contentType = 'tvshow' item.contentType = 'tvshow'
item.args = 'search' item.args = 'search'
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
info("%s" % line) logger.error("%s" % line)
return [] return []
def newest(categoria): def newest(category):
info() logger.debug()
itemlist = [] itemlist = []
item = Item() item = Item()
item.contentType = 'tvshow' item.contentType = 'tvshow'
item.args = 'update' item.args = 'update'
try: try:
if categoria == "series": if category == 'tvshow':
item.url = host item.url = host
item.action = "peliculas" item.action = "movies"
itemlist = peliculas(item) itemlist = movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
info("{0}".format(line)) logger.error("{0}".format(line))
return [] return []
return itemlist return itemlist
def findvideos(item): def findvideos(item):
info('--->', item) logger.debug('--->', item)
return support.server(item, item.url) return support.server(item, item.url)

2
channels/guardaserieicu.json Executable file → Normal file
View File

@@ -2,7 +2,7 @@
"id": "guardaserieicu", "id": "guardaserieicu",
"name": "Guarda Serie Icu", "name": "Guarda Serie Icu",
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"active": false, "active": true,
"thumbnail": "https://raw.githubusercontent.com/32Dexter/DexterRepo/master/media/guarda_serie.jpg", "thumbnail": "https://raw.githubusercontent.com/32Dexter/DexterRepo/master/media/guarda_serie.jpg",
"banner": "", "banner": "",
"categories": ["tvshow"], "categories": ["tvshow"],

32
channels/guardaserieicu.py Executable file → Normal file
View File

@@ -10,56 +10,50 @@
# possibilità di miglioramento: gestire le novità (sezione Ultimi episodi sul sito) # possibilità di miglioramento: gestire le novità (sezione Ultimi episodi sul sito)
from core.support import info
from core import support from core import support
from platformcode import config from platformcode import config, logger
host = config.get_channel_url() host = config.get_channel_url()
headers = [['Referer', host]] headers = [['Referer', host]]
@support.menu @support.menu
def mainlist(item): def mainlist(item):
tvshow = ['/serie'] tvshow = ['/serie']
return locals() return locals()
@support.scrape @support.scrape
def peliculas(item): def movies(item):
# debug = True patronBlock = r'movies-list movies-list-full(?P<block>.*?)footer>'
# patronBlock = r'movies-list movies-list-full(?P<block>.*?)footer>' patron = r'<div data-movie-id[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>[^>]+>[^>]+><img src="(?P<thumbnail>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+).*?jt-info[^>]+>[^:]+:\s*(?P<rating>[^<]+)[^>]+>[^>]+>[^>]+>(?P<year>\d*)[^>]+>[^>]+>[^>]+>(?P<duration>\d*)'
if item.args == 'search':
patron = r'<div data-movie-id[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>(?:\s*<span class="mli-quality">(?P<quality>[^>]+)</span>)?\s*<img src="(?P<thumbnail>[^"]+)[^>]+>[^>]+>[^>]+>(?P<title>[^<]+).*?jt-info[^>]+>[^:]+:\s*(?P<rating>[^<]+)[^>]+>[^>]+>[^>]+>(?P<year>\d*)[^>]+>[^>]+>[^>]+>(?P<duration>\d*).*?"f-desc">(?:\s*<p>(?P<plot>[^<]+))?'
else:
patron = r'<div data-movie-id[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>[^>]+>[^>]+><img src="(?P<thumbnail>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+).*?jt-info[^>]+>[^:]+:\s*(?P<rating>[^<]+)[^>]+>[^>]+>[^>]+>(?P<year>\d*)[^>]+>[^>]+>[^>]+>(?P<duration>\d*)'
patronNext = '<li class=.active.>.*?href=.(.*?).>' patronNext = '<li class=.active.>.*?href=.(.*?).>'
action = 'episodios' action = 'episodes'
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodes(item):
patronBlock = r'<strong>Stagione (?P<season>[0-9]+)(?P<block>.*?)</div></div>' patronBlock = r'<strong>Stagione (?P<season>[0-9]+)(?P<block>.*?)</div></div>'
patron = r'<a href="(?P<url>[^"]+)">\s*Episodio\s*(?P<episode>[0-9]+)' patron = r'<a href="(?P<url>[^"]+)">\s*Episodio\s*(?P<episode>[0-9]+)'
return locals() return locals()
def search(item, text): def search(item, text):
info(text) logger.debug(text)
item.contentType = 'tvshow' item.contentType = 'tvshow'
item.url = host + "/?s=" + text item.url = host + "/?s=" + text
try: try:
item.args = 'search' item.args = 'search'
return peliculas(item) return movies(item)
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
info("%s" % line) logger.error("%s" % line)
return [] return []
def findvideos(item): def findvideos(item):
support.info('findvideos', item) logger.debug('findvideos', item)
data = support.match(item, headers=headers, patron=r'div class="movieplay">([^>]+)').matches data = support.match(item, headers=headers, patron=r'div class="movieplay">([^>]+)').matches
return support.server(item, data=data ) return support.server(item, data=data )

2
channels/hd4me.json Executable file → Normal file
View File

@@ -5,7 +5,7 @@
"active": true, "active": true,
"thumbnail": "hd4me.png", "thumbnail": "hd4me.png",
"banner": "hd4me.png", "banner": "hd4me.png",
"categories": ["movie", "vos"], "categories": ["movie", "sub"],
"not_active": ["include_in_newest"], "not_active": ["include_in_newest"],
"settings": [] "settings": []
} }

19
channels/hd4me.py Executable file → Normal file
View File

@@ -4,6 +4,7 @@
# ------------------------------------------------------------ # ------------------------------------------------------------
from core import support from core import support
from platformcode import logger
host = support.config.get_channel_url() host = support.config.get_channel_url()
@@ -19,22 +20,22 @@ def mainlist(item):
@support.scrape @support.scrape
def peliculas(item): def movies(item):
# debug = True # debug = True
if item.args == 'alternative': if item.args == 'alternative':
pagination = '' pagination = True
patron = r'<a title="(?P<title>[^\(]+)\(\s*(?P<year>\d+)\)\s\D+(?P<quality>\d+p).{3}(?P<lang>[^ ]+).*?[^"]+"\s*href="(?P<url>[^"]+)' patron = r'<a title="(?P<title>[^\(]+)\(\s*(?P<year>\d+)\)\s\D+(?P<quality>\d+p).{3}(?P<lang>[^ ]+).*?[^"]+"\s*href="(?P<url>[^"]+)'
else: else:
patron = r'<a href="(?P<url>[^"]+)" (?:rel="?[0-9]+"?)? title="(?P<title>[^"]+)(?!\()\s*\((?P<year>\d+)\)\s(?:[^\]]+\])?\D+(?P<quality>\d+p).{3}(?P<lang>[^ ]+).*?<img id="?cov"?.*?src="(?P<thumb>[^"]+)' patron = r'<a href="(?P<url>[^"]+)" (?:rel="?[0-9]+"?)? title="(?P<title>[^\(]+)(?!\()\s*\((?P<year>\d+)\)\s(?:[^\]]+\])?\D+(?P<quality>\d+p).{3}(?P<lang>[^ ]+).*?<img id="?cov"?.*?src="(?P<thumb>[^"]+)'
patronNext = r'current(?:[^>]*>){2}\s*<a class="[^"]+"\s* href="([^"]+)' patronNext = r'current(?:[^>]*>){2}\s*<a class="[^"]+"\s* href="([^"]+)'
return locals() return locals()
@support.scrape @support.scrape
def genre(item): def genre(item):
action = 'peliculas' action = 'movies'
blacklist =['prova '] blacklist =['prova ']
patronMenu = r'<a href="(?P<url>[^"]+)" class="menu-link\s*sub-menu-link">(?P<title>[^<]+)<' patronGenreMenu = r'<a href="(?P<url>[^"]+)" class="menu-link\s*sub-menu-link">(?P<title>[^<]+)<'
def itemHook(item): def itemHook(item):
if item.fulltitle in ['Classici Disney', 'Studio Ghibli', 'Pixar']: if item.fulltitle in ['Classici Disney', 'Studio Ghibli', 'Pixar']:
item.args = 'alternative' item.args = 'alternative'
@@ -43,21 +44,19 @@ def genre(item):
def search(item, text): def search(item, text):
support.info(text) logger.debug(text)
item.url = host + '/?s=' + text item.url = host + '/?s=' + text
try: try:
return peliculas(item) return movies(item)
# Cattura la eccezione così non interrompe la ricerca globle se il canale si rompe! # Cattura la eccezione così non interrompe la ricerca globle se il canale si rompe!
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.logger.error("search except: %s" % line) logger.error("search except: %s" % line)
return [] return []
def findvideos(item): def findvideos(item):
url = support.match(item, patron=r'<a class=["]?bot1["]? href="([^"]+)"').match url = support.match(item, patron=r'<a class=["]?bot1["]? href="([^"]+)"').match
if not url.startswith('http'):
url = host + url
url = support.httptools.downloadpage(url, followredirect=True).url url = support.httptools.downloadpage(url, followredirect=True).url
return support.server(item, url) return support.server(item, url)

0
channels/ilcorsaronero.json Executable file → Normal file
View File

82
channels/ilcorsaronero.py Executable file → Normal file
View File

@@ -3,59 +3,83 @@
# Canale per ilcorsaronero # Canale per ilcorsaronero
# ------------------------------------------------------------ # ------------------------------------------------------------
from core import support, httptools from core import support
from platformcode import logger
# def findhost(url):
# data = support.httptools.downloadpage(url).data
# url = support.scrapertools.find_single_match(data, '<li><a href="([^"]+)')
# return url[:-1] if url.endswith('/') else url
host = support.config.get_channel_url() host = support.config.get_channel_url()
support.info('HOST',host) logger.debug('HOST',host)
# host = 'https://ilcorsaronero.xyz'
headers = [['Referer', host]] headers = [['Referer', host]]
@support.menu @support.menu
def mainlist(item): def mainlist(item):
menu = [ menu = [
('Film {film}', ['/cat/film', 'peliculas', [0, 'movie', True], 'undefined']), ('BDRiP {film}', ['/categoria.php?active=0&category=1&order=data&by=DESC&page=', 'movies', [0, 'movie', True], 'undefined']),
('Serie TV', ['/cat/serie-tv', 'peliculas', [0 , 'tvshow', True], 'undefined']), ('Cerca BDRiP... {submenu} {film}', ['/torrent-ita/1/', 'search', ['search', 'movie', True], 'movie']),
('Animazione', ['/cat/animazione', 'peliculas', [0 , 'anime', True], 'undefined']), ('DVD {film}', ['/categoria.php?active=0&category=20&order=data&by=DESC&page=', 'movies', [0, 'movie', True], 'undefined']),
('Documentari', ['/cat/altro/documentari', 'peliculas', [0 , 'documentary', True], 'undefined']), ('Cerca DVD... {submenu} {film}', ['/torrent-ita/20/', 'search', ['search', 'movie', True], 'movie']),
('Programmi TV', ['/cat/altro/programmi-tv', 'peliculas', [0 , 'tvshow', True], 'tvshow']), ('Screener {film}', ['/categoria.php?active=0&category=19&order=data&by=DESC&page=', 'movies', [0, 'movie', True], 'undefined']),
('Video Musica', ['/cat/musica/video-musicali', 'peliculas', [0 , 'music', False], 'undefined']), ('Cerca Screener.. {submenu} {film}', ['/torrent-ita/19/', 'search', ['search', 'movie', True], 'movie']),
('Videocorsi', ['/cat/altro/videocorsi', 'peliculas', [0 , 'music', False], 'undefined']) ('Serie TV', ['/categoria.php?active=0&category=15&order=data&by=DES&page=', 'movies', [0 , 'tvshow', True], 'tvshow']),
('Cerca Serie TV.. {submenu}', ['/torrent-ita/15/', 'search', ['search', 'tvshow',True], 'tvshow']),
('Anime', ['/categoria.php?active=0&category=5&order=data&by=DESC&page=', 'movies', [0, 'anime', True], 'tvshow']),
('Cerca Anime.. {submenu}', ['/torrent-ita/5/', 'search', ['search', 'anime', True], 'tvshow']),
('Musica', ['/categoria.php?active=0&category=2&order=data&by=DESC&page=', 'movies', [0, 'music', False], 'music']),
('Cerca Musica.. {submenu}', ['/torrent-ita/2/', 'search', ['search', 'music', False], 'music']),
('Audiolibri {musica}', ['/categoria.php?active=0&category=18&order=data&by=DESC&page=', 'movies', [0, 'music', False], 'music']),
('Cerca Audiolibri.. {submenu}', ['/torrent-ita/18/', 'search', ['search', 'music', False], 'music']),
# mostrerebbe anche risultati non "multimediali" e allungherebbero inutilmente la ricerca globale
# ('Altro {film}', ['/categoria.php?active=0&category=4&order=data&by=DESC&page=', 'movies', [0, 'other', False]]),
# ('Cerca altro.. {submenu}', ['/torrent-ita/4/', 'search', ['search', 'other', False]]),
# ('Cerca Tutto... {color kod bold}', ['/argh.php?search=', 'search', ['search', 'all', False]])
] ]
search = ''
return locals() return locals()
@support.scrape @support.scrape
def peliculas(item): def movies(item):
debug = False # debug = True
action = 'findvideos' sceneTitle = item.args[2]
sceneTitle = item.args[2] if item.args[1] in ['tvshow', 'anime', 'music', 'other']:
patron = r'>[^"<]+'
else:
patron = r'>(?P<quality>[^"<]+)'
patron += r'</td> <TD[^>]+><A class="tab" HREF="(?P<url>[^"]+)"\s*>(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<size>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<seed>[^<]+)'
def itemHook(item): if 'search' not in item.args:
if not sceneTitle: item.url += str(item.args[0])
item.title = item.title.replace('_', ' ') def itemlistHook(itemlist):
item.fulltitle = item.fulltitle.replace('_', ' ') args = item.args
item.title = support.scrapertools.decodeHtmlentities(support.urlparse.unquote(item.title)) args[0] += 1
support.nextPage(itemlist, item, 'movies', next_page=item.url, total_pages=15)
return item return itemlist
patron = r'<a class="hover:underline line-clamp-1.*?href="(?P<url>[^"]+)"\s*>(?P<title>.*?)</a>[^>]+>[^>]+>[^>]+>(?P<seed>.*?)<'
patronNext = r'<a href="(?P<url>[^"]+)".*?Next</span>'
return locals() return locals()
def search(item, text): def search(item, text):
item.url = "{}/search?{}".format(host, support.urlencode({'q': text})) logger.debug( text)
item.args = 'search' if 'all' in item.args:
item.url += text
else:
item.url += text + '.html'
try: try:
return peliculas(item) return movies(item)
# Cattura l' eccezione così non interrompe la ricerca globle se il canale si rompe!
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
logger.error("search except: %s" % line) logger.error("search except: %s" % line)
return [] return []
def findvideos(item): def findvideos(item):
if item.contentType == 'tvshow': item.contentType = 'episode' if item.contentType == 'tvshow': item.contentType = 'episode'
Videolibrary = True if 'movie' in item.args else False Videolibrary = True if 'movie' in item.args else False

4
channels/ilgeniodellostreaming.json Executable file → Normal file
View File

@@ -1,10 +1,10 @@
{ {
"id": "ilgeniodellostreaming", "id": "ilgeniodellostreaming",
"name": "IlGenioDelloStreaming", "name": "IlGenioDelloStreaming",
"active": false, "active": true,
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"thumbnail": "ilgeniodellostreaming.png", "thumbnail": "ilgeniodellostreaming.png",
"banner": "ilgeniodellostreaming.png", "banner": "ilgeniodellostreaming.png",
"categories": ["movie", "tvshow", "anime", "vos"], "categories": ["movie", "tvshow", "anime", "sub"],
"settings": ["include_in_newest_anime"] "settings": ["include_in_newest_anime"]
} }

62
channels/ilgeniodellostreaming.py Executable file → Normal file
View File

@@ -6,29 +6,27 @@
from core import support from core import support
from core.support import info
from core.item import Item from core.item import Item
from platformcode import config from platformcode import config, logger
host = config.get_channel_url() host = config.get_channel_url()
headers = [['Referer', host]] headers = [['Referer', host]]
@support.menu @support.menu
def mainlist(item): def mainlist(item):
support.info(item)
film = ['/film/', film = ['/film/',
('Generi',['', 'genres', 'genres']), ('Generi',['', 'genres', 'genres']),
('Per Lettera',['/film-a-z/', 'genres', 'letter']), ('Per Lettera',['/film-a-z/', 'genres', 'letter']),
('Anni',['', 'genres', 'year']), ('Anni',['', 'genres', 'year']),
('Popolari',['/trending/?get=movies', 'peliculas', 'populared']), ('Popolari',['/trending/?get=movies', 'movies', 'populared']),
('Più Votati', ['/ratings/?get=movies', 'peliculas', 'populared']) ('Più Votati', ['/ratings/?get=movies', 'movies', 'populared'])
] ]
tvshow = ['/serie/', tvshow = ['/serie/',
('Aggiornamenti', ['/aggiornamenti-serie/', 'peliculas', 'update']), ('Aggiornamenti', ['/aggiornamenti-serie/', 'movies', 'update']),
('Popolari',['/trending/?get=tv', 'peliculas', 'populared']), ('Popolari',['/trending/?get=tv', 'movies', 'populared']),
('Più Votati', ['/ratings/?get=tv', 'peliculas', 'populared']) ('Più Votati', ['/ratings/?get=tv', 'movies', 'populared'])
] ]
@@ -36,7 +34,7 @@ def mainlist(item):
] ]
Tvshow = [ Tvshow = [
('Show TV {bullet bold}', ['/tv-show/', 'peliculas', '', 'tvshow']) ('Show TV {bullet bold}', ['/tv-show/', 'movies', '', 'tvshow'])
] ]
search = '' search = ''
@@ -45,8 +43,8 @@ def mainlist(item):
@support.scrape @support.scrape
def peliculas(item): def movies(item):
info() logger.debug()
# debugBlock = True # debugBlock = True
# debug=True # debug=True
@@ -55,7 +53,7 @@ def peliculas(item):
patron = r'<img src="(?P<thumb>[^"]+)" alt="[^"]+" ?/?>[^>]+>(?P<type>[^<]+)</span>.*?<a href="(?P<url>[^"]+)">(?P<title>.+?)[ ]?(?:\[(?P<lang>Sub-ITA)\])?</a>[^>]+>[^>]+>(?:<span class="rating">IMDb\s*(?P<rating>[^>]+)</span>)?.?(?:<span class="year">(?P<year>[0-9]+)</span>)?.*?<p>(?P<plot>.*?)</p>' patron = r'<img src="(?P<thumb>[^"]+)" alt="[^"]+" ?/?>[^>]+>(?P<type>[^<]+)</span>.*?<a href="(?P<url>[^"]+)">(?P<title>.+?)[ ]?(?:\[(?P<lang>Sub-ITA)\])?</a>[^>]+>[^>]+>(?:<span class="rating">IMDb\s*(?P<rating>[^>]+)</span>)?.?(?:<span class="year">(?P<year>[0-9]+)</span>)?.*?<p>(?P<plot>.*?)</p>'
typeContentDict={'movie': ['film'], 'tvshow': ['tv']} typeContentDict={'movie': ['film'], 'tvshow': ['tv']}
typeActionDict={'findvideos': ['film'], 'episodios': ['tv']} typeActionDict={'findvideos': ['film'], 'episodes': ['tv']}
else: else:
if item.contentType == 'movie': if item.contentType == 'movie':
@@ -77,11 +75,11 @@ def peliculas(item):
patron = r'<div class="poster">\s?<a href="(?P<url>[^"]+)"><img src="(?P<thumb>[^"]+)" alt="[^"]+"><\/a>[^>]+>[^>]+>[^>]+>\s*(?P<rating>[0-9.]+)<\/div>(?:<span class="quality">(?:SUB-ITA|)?(?P<quality>|[^<]+)?<\/span>)?[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>.+?)[ ]?(?:\[(?P<lang>Sub-ITA)\])?<\/a>[^>]+>[^>]+>(?P<year>[^<]+)<\/span>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]+)<div' patron = r'<div class="poster">\s?<a href="(?P<url>[^"]+)"><img src="(?P<thumb>[^"]+)" alt="[^"]+"><\/a>[^>]+>[^>]+>[^>]+>\s*(?P<rating>[0-9.]+)<\/div>(?:<span class="quality">(?:SUB-ITA|)?(?P<quality>|[^<]+)?<\/span>)?[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>.+?)[ ]?(?:\[(?P<lang>Sub-ITA)\])?<\/a>[^>]+>[^>]+>(?P<year>[^<]+)<\/span>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]+)<div'
else: else:
# TVSHOW # TVSHOW
action = 'episodios' action = 'episodes'
if item.args == 'update': if item.args == 'update':
action = 'findvideos' action = 'findvideos'
patron = r'<div class="poster"><img src="(?P<thumb>[^"]+)"(?:[^>]+>){2}<a href="(?P<url>[^"]+)">[^>]+>(?P<episode>[\d\-x]+)(?:[^>]+>){4}(?P<title>.+?)(?:\[(?P<lang>[SsuUbBiItTaA-]{7})\])?<(?:[^>]+>){4}(?P<quality>[HDWEBRIP-]+)?(?:.+?)?/span><p class="serie"' patron = r'<div class="poster"><img src="(?P<thumb>[^"]+)"(?:[^>]+>){2}<a href="(?P<url>[^"]+)">[^>]+>(?P<episode>[\d\-x]+)(?:[^>]+>){4}(?P<title>.+?)(?:\[(?P<lang>[SsuUbBiItTaA-]{7})\])?<(?:[^>]+>){4}(?P<quality>[HDWEBRIP-]+)?(?:.+?)?/span><p class="serie"'
pagination = 25 pagination = True
def itemHook(item): def itemHook(item):
item.contentType = 'episode' item.contentType = 'episode'
return item return item
@@ -95,10 +93,10 @@ def peliculas(item):
@support.scrape @support.scrape
def episodios(item): def episodes(item):
info() logger.debug()
patronBlock = r'<h1>.*?[ ]?(?:\[(?P<lang>.+?\]))?</h1>.+?<div class="se-a" style="display:block">\s*<ul class="episodios">(?P<block>.*?)</ul>\s*</div>\s*</div>\s*</div>\s*</div>\s*</div>' patronBlock = r'<h1>.*?[ ]?(?:\[(?P<lang>.+?\]))?</h1>.+?<div class="se-a" style="display:block">\s*<ul class="episodes">(?P<block>.*?)</ul>\s*</div>\s*</div>\s*</div>\s*</div>\s*</div>'
patron = r'<a href="(?P<url>[^"]+)"><img src="(?P<thumb>[^"]+)">.*?'\ patron = r'<a href="(?P<url>[^"]+)"><img src="(?P<thumb>[^"]+)">.*?'\
'<div class="numerando">(?P<episode>[^<]+).*?<div class="episodiotitle">'\ '<div class="numerando">(?P<episode>[^<]+).*?<div class="episodiotitle">'\
'[^>]+>(?P<title>[^<]+)<\/a>' '[^>]+>(?P<title>[^<]+)<\/a>'
@@ -108,9 +106,9 @@ def episodios(item):
@support.scrape @support.scrape
def genres(item): def genres(item):
info(item) logger.debug(item)
action='peliculas' action='movies'
if item.args == 'genres': if item.args == 'genres':
patronBlock = r'<div class="sidemenu"><h2>Genere</h2>(?P<block>.*?)/li></ul></div>' patronBlock = r'<div class="sidemenu"><h2>Genere</h2>(?P<block>.*?)/li></ul></div>'
elif item.args == 'year': elif item.args == 'year':
@@ -126,50 +124,50 @@ def genres(item):
def search(item, text): def search(item, text):
info(text) logger.debug(text)
import uuid import uuid
text = text.replace(' ', '+') text = text.replace(' ', '+')
item.url = host + '/?' + uuid.uuid4().hex + '=' + uuid.uuid4().hex + '&s=' + text item.url = host + '/?' + uuid.uuid4().hex + '=' + uuid.uuid4().hex + '&s=' + text
try: try:
item.args = 'search' item.args = 'search'
return peliculas(item) return movies(item)
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
info("%s" % line) logger.error("%s" % line)
return [] return []
def newest(categoria): def newest(category):
info(categoria) logger.debug(category)
itemlist = [] itemlist = []
item = Item() item = Item()
if categoria == 'peliculas': if category == 'movie':
item.contentType = 'movie' item.contentType = 'movie'
item.url = host + '/film/' item.url = host + '/film/'
elif categoria == 'series': elif category == 'tvshow':
item.args = 'update' item.args = 'update'
item.contentType = 'tvshow' item.contentType = 'tvshow'
item.url = host + '/aggiornamenti-serie/' item.url = host + '/aggiornamenti-serie/'
## elif categoria == 'anime': ## elif category == 'anime':
## item.contentType = 'tvshow' ## item.contentType = 'tvshow'
## item.url = host + '/anime/' ## item.url = host + '/anime/'
try: try:
item.action = 'peliculas' item.action = 'movies'
itemlist = peliculas(item) itemlist = movies(item)
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
info("{0}".format(line)) logger.error("{0}".format(line))
return [] return []
return itemlist return itemlist
def findvideos(item): def findvideos(item):
info() logger.debug()
matches = support.match(item, patron=[r'var ilinks\s?=\s?([^;]+)',r' href="#option-\d">([^\s]+)\s*([^\s]+)']).matches matches = support.match(item, patron=[r'var ilinks\s?=\s?([^;]+)',r' href="#option-\d">([^\s]+)\s*([^\s]+)']).matches
itemlist = [] itemlist = []
list_url = [] list_url = []
@@ -193,7 +191,7 @@ def findvideos(item):
for i, url in enumerate(list_url): for i, url in enumerate(list_url):
itemlist.append(support.Item( itemlist.append(support.Item(
channel=item.channel, channel=item.channel,
title=list_servers[i], # title=list_servers[i],
url=url, url=url,
action='play', action='play',
quality=list_quality[i], quality=list_quality[i],

2
channels/ilgeniodellostreaming_cam.json Executable file → Normal file
View File

@@ -1,7 +1,7 @@
{ {
"id": "ilgeniodellostreaming_cam", "id": "ilgeniodellostreaming_cam",
"name": "IlGenioDelloStreaming CAM", "name": "IlGenioDelloStreaming CAM",
"active": true, "active": false,
"language": ["ita"], "language": ["ita"],
"thumbnail": "ilgeniodellostreaming.png", "thumbnail": "ilgeniodellostreaming.png",
"banner": "ilgeniodellostreaming.png", "banner": "ilgeniodellostreaming.png",

54
channels/ilgeniodellostreaming_cam.py Executable file → Normal file
View File

@@ -5,9 +5,8 @@
from core import support from core import support
from core.support import info
from core.item import Item from core.item import Item
from platformcode import config from platformcode import config, logger
host = config.get_channel_url() host = config.get_channel_url()
headers = [['Referer', host]] headers = [['Referer', host]]
@@ -15,7 +14,7 @@ headers = [['Referer', host]]
@support.menu @support.menu
def mainlist(item): def mainlist(item):
film = ['/film/', film = ['/film/',
('In Sala', ['', 'peliculas', 'sala']), ('In Sala', ['', 'movies', 'sala']),
('Generi',['', 'genres', 'genres']), ('Generi',['', 'genres', 'genres']),
('Per Lettera',['/catalog/all', 'genres', 'az']), ('Per Lettera',['/catalog/all', 'genres', 'az']),
('Anni',['', 'genres', 'year'])] ('Anni',['', 'genres', 'year'])]
@@ -24,74 +23,71 @@ def mainlist(item):
@support.scrape @support.scrape
def peliculas(item): def movies(item):
if item.text: if item.args == 'sala':
data = support.httptools.downloadpage(host + '/?s=' + item.text, post={'story': item.text, 'do': 'search', 'subaction': 'search'}).data patronBlock = r'insala(?P<block>.*?)<header>'
patron = '<img src="(?P<thumb>[^"]+)(?:[^>]+>){8}\s*<a href="(?P<url>[^"]+)[^>]+>(?P<title>[^<]+)(?:[^>]+>){4}IMDb\s(?P<rating>[^<]+)(?:[^>]+>){2}(?P<year>\d+)' patron = r'<img src="(?P<thumb>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<rating>[^<]+)[^>]+>[^>]+>(?P<quality>[^<]+)[^>]+>[^>]+>[^>]+>[^>]+><a href="(?P<url>[^"]+)">(?P<title>[^<]+)[^>]+>[^>]+>[^>]+>(?P<year>\d{4})'
elif item.args == 'az':
patron = r'<img src="(?P<thumb>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+><a href="(?P<url>[^"]+)[^>]+>(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>.*?<span class="labelimdb">(?P<rating>[^>]+)<'
else: else:
if item.args == 'sala': patron = r'<img src="(?P<thumb>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<rating>[^<]+)[^>]+>[^>]+>(?P<quality>[^<]+)[^>]+>[^>]+>[^>]+>[^>]+><a href="(?P<url>[^"]+)">(?P<title>[^<]+)[^>]+>[^>]+>[^>]+>(?P<year>\d{4})[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<plot>[^<]+)<[^>]+>'
patronBlock = r'insala(?P<block>.*?)<header>'
patron = r'<img src="(?P<thumb>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<rating>[^<]+)[^>]+>[^>]+>(?P<quality>[^<]+)[^>]+>[^>]+>[^>]+>[^>]+><a href="(?P<url>[^"]+)">(?P<title>[^<]+)[^>]+>[^>]+>[^>]+>(?P<year>\d{4})'
elif item.args == 'az':
patron = r'<img src="(?P<thumb>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+><a href="(?P<url>[^"]+)[^>]+>(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>.*?<span class="labelimdb">(?P<rating>[^>]+)<'
else:
patron = r'<img src="(?P<thumb>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<rating>[^<]+)[^>]+>[^>]+>(?P<quality>[^<]+)[^>]+>[^>]+>[^>]+>[^>]+><a href="(?P<url>[^"]+)">(?P<title>[^<]+)[^>]+>[^>]+>[^>]+>(?P<year>\d{4})[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<plot>[^<]+)<[^>]+>'
patronNext = 'href="([^>]+)"' patronNext = 'href="([^>]+)"'
return locals() return locals()
@support.scrape @support.scrape
def genres(item): def genres(item):
action='peliculas' action='movies'
if item.args == 'genres': if item.args == 'genres':
patronBlock = r'<div class="sidemenu">\s*<h2>Genere</h2>(?P<block>.*?)</ul' patronBlock = r'<div class="sidemenu">\s*<h2>Genere</h2>(?P<block>.*?)</ul'
elif item.args == 'year': elif item.args == 'year':
item.args = 'genres'
patronBlock = r'<div class="sidemenu">\s*<h2>Anno di uscita</h2>(?P<block>.*?)</ul' patronBlock = r'<div class="sidemenu">\s*<h2>Anno di uscita</h2>(?P<block>.*?)</ul'
elif item.args == 'az': elif item.args == 'az':
patronBlock = r'<div class="movies-letter">(?P<block>.*?)<div class="clearfix">' patronBlock = r'<div class="movies-letter">(?P<block>.*?)<div class="clearfix">'
patronMenu = r'<a(?:.+?)?href="(?P<url>.*?)"[ ]?>(?P<title>.*?)<\/a>' patronMenu = r'<a(?:.+?)?href="(?P<url>.*?)"[ ]?>(?P<title>.*?)<\/a>'
if 'genres' in item.args:
patronGenreMenu = patronMenu
return locals() return locals()
def search(item, text): def search(item, text):
info(text) logger.debug(text)
item.text = text text = text.replace(' ', '+')
item.url = host + "/search/" + text
try: try:
return peliculas(item) return movies(item)
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
info("%s" % line) logger.error("%s" % line)
return [] return []
def newest(categoria): def newest(category):
info(categoria) logger.debug(category)
itemlist = [] itemlist = []
item = Item() item = Item()
if categoria == 'peliculas': if category == 'movie':
item.contentType = 'movie' item.contentType = 'movie'
item.url = host + '/film/' item.url = host + '/film/'
try: try:
item.action = 'peliculas' item.action = 'movies'
itemlist = peliculas(item) itemlist = movies(item)
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
info("{0}".format(line)) logger.error("{0}".format(line))
return [] return []
return itemlist return itemlist
def findvideos(item): def findvideos(item):
info() logger.debug()
urls = [] urls = []
data = support.match(item).data data = support.match(item).data
urls += support.match(data, patron=r'id="urlEmbed" value="([^"]+)').matches urls += support.match(data, patron=r'id="urlEmbed" value="([^"]+)').matches

View File

@@ -1,11 +0,0 @@
{
"id": "italiafilm",
"name": "ItaliaFilm",
"language": ["ita", "sub-ita"],
"active": true,
"thumbnail": "italiafilm.png",
"banner": "",
"categories": ["movie"],
"not_active": ["include_in_newest"],
"settings": []
}

View File

@@ -1,90 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per 'italifilm'
# ------------------------------------------------------------
from core import support, httptools, scrapertools, tmdb
from platformcode import config, logger
host = config.get_channel_url()
headers = [['Referer', host]]
@support.menu
def mainlist(item):
menu = [
('Film', ['/film/', 'list', 'film']),
('Per Genere', ['', 'list', 'genere']),
('Al Cinema', ['/cinema/', 'list', 'film']),
('Sub-ITA', ['/sub-ita/', 'list', 'film']),
('Top del Mese', ['/top-del-mese.html', 'list', 'film'])
]
search = ''
return locals()
@support.scrape
def list(item):
actLike = 'peliculas'
if item.args == 'genere':
patronBlock = r'<ul class="sub-menu">(?P<block>.*?)</ul>'
patronMenu = r'<li><a href="(?P<url>[^"]+)">(?P<title>[^<]+)'
action = 'peliculas'
elif item.args == 'film':
patron = r'<div class="entry-summary.*?<a href="(?P<url>[^"]+)" title="(?P<title>[^\("]+)(?:\((?P<year>\d+)\))" class="[^"]+"><img class="lazyload" data-src="(?P<thumb>[^"]+)" alt="[^"]+".*?></a>'
patronNext = r'<a href="([^"]+)">(?:&rarr|→)'
return locals()
def peliculas(item):
data = httptools.downloadpage(item.url).data
itemlist = []
for it in support.match(data, patron=[r'<div class="entry-summary.*?<a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)(?:\((?P<year>\d+)\))" class="[^"]+"><img class="lazyload" data-src="(?P<thumb>[^"]+)" alt="[^"]+".*?></a>']).matches:
infoLabels = dict()
infoLabels['title'] = it[1]
infoLabels['mediatype'] = 'movie'
infoLabels['year'] = it[2]
itemlist.append(item.clone(action='findvideos', thumbnail = host + it[3].replace(' ','%20'), title = support.cleantitle(it[1]), url= it[0], infoLabels=infoLabels))
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
if item.args == 'search':
next = support.match(data, patron=['<a name="nextlink".*list_submit\((\d+)\);.*(?:&rarr|→)']).matches
else:
next = support.match(data, patron=['<a href="([^"]+)">(?:&rarr|→)']).matches
if next:
if item.args == 'search':
item.url = "{}/?{}".format(host, support.urlencode({"story": item.search_text,"do": "search","subaction": "search", "search_start": next[0]}))
else:
item.url = next[0]
support.nextPage(itemlist = itemlist, item = item, next_page=item.url)
return itemlist
def search(item, text):
item.args = 'search'
item.url = "{}/?{}".format(host, support.urlencode({"story": text,"do": "search","subaction": "search", "search_start": item.page}))
item.search_text = text
try:
return peliculas(item)
except:
import sys
for line in sys.exc_info():
logger.error("search except: %s" % line)
return []
#action di default
def findvideos(item):
support.info('findvideos')
urls = []
data = support.match(item).data
matches = support.match(data, patron=r'<iframe.*?src="([^"]+)').matches
for m in matches:
if 'youtube' not in m and not m.endswith('.js'):
urls += support.match(m, patron=r'data-link="([^"]+)').matches
return support.server(item, urls)

6
channels/italiaserie.json Executable file → Normal file
View File

@@ -1,11 +1,11 @@
{ {
"id": "italiaserie", "id": "italiaserie",
"name": "Italia Serie", "name": "Italia Serie",
"active": false, "active": true,
"language": ["ita","sub-ita"], "language": ["ita","sub-ita"],
"thumbnail": "italiaserie.png", "thumbnail": "italiaserie.png",
"bannermenu": "italiaserie.png", "bannermenu": "italiaserie.png",
"categories": ["tvshow", "vos"], "categories": ["tvshow", "sub"],
"not_active": ["include_in_newest_peliculas", "include_in_newest_anime"], "not_active": ["include_in_newest_movie", "include_in_newest_anime"],
"settings": [] "settings": []
} }

42
channels/italiaserie.py Executable file → Normal file
View File

@@ -15,30 +15,30 @@ headers = [['Referer', host]]
@support.menu @support.menu
def mainlist(item): def mainlist(item):
tvshow = ['', tvshow = ['',
('Aggiornamenti', ['/aggiornamento-episodi/', 'peliculas', 'update']), ('Aggiornamenti', ['/aggiornamento-episodi/', 'movies', 'update']),
('Top 10', ['/top-10', 'peliculas', 'top']), ('Top 10', ['/top-10', 'movies', 'top']),
('Netflix {tv submenu}', ['/genere/netflix', 'peliculas']) ('Netflix {tv submenu}', ['/genere/netflix', 'movies'])
] ]
return locals() return locals()
@support.scrape @support.scrape
def peliculas(item): def movies(item):
# debug=True # debug=True
blacklist = ['Aggiornamento Episodi'] blacklist = ['Aggiornamento Episodi']
action = 'episodios' action = 'episodes'
patron = r'<div class="post-thumb">\s*<a href="(?P<url>[^"]+)" title="(?P<title>[^"\[]+)[^>]+>\s*<img src="(?P<thumb>[^"]+)"[^>]+>' patron = r'<div class="post-thumb">\s*<a href="(?P<url>[^"]+)" title="(?P<title>[^"\[]+)[^>]+>\s*<img src="(?P<thumb>[^"]+)"[^>]+>'
if item.args == 'update': if item.args == 'update':
pagination = '' pagination = True
#patron = r'br />(?:[^>]+>)?(?P<title>[^]+)[^<]+<a href="(?P<url>[^"]+)">(?P<episode>[^ ]+)\s*(?P<title2>[^\(<]+)(?:\((?P<lang>[^\)]+))?' #patron = r'br />(?:[^>]+>)?(?P<title>[^]+)[^<]+<a href="(?P<url>[^"]+)">(?P<episode>[^ ]+)\s*(?P<title2>[^\(<]+)(?:\((?P<lang>[^\)]+))?'
patron = r'br[\s/]*>(?:\s*<[^>]+>)*(?P<title>[^<]+)[^<]+<a href="(?P<url>[^"]+)"[^>]*>(?:[^,]{0,80}[, ]{2})*(?P<episode>[\S]+)\s*(?P<title2>[^\(<]+)(?:\((?P<lang>[^\)]+))?' patron = r'br[\s/]*>(?:\s*<[^>]+>)*(?P<title>[^<]+)[^<]+<a href="(?P<url>[^"]+)"[^>]*>(?:[^,]{0,80}[, ]{2})*(?P<episode>[\S]+)\s*(?P<title2>[^\(<]+)(?:\((?P<lang>[^\)]+))?'
action = 'episodios' action = 'episodes'
if item.args == 'top': if item.args == 'top':
patron = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)</a>(?:[^>]+>){3}<img.*?src="(?P<thumb>[^"]+)"[^>]+>(?:[^>]+>){5}:\s*(?P<rating>[^/]+)' patron = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)</a>(?:[^>]+>){3}<img.*?src="(?P<thumb>[^"]+)"[^>]+>(?:[^>]+>){5}:\s*(?P<rating>[^/]+)'
if item.args =='a-z': if item.args =='a-z':
pagination = '' pagination = True
patron = r'<li ><a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)"' patron = r'<li ><a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)"'
patronNext = r'<a class="next page-numbers" href="(.*?)">' patronNext = r'<a class="next page-numbers" href="(.*?)">'
@@ -50,7 +50,7 @@ def peliculas(item):
@support.scrape @support.scrape
def episodios(item): def episodes(item):
res = support.match(item, patron=r'<a href="([^"]+)">&gt;') res = support.match(item, patron=r'<a href="([^"]+)">&gt;')
if res.match: data = support.match(res.match).data if res.match: data = support.match(res.match).data
else: data = res.data else: data = res.data
@@ -66,38 +66,38 @@ def episodios(item):
@support.scrape @support.scrape
def category(item): def category(item):
action = 'peliculas' action = 'movies'
patron = r'<li class="cat-item.*?href="(?P<url>[^"]+)".*?>(?P<title>.*?)</a>' patron = r'<li class="cat-item.*?href="(?P<url>[^"]+)".*?>(?P<title>.*?)</a>'
return locals() return locals()
def search(item, texto): def search(item, text):
support.info("s=", texto) logger.debug(text)
item.url = host + "/?s=" + texto item.url = host + "/?s=" + text
item.contentType = 'tvshow' item.contentType = 'tvshow'
try: try:
return peliculas(item) return movies(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.info("%s" % line) logger.error("%s" % line)
return [] return []
def newest(categoria): def newest(category):
support.info("newest", categoria) logger.debug("newest", category)
itemlist = [] itemlist = []
item = Item() item = Item()
try: try:
if categoria == "series": if category == 'tvshow':
item.url = host + "/aggiornamento-episodi/" item.url = host + "/aggiornamento-episodi/"
item.action = "peliculas" item.action = "movies"
item.args = "update" item.args = "update"
item.contentType = "episode" item.contentType = "episode"
itemlist = peliculas(item) itemlist = movies(item)
if itemlist[-1].action == "peliculas": if itemlist[-1].action == "movies":
itemlist.pop() itemlist.pop()
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore

0
channels/la7.json Executable file → Normal file
View File

104
channels/la7.py Executable file → Normal file
View File

@@ -4,7 +4,7 @@
# ------------------------------------------------------------ # ------------------------------------------------------------
import requests import requests
from core import support, httptools from core import support
from platformcode import logger from platformcode import logger
DRM = 'com.widevine.alpha' DRM = 'com.widevine.alpha'
@@ -24,26 +24,26 @@ headers = {
@support.menu @support.menu
def mainlist(item): def mainlist(item):
top = [('Dirette {bold}', ['', 'live']), top = [('Dirette {bullet bold}', ['', 'live']),
('Replay {bold}', ['', 'replay_channels'])] ('Replay {bullet bold}', ['', 'replay_channels'])]
menu = [('Programmi TV {bullet bold}', ['/tutti-i-programmi', 'peliculas', '', 'tvshow']), menu = [('Programmi TV {bullet bold}', ['/tutti-i-programmi', 'movies', '', 'tvshow']),
('Teche La7 {bullet bold}', ['/la7teche', 'peliculas', '', 'tvshow'])] ('Teche La7 {bullet bold}', ['/i-protagonisti', 'movies', '', 'tvshow'])]
search = '' search = ''
return locals() return locals()
def live(item): def live(item):
itemlist = [item.clone(title=support.typo('La7', 'bold'), fulltitle='La7', url= host + '/dirette-tv', action='findvideos', forcethumb = True, no_return=True), itemlist = [item.clone(title='La7', fulltitle='La7', url= host + '/dirette-tv', action='findvideos', forcethumb = True),
item.clone(title=support.typo('La7d', 'bold'), fulltitle='La7d', url= host + '/live-la7d', action='findvideos', forcethumb = True, no_return=True)] item.clone(title='La7d', fulltitle='La7d', url= host + '/live-la7d', action='findvideos', forcethumb = True)]
return support.thumb(itemlist, live=True) return support.thumb(itemlist, mode='live')
def replay_channels(item): def replay_channels(item):
itemlist = [item.clone(title=support.typo('La7', 'bold'), fulltitle='La7', url= host + '/rivedila7/0/la7', action='replay_menu', forcethumb = True), itemlist = [item.clone(title='La7', fulltitle='La7', url= host + '/rivedila7/0/la7', action='replay_menu', forcethumb = True),
item.clone(title=support.typo('La7d', 'bold'), fulltitle='La7d', url= host + '/rivedila7/0/la7d', action='replay_menu', forcethumb = True)] item.clone(title='La7d', fulltitle='La7d', url= host + '/rivedila7/0/la7d', action='replay_menu', forcethumb = True)]
return support.thumb(itemlist, live=True) return support.thumb(itemlist, mode='live')
@support.scrape @support.scrape
@@ -51,7 +51,7 @@ def replay_menu(item):
action = 'replay' action = 'replay'
patron = r'href="(?P<url>[^"]+)"><div class="giorno-text">\s*(?P<day>[^>]+)</div><[^>]+>\s*(?P<num>[^<]+)</div><[^>]+>\s*(?P<month>[^<]+)<' patron = r'href="(?P<url>[^"]+)"><div class="giorno-text">\s*(?P<day>[^>]+)</div><[^>]+>\s*(?P<num>[^<]+)</div><[^>]+>\s*(?P<month>[^<]+)<'
def itemHook(item): def itemHook(item):
item.title = support.typo(item.day + ' ' + item.num + ' ' + item.month,'bold') item.title = '{} {} {}'.format(item.day, item.num, item.month)
return item return item
return locals() return locals()
@@ -61,7 +61,7 @@ def replay(item):
action = 'findvideos' action = 'findvideos'
patron = r'guida-tv"><[^>]+><[^>]+>(?P<hour>[^<]+)<[^>]+><[^>]+><[^>]+>\s*<a href="(?P<url>[^"]+)"><[^>]+><div class="[^"]+" data-background-image="(?P<t>[^"]+)"><[^>]+><[^>]+><[^>]+><[^>]+>\s*(?P<name>[^<]+)<[^>]+><[^>]+><[^>]+>(?P<plot>[^<]+)<' patron = r'guida-tv"><[^>]+><[^>]+>(?P<hour>[^<]+)<[^>]+><[^>]+><[^>]+>\s*<a href="(?P<url>[^"]+)"><[^>]+><div class="[^"]+" data-background-image="(?P<t>[^"]+)"><[^>]+><[^>]+><[^>]+><[^>]+>\s*(?P<name>[^<]+)<[^>]+><[^>]+><[^>]+>(?P<plot>[^<]+)<'
def itemHook(item): def itemHook(item):
item.title = support.typo(item.hour + ' - ' + item.name,'bold') item.title = '{} - {}'.format(item.hour, item.name)
item.contentTitle = item.fulltitle = item.show = item.name item.contentTitle = item.fulltitle = item.show = item.name
item.thumbnail = 'http:' + item.t item.thumbnail = 'http:' + item.t
item.fanart = item.thumbnail item.fanart = item.thumbnail
@@ -70,63 +70,76 @@ def replay(item):
return locals() return locals()
def search(item, text): def search(item, text):
logger.debug(text)
item.url = host + '/tutti-i-programmi' item.url = host + '/tutti-i-programmi'
item.search = text item.search = text
try: try:
return peliculas(item) return movies(item)
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.info('search log:', line) logger.error('search log:', line)
return [] return []
@support.scrape @support.scrape
def peliculas(item): def movies(item):
search = item.search search = item.search
action = 'episodios' disableAll = True
pagination = 20 action = 'episodes'
disabletmdb = True
addVideolibrary = False
downloadEnabled = False
patron = r'<a href="(?P<url>[^"]+)"[^>]+><div class="[^"]+" data-background-image="(?P<t>[^"]+)"></div><div class="titolo">\s*(?P<title>[^<]+)<' patron = r'<a href="(?P<url>[^"]+)"[^>]+><div class="[^"]+" data-background-image="(?P<t>[^"]+)"></div><div class="titolo">\s*(?P<title>[^<]+)<'
if 'la7teche' in item.url:
patron = r'<a href="(?P<url>[^"]+)" title="(?P<title>[^"]+)" class="teche-i-img".*?url\(\'(?P<thumb>[^\']+)'
def itemHook(item): def itemHook(item):
prepose = ''
if item.t.startswith('//'):
prepose = 'http:'
elif item.t.startswith('/'):
prepose = host
elif not item.t.startswith('http'):
prepose = host + '/'
item.thumbnail = prepose + item.t
item.fanart = item.thumb item.fanart = item.thumb
return item return item
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodes(item):
data = support.match(item).data
action = 'findvideos' action = 'findvideos'
addVideolibrary = False if '>puntate<' in data:
patronBlock = r'>puntate<(?P<block>.*?)home-block-outbrain'
url = support.match(data, patron=r'>puntate<[^>]+>[^>]+>[^>]+><a href="([^"]+)"').match
data += support.match(host + url).data
else:
item.url += '/video'
data = support.match(item).data
patron = r'(?:<a href="(?P<url>[^"]+)">[^>]+><div class="[^"]+" data-background-image="(?P<t>[^"]*)">[^>]+>[^>]+>[^>]+>(?:[^>]+>)?(?:[^>]+>){6}?)\s*(?P<title>[^<]+)<(?:[^>]+>[^>]+>[^>]+><div class="data">(?P<date>[^<]+))?|class="heading">[^>]+>(?P<Title>[^<]+).*?window.shareUrl = "(?P<Url>[^"]+)".*?poster:\s*"(?P<Thumb>[^"]+)", title: "(?P<desc>[^"]+)"'
patronNext = r'<a href="([^"]+)">'
videlibraryEnabled = False
downloadEnabled = False downloadEnabled = False
if 'la7teche' in item.url: def itemHook(item):
patron = r'<a href="(?P<url>[^"]+)">\s*<div class="holder-bg">.*?data-background-image="(?P<thumb>[^"]+)(?:[^>]+>){4}\s*(?P<title>[^<]+)(?:(?:[^>]+>){2}\s*(?P<plot>[^<]+))?' if item.Thumb: item.t = item.Thumb
else: item.thumbnail = 'http:' + item.t if item.t.startswith('//') else item.t if item.t else item.thumbnail
data = str(support.match(item.url, patron=r'"home-block home-block--oggi(.*?)</section>').matches) if item.Title: item.title = item.Title
data += httptools.downloadpage(item.url + '/video').data if item.date:
item.title = support.re.sub(r'[Pp]untata (?:del )?\d+/\d+/\d+', '', item.title)
patron = r'item[^>]+>\s*<a href="(?P<url>[^"]+)">.*?image="(?P<thumb>[^"]+)(?:[^>]+>){4,5}\s*(?P<title>[\d\w][^<]+)(?:(?:[^>]+>){7}\s*(?P<title2>[\d\w][^<]+))?' item.title = '{} [{}]'.format(item.title, item.date)
patronNext = r'<a href="([^"]+)">' if item.desc: item.plot = item.desc
item.forcethumb = True
item.fanart = item.thumbnail
return item
return locals() return locals()
def findvideos(item): def findvideos(item):
support.info() logger.debug()
if item.livefilter: return support.server(item, itemlist=[item.clone(server='directo', action='play')])
for it in live(item):
if it.fulltitle == item.livefilter:
item = it
break
data = support.match(item).data
def play(item):
logger.debug()
data = support.match(item).data
url = support.match(data, patron=r'''["]?dash["]?\s*:\s*["']([^"']+)["']''').match url = support.match(data, patron=r'''["]?dash["]?\s*:\s*["']([^"']+)["']''').match
if url: if url:
preurl = support.match(data, patron=r'preTokenUrl = "(.+?)"').match preurl = support.match(data, patron=r'preTokenUrl = "(.+?)"').match
@@ -160,6 +173,5 @@ def findvideos(item):
match = support.match(data, patron='/content/entry/data/(.*?).mp4').match match = support.match(data, patron='/content/entry/data/(.*?).mp4').match
if match: if match:
url = 'https://awsvodpkg.iltrovatore.it/local/hls/,/content/entry/data/' + support.match(item, patron='/content/entry/data/(.*?).mp4').match + '.mp4.urlset/master.m3u8' url = 'https://awsvodpkg.iltrovatore.it/local/hls/,/content/entry/data/' + support.match(item, patron='/content/entry/data/(.*?).mp4').match + '.mp4.urlset/master.m3u8'
item = item.clone(url=url, server='directo', action='play')
item = item.clone(title='Direct', server='directo', url=url, action='play') return support.servertools.find_video_items(item, data=url)
return support.server(item, itemlist=[item], Download=False, Videolibrary=False)

6
channels/mediasetplay.json Executable file → Normal file
View File

@@ -1,10 +1,10 @@
{ {
"id": "mediasetplay", "id": "mediasetplay",
"name": "Mediaset play infinity [free]", "name": "Mediaset Play",
"active": true, "active": true,
"language": ["ita"], "language": ["ita"],
"thumbnail": "mediasetplayinfinity.png", "thumbnail": "mediasetplay.png",
"banner": "mediasetplayinfinity.png", "banner": "mediasetplay.png",
"categories": ["movie", "tvshow", "documentary", "live"], "categories": ["movie", "tvshow", "documentary", "live"],
"not_active": ["include_in_newest"], "not_active": ["include_in_newest"],
"default_off": ["include_in_global_search"], "default_off": ["include_in_global_search"],

Some files were not shown because too many files have changed in this diff Show More