549 Commits

Author SHA1 Message Date
marco fdfaacbd4e Migliorie 2022-10-10 20:05:36 +02:00
marco dc96c1705d Cambio UA 2022-10-08 13:19:28 +02:00
marco c0a5629d8f ops 2022-10-06 18:58:09 +02:00
marco dc9f552708 ops 2022-10-06 18:56:53 +02:00
marco 746738a868 prova 2022-10-06 18:55:28 +02:00
marco a0e45bd896 prova 2022-10-05 21:14:52 +02:00
marco 073b755100 prova 2022-10-04 20:48:31 +02:00
marco 26ac0660f7 prova 2022-10-04 20:45:24 +02:00
marco 5a2c9fb6ac prova 2022-10-01 19:01:21 +02:00
marco b5b4427941 prova 2022-10-01 18:52:52 +02:00
marco 7ff96d2248 prova 2022-10-01 18:47:04 +02:00
marco f544552b5f prova 2022-09-30 20:20:08 +02:00
marco b0a4688038 ops 2022-09-30 20:15:49 +02:00
marco 4e1e761c0a Prova 2022-09-30 20:08:03 +02:00
marco f394372f78 Prova 2022-09-30 18:50:34 +02:00
Alhaziel01 6c43f5101b Fix certifi per Kodi 18 (potrebbe richiedere reinstallazione) 2022-09-29 18:34:38 +02:00
Alhaziel01 9109d6ec55 Aggiornamento certifi (Fix Mediaset) 2022-09-28 18:59:53 +02:00
Alhaziel01 f6a10e1eda Fix SC 2022-09-28 08:23:36 +02:00
Alhaziel01 1542f6493a Fix AU 2022-09-27 10:44:32 +02:00
Alhaziel01 10f0899e81 StreamingCommunityWS 2022-09-27 09:26:40 +02:00
marco d5ec41e305 Prova riattivazione tantifilm 2022-09-26 20:57:02 +02:00
marco 0be70c79b1 Merge remote-tracking branch 'origin/master' 2022-09-26 20:56:50 +02:00
marco 36b8912a18 Fix eurostreaming_actor 2022-09-26 20:56:42 +02:00
Alhaziel01 b66d292ff2 Fix SC 2022-09-26 19:50:28 +02:00
Alhaziel01 d723f0552b Fix SC e AU 2022-09-26 19:44:46 +02:00
Alhaziel01 4cfb971475 Fix streamingcommunity e animeunity 2022-09-26 18:16:41 +02:00
Alhaziel01 b0f3e4022c Fix streamingcommunity e animeunity 2022-09-26 09:15:56 +02:00
marco 7e2c5a6b4b Cambio dominio SCWS -> fix streamingcommunity e animeunity 2022-09-25 14:16:30 +02:00
github-actions[bot] a832a90dfa Aggiornamento domini 2022-09-23 17:55:37 +00:00
marco be782638d1 completato inspect.stack senza contesto + prova ricerca globale 2022-09-22 21:03:38 +02:00
marco d3e6779ea5 Merge remote-tracking branch 'origin/master' 2022-09-21 20:27:51 +02:00
marco c3ba3a1be6 Prova inspect.stack senza contesto 2022-09-21 20:27:44 +02:00
github-actions[bot] 7feac8a061 Aggiornamento domini 2022-09-21 17:54:23 +00:00
marco e937b70a65 Sostituito parzialmente inspect.stack 2022-09-20 19:51:54 +02:00
marco 51042bf9df Fix ricerca discoveryplus e filmpertutti, aggiornamento episodi eurostreaming 2022-09-18 14:52:57 +02:00
marco ef6e3eecb4 KoD 1.7.6 2022-09-15 19:15:48 +02:00
Dexter Morgan 518d99893a Update Streamlare and Streamsb (#394) 2022-09-15 18:45:59 +02:00
Alhaziel01 56869b48d0 Correzione refuso in selezione scraper serie tv 2022-09-15 16:06:43 +02:00
Alhaziel01 4a8b3fd1b6 Disabilitato CB Anime e Tantifilm 2022-09-15 15:58:49 +02:00
Alhaziel01 de8d6ff46d Aggiornato Cloudscraper 2022-09-15 15:42:27 +02:00
Alhaziel01 667f7f31ff Fix GuardaSerie Cam 2022-09-15 15:39:04 +02:00
Alhaziel01 1102ad2191 fix Mediaset Play 2022-09-15 08:59:33 +02:00
github-actions[bot] 88c011ec75 Aggiornamento domini 2022-09-13 17:53:05 +00:00
Alhaziel01 d83541b5cb Fix AnimeForce e AnimeSaturn 2022-09-08 18:39:56 +02:00
Alhaziel01 24c5489d2d Fix Casacinema 2022-09-07 19:22:47 +02:00
github-actions[bot] 50372763dc Aggiornamento domini 2022-09-03 17:41:39 +00:00
marco a5c265ac40 Merge remote-tracking branch 'origin/master' 2022-08-26 20:45:00 +02:00
marco 77dc4168ff Ridotta scadenza cache DNS -> 1h 2022-08-26 20:44:54 +02:00
Alhaziel01 d20384c9cf Fix Film Streaming 2022-08-24 08:57:47 +02:00
Alhaziel01 fb80f47bc8 Fix Tmdb In caso non si conosca il mediatype e sia presente l'anno 2022-08-23 18:08:37 +02:00
Alhaziel01 f590067983 Migliorie contextmenu 2022-08-20 11:32:22 +02:00
Alhaziel01 5383448d44 Fix Menu Contestuale in Libreria 2022-08-20 11:07:44 +02:00
Alhaziel01 9e991c2d49 Fix Impostazioni aggiornamento videoteca 2022-08-20 10:57:44 +02:00
Alhaziel01 555c0491f2 Disabilitato DresmSub 2022-08-19 18:18:12 +02:00
marco 1fda900526 Prova scws 2022-08-19 15:26:24 +02:00
Alhaziel01 17d90cd906 Seleziona server in Libreria se autoplay è attivo 2022-08-19 12:19:35 +02:00
Alhaziel01 d4129b0da2 Test Aggiornamento Videoteca Ad ogni avvio di Kodi e giornaliero 2022-08-19 10:48:22 +02:00
Alhaziel01 80261ee7ce Fix Cinemalibero (Wrestling) 2022-08-19 10:08:02 +02:00
Alhaziel01 2f5cb8d959 IlGenioDelloStreaming CAM: Parziale fix ricerca 2022-08-18 19:30:11 +02:00
Alhaziel01 1bfc5841f8 Fix Altadefinizione 2022-08-18 19:06:59 +02:00
Alhaziel01 89e13e71f8 Fix Altadefinizione 2022-08-18 18:45:24 +02:00
Alhaziel01 2d67edd310 ilCorsroNero, Fix Serie TV 2022-08-18 15:17:56 +02:00
github-actions[bot] 352df6dea6 Aggiornamento domini 2022-08-11 17:42:04 +00:00
marco 636371b658 Prova IPv6 #3 2022-08-09 14:07:49 +02:00
marco c190f9e3d7 Prova IPv6 # 2022-08-09 13:55:16 +02:00
marco 812b4a5b08 Prova IPv6 #2 2022-08-09 12:46:25 +02:00
marco 22337380aa Prova IPv6 2022-08-08 20:10:17 +02:00
marco 83aab2a115 Updater: fix notifica 2022-08-03 20:32:00 +02:00
marco c9798071f3 Merge remote-tracking branch 'origin/master' 2022-08-02 19:26:59 +02:00
marco 1cc2790198 Fix lag ricerca su ATV quando avviata da sezioni TMDB 2022-08-02 19:26:36 +02:00
Alhaziel01 ed82c22823 Fix Canale Url 2022-08-02 19:01:20 +02:00
Alhaziel01 0042142878 Fix Ok.ru 2022-08-02 19:00:59 +02:00
marco 422d21d2a0 Riattivato HD4ME 2022-08-01 19:15:07 +02:00
marco 2c4e0330ba Disattivati canali offline da tempo (guardaserieclick, guardaserieicu, hd4me, italiaserie, piratestreaming, serietvu) 2022-07-31 20:05:33 +02:00
Alhaziel01 20b5a52d40 Fix Altadefinizione: Film in Videoteca 2022-07-30 15:26:07 +02:00
Alhaziel01 d300adbdb4 Aggiunta opzione per aggiornare la Videoteca ad ogni avvio di Kodi 2022-07-29 15:13:07 +02:00
Alhaziel01 aec6f6811e Fix Sottotitoli Community Channels 2022-07-28 18:49:47 +02:00
Alhaziel01 86bff2be1e Test: Sottotitoli nei Community Channels 2022-07-28 16:33:33 +02:00
github-actions[bot] bfff10a459 Aggiornamento domini 2022-07-26 17:48:34 +00:00
github-actions[bot] d93ac324ce Aggiornamento domini 2022-07-25 17:50:46 +00:00
github-actions[bot] 96b2a4dbfd Aggiornamento domini 2022-07-21 17:50:03 +00:00
github-actions[bot] fa188aa719 Aggiornamento domini 2022-07-13 17:50:18 +00:00
Alhaziel01 65475409b6 Fix Cinemalibero (Wrestling) 2022-07-13 15:41:55 +02:00
Alhaziel01 16d3ad375f Fix per Kodi 18 2022-07-13 12:25:25 +02:00
Alhaziel01 50b8ac8c08 Fix rinumerazione Toonitalia 2022-07-12 14:56:23 +02:00
Alhaziel01 794828696b Fix CB01 2022-07-12 11:23:18 +02:00
Alhaziel01 26da64bceb Fix Community Channels 2022-07-11 09:43:05 +02:00
github-actions[bot] 20f9048225 Aggiornamento domini 2022-07-10 17:44:06 +00:00
github-actions[bot] 7d7f191f3c Aggiornamento domini 2022-07-09 17:43:17 +00:00
github-actions[bot] 89c577dc32 Aggiornamento domini 2022-07-08 17:52:03 +00:00
Alhaziel01 52ad47a924 Disable seep con launcher 2022-07-08 09:14:19 +02:00
Alhaziel01 bf9e875195 Selezione Scraper (TMDb TvSows come default) 2022-07-05 19:54:27 +02:00
Alhaziel01 eca909a5f8 Community Channels Fix Ordine alfabetico con paginazione 2022-07-05 12:00:10 +02:00
Alhaziel01 2198e6a8a8 Possibile Fix Episodio Successivo 2022-07-05 11:59:08 +02:00
Alhaziel01 005236f52e CB01 Fix voci sottomenu 2022-07-04 20:03:13 +02:00
Alhaziel01 4441f443b4 CB01 Aggiunto tag 3D se presente 2022-07-04 19:51:52 +02:00
Alhaziel01 fd4071bc36 Fix Toonitalia 2022-07-04 19:42:37 +02:00
Alhaziel01 f7639a7321 Disabilita changelog all'avvio se "Notifiche aggiornamenti" è disabilitato 2022-07-04 17:05:47 +02:00
Alhaziel01 44808ac042 Possibiltà di disattivare la ricerca informazioni da TMDB per la sezione novità 2022-07-04 17:02:44 +02:00
Alhaziel01 95ff7ddeea Ricerca Informazioni in sezione Novità 2022-07-04 16:32:33 +02:00
Alhaziel01 09df8697ea Fix VVVVID 2022-07-04 16:32:04 +02:00
github-actions[bot] 3b746a5fa1 Aggiornamento domini 2022-07-01 17:45:05 +00:00
github-actions[bot] 7c41d4a16f Aggiornamento domini 2022-06-29 18:06:54 +00:00
github-actions[bot] 68b126153b Aggiornamento domini 2022-06-24 17:49:35 +00:00
github-actions[bot] bff9e65af6 Aggiornamento domini 2022-06-23 17:49:23 +00:00
marco f7d661dabf Nuovi domini streamlare e streamsb, possibile fix streamsb 2022-06-22 20:08:46 +02:00
github-actions[bot] 336470cc96 Aggiornamento domini 2022-06-16 17:43:56 +00:00
github-actions[bot] 43da897cf3 Aggiornamento domini 2022-06-15 17:41:57 +00:00
github-actions[bot] 51da0d223d Aggiornamento domini 2022-06-14 17:42:59 +00:00
github-actions[bot] a1236b244d Aggiornamento domini 2022-06-10 17:42:53 +00:00
github-actions[bot] a33b455d85 Aggiornamento domini 2022-06-09 17:42:42 +00:00
Dexter Morgan bf04f60efd Eurostreaming_Actor: fix per range anno 2022-06-07 21:06:01 +02:00
github-actions[bot] 0576e101d9 Aggiornamento domini 2022-06-04 17:38:32 +00:00
Dexter Morgan 47b1dca226 Eurostreaming_Actor (#383) 2022-06-04 19:02:52 +02:00
marco f3bd94fd2b Merge remote-tracking branch 'origin/master' 2022-05-30 19:58:10 +02:00
marco e0b99a5491 Reinserito settaggio per disattivare notifica trakt 2022-05-30 19:58:04 +02:00
github-actions[bot] 5fbf15b83b Aggiornamento domini 2022-05-28 17:41:53 +00:00
marco 4b71a0d708 Fix filmstreaming casi particolari, nuovo server goodstream 2022-05-28 16:26:51 +02:00
marco 1401d79879 Merge remote-tracking branch 'origin/master' 2022-05-28 12:04:36 +02:00
marco 7fc11153fd Fix filmstreaming 2022-05-28 12:04:26 +02:00
marco d79e9f358c KoD 1.7.5 2022-05-28 11:48:52 +02:00
github-actions[bot] aaab9b867d Aggiornamento domini 2022-05-27 17:47:05 +00:00
Alhaziel01 4ac8a7d863 Fix Altadefinizione01 2022-05-27 18:11:54 +02:00
marco ebd3473750 Supporto 2 domini StreamSB, migliorie minori 2022-05-26 20:41:50 +02:00
Alhaziel01 074e7b9c79 Fix Nuovi Episodi in Videoteca (in caso di path completo) 2022-05-20 17:42:55 +02:00
github-actions[bot] f85f8a94d5 Aggiornamento domini 2022-05-18 17:49:08 +00:00
github-actions[bot] 71b7f72f13 Aggiornamento domini 2022-05-13 17:49:58 +00:00
github-actions[bot] ccf72d517b Aggiornamento domini 2022-05-08 17:42:51 +00:00
Alhaziel01 6f9a35ebbc Fix Discovery + 2022-05-05 16:07:45 +02:00
marco 7ab66fbb8a Fix alternativo a redirect 2022-05-04 19:57:21 +02:00
marco 5484fcc661 Merge remote-tracking branch 'origin/master' 2022-05-04 19:17:09 +02:00
github-actions[bot] 1a782fd8da Aggiornamento domini 2022-04-30 17:41:27 +00:00
github-actions[bot] 33ba9fea0d Aggiornamento domini 2022-04-29 17:44:23 +00:00
marco 4f4d4bc54f Revert "Fix Redirect Dominio"
This reverts commit 9e3f74f453.
2022-04-28 20:39:30 +02:00
marco 336e485f60 Revert "Fix Redirect Dominio"
This reverts commit 6aabebb232.
2022-04-28 20:39:25 +02:00
github-actions[bot] 6c3976424a Aggiornamento domini 2022-04-28 17:43:46 +00:00
marco 72ba8d6efd Merge remote-tracking branch 'origin/master' 2022-04-28 18:30:54 +02:00
marco d39194384b Fix Cerca con KoD se si usa la vecchia ricerca 2022-04-28 18:30:45 +02:00
github-actions[bot] 58287a76ac Aggiornamento domini 2022-04-27 17:47:58 +00:00
github-actions[bot] fc924e604d Aggiornamento domini 2022-04-22 17:48:58 +00:00
Alhaziel01 1398e96ed6 Fix Aniplay 2022-04-20 19:21:35 +02:00
Alhaziel01 6aabebb232 Fix Redirect Dominio 2022-04-20 19:16:08 +02:00
Alhaziel01 9e3f74f453 Fix Redirect Dominio 2022-04-16 17:07:38 +02:00
Alhaziel01 cc9445ae7c Fix Ricerca IMDB 2022-04-16 17:01:50 +02:00
Alhaziel01 61057ded3b Fix Altadefinizione 2022-04-16 17:01:38 +02:00
github-actions[bot] b3a552e7ef Aggiornamento domini 2022-04-12 17:44:56 +00:00
github-actions[bot] 7b64e558e7 Aggiornamento domini 2022-04-11 17:43:13 +00:00
Alhaziel01 ee5bde91a5 Test: Fix Viste su skin di terze parti 2022-04-08 19:16:41 +02:00
Alhaziel01 e33e46570f Rimozione blocco plugin esterni 2022-04-08 16:03:00 +02:00
github-actions[bot] 94912089b7 Aggiornamento domini 2022-04-07 17:39:09 +00:00
marco 1135c9b96d Fix streamlare 2022-04-03 13:34:24 +02:00
Alhaziel01 82346899f1 Blocco addon-esterni 2022-04-02 16:51:02 +02:00
Alhaziel01 49e609b4e0 Fix Cinemalibero e StreamingCommunity 2022-04-02 10:17:27 +02:00
marco 75d83f423c Fix dirette mediaset 2022-03-30 21:05:10 +02:00
marco 6c6d10f35c Aggiornamento domini 2022-03-30 20:35:52 +02:00
github-actions[bot] 92d009ccd7 Aggiornamento domini 2022-03-26 17:37:39 +00:00
github-actions[bot] 70e3deaa31 Aggiornamento domini 2022-03-25 17:39:45 +00:00
github-actions[bot] 4eeb4f7627 Aggiornamento domini 2022-03-24 17:48:05 +00:00
marco 152633e912 Aggiornamento domini 2022-03-23 21:05:31 +01:00
Alhaziel01 1c07e53788 Test fix episodio successivo 2022-03-15 19:22:23 +01:00
Alhaziel01 ad2804a32c Fix *Tutte le stagioni 2022-03-15 18:24:13 +01:00
Alhaziel01 247630947f Merge branch 'master' of https://github.com/kodiondemand/addon 2022-03-15 16:33:28 +01:00
Alhaziel01 a2f03b5f55 Fix InfoWindow 2022-03-15 16:33:24 +01:00
marco 3f9ecc60eb 1337x -> fix doppio pulsante "successivo" 2022-03-14 20:46:32 +01:00
github-actions[bot] 4b5488b445 Aggiornamento domini 2022-03-13 17:38:47 +00:00
github-actions[bot] 51e19264f4 Aggiornamento domini 2022-03-12 17:37:04 +00:00
github-actions[bot] 4af7e668cc Aggiornamento domini 2022-03-11 17:40:04 +00:00
Alhaziel01 26cd6d4f24 Aggiunta voce seleziona server nel menu contestuale se autoplay è attivo 2022-03-09 19:10:24 +01:00
Alhaziel01 2d9413af9d Videoteca refresh dopo cancellazione canale 2022-03-09 18:43:30 +01:00
Alhaziel01 f3011b5b5d Fix 1337x e Film Streaming 2022-03-08 19:30:36 +01:00
Alhaziel01 2b8b1d42f2 Fix Episodio successivo 2022-03-08 19:08:31 +01:00
Alhaziel01 f92894e877 Fix Community Channels 2022-03-07 20:12:48 +01:00
github-actions[bot] 0fca66e7f4 Aggiornamento domini 2022-03-07 17:40:45 +00:00
Alhaziel01 5cc3290bef Completato 1337x 2022-03-05 16:23:35 +01:00
Alhaziel01 0e1c544add 1337x WIP 2022-03-04 19:58:26 +01:00
Alhaziel01 4805152a7d Nuovo Canale Film Streaming 2022-03-04 17:40:06 +01:00
Alhaziel01 4cea872956 Fix Discovery + 2022-03-04 16:15:41 +01:00
Alhaziel01 c7fad20777 Fix Tempo di Visione Episodi 2022-03-02 12:45:35 +01:00
Alhaziel01 7de34da0b8 Fix DoodStream 2022-02-28 19:04:39 +01:00
Matteo Sammarco 7c9da143a9 fix Mylinks-Movies does not open for concatenating a string and a dict (#379)
Co-authored-by: Matteo Sammarco <matteo.sammarco@axa-groupsolutions.com>
2022-02-28 18:14:30 +01:00
Alhaziel01 e3544248ee Fix doodstream 2022-02-26 17:27:20 +01:00
github-actions[bot] 87cfef27ea Aggiornamento domini 2022-02-25 17:38:18 +00:00
github-actions[bot] 8803f1a1dd Aggiornamento domini 2022-02-24 17:37:53 +00:00
marco 823b234549 Nuovo dominio streamingITA 2022-02-23 20:33:39 +01:00
Alhaziel01 06ea564dbf Fix Menu Film Altadefinizione 2022-02-23 16:50:31 +01:00
Alhaziel01 5923da3325 Fix riapertura finestra server in caso di video brevi 2022-02-23 16:50:14 +01:00
Alhaziel01 12943c26d9 Aggiunta alla videoteca da menu contestuale casacinema e filmpertutti 2022-02-23 16:03:23 +01:00
Alhaziel01 afa381d6ba Fix aggiungi a videoteca da ricerca globale 2022-02-23 15:46:30 +01:00
Alhaziel01 911d4b2a9d Fix Server bloccati 2022-02-23 10:45:26 +01:00
Alhaziel01 e8ad9c3c0f Fix impossibilità di usare tasto OK a fine riproduzione 2022-02-22 19:00:26 +01:00
Alhaziel01 46302a0f7f Test Fix Aggiungi alla videoteca da ricerca globale 2022-02-22 18:37:42 +01:00
Alhaziel01 77e9338661 Fix Server bloccati 2022-02-22 18:37:08 +01:00
Alhaziel01 647fdf9987 Autoplay spostato in serverWindow 2022-02-19 16:22:57 +01:00
Alhaziel01 4396e4ce15 Fix Finestra server 2022-02-18 10:22:33 +01:00
Alhaziel01 905e9aeafe Fix Lista episodi da ricerca globale 2022-02-17 17:51:13 +01:00
Alhaziel01 bbd10b5f76 Fix Riapertura finestra server in caso di errore 2022-02-17 17:34:11 +01:00
marco ff5a009167 Fix pagina successiva da ricerga globale -> altre opzioni 2022-02-15 18:34:52 +01:00
marco 4ef558dd5b altadefinizione: aggiungi in videoteca, altadefinizione01: niente paginazione in ultimi aggiunti 2022-02-14 19:55:19 +01:00
Alhaziel01 3b89ecd157 Fix Altadefinizione 2022-02-12 15:18:03 +01:00
marco fae18dd562 KoD 1.7.4 2022-02-12 12:54:46 +01:00
marco a1e14e3f51 Disattivato temporaneamente altadefinizione 2022-02-12 12:53:27 +01:00
marco d02891bb2b Fix streamsb 2022-02-12 11:29:49 +01:00
marco 7eec8ffbc0 Fix streamlare 2022-02-09 20:30:22 +01:00
Alhaziel01 84b5d77139 StreamingCommunity Fix copertine mancanti 2022-02-07 18:00:17 +01:00
Alhaziel01 5c072c8530 Fix Gestione Viste 2022-02-07 17:21:20 +01:00
Alhaziel01 41ed3c2210 Merge branch 'master' of https://github.com/kodiondemand/addon 2022-02-07 16:21:31 +01:00
Alhaziel01 88251e9f1a Test gestione viste via db 2022-02-07 16:21:21 +01:00
github-actions[bot] cd7df20b9f Aggiornamento domini 2022-02-06 17:37:07 +00:00
github-actions[bot] 4e8c12ed50 Aggiornamento domini 2022-02-05 17:35:12 +00:00
Alhaziel01 49ad5154cf - Fix selezione viste e pop-up disabilitato
- Miglioria sottotitoli StreamingCommunity
 - Piccolo fix in launcher
2022-02-05 18:24:22 +01:00
Alhaziel01 9e06b9acb5 Fix Salva Link 2022-02-05 16:48:54 +01:00
Alhaziel01 1e2bd87b7e Merge branch 'master' of https://github.com/kodiondemand/addon 2022-02-05 15:55:41 +01:00
Alhaziel01 0cf74df051 Test workaround gestione viste 2022-02-05 15:55:38 +01:00
marco 9342bfaa06 Fix canali mancanti ricerca globale da sezioni tmdb 2022-02-05 14:07:00 +01:00
Alhaziel01 ff4e30dcd7 Aggiornato Nome e logo per Mediaset 2022-02-05 11:59:52 +01:00
Alhaziel01 d3240f4b78 Probabile fix gestione viste (cache attiva) 2022-02-05 11:39:44 +01:00
Alhaziel01 69d5088b85 Merge branch 'master' of https://github.com/kodiondemand/addon 2022-02-04 19:45:07 +01:00
Alhaziel01 566628b774 Fix Riproduzione CB01 2022-02-04 19:45:01 +01:00
github-actions[bot] bf8417674e Aggiornamento domini 2022-02-04 17:35:24 +00:00
Alhaziel01 c829292cc3 Fix Play da Ricerca Globale 2022-02-04 18:29:24 +01:00
Alhaziel01 0d34139dea Fix riproduzione da ricerca globale 2022-02-03 20:00:31 +01:00
marco 788cfcff22 Rferer corretto per i link diretti (fix animesaturn) 2022-02-03 19:42:16 +01:00
marco 1d9b5c9dd1 Piccole migliorie cinemalibero e guardaseriecam 2022-02-02 20:57:38 +01:00
github-actions[bot] 30842961d2 Aggiornamento domini 2022-02-02 17:38:29 +00:00
github-actions[bot] 537668906f Aggiornamento domini 2022-01-31 17:37:19 +00:00
marco 69fa5e7bf4 updateDomains: evita di modificare findhost 2022-01-25 17:34:50 +01:00
github-actions[bot] 2de8b6c7e0 Aggiornamento domini 2022-01-23 17:38:21 +00:00
marco 6324d3124c ops 2022-01-23 16:00:55 +01:00
github-actions[bot] a58129f03c Aggiornamento domini 2022-01-23 14:58:05 +00:00
marco d7451c421d Fix updateDomains, pulizia 2022-01-23 15:55:29 +01:00
Alhaziel01 61b50ec301 Fix Altadefinizione 2022-01-21 18:24:28 +01:00
Alhaziel01 73247722da Fix Adesso in onda e Altadefinizione 2022-01-20 20:12:25 +01:00
github-actions[bot] 724e61820e Aggiornamento domini 2022-01-20 17:46:58 +00:00
Alhaziel01 cf41316ffc Fix Dirette Pluto TV 2022-01-19 20:09:35 +01:00
Alhaziel01 613b9abcc6 Aggiunto Altadefinizione (WIP) 2022-01-19 19:29:09 +01:00
github-actions[bot] 7e7c7e8654 Aggiornamento domini 2022-01-19 17:46:47 +00:00
Alhaziel01 3b3902cb29 Disattivato Paramount Network 2022-01-19 09:47:38 +01:00
Alhaziel01 9b65bb4291 Merge branch 'master' of https://github.com/kodiondemand/addon 2022-01-19 09:47:04 +01:00
Alhaziel01 104c2d4fd4 Fix Pluto TV 2022-01-19 09:47:01 +01:00
marco 0e915e591a Miglioria bot aggiornamento domini 2022-01-18 20:57:42 +01:00
Alhaziel01 8221e09825 Aggiunto Pluto TV 2022-01-18 20:22:43 +01:00
marco 71cb39ddc4 Fix streamingcommunity 2022-01-17 20:27:40 +01:00
Alhaziel01 aacdd5d749 Fix Mediaset 2022-01-17 16:39:02 +01:00
github-actions[bot] db39d6bed9 Aggiornamento domini 2022-01-16 17:52:11 +00:00
marco 187b66fd7c Spostato import 2022-01-15 20:39:15 +01:00
Alhaziel01 c2625c9ba8 Merge branch 'master' of https://github.com/kodiondemand/addon 2022-01-15 19:40:57 +01:00
Alhaziel01 64fe224029 Gestione viste per "Adesso in Onda" 2022-01-15 19:40:23 +01:00
github-actions[bot] 471a7bb74b Aggiornamento domini 2022-01-15 17:49:52 +00:00
Alhaziel01 938b1b5c69 Fix Gestione Viste 2022-01-15 18:25:06 +01:00
Alhaziel01 8bad53bdd5 Fix MediasetPlay 2022-01-15 16:51:21 +01:00
Alhaziel01 e0eef19c78 Kodi 20 Nexus in get_platform 2022-01-15 16:14:00 +01:00
Alhaziel01 52abd760a4 Test Fix Viste (cacheToDisc=False) 2022-01-15 16:13:20 +01:00
Alhaziel01 888956b158 oops 2022-01-15 12:12:16 +01:00
Alhaziel01 e892af34bb Fix Streaming Community 2022-01-15 12:03:02 +01:00
Alhaziel01 621725d354 Test Fix Gestione Viste 2022-01-15 11:07:09 +01:00
Alhaziel01 caf4b83230 Fix Streaming Community 2022-01-15 11:06:32 +01:00
github-actions[bot] 872170d935 Aggiornamento domini 2022-01-14 17:51:04 +00:00
marco 71e29792d0 Fix ordinamento episodi tantifilm 2022-01-14 18:30:55 +01:00
Alhaziel01 de6d1eb0da riordino 2022-01-13 18:36:55 +01:00
Alhaziel01 6cb981d4f1 ops 2022-01-13 17:46:51 +01:00
Alhaziel01 21574b21db Disabilitato Maxstream 2022-01-13 15:21:30 +01:00
Alhaziel01 881f268079 Menu contestuale finestra server a schermo intero 2022-01-13 15:21:15 +01:00
Alhaziel01 29a5b2569e - Chiusura finestra server dopo standby
- Menu contestuale in finestra server
 - Piccoli fix deltabit e uqloads
 - Piccolo fix gestione viste
 - Fix gestione salva link
2022-01-13 13:02:01 +01:00
marco a7a94eb20b ops 2022-01-12 20:23:36 +01:00
marco f339fabffa Disattivato il genio, fix ilgenio_cam 2022-01-12 20:20:54 +01:00
marco adfaa868c8 Fix referer in play_video 2022-01-10 20:00:37 +01:00
marco 06c7467e4a ops 2022-01-09 17:56:22 +01:00
marco 0129828c54 Fix streamingcommunity 2022-01-09 17:37:55 +01:00
marco 542cb33c03 Passaggio User-agent e referer al player di kodi e avviso contenuto non ancora disponibile su streamingcommunity 2022-01-07 18:24:24 +01:00
marco c21ae8cf07 Opzioni menu contestuale aggiuntive nei miei link e nei preferiti 2022-01-02 14:54:00 +01:00
marco c02050417d Fix riproduzione elementum 2021-12-29 14:52:25 +01:00
marco edecfb8df4 Prova viste 2021-12-28 19:37:01 +01:00
marco 9cc3ab7f52 Salvataggio viste: check forzato sul primo item 2021-12-28 18:18:11 +01:00
marco 17a33a6ed9 cinemalibero: supporto filecrypt 2021-12-28 16:49:50 +01:00
marco 682eeddce6 Cambiato ordinamento menu contestuale 2021-12-25 19:10:52 +01:00
Alhaziel01 0505607b09 aggiunta possibilità di ricercare informazioni sugli episodi e migliorato render_items 2021-12-23 17:58:38 +01:00
Alhaziel01 de8a2388fd Fix Gestione Viste 2021-12-23 16:39:15 +01:00
Alhaziel01 297603f6cb Ultimo Test Gestione Viste 2021-12-23 16:12:28 +01:00
Alhaziel01 db33ccf61f Fix Visualizzazione estensione in server diretto 2021-12-23 12:14:49 +01:00
Alhaziel01 180c2d640a test gestione viste 2021-12-23 11:14:32 +01:00
Alhaziel01 ed94dedbc2 Nuova gestione salvataggio Viste (Senza Monitor) 2021-12-23 10:39:44 +01:00
Alhaziel01 8ce21e8e10 Fix successivo in novità 2021-12-22 19:04:37 +01:00
Alhaziel01 d682cd7886 - Aggiunta Visualizzazione musicvideo
- Doppio controllo cambio di visuale
2021-12-22 18:08:52 +01:00
Alhaziel01 519830bfea rimosso debug da unshortenit 2021-12-22 12:13:28 +01:00
Alhaziel01 a6c8a61a0b Guardaserie icu rimosso debug 2021-12-22 12:06:47 +01:00
Alhaziel01 03e8d7018f Fix Mediaset Play 2021-12-22 12:00:43 +01:00
Alhaziel01 91871c7846 Migliorie Ricerca Globale 2021-12-22 12:00:30 +01:00
Alhaziel01 92e8a3fcc4 Test Fix Gestion viste 2021-12-22 12:00:01 +01:00
Alhaziel01 791ac16674 Test Fix Viste 2021-12-20 19:26:24 +01:00
Alhaziel01 afd99db33f Fix dooplay_search 2021-12-20 19:15:24 +01:00
Alhaziel01 4caad5d27f Fix Community Channels 2021-12-20 19:14:44 +01:00
github-actions[bot] a9ccecdd44 Aggiornamento domini 2021-12-18 17:48:37 +00:00
Alhaziel01 38585f5baa Fix Trakt 2021-12-18 18:28:24 +01:00
Alhaziel01 0dd880537c Piccole migliorie 2021-12-18 15:57:25 +01:00
Alhaziel01 84b30d3be6 Fix sort Community Channels 2021-12-18 12:29:09 +01:00
Alhaziel01 4a1735fbb4 ulteriore fix StreamingCommunity 2021-12-18 12:24:24 +01:00
Alhaziel01 2bfad01bd5 fix StreamingCommunity 2021-12-18 12:00:48 +01:00
Alhaziel01 3b52812f55 Merge branch 'master' of https://github.com/kodiondemand/addon 2021-12-17 19:39:08 +01:00
Alhaziel01 c92fbd38bb Fix Segna come già visto 2021-12-17 19:38:51 +01:00
github-actions[bot] fe109622fa Aggiornamento domini 2021-12-17 17:48:14 +00:00
Alhaziel01 a3bfb3b184 Revert "Test StreamingCommunity"
This reverts commit 139a7fe588.
2021-12-17 18:14:58 +01:00
Alhaziel01 139a7fe588 Test StreamingCommunity 2021-12-17 17:40:05 +01:00
Alhaziel01 42b3bbf574 alcuni fix 2021-12-17 16:37:41 +01:00
Alhaziel01 867a0bf36b disabilitato inputsream adaptive in streamingcommunity 2021-12-17 10:35:26 +01:00
Alhaziel01 27634c3907 Extra info in server pop-up e fix link .torrent 2021-12-17 10:09:40 +01:00
Alhaziel01 d8388c44a4 Fix dailymotion 2021-12-17 09:37:59 +01:00
marco dd2314153c Merge remote-tracking branch 'origin/master' 2021-12-16 19:44:40 +01:00
marco a47103c056 Fix get_season_and_episode 2021-12-16 19:44:35 +01:00
github-actions[bot] d17b46465c Aggiornamento domini 2021-12-16 17:48:48 +00:00
marco a953280d4d Merge remote-tracking branch 'origin/master' 2021-12-15 20:21:23 +01:00
marco b4ab8549ff Riattivati guardaseriecam e ilgeniodellostreaming_cam 2021-12-15 20:21:16 +01:00
github-actions[bot] 0338d248e0 Aggiornamento domini 2021-12-15 17:51:24 +00:00
marco 3fa58014f6 Miglioria commit precedente 2021-12-14 20:35:55 +01:00
marco a038497d94 Fix parziale cinemalibero (SerieTV) 2021-12-14 19:45:15 +01:00
Alhaziel01 3bd5d636e1 Test Nuovo launcher 2021-12-11 19:55:18 +01:00
Alhaziel01 a588b44c9c Fix Tantifilm 2021-12-10 18:16:07 +01:00
Alhaziel01 4a96b8c987 Fix Autoplay e Server pop-up 2021-12-10 10:15:36 +01:00
Alhaziel01 83b7e1e821 Fix Discovery 2021-12-10 10:15:13 +01:00
Alhaziel01 3e88831439 Disabilitato Altadefinizione Community 2021-12-09 19:27:33 +01:00
Alhaziel01 3de1441225 Merge branch 'master' of https://github.com/kodiondemand/addon 2021-12-09 19:22:51 +01:00
Alhaziel01 18e5302741 Fix riapertura finestra server in casodi errore 2021-12-09 19:22:12 +01:00
github-actions[bot] e3939507b8 Aggiornamento domini 2021-12-09 17:50:45 +00:00
Alhaziel01 0a6708009e Miglioria Riprendi Visione 2021-12-06 15:43:16 +01:00
Alhaziel01 b2a390a5c2 - Fix Video a scatti Raspberry
- piccoli fix link in finestra pop-up
2021-12-04 10:00:07 +01:00
Alhaziel01 da4ed8af4c Test fix video a scatti da Libreria 2021-12-03 16:47:48 +01:00
Alhaziel01 05e6e5dea8 Fix e migliorie per finestra server pop-up 2021-12-02 18:30:59 +01:00
marco a2bd4e464d Disattivato tapmovie(chiuso) 2021-12-02 17:41:09 +01:00
Alhaziel01 d2338d07b2 monitor finestra server come thread 2021-12-02 12:33:17 +01:00
Alhaziel01 c0b487b280 Finestra selezione server possibilità di usare la selezione con la skin utilizzata da Kodi 2021-12-02 12:18:47 +01:00
Alhaziel01 446af0fcfb piccola miglioria Streaming Community 2021-12-02 12:17:33 +01:00
Alhaziel01 71e4a487db Fix StreamingITA 2021-12-01 19:37:59 +01:00
Alhaziel01 4d31b961dd Miglioria VVVVID 2021-12-01 19:21:01 +01:00
Alhaziel01 d97ca5d5fa Miglioria tmdb 2021-12-01 19:20:44 +01:00
Alhaziel01 d27fd3782f Fix Pop-up server 2021-12-01 19:20:27 +01:00
Alhaziel01 0c76096a22 Test Fix pop-up server 2 2021-12-01 11:31:48 +01:00
Alhaziel01 897a5643a7 Test Fix pop-up server 2021-12-01 10:05:53 +01:00
Alhaziel01 295304567d Test forza server in finestra pop-up 2021-11-30 20:10:53 +01:00
Alhaziel01 f82509e60c Fix StreamingITA 2021-11-29 11:39:39 +01:00
Alhaziel01 8ec1b818f2 Fix canali o server vuoti 2021-11-29 10:42:17 +01:00
Alhaziel01 3d4893061c Fix File .nfo in libreria 2021-11-29 10:28:23 +01:00
marco cb963ec76f KoD 1.7.3 2021-11-27 18:08:11 +01:00
marco ad40a34d5c Ultimi fix 2021-11-27 17:56:34 +01:00
marco 35ff445f9b Ultime modifiche 2021-11-27 17:36:32 +01:00
Alhaziel01 2409f7db37 Fix Freeze e canali vuoti 2021-11-27 17:30:29 +01:00
Alhaziel01 d8d1e123ef Widevine Gestito da Inputstream Helper 2021-11-27 12:18:08 +01:00
Alhaziel01 70665bea3c Probabile Fix Freeze 2021-11-27 08:48:50 +01:00
Alhaziel01 59e79739e5 FIx Live e icone canali mancanti MediasetPlay 2021-11-26 17:29:33 +01:00
Alhaziel01 1abb62ee01 Fix La7 2021-11-26 16:47:11 +01:00
Alhaziel01 6352e33a5a Fix Ultimi Episodi AnimeWorld 2021-11-26 16:34:09 +01:00
marco 4298468aca Settaggio per notifica cambio viste 2021-11-25 18:49:21 +01:00
Alhaziel01 bc4f4330c1 ReCaptcha Ita di default e file cache in base alla lingua 2021-11-24 18:19:23 +01:00
fatshotty 591fb12edf fix recaptcha (#363)
* ignore bin and abi

* use ITA

* change language by arguments
2021-11-24 18:05:07 +01:00
Alhaziel01 5233da7638 Test 2 Fix Riproduci da finestra informazioni in adesso in onda 2021-11-24 18:00:43 +01:00
Alhaziel01 bc0af7e372 Fix Riproduci da finestra informazioni in adesso in onda 2021-11-24 17:47:59 +01:00
Alhaziel01 bd4cca09ba Fix Riproduzione da Informazioni 2021-11-24 16:50:11 +01:00
Alhaziel01 cbccf06cc5 Recaptcha, Rimosso Tasto Reload 2021-11-23 19:36:45 +01:00
Alhaziel01 92be087cc4 Test Fix Riproduzione 2021-11-23 11:26:46 +01:00
Alhaziel01 9af83f59d9 Racaptcha Timing 2021-11-23 10:08:39 +01:00
marco 2ce628e367 Recaptcha funzionanti 2021-11-22 21:11:05 +01:00
Alhaziel01 d67ccd9b75 Recaptcha immagini dinamiche 2021-11-22 18:12:52 +01:00
Alhaziel01 94262e9a0c UI Recaptcha 2021-11-22 16:35:12 +01:00
marco 377044a879 recaptcha librerie 2021-11-21 13:34:57 +01:00
marco 264b2d4292 Merge remote-tracking branch 'origin/master' 2021-11-21 13:34:37 +01:00
marco 15785a653e WIP: recaptcha 2021-11-21 13:34:24 +01:00
Alhaziel01 2dee7d7708 Fix Riproduzione AnimeUniverse da Libreria 2021-11-20 11:03:20 +01:00
Alhaziel01 e1e817a93c Merge branch 'master' of https://github.com/kodiondemand/addon 2021-11-20 10:22:24 +01:00
Alhaziel01 547839f0b0 Test Fix Torrent 3 2021-11-20 10:22:17 +01:00
github-actions[bot] 944d98a937 Aggiornamento domini 2021-11-19 17:44:35 +00:00
Alhaziel01 37e40653a8 Test 2 Torrent 2021-11-19 16:45:05 +01:00
Alhaziel01 34cc89f79e Test Fix Torrent 2021-11-19 16:28:19 +01:00
Alhaziel01 ddd2933883 Test Fix Riproduzione 2021-11-19 15:48:54 +01:00
github-actions[bot] 38eb4ac49f Aggiornamento domini 2021-11-18 17:42:24 +00:00
Alhaziel01 80019ab6b7 Altedefinizione Community, registrazione in lista episodi 2021-11-18 12:35:36 +01:00
Alhaziel01 83cd0280ed Fix Segna come già visto 2021-11-18 11:09:40 +01:00
github-actions[bot] abec23383d Aggiornamento domini 2021-11-17 17:41:25 +00:00
Alhaziel01 7450a36530 Test Fix Riproduzione 2021-11-17 15:53:55 +01:00
Alhaziel01 d0baa85fe2 Fix Riproduzione Diretta 2021-11-17 12:41:55 +01:00
marco 08a0e5c0eb Miglioria streamSB 2021-11-16 19:45:15 +01:00
marco 338526f107 Aggiunto canale streamingITA, streamingcommunity nuovo URL 2021-11-16 18:46:00 +01:00
Alhaziel01 b7ba220e18 Nomi Corretti Nuovi Server 2021-11-16 17:49:35 +01:00
marco 6f294c99bf fix ricerca guardaserieicu, prova timeout globale (requests) 2021-11-15 19:51:21 +01:00
marco b62c616693 Aggiunti server streamlare (by alpha) e streamsb(by urlresolver) 2021-11-15 18:59:29 +01:00
marco 7b7f186e47 ops 2021-11-14 11:44:51 +01:00
marco d5c870db44 Ricerche salvate: supporto cerca film/serie/attore
Possibile fix freeze kodi alla chiusura
2021-11-13 14:42:40 +01:00
Alhaziel01 dea6782c5e - Forza Elementum alla riproduzione in memoria
- Probabile fix del freeze alla riproduzione da libreria
2021-11-12 16:59:14 +01:00
Alhaziel01 95f3ec68da Fix Audio Assente Raiplay 2021-11-11 17:32:38 +01:00
marco 6b546f0dc1 KoD 1.7.2 2021-11-08 19:50:48 +01:00
Alhaziel01 52f85673cc Fix VVVVID Trailers 2021-11-08 15:30:51 +01:00
Alhaziel01 a151ffbdff Aggiornamento videoteca all'avvio 1 volta al giorno. 2021-11-08 12:17:52 +01:00
Alhaziel01 49764eae1f Fix Ep. Successivo senza autoplay 2021-11-08 09:02:25 +01:00
github-actions[bot] 447104a66e Aggiornamento domini 2021-11-06 17:42:49 +00:00
marco 49f341f6db ops 2021-11-06 15:21:42 +01:00
marco 4077f8888b fix babelfish 2021-11-06 15:15:19 +01:00
marco 802fcc3a13 Merge remote-tracking branch 'origin/master' 2021-11-06 14:46:59 +01:00
marco 06239735f5 ops 2021-11-06 14:46:50 +01:00
Alhaziel01 5fec26bd6c Fix Riapertura Finestra Trailers 2021-11-06 12:50:35 +01:00
Alhaziel01 e1d6540fe6 Merge branch 'master' of https://github.com/kodiondemand/addon 2021-11-06 12:24:42 +01:00
Alhaziel01 6f2b34a857 Fix Navigazione finestra Trailers 2021-11-06 12:24:39 +01:00
marco aafb008d5a ilcorsaronero titoli con caratteri speciali e aggiornamento libreria babelfish 2021-11-06 12:17:51 +01:00
Alhaziel01 d21ba2dcb7 Fix Cerca Trailer 2021-11-06 10:56:06 +01:00
Alhaziel01 646de5cae4 ooops 2021-11-06 10:40:47 +01:00
Alhaziel01 54ad39f1fc Test riproduzione torrent senza autoplay su android 2021-11-06 09:03:07 +01:00
Alhaziel01 686d491daf FIx Server ed errore jsontools in Ricerca globale 2021-11-06 09:00:57 +01:00
Alhaziel01 70f69acfff Fix jsontools ERROR 2021-11-05 18:08:02 +01:00
Alhaziel01 5e08aa3391 non riaprire Finesta popup se si seleziona un torrent 2021-11-05 17:32:29 +01:00
Alhaziel01 35f7a50345 ooops 2021-11-05 17:24:23 +01:00
Alhaziel01 f1523e7467 Ulteriore Fix Riproduzione 2021-11-05 17:14:05 +01:00
Alhaziel01 6b03659b81 Fix AnimeUnity 2021-11-05 12:57:13 +01:00
Alhaziel01 07fc2fb724 Fix errore jsontools 2021-11-05 12:44:01 +01:00
Alhaziel01 c1efb6db57 Fix Riproduzione Torrent da ricerca Globale 2021-11-05 12:27:52 +01:00
Alhaziel01 fdcc00d69e Fix Riproduzione Torrent da Videoteca 2021-11-05 11:30:45 +01:00
Alhaziel01 f24e8c8da6 Fix riproduzione torrent senza autoplay e riproduzione dopo installazione automatica di Elementum 2021-11-05 09:48:12 +01:00
github-actions[bot] 158372ed1b Aggiornamento domini 2021-11-04 17:45:30 +00:00
mac12m99 818a423dc9 Update maxstream.py 2021-11-04 18:31:32 +01:00
mac12m99 b43520223d Fix maxstream (vediamo quanto regge) 2021-11-04 14:48:37 +01:00
mac12m99 714ea10b55 Fix streamingcommunity per quando cambia url 2021-11-04 11:20:21 +01:00
mac12m99 438b2a5da6 Fix paramount serie tv 2021-11-04 10:51:20 +01:00
Alhaziel01 05102262ca Fix Download Torrent 2021-11-03 19:18:11 +01:00
github-actions[bot] df6f3f1177 Aggiornamento domini 2021-11-03 17:44:58 +00:00
Alhaziel01 60de78f448 Possibilie Fix autoplay e episodio successivo 2021-11-03 12:06:45 +01:00
mac12m99 6e4aec0ab9 Prova riproduzione 2021-11-02 21:40:20 +01:00
mac12m99 ebbf37222e Miglioria del precedente commit 2021-11-02 19:58:01 +01:00
mac12m99 9828908bfe Possibile fix crash con torrent 2021-11-02 18:16:18 +01:00
mac12m99 925a696a17 Autoplay: non ri-eseguire in caso di refresh 2021-10-30 13:20:34 +02:00
Alhaziel01 9d81c2e4b6 Fix Autoplay per Torrent 2021-10-30 12:36:09 +02:00
mac12m99 4610ba71af Miglioria ricerca globale 2021-10-30 11:39:06 +02:00
Alhaziel01 0aebc644fa Fix parziale autoplay con Torrent 2021-10-30 11:22:15 +02:00
mac12m99 cce2e330ba Timeout richieste 5 secondi di default, 2 per i DNS 2021-10-29 20:06:30 +02:00
Alhaziel01 d0de267be7 Fix Streaming community 2021-10-29 19:17:34 +02:00
Alhaziel01 18bb6bc4b2 Fix Autoplay Torrent 2021-10-29 16:50:42 +02:00
Alhaziel01 e70c18efa3 Probabile Fix Autoplay Torrent 2021-10-29 16:25:53 +02:00
Alhaziel01 852588254a Fix Installazione Elementum 2021-10-29 11:40:25 +02:00
mac12m99 e8c5f335b3 Migliorie test suite 2021-10-27 20:32:05 +02:00
mac12m99 1b61616806 Fix guardaserieicu 2021-10-27 20:31:38 +02:00
mac12m99 ae93e4d1f6 Fix tantiflm, animealtadefinizione utiltimi ep e nascosti ep non ancora caricati 2021-10-27 19:34:39 +02:00
mac12m99 9dcd33ac07 Fix dreamsub ultimi episodi 2021-10-24 14:08:28 +02:00
mac12m99 d6d8153004 Fix ricerca globale 2021-10-23 16:29:24 +02:00
Alhaziel01 b33a250f9e Fix Stayonline 2021-10-23 09:47:52 +02:00
mac12m99 d09be99136 Merge remote-tracking branch 'origin/master' 2021-10-22 19:03:35 +02:00
mac12m99 ec4510aea4 Fix maxstream 2021-10-22 19:03:30 +02:00
Alhaziel01 0276dd46f6 altri url per anavids 2021-10-22 17:50:11 +02:00
Alhaziel01 40d8501afc - Aggiornato Anavids
- Fix m3u8 non supportati da inputstream
2021-10-21 19:26:55 +02:00
Alhaziel01 3f55c94662 Log ricerca globale 2021-10-21 17:18:02 +02:00
mac12m99 ebf520aaf2 Miglioria ilcorsaronero->tag qualità 2021-10-20 20:46:30 +02:00
Alhaziel01 8686308f86 Fix AnimeUnity 2021-10-20 20:15:04 +02:00
github-actions[bot] d002307088 Aggiornamento domini 2021-10-20 17:44:03 +00:00
Alhaziel01 182cca5d5e Fix Userload 2021-10-20 19:29:50 +02:00
mac12m99 df04d70e38 Merge remote-tracking branch 'origin/master' 2021-10-20 18:30:50 +02:00
mac12m99 bbc6aef5d2 Miglioria ilcorsaronero: titolo completo tramite URL 2021-10-20 18:30:46 +02:00
mac12m99 b3015d3ed8 Supporto isecure.link (casacinema) 2021-10-20 18:30:25 +02:00
Alhaziel01 9d1390491a Fix Ricerca per Attori (Ricerca Classica) 2021-10-20 18:18:46 +02:00
mac12m99 2265300ebd Merge remote-tracking branch 'origin/master' 2021-10-19 20:34:31 +02:00
mac12m99 2254d2851a Fix dreamsub 2021-10-19 20:34:26 +02:00
Alhaziel01 6fde4bd5d7 Fix AnimeUnity 2021-10-19 20:32:44 +02:00
github-actions[bot] fe18e7c6c2 Aggiornamento domini 2021-10-19 17:43:49 +00:00
github-actions[bot] d9a4f15340 Aggiornamento domini 2021-10-18 17:44:27 +00:00
mac12m99 d6dd20ba1a Fix maxstream 2021-10-18 19:20:08 +02:00
mac12m99 1e4e68cb24 Fix maxstream 2021-10-18 17:40:42 +02:00
mac12m99 cbb0d138ab Fix maxstream (support CAPTCHA) 2021-10-17 11:11:24 +02:00
Alhaziel01 9dfc558dc5 Fix streaming Community, in caso di cambio dominio 2021-10-16 16:01:49 +02:00
mac12m99 9c83458d93 Fix maxstream 2021-10-16 15:32:45 +02:00
Alhaziel01 d8963766c2 Fix titoli Streaming Community 2021-10-16 11:22:40 +02:00
Alhaziel01 53fa709767 Fix Maxstream 2021-10-16 09:00:47 +02:00
mac12m99 3de393f030 Maxstream check codice video 2021-10-15 20:03:09 +02:00
Alhaziel01 6f4c090e7e Fix Maxstream 2021-10-15 16:44:02 +02:00
Alhaziel01 04e121b196 Fix Streaming Community 2021-10-15 12:42:48 +02:00
github-actions[bot] 7d855652e8 Aggiornamento domini 2021-10-14 17:44:39 +00:00
Alhaziel01 0b44d573a9 Fix Altadefinizione Community 2021-10-14 15:29:29 +02:00
Alhaziel01 70a5a55e6d Fix Mediaset Play, diretta "20" 2021-10-12 20:02:20 +02:00
mac12m99 7270bda78e Fix minori 2021-10-12 19:34:28 +02:00
mac12m99 f34269245c Fix altacommunity 2021-10-11 20:59:00 +02:00
Alhaziel01 3defaa16ed Probabile Fix Viste 2021-10-11 20:03:30 +02:00
Alhaziel01 8315a289b7 Fix Altadefinizione Community 2021-10-11 20:03:16 +02:00
Alhaziel01 ac6883c8b2 Fix AnimeForce 2021-10-11 20:02:53 +02:00
Alhaziel01 39a1c46b62 Piccolo Fix aggiornamento Videoteca 2021-10-09 10:22:29 +02:00
Alhaziel01 0274446ebb Probabile Fix Ricerca Globale 2021-10-09 10:17:27 +02:00
Alhaziel01 74ed9e24dc Piccolo Fix Altadefinizione Community 2021-10-09 10:17:12 +02:00
mac12m99 5b2c76a7de Merge remote-tracking branch 'origin/master' 2021-10-08 19:27:07 +02:00
mac12m99 06fe40ed9e Fix maxstream 2021-10-08 19:27:02 +02:00
Alhaziel01 3bc27f3b05 Fix AnimeForce 2021-10-07 19:53:01 +02:00
Alhaziel01 253aae6137 Rai Play: Ordine corretto 2021-10-07 19:43:50 +02:00
Alhaziel01 cdca6bb55f Fix Repaly Rai Play 2021-10-06 19:23:32 +02:00
Alhaziel01 e1e36e1a6a Altadefinizione Community Risoluzione "Veritiera" 2021-10-06 15:08:29 +02:00
Alhaziel01 8c5ea39edf Fix Streaming Community 2021-10-06 12:38:43 +02:00
mac12m99 133b9e07aa Piccolo fix adesso in onda 2021-10-05 20:34:00 +02:00
Alhaziel01 bc9e0a09e8 Fix Visualizzazione per Videoteca 2021-10-05 16:05:17 +02:00
Alhaziel01 ae36c65714 Fix Streaming Community 2021-10-05 13:08:52 +02:00
Alhaziel01 3b40059cac Fix Altadefinizione Community 2021-10-05 11:59:59 +02:00
Alhaziel01 8877110b80 Fix Successivo in altre opzioni di ricerca 2021-10-05 09:56:01 +02:00
Alhaziel01 4eed606c30 Probabile Fix Blocco Ricerca Globale 2021-10-05 09:36:45 +02:00
Alhaziel01 3452861693 Probabile Fix Selezione Viste 2021-10-05 09:36:24 +02:00
github-actions[bot] c1a7544cc5 Aggiornamento domini 2021-10-03 17:43:08 +00:00
mac12m99 f2fc022a7c altacomm: rimossa richiesta registrazione 2021-10-02 14:44:58 +02:00
mac12m99 c0d514c165 Disattivato altadefinizioneclick (unito al community), fix altacomm e cineblog per certi tipi di serie 2021-10-02 12:18:14 +02:00
mac12m99 e926f8f504 Merge remote-tracking branch 'origin/master' 2021-10-02 11:34:58 +02:00
mac12m99 039117311c Test suite: supporto a ricerca e test specifico eurostreaming 2021-10-02 11:34:52 +02:00
Alhaziel01 bd242f4875 Ripristiono Vista Touch 2021-10-01 19:45:11 +02:00
github-actions[bot] 974a581428 Aggiornamento domini 2021-10-01 17:43:48 +00:00
Alhaziel01 9977c2aa3c Fix TMDB 2021-10-01 19:34:11 +02:00
Alhaziel01 63ba995222 Rimossa voce ricerca Avanzata da Altadefinizione Click 2021-10-01 19:28:19 +02:00
Alhaziel01 42f10a56d3 Fix Altadefiniziona Community 2021-10-01 15:49:32 +02:00
Alhaziel01 1efe6595e1 Fix Altadefinizione Click 2021-10-01 15:49:14 +02:00
Alhaziel01 3ca7707c01 Fix Gestione Viste 2021-10-01 14:55:21 +02:00
Alhaziel01 a5ba79d176 - Fix Altadefinizione Community
- Fix HDMario
 - Fix Streamtape
2021-10-01 09:52:17 +02:00
Alhaziel01 8afa165501 ops 2021-09-30 20:31:21 +02:00
Alhaziel01 6e0cd8ff46 Fix Altadefinizione Community 2021-09-30 20:27:07 +02:00
github-actions[bot] 1544f32c8c Aggiornamento domini 2021-09-30 17:45:07 +00:00
Alhaziel01 999dd188fb Probabile Fix Visualizzazioni 2 2021-09-30 10:23:49 +02:00
Alhaziel01 af14b730f1 Fix Altadefinizione Community 2021-09-29 17:16:16 +02:00
Alhaziel01 5229deeaf2 - Fix sqlitedict
- Probabile fix Visualizzazioni
2021-09-29 16:46:30 +02:00
Alhaziel01 2aa492587f Fix AnimeSaturn 2021-09-29 12:16:25 +02:00
Alhaziel01 8c8a5c6f21 piccolo fix 2021-09-29 09:07:52 +02:00
mac12m99 1bd771b565 sqlitedict cache e migliore gestione dei thread 2021-09-28 20:13:15 +02:00
Alhaziel01 613087342b Nuovo Server HighLoad 2021-09-28 15:18:59 +02:00
4l3x87 be6eb18570 Fix Turbovid (#345) 2021-09-27 17:38:58 +02:00
mac12m99 207df5678d Fix toonitalia, alcuni link su eurostreaming, aggiunto server VOE (by alfa) 2021-09-26 14:33:42 +02:00
Alhaziel01 1892eab9a7 fix tmdb 2021-09-23 16:19:20 +02:00
Alhaziel01 b3a199e457 piccolo fix 2021-09-23 10:50:27 +02:00
Alhaziel01 6a93857cc6 tmdb più veloce 2021-09-23 10:50:15 +02:00
Alhaziel01 e5d6d71017 altadefinizione community:
- divisione per anno (per Film e Serie TV)
 - disabilitata divisione per qualità (inutile)
 - preferenze di ordinamento (da configurazione canale)
2021-09-23 10:49:31 +02:00
Alhaziel01 40841e6435 Abilita autoplay da item 2021-09-23 10:15:41 +02:00
github-actions[bot] 716625fd34 Aggiornamento domini 2021-09-22 17:45:22 +00:00
Alhaziel01 03c4cc53a6 piccolo fix tmdb 2021-09-22 11:40:49 +02:00
Alhaziel01 a043fc3ab2 Fix tmdb per anime 2021-09-22 11:19:21 +02:00
Alhaziel01 72300864c7 Fix Ricerca per Attori 2021-09-22 09:00:35 +02:00
mac12m99 f78ab57f5b Merge remote-tracking branch 'origin/master' 2021-09-21 19:54:40 +02:00
mac12m99 9d3ca7d4bc Fix streamingcommunity e ordinamento decrescente per programmi tv mediaset 2021-09-21 19:54:34 +02:00
github-actions[bot] 3c1094ded3 Aggiornamento domini 2021-09-21 17:44:23 +00:00
github-actions[bot] 23942b3245 Aggiornamento domini 2021-09-20 17:40:37 +00:00
mac12m99 01d3902fbb Merge remote-tracking branch 'origin/master' 2021-09-19 11:36:13 +02:00
mac12m99 c18b7fb226 Fix dirette mediaset 2021-09-19 11:36:09 +02:00
mac12m99 bb52f0eb00 KoD 1.7.1 2021-09-18 18:58:58 +02:00
github-actions[bot] 729bc59e96 Aggiornamento domini 2021-09-16 17:42:36 +00:00
Alhaziel01 3954e0f2a2 Fix Deltabit 2021-09-15 20:14:10 +02:00
mac12m99 c984813f94 Fix hdmario 2021-09-14 20:20:46 +02:00
mac12m99 e1d2352dc2 Fix sezioni novità per eurostreaming e tantifilm 2021-09-13 20:42:06 +02:00
mac12m99 a782901afc altacomm: fix cerca serietv 2021-09-13 18:28:24 +02:00
mac12m99 b8de2e3df5 Disabilitato speedvideo (probabilmente chiuso o abbandonato) 2021-09-11 13:30:48 +02:00
Alhaziel01 a0b64c4cdf ops 2021-09-09 20:20:50 +02:00
Alhaziel01 293f9e15c6 Fix Played Time 2021-09-09 20:18:49 +02:00
mac12m99 4350a593d7 Merge remote-tracking branch 'origin/master' 2021-09-09 18:29:44 +02:00
mac12m99 d50299ca55 Fix altaCommunity -> SerieTv mancanti + Deltabit 2021-09-09 18:29:39 +02:00
github-actions[bot] 2d00118252 Aggiornamento domini 2021-09-08 17:46:20 +00:00
mac12m99 9e44409ab5 Fix altaCommunity -> SerieTv mancanti 2021-09-08 17:51:04 +02:00
mac12m99 a286187235 Fix altaCommunity e streamtape 2021-09-07 20:54:10 +02:00
mac12m99 87b205c50a Fix altaCommunity e aggiungi alla videoteca con autoplay attivo su alcuni canali 2021-09-06 20:38:19 +02:00
Alhaziel01 352cdbaf3d Fix Filmpertutti 2021-09-04 09:05:45 +02:00
Alhaziel01 2f5c6752bd Fix tmdb per contentType Undefined 2021-08-31 20:03:20 +02:00
4l3x87 3712d65afd Aggiunto server EvoLoad (#339)
* Aggiunto Server EvoLoad

Co-authored-by: Alex Pettiti <alex.pettiti@axterisko.it>
Co-authored-by: mac12m99 <10120390+mac12m99@users.noreply.github.com>
2021-08-31 18:15:28 +02:00
246 changed files with 19171 additions and 14349 deletions
+2
View File
@@ -7,3 +7,5 @@ custom_code.json
last_commit.txt last_commit.txt
__pycache__/ __pycache__/
.vscode/settings.json .vscode/settings.json
bin/
lib/abi
+5 -4
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.kod" name="Kodi on Demand BETA" version="1.7" provider-name="KoD Team"> <addon id="plugin.video.kod" name="Kodi on Demand BETA" version="1.7.6" provider-name="KoD Team">
<requires> <requires>
<!-- <import addon="script.module.libtorrent" optional="true"/> --> <!-- <import addon="script.module.libtorrent" optional="true"/> -->
<import addon="metadata.themoviedb.org"/> <import addon="metadata.themoviedb.org"/>
@@ -28,9 +28,10 @@
<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>- Aggiunto menu globale "opzioni di KoD" <news>- fix di routine ai canali/server
- Aggiunto canale tapmovie e server annessi - disabilitati cb01anime e tantifilm
- Notifica quando il tipo di vista viene salvata (con indicazione del tipo di contenuto) - aggiunta opzione "mostra server" nel menu contestuale della libreria
- più opzioni per quanto riguarda l'aggiornamento della videoteca
</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]
+20 -30
View File
@@ -1,54 +1,44 @@
{ {
"direct": { "direct": {
"altadefinizione01": "https://www.altadefinizione01.plus", "altadefinizione01": "https://www.altadefinizione01.sbs",
"altadefinizione01_link": "https://altadefinizione01.travel",
"animealtadefinizione": "https://www.animealtadefinizione.it", "animealtadefinizione": "https://www.animealtadefinizione.it",
"animeforce": "https://www.animeforce.it", "animeforce": "https://www.animeforce.it",
"animeleggendari": "https://animezeus.com", "animesaturn": "https://www.animesaturn.in",
"animesaturn": "https://www.animesaturn.it", "animeunity": "https://www.animeunity.tv",
"animeunity": "https://www.animeunity.it",
"animeuniverse": "https://www.animeuniverse.it", "animeuniverse": "https://www.animeuniverse.it",
"animeworld": "https://www.animeworld.tv", "animeworld": "https://www.animeworld.tv",
"aniplay": "https://aniplay.it", "aniplay": "https://aniplay.it",
"casacinema": "https://www.casacinema.page", "casacinema": "https://www.casacinema.lol",
"cb01anime": "https://www.cineblog01.red", "cb01anime": "https://www.cineblog01.red",
"cineblog01": "https://cb01.uno", "cinemalibero": "https://cinemalibero.cafe",
"cinemalibero": "https://cinemalibero.bar",
"cinetecadibologna": "http://cinestore.cinetecadibologna.it", "cinetecadibologna": "http://cinestore.cinetecadibologna.it",
"discoveryplus": "https://www.discoveryplus.com", "discoveryplus": "https://www.discoveryplus.com",
"dreamsub": "https://dreamsub.stream", "dreamsub": "https://www.animeworld.tv",
"dsda": "https://www.dsda.press", "eurostreaming": "https://eurostreaming.party",
"eurostreaming": "https://eurostreaming.bar", "eurostreaming_actor": "https://eurostreaming.actor",
"filmigratis": "https://filmigratis.org", "filmstreaming": "https://filmstreaming.media",
"guardaseriecam": "https://guardaserie.cam", "guardaseriecam": "https://guardaserie.cam",
"guardaserieclick": "https://www.guardaserie.builders",
"guardaserieicu": "https://guardaserie.cfd",
"hd4me": "https://hd4me.net", "hd4me": "https://hd4me.net",
"ilcorsaronero": "https://ilcorsaronero.link", "ilcorsaronero": "https://ilcorsaronero.link",
"ilgeniodellostreaming": "https://ilgeniodellostreaming.wtf", "ilgeniodellostreaming_cam": "https://ilgeniodellostreaming.sbs",
"ilgeniodellostreaming_cam": "https://ilgeniodellostreaming.city", "mediasetplay": "https://mediasetinfinity.mediaset.it",
"italiaserie": "https://italiaserie.date",
"mediasetplay": "https://www.mediasetplay.mediaset.it",
"mondoserietv": "https://mondoserietv.club", "mondoserietv": "https://mondoserietv.club",
"paramount": "https://www.paramountnetwork.it", "paramount": "https://www.mtv.it",
"piratestreaming": "https://www.piratestreaming.design", "piratestreaming": "https://www.piratestreaming.design",
"polpotv": "https://roma.polpo.tv", "plutotv": "https://pluto.tv",
"raiplay": "https://www.raiplay.it", "raiplay": "https://www.raiplay.it",
"seriehd": "https://altadefinizionecommunity.casa",
"serietvonline": "https://serietvonline.art",
"serietvsubita": "http://serietvsubita.xyz",
"serietvu": "https://www.serietvu.live", "serietvu": "https://www.serietvu.live",
"streamingcommunity": "https://streamingcommunity.vip", "streamingcommunity": "https://streamingcommunity.tech",
"streamingita": "https://www.streamingita.wtf",
"streamtime": "https://t.me/s/StreamTime", "streamtime": "https://t.me/s/StreamTime",
"tantifilm": "https://www.tantifilm.stream", "tantifilm": "https://www.tantifilm.yachts",
"tapmovie": "https://it.tapmovie.net", "toonitalia": "https://toonitalia.co"
"toonitalia": "https://toonitalia.co",
"vvvvid": "https://www.vvvvid.it"
}, },
"findhost": { "findhost": {
"altadefinizioneclick": "https://altadefinizione-nuovo.click", "altadefinizione": "https://altadefinizione.nuovo.live",
"altadefinizionecommunity": "https://altaregistrazione.com", "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"
} }
} }
+2 -2
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 select # 3. aggiunta la def check
# 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.
@@ -197,7 +197,7 @@ 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 peliculas e episodios ove occorre
def select(item): def check(item):
support.info('select --->', item) support.info('select --->', item)
#support.dbg() #support.dbg()
data = httptools.downloadpage(item.url, headers=headers).data data = httptools.downloadpage(item.url, headers=headers).data
+19
View File
@@ -0,0 +1,19 @@
{
"id": "1337x",
"name": "1337x",
"language": ["ita", "sub-ita", "eng"],
"active": true,
"thumbnail": "1337x.png",
"banner": "1337x.png",
"categories": ["movie", "tvshow", "torrent"],
"settings": [
{
"id": "itaSearch",
"type": "bool",
"label": "Cerca contenuti in italiano",
"default": false,
"enabled": true,
"visible": true
}
]
}
+193
View File
@@ -0,0 +1,193 @@
# -*- 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
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 alt="[^"]*" data-original="(?P<thumb>[^"]+)(?:[^>]+>){15}(?P<title>[^<]+)(?:[^>]+>){18,23}\s*<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)
+10
View File
@@ -0,0 +1,10 @@
{
"id": "altadefinizione",
"name": "Altadefinizione",
"language": ["ita", "sub-ita"],
"active": true,
"thumbnail": "altadefinizione.png",
"banner": "altadefinizione.png",
"categories": ["movie", "tvshow", "vos"],
"settings": []
}
+102
View File
@@ -0,0 +1,102 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per altadefinizione
# ------------------------------------------------------------
from core import httptools, support
from platformcode import config, logger
def findhost(url):
host = support.match(url, patron=r'<h2[^>]+><a href="([^"]+)').match.rstrip('/')
return host
host = config.get_channel_url(findhost)
headers = [['Referer', host]]
@support.menu
def mainlist(item):
film = ['/category/film/',
('Al Cinema', ['/al-cinema/', 'peliculas']),
('Generi', ['', 'genres']),
# ('Sub-ITA', ['/sub-ita/', 'peliculas'])
]
tvshow = ['/category/serie-tv/',
('Aggiornamenti Serie TV', ['/aggiornamenti-serie-tv/', 'peliculas']),]
search = ''
return locals()
@support.scrape
def genres(item):
action = 'peliculas'
blacklist = ['Scegli il Genere', 'Film', 'Serie TV', 'Sub-Ita', 'Anime']
patronMenu = r'<option value="(?P<url>[^"]+)">(?P<title>[^<]+)'
def itemlistHook(itemlist):
itl = []
for item in itemlist:
if len(item.fulltitle) != 3:
itl.append(item)
return itl
return locals()
def search(item, text):
logger.debug(text)
item.url = "{}/search/{}/feed/rss2/".format(host, 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):
n = '22' if '/?s=' in item.url else '8'
item.contentType = "undefined"
action = 'check'
patron = r'src="(?P<poster>http[^"]+)(?:[^>]+>){4}\s*<a href="(?P<url>[^"]+)[^>]+>\s*(?P<title>[^\[\(\<]+)(?:\[(?P<quality>[^\]]+)\])?\s*(?:\((?P<lang>[a-zA-z-]+)\))?\s*(?:\((?P<year>\d+)\))?\s*</a>\s*</h2>'
if item.args == 'search':
patron = r'<title>(?P<title>[^\[\(\<]+)(?:\[(?P<quality>[^\]]+)\])?\s*(?:\((?P<lang>[a-zA-z-]+)\))?\s*(?:\((?P<year>\d+)\))?\s*[^>]+>\s*<link>(?P<url>[^<]+)'
patronNext = r'href="([^"]+)[^>]+>Successivo'
return locals()
@support.scrape
def episodios(item):
item.quality = ''
data = item.data
action='findvideos'
# debug=True
patronBlock = r'<span>\s*\w+\s*[Ss]tagione.*?(?P<lang>(?:[Ss][Uu][Bb][-]?)?[Ii][Tt][Aa])(?: in )?(?P<quality>[^<]*)?(?:[^>]+>){4}(?P<block>.*?)/p>'
patron = r'(?P<season>\d+)x(?P<episode>\d+)[^>]+>(?P<data>.*?)(?:</table)'
return locals()
def check(item):
item.data = httptools.downloadpage(item.url).data
if 'Stagione' in item.data:
item.contentType = 'tvshow'
return episodios(item)
else:
return findvideos(item)
def findvideos(item):
logger.debug()
if item.contentType == 'movie' and isinstance(item.data, str):
item.data = support.match(item.data, patron=r'data-id="([^"]+)').matches
return support.server(item, item.data)
+4 -4
View File
@@ -51,13 +51,14 @@ def peliculas(item):
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 == 'orderalf': 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})<' \
@@ -65,7 +66,6 @@ def peliculas(item):
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">'
patronNext = '<span>\d</span> <a href="([^"]+)">'
# debug = True # debug = True
return locals() return locals()
@@ -144,7 +144,7 @@ def newest(categoria):
def findvideos(item): def findvideos(item):
support.info('findvideos', item) support.info('findvideos', item)
data = httptools.downloadpage(item.url).data data = httptools.downloadpage(item.url).data
iframe = support.match(data, patron='player-container[^>]+>\s*<iframe[^>]+src="([^"]+)').match iframe = support.match(data, patron='src="(http[^"]+)" frameborder').match
if iframe: if iframe:
item.url = iframe item.url = iframe
return support.server(item) return support.server(item)
-10
View File
@@ -1,10 +0,0 @@
{
"id": "altadefinizione01_link",
"name": "Altadefinizione01 L",
"active": false,
"language": ["ita","sub-ita"],
"thumbnail": "altadefinizione01_L.png",
"banner": "altadefinizione01_L.png",
"categories": ["movie","vos"],
"settings" :[]
}
-105
View File
@@ -1,105 +0,0 @@
# -*- 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):
support.info('mainlist',item)
film = [
('Al Cinema', ['/film-del-cinema', 'peliculas', '']),
('Generi', ['', 'genres', 'genres']),
('Anni', ['', 'genres', 'years']),
('Qualità', ['/piu-visti.html', 'genres', 'quality']),
('Mi sento fortunato', ['/piu-visti.html', 'genres', 'lucky']),
('Popolari', ['/piu-visti.html', 'peliculas', '']),
('Sub-ITA', ['/film-sub-ita/', 'peliculas', ''])
]
return locals()
# ======== def in ordine di action dal menu ===========================
@support.scrape
def peliculas(item):
# debug = True
support.info('peliculas',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="([^"]+)">'
# debug = True
return locals()
# =========== def pagina categorie ======================================
@support.scrape
def genres(item):
support.info('genres',item)
action = 'peliculas'
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>[^<]+)<'
#debug = True
return locals()
# =========== def per cercare film/serietv =============
#host+/index.php?do=search&story=avatar&subaction=search
def search(item, text):
support.info('search', item)
itemlist = []
text = text.replace(" ", "+")
item.url = host+"/index.php?do=search&story=%s&subaction=search" % (text)
try:
return peliculas(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(categoria):
support.info('newest', categoria)
itemlist = []
item = Item()
try:
if categoria == "peliculas":
item.url = host
item.action = "peliculas"
item.contentType='movie'
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
def findvideos(item):
support.info('findvideos', item)
return support.server(item, support.match(item, patron='<ul class="playernav">.*?</ul>', headers=headers).match)
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"id": "altadefinizioneclick", "id": "altadefinizioneclick",
"name": "AltadefinizioneClick", "name": "AltadefinizioneClick",
"active": true, "active": false,
"language": ["ita","sub-ita"], "language": ["ita","sub-ita"],
"thumbnail": "altadefinizioneclick.png", "thumbnail": "altadefinizioneclick.png",
"bannermenu": "altadefinizioneciclk.png", "bannermenu": "altadefinizioneciclk.png",
+112 -158
View File
@@ -1,107 +1,41 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# ------------------------------------------------------------ # ------------------------------------------------------------
# Canale per altadefinizioneclick # Canale per Altadefinizione Click
# ---------------------------------------------------------- # ----------------------------------------------------------
"""
Eccezioni che non superano il test del canale:
- indicare le eccezioni
Novità. Indicare in quale/i sezione/i è presente il canale:
- film
Avvisi:
- Eventuali avvisi per i tester
Ulteriori info:
"""
from platformcode.logger import debug
from core import support from core import support
from core.item import Item from platformcode import config, logger
from platformcode import config
def findhost(url): def findhost(url):
data = support.httptools.downloadpage(url).data return support.match(url, patron=r'<div class="elementor-button-wrapper">\s*<a href="([^"]+)"').match
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)
headers = [['Referer', host]] if host.endswith('/'):
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):
film = ['', logger.debug(item)
('Novità', ['/nuove-uscite/', 'peliculas', 'news']),
('Al Cinema', ['/al-cinema/', 'peliculas', '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/', 'peliculas', 'sub'])
]
tvshow = ['/serie-tv/'] film = ['/type/movie',
('Generi', ['/type/movie', 'genres', 'genres']),
('Anni', ['/type/movie', 'genres', 'year']),]
search = '' tvshow = ['/serie-tv/tvshow',
return locals() ('Generi', ['/serie-tv/tvshow', 'genres', 'genres']),
('Anni', ['/serie-tv/tvshow', 'genres', 'year'])]
@support.scrape
def peliculas(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')
# nella pagina "CERCA", la voce "SUCCESSIVO" apre la maschera di inserimento dati
patronNext = r'<a class="next page-numbers" href="([^"]+)">'
return locals() return locals()
@support.scrape
def genres(item):
action = 'peliculas'
patronMenu = r'<li><a href="(?P<url>[^"]+)">(?P<title>[^<]+)<'
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>.*)</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, texto): def search(item, texto):
support.info("search ", texto) logger.debug("search ", texto)
item.args = 'search' item.args = 'search'
item.url = host + "?s=" + texto item.url = host + "/search?s={}&f={}&page=1".format(texto, item.contentType)
try: try:
return peliculas(item) return peliculas(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
@@ -111,87 +45,107 @@ def search(item, texto):
support.logger.error("%s" % line) support.logger.error("%s" % line)
return [] return []
def newest(categoria):
support.info(categoria)
itemlist = []
item = Item()
try:
if categoria == "peliculas":
item.args = 'news'
item.contentType = 'movie'
item.url = host + "/nuove-uscite/"
item.action = "peliculas"
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():
from platformcode import logger
logger.error("{0}".format(line))
return []
return itemlist
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:
# episode_url = support.urlparse.urljoin(item.url, episode_url)
# if '-' in episode: episode = episode.split('-')[0].zfill(2) + 'x' + episode.split('-')[1].zfill(2)
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').match
seasons = support.match(url, patronBlock=patron_season, patron=patron_option)
if not seasons.match:
item.contentType = 'movie'
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 episodios(item)
@support.scrape @support.scrape
def episodios(item): def genres(item):
data = item.data logger.debug(item)
data = support.httptools.downloadpage(item.url, cloudscraper=True).data
blacklist= ['Film', 'Serie TV']
patron = r'(?P<season>\d+)x(?P<episode>\d+)\s*-\s*(?P<title>[^\|]+)\|(?P<url>[^ ]+)' if item.args == 'genres':
action = 'findvideos' categories ={}
res = support.match(host + '/cerca', patron=r'for="cat-(\d+)[^>]+>([^<]+)').matches
for _id, name in res:
categories[name] = _id
def itemlistHook(itemlist): patronBlock = r'{}<span></span>(?P<block>.*?)</ul>\s*</li'.format('Film' if item.contentType == 'movie' else 'Serie TV')
itemlist.sort(key=lambda item: (item.infoLabels['season'], item.infoLabels['episode'])) patronMenu = r'<a href="[^"]+">(?P<title>[^<]+)'
return itemlist
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:
# support.dbg()
if item.args in ['search']:
page = support.httptools.downloadpage(item.url, headers=headers)
if page.json:
data = "\n".join(page.json['data'])
else:
data = page.data
else:
params['page'] = item.page
url = '{}/load-more-film?{}'.format(host, support.urlencode(params))
json = support.httptools.downloadpage(url, headers=headers).json
data = "\n".join(json['data'])
except:
data = ' '
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-]+))?'
# 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() return locals()
def findvideos(item):
support.info('findvideos', item)
return support.hdpass_get_servers(item)
# def play(item): @support.scrape
# if 'hdpass' in item.url: def episodios(item):
# return support.hdpass_get_url(item) logger.debug(item)
# return [item] # debug = True
data = item.data
patron = r'class="playtvshow "\s+data-href="(?P<url>[^"]+)'
def itemHook(it):
spl = it.url.split('/')[-2:]
it.infoLabels['season'] = int(spl[0])+1
it.infoLabels['episode'] = int(spl[1])+1
it.url = it.url.replace('/watch-unsubscribed', '/watch-external')
it.title = '{}x{:02d} - {}'.format(it.contentSeason, it.contentEpisodeNumber, it.fulltitle)
return it
return locals()
def findvideos(item):
itemlist = []
playWindow = support.match(item, patron='(?:playWindow|iframe)" (?:href|src)="([^"]+)').match
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)
+12 -2
View File
@@ -2,7 +2,7 @@
"id": "altadefinizionecommunity", "id": "altadefinizionecommunity",
"name": "Altadefinizione Community", "name": "Altadefinizione Community",
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"active": true, "active": false,
"thumbnail": "altadefinizionecommunity.png", "thumbnail": "altadefinizionecommunity.png",
"banner": "", "banner": "",
"categories": ["movie", "tvshow", "vos"], "categories": ["movie", "tvshow", "vos"],
@@ -23,5 +23,15 @@
"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"]
}
]
} }
+167 -146
View File
@@ -13,52 +13,198 @@ def findhost(url):
host = config.get_channel_url(findhost) host = config.get_channel_url(findhost)
register_url = 'https://altaregistrazione.com' register_url = 'https://altaregistrazione.net'
headers = {'Referer': host, 'x-requested-with': 'XMLHttpRequest'}
if 'altadefinizionecommunity' not in host:
config.get_channel_url(findhost, forceFindhost=True)
if host.endswith('/'):
host = host[:-1]
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')]
@support.menu @support.menu
def mainlist(item): def mainlist(item):
logger.debug(item) logger.debug(item)
film = ['/load-more-film?anno=&order=&support_webp=1&type=movie&page=1', film = ['/type/movie',
# Voce Menu,['url','action','args',contentType] ('Generi', ['/type/movie', 'genres', 'genres']),
('Generi Film', ['', 'genres', 'genres']), ('Anni', ['/type/movie', 'genres', 'year']),]
]
tvshow = ['/load-more-film?type=tvshow&anno=&order=&support_webp=1&page=1', tvshow = ['/serie-tv/tvshow',
# Voce Menu,['url','action','args',contentType] ('Generi', ['/serie-tv/tvshow', 'genres', 'genres']),
('Generi Serie TV', ['', 'genres', 'genres']), ('Anni', ['/serie-tv/tvshow', 'genres', 'year'])]
]
altri = [
# ('A-Z', ['/lista-film', 'genres', 'letters']),
('Qualità', ['', 'genres', 'quality']),
('Anni', ['/anno', 'genres', 'years'])
]
search = ''
return locals() return locals()
def search(item, text):
logger.debug("search ", text)
# per evitare fastidi da ricerca globale
if not item.globalsearch:
registerOrLogin()
item.args = 'search'
item.url = host + "/search?s={}&f={}".format(text.replace(' ', '+'), item.contentType)
try:
return peliculas(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
support.logger.error("%s" % line)
return []
@support.scrape
def genres(item):
registerOrLogin()
logger.debug(item)
data = support.httptools.downloadpage(item.url).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':
patronMenu = 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 = {}
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}
# debug = True
action = 'findvideos' if item.contentType == 'movie' else 'episodios'
try:
# support.dbg()
if item.args in ['search']:
page = support.httptools.downloadpage(item.url, headers=headers)
if page.json:
data = "\n".join(page.json['data'])
else:
data = page.data
else:
params['page'] = item.page
url = '{}/load-more-film?{}'.format(host, support.urlencode(params))
json = support.httptools.downloadpage(url, headers=headers).json
data = "\n".join(json['data'])
except:
data = ' '
patron = r'wrapFilm"[^>]*>\s*<a href="(?P<url>[^"]+)">[^>]+>(?P<year>\d+)(?:[^>]+>){2}(?P<rating>[^<]+)(?:[^>]+>){4}\s*<img src="(?P<thumb>[^"]+)(?:[^>]+>){2,6}\s+<h3>(?P<title>[^<[]+)(?:\[(?P<lang>[sSuUbBiItTaA -]+))?'
# 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-]+))?'
def itemHook(item):
item.quality = item.quality.replace('2K', 'HD').replace('4K', 'HD')
item.title = item.title.replace('2K', 'HD').replace('4K', 'HD')
return item
# paginazione
if json.get('have_next') or support.match(data, patron=r'have_next_film\s*=\s*true').match:
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()
@support.scrape
def episodios(item):
registerOrLogin()
logger.debug(item)
# debug = True
data = item.data
patron = r'class="playtvshow "\s+data-href="(?P<url>[^"]+)'
def itemHook(it):
spl = it.url.split('/')[-2:]
it.infoLabels['season'] = int(spl[0])+1
it.infoLabels['episode'] = int(spl[1])+1
it.url = it.url.replace('/watch-unsubscribed', '/watch-external')
it.title = '{}x{:02d} - {}'.format(it.contentSeason, it.contentEpisodeNumber, it.fulltitle)
return it
return locals()
def findvideos(item):
itemlist = []
resolve_url(item)
itemlist.append(item.clone(action='play', url=support.match(item.url, patron='allowfullscreen[^<]+src="([^"]+)"', cloudscraper=True).match, quality=''))
return support.server(item, itemlist=itemlist)
def play(item):
if host in item.url: # intercetto il server proprietario
# if registerOrLogin():
return support.get_jwplayer_mediaurl(support.httptools.downloadpage(item.url, cloudscraper=True).data, 'Diretto')
# else:
# platformtools.play_canceled = True
# return []
else:
return [item]
def resolve_url(item):
registerOrLogin()
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="([^"]+)')
video_url = playWindow.match
item.data = playWindow.data
item.url = video_url.replace('/watch-unsubscribed', '/watch-external')
return item
def login(): def login():
r = support.httptools.downloadpage(host, cloudscraper=True) r = support.httptools.downloadpage(host, cloudscraper=True)
Token = support.match(r.data, patron=r'name=\s*"_token"\s*value=\s*"([^"]+)', cloudscraper=True).match Token = support.match(r.data, patron=r'name=\s*"_token"\s*value=\s*"([^"]+)', cloudscraper=True).match
if 'id="logged"' in r.text: if 'id="logged"' in r.data:
logger.info('Già loggato') logger.info('Già loggato')
else: else:
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.get_setting('username', channel='altadefinizionecommunity'),
'password':config.get_setting('password', channel='altadefinizionecommunity')} 'password':config.get_setting('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 not r.status_code in [200, 302] or 'Email o Password non validi' in r.text: 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.dialog_ok('AltadefinizioneCommunity', 'Username/password non validi')
return False return False
return 'id="logged"' in r.text return 'id="logged"' in r.data
def registerOrLogin(): def registerOrLogin():
@@ -125,128 +271,3 @@ def registerOrLogin():
return False return False
return True return True
@support.scrape
def peliculas(item):
json = {}
if item.contentType == 'undefined':
disabletmdb = True
action = 'check'
elif item.contentType == 'movie':
action = 'findvideos'
else:
action = 'episodios'
if '/load-more-film' not in item.url and '/search' not in item.url: # generi o altri menu, converto
import ast
ajax = support.match(item.url, patron='ajax_data\s*=\s*"?\s*([^;]+)', cloudscraper=True).match
item.url = host + '/load-more-film?' + support.urlencode(ast.literal_eval(ajax)) + '&page=1'
if not '/search' in item.url:
json = support.httptools.downloadpage(item.url, headers=headers, cloudscraper=True).json
data = "\n".join(json['data'])
else:
json = support.httptools.downloadpage(item.url, headers=headers, cloudscraper=True).json
data = "\n".join(json['data'])
patron = r'wrapFilm">\s*<a href="(?P<url>[^"]+)">\s*<span class="year">(?P<year>[0-9]{4})</span>\s*<span[^>]+>[^<]+</span>\s*<span class="qual">(?P<quality>[^<]+).*?<img src="(?P<thumbnail>[^"]+)[^>]+>\s*<h3>(?P<title>[^<[]+)(?:\[(?P<lang>[sSuUbBiItTaA-]+))?'
# paginazione
if json.get('have_next'):
def fullItemlistHook(itemlist):
spl = item.url.split('=')
url = '='.join(spl[:-1])
page = str(int(spl[-1])+1)
support.nextPage(itemlist, item, next_page='='.join((url, page)), function_or_level='peliculas')
return itemlist
return locals()
def search(item, texto):
logger.debug("search ", texto)
item.args = 'search'
item.url = host + "/search?s={}&page=1".format(texto)
try:
return peliculas(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
support.logger.error("%s" % line)
return []
@support.scrape
def genres(item):
logger.debug(item)
data = support.httptools.downloadpage(item.url, cloudscraper=True).data
patronMenu = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)'
if item.args == 'quality':
item.contentType = 'undefined'
patronBlock = r'Risoluzione(?P<block>.*?)</ul>'
elif item.args == 'years':
item.contentType = 'undefined'
patronBlock = r'ANNO(?P<block>.*?</section>)'
else:
patronBlock = ('Film' if item.contentType == 'movie' else 'Serie TV') + r'<span></span></a>\s+<ul class="dropdown-menu(?P<block>.*?)active-parent-menu'
action = 'peliculas'
return locals()
@support.scrape
def episodios(item):
logger.debug(item)
data = item.data
patron = r'class="playtvshow " data-href="(?P<url>[^"]+)'
def itemHook(it):
spl = it.url.split('/')[-2:]
it.infoLabels['season'] = int(spl[0])+1
it.infoLabels['episode'] = int(spl[1])+1
it.url = it.url.replace('/watch-unsubscribed', '/watch-external')
it.title = '{}x{:02d} - {}'.format(it.contentSeason, it.contentEpisodeNumber, it.fulltitle)
return it
return locals()
def check(item):
resolve_url(item)
if '/tvshow' in item.url:
item.contentType = 'tvshow'
return episodios(item)
else:
item.contentType = 'movie'
return findvideos(item)
def findvideos(item):
itemlist = []
resolve_url(item)
itemlist.append(item.clone(action='play', url=support.match(item.url, patron='allowfullscreen[^<]+src="([^"]+)"', cloudscraper=True).match, quality=''))
return support.server(item, itemlist=itemlist)
def play(item):
if host in item.url: # intercetto il server proprietario
if registerOrLogin():
return support.get_jwplayer_mediaurl(support.httptools.downloadpage(item.url, cloudscraper=True).data, 'Diretto')
else:
platformtools.play_canceled = True
return []
else:
return [item]
def resolve_url(item):
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="([^"]+)')
video_url = playWindow.match
item.data = playWindow.data
item.url = video_url.replace('/watch-unsubscribed', '/watch-external')
return item
+7 -2
View File
@@ -10,7 +10,7 @@ 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.get_setting('perpage' , 'animealtadefinizione')]
epPatron = r'<td>\s*(?P<title>[^<]+)[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)"' epPatron = r'<td>\s*(?P<title>[^<]+)[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>\s*<img[^>]+/Streaming'
@support.menu @support.menu
@@ -67,7 +67,7 @@ def peliculas(item):
action='findvideos' action='findvideos'
elif item.args == 'last': elif item.args == 'last':
item.contentType = 'episode' item.contentType = 'episode'
action='findvideos' action='episodios'
else: else:
item.contentType = 'tvshow' item.contentType = 'tvshow'
action='episodios' action='episodios'
@@ -85,6 +85,10 @@ def peliculas(item):
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 ]
@@ -98,6 +102,7 @@ def peliculas(item):
@support.scrape @support.scrape
def episodios(item): def episodios(item):
anime = True anime = True
# debug = True
pagination = int(perpage) pagination = int(perpage)
patron = epPatron patron = epPatron
return locals() return locals()
+45 -38
View File
@@ -11,7 +11,7 @@ headers = [['Referer', host]]
@support.menu @support.menu
def mainlist(item): def mainlist(item):
anime = ['/lista-anime/', anime = ['/anime',
('In Corso',['/anime/anime-status/in-corso/', 'peliculas', 'status']), ('In Corso',['/anime/anime-status/in-corso/', 'peliculas', 'status']),
('Completi',['/anime/anime-status/completo/', 'peliculas', 'status']), ('Completi',['/anime/anime-status/completo/', 'peliculas', 'status']),
('Genere',['/anime', 'submenu', 'genre']), ('Genere',['/anime', 'submenu', 'genre']),
@@ -27,9 +27,10 @@ def mainlist(item):
def submenu(item): def submenu(item):
action = 'peliculas' action = 'peliculas'
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<u>[^"]+)"[^>]+>(?P<t>[^(]+)[^\(]+\((?P<num>\d+)' patronMenu = r'<option class="level-\d+ (?P<url>[^"]+)"[^>]+>(?P<t>[^(]+)[^\(]+\((?P<num>\d+)'
def itemHook(item): def itemHook(item):
item.url += host + '/anime/' + item.args + '/' + item.u if not item.url.startswith('http'):
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()
@@ -73,19 +74,17 @@ def search(item, text):
def peliculas(item): def peliculas(item):
search = item.search search = item.search
anime = True anime = True
if 'movie' in item.url: action = 'check'
action = 'findvideos'
else:
action = 'check'
if not item.args: patron = r'<a href="(?P<url>[^"]+)"[^>]+>\s*<img src="(?P<thumb>[^"]+)" alt="(?P<title>.*?)(?: Sub| sub| SUB|")'
pagination = ''
patron = r'<a\s*href="(?P<url>[^"]+)"\s*title="(?P<title>[^"]+)">' if search:
else: patron = r'<a href="(?P<url>[^"]+)"\s*title="(?P<title>.*?)(?: Sub| sub| SUB|")'
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') if item.args != 'newest': item.title = item.title + support.typo('Sub-ITA','_ [] color kod')
@@ -96,7 +95,7 @@ def peliculas(item):
def check(item): def check(item):
m = support.match(item, headers=headers, patron=r'Tipologia[^>]+><a href="([^"]+)"') m = support.match(item, headers=headers, patron=r'Tipologia[^>]+>\s*<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'
@@ -108,12 +107,13 @@ def check(item):
@support.scrape @support.scrape
def episodios(item): def episodios(item):
anime = True anime = True
pagination = 50
data = item.data data = item.data
if '<h6>Streaming</h6>' in data: if '<h6>Streaming</h6>' in data:
patron = r'<td style[^>]+>\s*.*?(?:<span[^>]+)?<strong>(?P<title>[^<]+)<\/strong>.*?<td style[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>' patron = r'<td style[^>]+>\s*.*?(?:<span[^>]+)?<strong>(?P<title>[^<]+)<\/strong>.*?<td style[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>(?P<episode>\d+)'
else: else:
patron = r'<a\s*href="(?P<url>[^"]+)"\s*title="(?P<title>[^"]+)"\s*class="btn btn-dark mb-1">' patron = r'<a\s*href="(?P<url>[^"]+)"\s*title="(?P<title>[^"]+)"\s*class="btn btn-dark mb-1">(?P<episode>\d+)'
def itemHook(item): def itemHook(item):
support.info(item) support.info(item)
if item.url.startswith('//'): item.url= 'https:' + item.url if item.url.startswith('//'): item.url= 'https:' + item.url
@@ -126,30 +126,37 @@ def episodios(item):
def findvideos(item): def findvideos(item):
support.info(item) support.info(item)
itemlist = [] itemlist = []
if item.data:
if 'adf.ly' in item.url: url = support.match(item.data, patron=r'<a\s*href="([^"]+)"\s*title="[^"]+"\s*class="btn btn-dark mb-1">').match
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 = host url = item.url
for u in item.url.split('/'):
if u and 'animeforce' not in u and 'http' not in u:
url += '/' + u
if 'php?' in url: # if 'adf.ly' in item.url:
url = support.httptools.downloadpage(url, only_headers=True, follow_redirects=False).headers.get("location") # from servers.decrypters import adfly
url = support.match(url, patron=r'class="button"><a href=(?:")?([^" ]+)', headers=headers).match # url = adfly.get_long_url(item.url)
else:
if item.data: url = item.data # elif 'bit.ly' in item.url:
url = support.match(url, patron=r'data-href="([^"]+)" target').match # url = support.httptools.downloadpage(item.url, only_headers=True, follow_redirects=False).headers.get("location")
if not url: url = support.match(url, patron=[r'<source src=(?:")?([^" ]+)',r'name="_wp_http_referer" value="([^"]+)"']).match
if url.startswith('//'): url = 'https:' + url # else:
elif url.startswith('/'): url = 'https:/' + url # url = host
if 'vvvvid' in url: itemlist.append(item.clone(action="play", title='VVVVID', url=url, server='vvvvid')) # for u in item.url.split('/'):
else: itemlist.append(item.clone(action="play", title=support.config.get_localized_string(30137), url=url, server='directo')) # if u and 'animeforce' not in u and 'http' not in u:
# 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)
-11
View File
@@ -1,11 +0,0 @@
{
"id": "animeleggendari",
"name": "AnimePerTutti",
"active": false,
"language": ["ita", "sub-ita"],
"thumbnail": "animepertutti.png",
"bannermenu": "animepertutti.png",
"categories": ["anime", "vos"],
"not_active":["include_in_newest_peliculas", "include_in_newest_series", "include_in_newest_anime"],
"settings": []
}
-141
View File
@@ -1,141 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per animeleggendari
# ------------------------------------------------------------
from core import support
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/', 'peliculas']),
('ITA', ['/category/anime-ita/', 'peliculas']),
('SUB-ITA', ['/category/anime-sub-ita/', 'peliculas']),
('Conclusi', ['/category/serie-anime-concluse/', 'peliculas']),
('in Corso', ['/category/serie-anime-in-corso/', 'peliculas']),
('Genere', ['', 'genres'])
]
return locals()
def search(item, texto):
support.info(texto)
item.url = host + "/?s=" + texto
try:
return peliculas(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
support.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 = 'peliculas'
return locals()
@support.scrape
def peliculas(item):
anime = 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 = 'episodios'
return locals()
@support.scrape
def episodios(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:
support.info('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
anime = 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 = support.typo(item.fulltitle + ' - Part ','bold') + item.title
item.contentType = 'movie'
else:
item.title = support.typo('Episodio ', 'bold') + 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):
support.info()
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)
+6 -43
View File
@@ -6,6 +6,7 @@
from lib import js2py from lib import js2py
from core import support from core import support
from platformcode import config from platformcode import config
from platformcode.logger import debug
host = support.config.get_channel_url() host = support.config.get_channel_url()
__channel__ = 'animesaturn' __channel__ = 'animesaturn'
@@ -170,7 +171,7 @@ def check(item):
@support.scrape @support.scrape
def episodios(item): def episodios(item):
if item.contentType != 'movie': anime = True if item.contentType != 'movie': anime = True
patron = r'episodi-link-button">\s*<a href="(?P<url>[^"]+)"[^>]+>\s*(?P<title>[^<]+)</a>' patron = r'episodi-link-button">\s*<a href="(?P<url>[^"]+)"[^>]+>\s*(?P<title>[^\d<]+(?P<episode>\d+))\s*</a>'
return locals() return locals()
@@ -178,46 +179,11 @@ def findvideos(item):
support.info() support.info()
itemlist = [] itemlist = []
links = [] links = []
# page_data = ''
# titles =['Primario', 'Secondario', 'Alternativo Primario', 'Alternativo Secondario']
# pre_data = support.match(item, headers=headers).data
# url = support.match(pre_data , patron=r'<a href="([^"]+)">[^>]+>[^>]+>G').match
# urls = [url, url+'&extra=1', url+'&s=alt', url+'&s=alt&extra=1']
# links = []
# support.dbg()
# for i, url in enumerate(urls):
# data = support.match(url, headers=headers).data
# if not '&s' in url:
# link = support.match(data, patron=r'(?:<source type="[^"]+"\s*src=|file:\s*)"([^"]+)"', headers=headers).match
# else:
# link = support.match(data, headers=headers, patron=r'file:\s*"([^"]+)"').match
# if not link:
# page_data += data
# if link and link not in links:
# links.append(link)
# # link += '|Referer=' + item.url
# itemlist.append(item.clone(action="play", title=titles[i], url=link, server='directo'))
# return support.server(item, data=data, itemlist=itemlist)
main_url = support.match(item, patron=r'<a href="([^"]+)">[^>]+>[^>]+>G').match main_url = support.match(item, patron=r'<a href="([^"]+)">[^>]+>[^>]+>G').match
# internal = support.match(data, 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'))
itemlist.append(item.clone(action="play", title='Secondario', url=main_url + '&s=alt', server='directo')) itemlist.append(item.clone(action="play", title='Secondario', url=main_url + '&s=alt', server='directo'))
# support.dbg()
# for i, url in enumerate(internal_urls):
# internal_data = support.match(url, headers=headers).data
# if not '&s' in url:
# link = support.match(internal_data, patron=r'(?:<source type="[^"]+"\s*src=|file:\s*)"([^"]+)"', headers=headers).match
# else:
# link = support.match(internal_data, headers=headers, patron=r'file:\s*"([^"]+)"').match
# if not link:
# links.append(internal_data)
# if link and link not in links:
# links.append(link)
# itemlist.append(item.clone(action="play", title=internal_titles[i], url=link, server='directo'))
# link = support.match(external[0], patron=r'href="([^"]+)', headers=headers, debug=True).match
# support.dbg()
for url in urls: for url in urls:
link = support.match(url, patron=r'<a href="([^"]+)"[^>]+><button', headers=headers).match link = support.match(url, patron=r'<a href="([^"]+)"[^>]+><button', headers=headers).match
if link: if link:
@@ -225,10 +191,7 @@ def findvideos(item):
return support.server(item, data=links, itemlist=itemlist) return support.server(item, data=links, itemlist=itemlist)
def play(item):
if item.server == 'directo':
item.url = support.match(item.url, patron=r'(?:source type="[^"]+"\s*src=|file:[^"]+)"([^"]+)').match
return[item]
+12 -74
View File
@@ -4,11 +4,8 @@
# ------------------------------------------------------------ # ------------------------------------------------------------
import cloudscraper, json, copy, inspect import cloudscraper, json, copy, inspect
from core import jsontools, support, httptools, filetools from core import support
from platformcode import autorenumber, logger from platformcode import autorenumber, logger
import re
import xbmc
session = cloudscraper.create_scraper() session = cloudscraper.create_scraper()
@@ -132,7 +129,8 @@ def news(item):
fulltitle=it['anime']['title'], fulltitle=it['anime']['title'],
thumbnail=it['anime']['imageurl'], thumbnail=it['anime']['imageurl'],
forcethumb = True, forcethumb = True,
video_url=it['scws_id'], scws_id=it.get('scws_id', ''),
video_url=it.get('link', ''),
plot=it['anime']['plot'], plot=it['anime']['plot'],
action='findvideos') action='findvideos')
) )
@@ -157,7 +155,6 @@ def peliculas(item):
records = session.post(host + '/archivio/get-animes', headers=headers, data=payload).json()['records'] records = session.post(host + '/archivio/get-animes', headers=headers, data=payload).json()['records']
for it in records: for it in records:
logger.debug(jsontools.dump(it))
lang = support.match(it['title'], patron=r'\(([It][Tt][Aa])\)').match lang = support.match(it['title'], patron=r'\(([It][Tt][Aa])\)').match
title = support.re.sub(r'\s*\([^\)]+\)', '', it['title']) title = support.re.sub(r'\s*\([^\)]+\)', '', it['title'])
@@ -176,15 +173,15 @@ def peliculas(item):
itm.fulltitle = itm.show = itm.contentTitle = title itm.fulltitle = itm.show = itm.contentTitle = title
itm.contentSerieName = '' itm.contentSerieName = ''
itm.action = 'findvideos' itm.action = 'findvideos'
itm.video_url = it['episodes'][0]['scws_id'] itm.scws_id = it['episodes'][0].get('scws_id', '')
itm.video_url = it['episodes'][0].get('link', '')
else: else:
itm.contentType = 'tvshow' itm.contentType = 'tvshow'
itm.contentTitle = '' itm.contentTitle = ''
itm.fulltitle = itm.show = itm.contentSerieName = title itm.fulltitle = itm.show = itm.contentSerieName = title
itm.action = 'episodios' itm.action = 'episodios'
itm.episodes = it['episodes'] if 'episodes' in it else it['scws_id'] itm.episodes = it['episodes'] if 'episodes' in it else it.get('scws_id', '')
itm.video_url = item.url
itemlist.append(itm) itemlist.append(itm)
@@ -198,6 +195,7 @@ def episodios(item):
support.info() support.info()
itemlist = [] itemlist = []
title = 'Parte ' if item.type.lower() == 'movie' else 'Episodio ' title = 'Parte ' if item.type.lower() == 'movie' else 'Episodio '
for it in item.episodes: for it in item.episodes:
itemlist.append( itemlist.append(
item.clone(title=support.typo(title + it['number'], 'bold'), item.clone(title=support.typo(title + it['number'], 'bold'),
@@ -210,9 +208,10 @@ def episodios(item):
plot=item.plot, plot=item.plot,
action='findvideos', action='findvideos',
contentType='episode', contentType='episode',
video_url=it['scws_id'])) scws_id=it.get('scws_id', ''),
video_url=it.get('link', '')))
if inspect.stack()[1][3] not in ['find_episodes']: if inspect.stack(0)[1][3] not in ['find_episodes']:
autorenumber.start(itemlist, item) autorenumber.start(itemlist, item)
support.videolibrary(itemlist, item) support.videolibrary(itemlist, item)
support.download(itemlist, item) support.download(itemlist, item)
@@ -220,67 +219,6 @@ def episodios(item):
def findvideos(item): def findvideos(item):
# def calculateToken(): itemlist = [item.clone(title=support.config.get_localized_string(30137), server='streamingcommunityws', url=str(item.scws_id))]
# from time import time return support.server(item, itemlist=itemlist, referer=False)
# from base64 import b64encode as b64
# import hashlib
# o = 48
# n = support.match('https://au-1.scws-content.net/get-ip').data
# i = 'Yc8U6r8KjAKAepEA'
# t = int(time() + (3600 * o))
# l = '{}{} {}'.format(t, n, i)
# md5 = hashlib.md5(l.encode())
# s = '?token={}&expires={}'.format(b64(md5.digest()).decode().replace('=', '').replace('+', "-").replace('\\', "_"), t)
# return s
# token = calculateToken()
# url = 'https://streamingcommunityws.com/master/{}{}'.format(item.video_url, token)
# # support.dbg()
# m3u8_original = httptools.downloadpage(url, CF=False).data
# m_video = re.search(r'\.\/video\/(\d+p)\/playlist.m3u8', m3u8_original)
# video_res = m_video.group(1)
# m_audio = re.search(r'\.\/audio\/(\d+k)\/playlist.m3u8', m3u8_original)
# audio_res = m_audio.group(1)
# # https://streamingcommunityws.com/master/5957?type=video&rendition=480p&token=wQLowWskEnbLfOfXXWWPGA&expires=1623437317
# video_url = 'https://streamingcommunityws.com/master/{}{}&type=video&rendition={}'.format(item.video_url, token, video_res)
# audio_url = 'https://streamingcommunityws.com/master/{}{}&type=audio&rendition={}'.format(item.video_url, token, audio_res)
# m3u8_original = m3u8_original.replace( m_video.group(0), video_url )
# m3u8_original = m3u8_original.replace( m_audio.group(0), audio_url )
# file_path = 'special://temp/animeunity.m3u8'
# filetools.write(xbmc.translatePath(file_path), m3u8_original, 'w')
# return support.server(item, itemlist=[item.clone(title=support.config.get_localized_string(30137), url=file_path, manifest = 'hls', server='directo', action='play')])
# item.url=item.video_url
directLink = False
if item.video_url == None:
if item.extra == "tvshow":
epnum = item.episode
logger.info('it is a episode', epnum)
episode = None
for ep in item.episodes:
if ep["number"] == epnum:
episode = ep
break
if episode == None:
logger.warn('cannot found episode')
else:
item.url = episode["link"]
directLink = True
if directLink:
logger.info('try direct link')
return support.server(item, itemlist=[item.clone(title=support.config.get_localized_string(30137), url=item.url, server='directo', action='play')])
else:
return support.server(item, itemlist=[item.clone(title="StreamingCommunityWS", url=str(item.video_url), manifest = 'hls', server='streamingcommunityws', action='play')])
+1 -1
View File
@@ -125,7 +125,7 @@ def peliculas(item):
if item.args == 'updated': if item.args == 'updated':
item.contentType='episode' item.contentType='episode'
patron=r'<div class="inner">\s*<a href="(?P<url>[^"]+)" class[^>]+>\s*<img.*?src="(?P<thumb>[^"]+)" alt?="(?P<title>[^\("]+)(?:\((?P<lang>[^\)]+)\))?"[^>]+>[^>]+>\s*(?:<div class="[^"]+">(?P<type>[^<]+)</div>)?[^>]+>[^>]+>\s*<div class="ep">[^\d]+(?P<episode>\d+)[^<]*</div>' patron=r'<div class="inner">\s*<a href="(?P<url>[^"]+)" class[^>]+>\s*<img.*?src="(?P<thumb>[^"]+)" alt?="(?P<title>[^\("]+)(?:\((?P<lang>[^\)]+)\))?"[^>]+>[^>]+>\s*(?:<div class="[^"]+">(?P<type>[^<]+)</div>)?(?:[^>]+>){2,4}\s*<div class="ep">[^\d]+(?P<episode>\d+)[^<]*</div>'
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>)?'
+4 -3
View File
@@ -128,7 +128,7 @@ def latest_added(item):
js = httptools.downloadpage(url).json js = httptools.downloadpage(url).json
for episode in js: for episode in js:
title = episode['title'] title = episode['title'] if episode['title'] else ''
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') 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')
@@ -176,7 +176,7 @@ def peliculas(item):
contentSerieName = title if it['type'] == 'Serie' else '', contentSerieName = title if it['type'] == 'Serie' else '',
action ='findvideos' if it['type'] == 'Movie' else 'episodios',# '' if not active else 'findvideos' if it['type'] == 'Movie' else 'episodios', action ='findvideos' if it['type'] == 'Movie' else 'episodios',# '' if not active else 'findvideos' if it['type'] == 'Movie' else 'episodios',
plot = it['storyline'], plot = it['storyline'],
year = it['startDate'].split('-')[0], # year = it['startDate'].split('-')[0],
url = '{}/api/anime/{}'.format(host, it['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')))
@@ -289,8 +289,9 @@ def findvideos(item):
if json.get('episodes', []): if json.get('episodes', []):
json = httptools.downloadpage('{}/api/episode/{}'.format(host, json['episodes'][0]['id'])).json json = httptools.downloadpage('{}/api/episode/{}'.format(host, json['episodes'][0]['id'])).json
# logger.debug(json)
videourl = json['episodeVideo'] videourl = json['videoUrl']
itemlist = [item.clone(title=config.get_localized_string(30137), itemlist = [item.clone(title=config.get_localized_string(30137),
url=videourl, url=videourl,
+8 -8
View File
@@ -14,7 +14,6 @@ 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/', 'peliculas', 'sub'])
] ]
tvshow = ['/category/serie-tv', tvshow = ['/category/serie-tv',
@@ -35,7 +34,7 @@ def genres(item):
return locals() return locals()
def select(item): def check(item):
item.data = support.match(item).data item.data = support.match(item).data
if 'continua con il video' in item.data.lower(): if 'continua con il video' in item.data.lower():
support.info('select = ### è un film ###') support.info('select = ### è un film ###')
@@ -101,7 +100,7 @@ def peliculas(item):
action = 'episodios' action = 'episodios'
pagination = '' pagination = ''
else: else:
action = 'select' action = 'check'
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>[^<]+)))?'
@@ -134,8 +133,11 @@ def episodios(item):
action = 'findvideos' action = 'findvideos'
item.contentType = 'tvshow' item.contentType = 'tvshow'
blacklist = [''] blacklist = ['']
patron = r'(?P<episode>\d+(?:&#215;|×)?\d+\-\d+|\d+(?:&#215;|×)\d+)[;]?(?:(?P<title>[^<]+)<(?P<data>.*?)|(\2[ ])(?:<(\3.*?)))(?:<br />|</p>)' # debug = True
patronBlock = r'<strong>(?P<block>(?:.+?Stagione*.+?(?P<lang>[Ii][Tt][Aa]|[Ss][Uu][Bb][\-]?[iI][tT][aA]))?(?:.+?|</strong>)(/?:</span>)?</p>.*?</p>)' 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()
@@ -146,9 +148,7 @@ def findvideos(item):
matchData = item.data if item.data else item matchData = item.data if item.data else item
links = support.match(matchData, patron=r'(?:SRC|href)="([^"]+)"', patronBlock=r'<div class="col-md-10">(.+?)<div class="ads">').matches links = support.match(matchData, patron=r'(?:SRC|href)="([^"]+)"', patronBlock=r'<div class="col-md-10">(.+?)<div class="ads">').matches
data = '' data = ''
from lib.unshortenit import unshorten_only
for link in links: for link in links:
support.info('URL=',link) support.info('URL=',link)
url, c = unshorten_only(link.replace('#', 'speedvideo.net')) data += link + '\n'
data += url + '\n'
return support.server(item, data) return support.server(item, data)
+9 -9
View File
@@ -1,10 +1,10 @@
{ {
"id": "cb01anime", "id": "cb01anime",
"name": "Cb01anime", "name": "Cb01anime",
"language": ["ita", "vos", "sub-ita"], "language": ["ita", "vos", "sub-ita"],
"active": true, "active": false,
"thumbnail": "cb01anime.png", "thumbnail": "cb01anime.png",
"banner": "cb01anime.png", "banner": "cb01anime.png",
"categories": ["anime"], "categories": ["anime"],
"settings": [] "settings": []
} }
+24 -27
View File
@@ -9,14 +9,14 @@ 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() host = config.get_channel_url(findhost)
headers = [['Referer', host]] headers = [['Referer', host]]
@@ -45,8 +45,9 @@ 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>.*?)<\/a>' patronMenu = r'href="?(?P<url>[^">]+)"?>(?P<title>[^<»]+)'
action = 'peliculas' action = 'peliculas'
return locals() return locals()
@@ -104,14 +105,14 @@ def peliculas(item):
pagination = '' pagination = ''
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/]+)\]\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>[^<]+)<' 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>[^<]+)<'
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 = 'episodios'
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/]+)\]\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]+(?:[/]?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>[^<>]+))?'
action = 'findvideos' action = 'findvideos'
else: else:
@@ -133,28 +134,28 @@ def peliculas(item):
@support.scrape @support.scrape
def episodios(item): def episodios(item):
@support.scrape @support.scrape
def folder(item, data): def folder(item, url):
""" """
Quando c'è un link ad una cartella contenente più stagioni Quando c'è un link ad una cartella contenente più stagioni
""" """
actLike = 'episodios' if url:
addVideolibrary = False data = support.match(url).data
downloadEnabled = False actLike = 'episodios'
addVideolibrary = False
downloadEnabled = False
folderUrl = scrapertools.find_single_match(data, r'TUTTA L[EA] \w+\s+(?:&#8211;|-)\s+<a href="?([^" ]+)') patron = r'<td>(?P<title>[^<]+)<td><a [^>]+href="(?P<url>[^"]+)[^>]+>'
data = httptools.downloadpage(folderUrl, disable_directIP=True).data sceneTitle = True
patron = r'<td>(?P<title>[^<]+)<td><a [^>]+href="(?P<url>[^"]+)[^>]+>' # debug = True
sceneTitle = True
# debug = True
def itemHook(item): def itemHook(item):
item.serieFolder = True item.serieFolder = True
return item return item
return locals() return locals()
# debugBlock=True # debugBlock=True
data = support.match(item.url, headers=headers).data data = support.match(item.url, headers=headers).data
folderItemlist = folder(item, data) if '<p>TUTTA L' in data else [] 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[^>]*>' 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[^>]*>'
patron = r'(?:/>|<p>|<strong>)(?P<other>.*?(?P<episode>[0-9]+(?:&#215;|×)[0-9]+)\s*(?P<title2>.*?)?(?:\s*&#8211;|\s*-|\s*<).*?)(?:<\/p>|<br)' patron = r'(?:/>|<p>|<strong>)(?P<other>.*?(?P<episode>[0-9]+(?:&#215;|×)[0-9]+)\s*(?P<title2>.*?)?(?:\s*&#8211;|\s*-|\s*<).*?)(?:<\/p>|<br)'
@@ -194,7 +195,6 @@ def findvideos(item):
def load_links(itemlist, re_txt, desc_txt, quality=""): def load_links(itemlist, re_txt, desc_txt, quality=""):
streaming = scrapertools.find_single_match(data, re_txt).replace('"', '') streaming = scrapertools.find_single_match(data, re_txt).replace('"', '')
logger.debug('STREAMING', streaming)
logger.debug('STREAMING=', streaming) logger.debug('STREAMING=', streaming)
matches = support.match(streaming, patron = r'<td><a.*?href=([^ ]+) [^>]+>([^<]+)<').matches matches = support.match(streaming, patron = r'<td><a.*?href=([^ ]+) [^>]+>([^<]+)<').matches
for scrapedurl, scrapedtitle in matches: for scrapedurl, scrapedtitle in matches:
@@ -218,12 +218,9 @@ def findvideos(item):
# Estrae i contenuti - Streaming 3D # Estrae i contenuti - Streaming 3D
load_links(itemlist, '<strong>Streamin?g 3D[^<]+</strong>(.*?)cbtable', "Streaming 3D") load_links(itemlist, '<strong>Streamin?g 3D[^<]+</strong>(.*?)cbtable', "Streaming 3D")
itemlist = support.server(item, itemlist=itemlist)
# Extract the quality format # Extract the quality format
patronvideos = r'([\w.]+)</strong></div></td>' patronvideos = r'([\w.]+)</strong></div></td>'
support.addQualityTag(item, itemlist, data, patronvideos) return support.server(item, itemlist=itemlist, patronTag=patronvideos)
return itemlist
# Estrae i contenuti - Download # Estrae i contenuti - Download
# load_links(itemlist, '<strong>Download:</strong>(.*?)<tableclass=cbtable height=30>', "aqua", "Download") # load_links(itemlist, '<strong>Download:</strong>(.*?)<tableclass=cbtable height=30>', "aqua", "Download")
+132 -45
View File
@@ -7,8 +7,15 @@ 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 platformcode import config from core.support import typo
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):
@@ -53,11 +60,13 @@ def peliculas(item):
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 = 25
elif item.contentType == 'movie': elif item.contentType == 'movie':
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>)?' # 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>)?'
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 = 25
@@ -87,33 +96,71 @@ def peliculas(item):
@support.scrape @support.scrape
def episodios(item): def episodios(item):
data=item.data data = item.data
# debug=True
if item.args == 'anime': if item.args == 'anime':
support.info("Anime :", item) logger.debug("Anime :", item)
# blacklist = ['Clipwatching', 'Verystream', 'Easybytez', 'Flix555', 'Cloudvideo']
patron = r'<a target=(?P<url>[^>]+>(?P<title>Episodio\s(?P<episode>\d+))(?::)?(?:(?P<title2>[^<]+))?.*?(?:<br|</p))' 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 == 'serie': elif item.args == 'sport':
support.info("Serie :", item) logger.debug("Sport :", item)
patron = r'(?:>| )(?P<episode>\d+(?:x|×|&#215;)\d+)[;]?[ ]?(?:(?P<title>[^<-]+)(?P<data>.*?)|(\2[ ])(?:<(\3.*?)))(?:</a><br /|</a></p|$)' patron = r'(?:/>|<p>)\s*(?P<title>[^-]+)-(?P<data>.+?)(?:<br|</p)'
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)' patronBlock = r'</strong>\s*</p>(?P<block>.*?</p>)'
item.contentType = 'tvshow'
elif item.args == 'serie' or item.contentType == 'tvshow':
logger.debug("Serie :", item)
# debug=True
patron = r'(?:/>|<p>)\s*(?:(?P<episode>\d+(?:x|×|&#215;)\d+|Puntata \d+)(?:-(?P<episode2>\d+))?[;]?[ ]?(?P<title>[^<-]+))?(?P<data>.*?)(?:<br|</p)'
patronBlock = r'Stagione\s(?:[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(item): def itemHook(it):
if not scrapertools.find_single_match(item.title, r'(\d+x\d+)'): if not scrapertools.find_single_match(it.title, r'(\d+x\d+)'):
item.title = re.sub(r'(\d+) -', '1x\\1', item.title) it.title = re.sub(r'(\d+) -', '1x\\1', it.title)
return item return it
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)
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)
ep = scrapertools.get_season_and_episode(title)
if ep:
if ep not in episodes:
episodes[ep] = []
episodes[ep].append(s)
servers = support.server(item, data, CheckLinks=False, Download=False, Videolibrary=False)
episodes = {}
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)
ret.extend([it.clone(title=typo(ep, 'bold')+typo(it.contentLanguage, '_ [] color kod bold'), contentSeason=int(ep.split('x')[0]), contentEpisodeNumber=int(ep.split('x')[1]), 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='peliculas'
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]+)"' patronMenu=r'<a class="dropdown-item" href="(?P<url>[^"]+)" title="(?P<title>[A-z]+)"'
@@ -122,7 +169,7 @@ def genres(item):
def search(item, texto): def search(item, texto):
support.info(item.url,texto) logger.debug(item.url,texto)
texto = texto.replace(' ', '+') texto = texto.replace(' ', '+')
item.url = host + "/?s=" + texto item.url = host + "/?s=" + texto
# item.contentType = 'tv' # item.contentType = 'tv'
@@ -133,11 +180,12 @@ def search(item, texto):
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(categoria):
support.info('newest ->', categoria) logger.debug('newest ->', categoria)
itemlist = [] itemlist = []
item = Item() item = Item()
item.args = 'newest' item.args = 'newest'
@@ -151,47 +199,86 @@ def newest(categoria):
except: except:
import sys import sys
for line in sys.exc_info(): for line in sys.exc_info():
support.info('newest log: ', (line)) logger.error('newest log: ', (line))
return [] return []
return itemlist return itemlist
def check(item): def check(item):
support.info() logger.debug()
data = support.match(item.url, headers=headers).data data = support.match(item.url, headers=headers).data
# support.dbg()
if data: if data:
ck = support.match(data, patron=r'Supportaci condividendo quest[oa] ([^:]+)').match.lower() ck = str(support.match(data, patronBlock=r'Genere:(.*?)</span>', patron=r'tag">([^<]+)').matches).lower()
if ck == 'serie tv': if 'serie tv' in ck or 'anime' in ck:# in ['serie tv', 'wrestling wwe', 'anime']:
item.contentType = 'tvshow' if 'anime' in ck:
item.args = 'serie' item.args = 'anime'
item.data = data elif 'sport' in ck:
return episodios(item) item.args = 'sport'
else:
elif ck == 'anime': item.args = 'serie'
item.contentType = 'tvshow'
item.args = 'anime'
item.data = data
return episodios(item)
elif ck == 'film':
item.contentType = 'movie'
item.data = data
return findvideos(item)
else:
item.contentType = 'tvshow' item.contentType = 'tvshow'
item.data = data item.data = data
itemlist = episodios(item) itemlist = episodios(item)
if not itemlist: if not itemlist:
item.contentType = 'movie'
item.data = data item.data = data
return findvideos(item) return findvideos(item)
return itemlist else:
item.contentType = 'movie'
item.data = data
# item.action = 'findvideos'
return findvideos(item)
return itemlist
def findvideos(item): def findvideos(item):
support.info() def filter_ep(s):
item.data = item.data.replace('http://rapidcrypt.net/verys/', '').replace('http://rapidcrypt.net/open/', '') #blocca la ricerca srv_mod = __import__('servers.%s' % s.server, None, None, ["servers.%s" % s.server])
return support.server(item, data=item.data) 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()
# support.dbg()
if item.servers:
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')
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 = {}
# support.dbg()
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
+1 -1
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"], "not_active":["include_in_newest_peliculas", "include_in_newest_series", "include_in_newest_anime", "include_in_global_search"],
"settings": [] "settings": []
} }
+163 -135
View File
@@ -2,196 +2,224 @@
# ------------------------------------------------------------ # ------------------------------------------------------------
# Canale per Rai Play # Canale per Rai Play
# ------------------------------------------------------------ # ------------------------------------------------------------
import functools
import requests, uuid
from core import jsontools, support, httptools
from platformcode import logger
import requests
from core import support, jsontools
from platformcode import logger, config
typo = support.typo 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
token = session.get('https://disco-api.discoveryplus.it/token?realm=dplayit').json()['data']['attributes']['token'] # domain = 'https://eu1-prod-direct.discoveryplus.com'
domain = 'https://' + session.get("https://prod-realmservice.mercury.dnitv.com/realm-config/www.discoveryplus.com%2Fit%2Fepg").json()["domain"]
api = "https://disco-api.discoveryplus.it" token = session.get('{}/token?deviceId={}&realm=dplay&shortlived=true'.format(domain, deviceId)).json()['data']['attributes']['token']
headers = {'User-Agent': 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0', session.headers = {'User-Agent': 'Mozilla/50.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0',
'Referer': host, 'Referer': host,
'Cookie' : 'st=' + token} 'Origin': host,
'Cookie': 'st={}'.format(token),
def Dict(item): 'content-type': 'application/json',
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 {bold}', ['', 'live']),
('Programmi {bullet bold tv}', ['', 'peliculas', 'programmi']), ('Programmi {bullet bold tv}', ['', 'programs', 'programmi'])]
('Generi {bullet bold tv}', ['', 'genres'])]
search = '' search = ''
return locals() return locals()
def liveDict():
livedict = {}
for key in session.get(api + '/cms/routes/canali?decorators=viewingHistory&include=default', headers=headers).json()['included']:
if key['type'] == 'channel' and key.get('attributes',{}).get('hasLiveStream', '') and 'Free' in key.get('attributes',{}).get('packages', []):
title = key['attributes']['name']
livedict[title] = {}
livedict[title]['plot'] = key['attributes']['description']
livedict[title]['url'] = '{}/canali/{}'.format(host, key['attributes']['alternateId'])
livedict[title]['id'] = key['id']
return livedict
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 = peliculas(item)
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(line)
return itemlist return itemlist
def live(item): def live(item):
logger.debug() logger.debug()
itemlist =[] itemlist =[]
for name, values in liveDict().items(): data = session.get(domain + '/cms/routes/epg?include=default').json()['included']
itemlist.append(item.clone(title=typo(name,'bold'), fulltitle=name, plot=values['plot'], url=values['url'], id=values['id'], action='play', forcethumb=True, no_return=True))
for key in data:
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'),
fulltitle = key['attributes']['name'],
plot = key['attributes'].get('description', ''),
url = "{}/canali/{}".format(host, key['attributes']['alternateId']),
id = key['id'],
action = 'findvideos'))
return support.thumb(itemlist, live=True) return support.thumb(itemlist, live=True)
def programs(item):
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):
item.action = 'peliculas' logger.debug()
itemlist = [
item.clone(title='Attualità e inchiesta', args='genere/attualita-e-inchiesta'), itemlist = []
item.clone(title='Beauty and style', args='genere/beauty-and-style'), data = session.get('{}/cms/collections/{}?include=default'. format(domain, item.id)).json()['included']
item.clone(title='Serie TV', args='genere/serie-tv'), collection = {k['id']: k['relationships'].get('show', k['relationships'].get('collection'))['data']['id'] for k in data if k['type'] == 'collectionItem'}
item.clone(title='Casa', args='genere/casa'),
item.clone(title='Comedy', args='genere/comedy'), included = {}
item.clone(title='Crime', args='genere/crime'), for key in data:
item.clone(title='Documentari', args='genere/documentari'), if key.get('relationships', {}).get('items') and key['type'] == 'collection' and key['attributes']['title'] not in ['A-Z', 'I più visti']:
# item.clone(title='Discovery + Originals', args='genere/discoveryplus-original'), included[key['attributes']['title']] = [k['id'] for k in key['relationships']['items']['data']]
item.clone(title='Food', args='genere/food'),
item.clone(title='Medical', args='genere/medical'), for title, values in included.items():
item.clone(title='Motori', args='genere/motori'), itemlist.append(item.clone(title=title, action='peliculas', filter=[collection[k] for k in values]))
item.clone(title='Natura', args='genere/natura'),
item.clone(title='Paranormal', args='genere/paranormal'), itemlist.sort(key=lambda it: it.title)
item.clone(title='People', args='genere/people'),
item.clone(title='Real Adventure', args='genere/real-adventure'), return support.thumb(itemlist, genre=True)
item.clone(title='Real Life', args='genere/real-life'),
item.clone(title='Scienza e Spazio', args='genere/scienza-e-spazio'),
item.clone(title='Sex and love', args='genere/sex-and-love'), def channels(item):
item.clone(title='Sport', args='genere/sport'), logger.debug()
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 peliculas(item):
logger.debug() logger.debug()
itemlist =[]
if 'search' in item.args:
pdict = session.get('{}/content/shows?include=genres,images,primaryChannel.images,contentPackages&page[size]=12&query={}'.format(api, item.text), headers=headers).json()['data']
else:
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))
for key in pdict: itemlist =[]
if key['type'] == 'show' and 'Free' in str(key.get('relationships',{}).get('contentPackages',{}).get('data',[])):
title = key['attributes']['name'] if item.text:
plot = key['attributes'].get('description','') data = session.get('{}/cms/routes/search/result?include=default&contentFilter[query]={}'.format(domain, item.text)).json()['included']
url = '{}/programmi/{}'.format(host, key['attributes']['alternateId']) else:
seasons = key['attributes']['seasonNumbers'] data = session.get('{}/cms/collections/{}?include=default'.format(domain, item.id)).json()['included']
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 images = {key['id'] : key['attributes']['src'] for key in data if key['type'] == 'image'}
fanarts = [image['attributes']['src'] for image in images if len(key['relationships']['images']['data']) > 1 and image['id'] == key['relationships']['images']['data'][1]['id']]
fanart = fanarts[0] if fanarts else item.fanart for key in data:
if key['type'] == 'show' and 'Free' in str(key.get('relationships',{}).get('contentPackages',{}).get('data',[])) and key['attributes']['episodeCount']:
if item.filter and key['id'] not in item.filter:
continue
thumbId = key['relationships'].get('images',{}).get('data', [{},{},{}])[2].get('id', '')
fanartId = key['relationships'].get('images',{}).get('data', [{}])[0].get('id', '')
itemlist.append( itemlist.append(
item.clone(title=typo(title,'bold'), item.clone(title=typo(key['attributes']['name'],'bold'),
fulltitle=title, plot=key['attributes'].get('description',''),
plot=plot, programid=key['attributes']['alternateId'],
url=url, seasons=key['attributes']['seasonNumbers'],
programid=key['attributes']['alternateId'], action='seasons',
id=key['id'], thumbnail=images[thumbId] if thumbId else item.thumbnail,
seasons=seasons, fanart=images[fanartId] if fanartId else item.fanart,
action='episodios', contentType='tvshow'))
thumbnail=thumb,
fanart=fanart, itemlist.sort(key=lambda it: it.title)
contentType='tvshow'))
if not itemlist:
from core.item import Item
itemlist = [Item(title='Nessun Contenuto Free Disponibile', thumbnail=support.thumb('info'))]
return itemlist
def seasons(item):
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':
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
return itemlist return itemlist
def episodios(item): def episodios(item):
logger.debug() logger.debug()
itemlist =[] itemlist =[]
pdict = session.get(api + '/cms/routes/programmi/{}?decorators=viewingHistory&include=default'.format(item.programid), headers=headers).json()['included'] data = session.get('{}/cms/collections/{}?include=default&{}&{}'.format(domain, item.id, item.seasonparams, item.showparams)).json()['included']
images = {key['id'] : key['attributes']['src'] for key in data if key['type'] == 'image'}
for key in pdict: for key in data:
if key['type'] == 'collection' and key.get('attributes',{}).get('component',{}).get('id', '') == 'tabbed-content': if key['type'] == 'video' and 'Free' in str(key.get('relationships',{}).get('contentPackages',{}).get('data',[])):
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()
seasons.append(season['included'])
pages = season['data'].get('meta',{}).get('itemsTotalPages', 0)
if pages:
for page in range(2,pages + 1):
url = '{}/cms/collections/{}?decorators=viewingHistory&include=default&{}&{}&page[items.number]={}'.format(api, key['id'], mandatory, option['parameter'], page)
logger.debug(url)
season = session.get(url, headers=headers).json()['included']
seasons.append(season)
except:
pass
for season in seasons: itemlist.sort(key=lambda it: it.episode)
for episode in season:
if episode['type'] == 'video' and 'Free' in episode['attributes']['packages']: if not itemlist:
title = '{}x{:02d} - {}'.format(option['id'], episode['attributes']['episodeNumber'], episode['attributes']['name']) from core.item import Item
plot = episode['attributes']['description'] itemlist = [Item(title='Nessun Episodio Free Disponibile', thumbnail=support.thumb('info'))]
itemlist.append(
item.clone(title=typo(title,'bold'),
fulltitle=title,
plot=plot,
id=episode['id'],
action='play',
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 play(item): def findvideos(item):
if item.livefilter: logger.debug()
item.id = liveDict()[item.livefilter]['id']
item.fulltitle = item.livefilter content = 'video' if item.contentType == 'episode' else 'channel'
item.forcethumb = True post = {content + 'Id': item.id, 'deviceInfo': {'adBlocker': False,'drmSupported': True}}
item.no_return = True
support.thumb(item, live=True) data = session.post('{}/playback/v3/{}PlaybackInfo'.format(domain, content), json=post).json().get('data',{}).get('attributes',{})
if item.contentType == 'episode': data = session.get('{}/playback/v2/videoPlaybackInfo/{}?usePreAuth=true'.format(api, item.id), headers=headers).json().get('data',{}).get('attributes',{})
else: data = session.get('{}/playback/v2/channelPlaybackInfo/{}?usePreAuth=true'.format(api, item.id), headers=headers).json().get('data',{}).get('attributes',{}) if data.get('protection', {}).get('drmEnabled',False):
if data.get('protection', {}).get('drm_enabled',True):
item.url = data['streaming']['dash']['url'] item.url = data['streaming']['dash']['url']
item.drm = 'com.widevine.alpha' item.drm = 'com.widevine.alpha'
item.license = data['protection']['schemes']['widevine']['licenseUrl'] + '|PreAuthorization=' + data['protection']['drmToken'] + '|R{SSM}|' item.license ="{}|PreAuthorization={}|R{{SSM}}|".format(data['protection']['schemes']['widevine']['licenseUrl'], data['protection']['drmToken'])
else: else:
item.url = data['streaming']['hls']['url'] item.url = data['streaming'][0]['url']
item.manifest = 'hls' item.manifest = 'hls'
return [item]
return support.server(item, itemlist=[item], Download=False, Videolibrary=False)
+2 -2
View File
@@ -2,9 +2,9 @@
"id": "dreamsub", "id": "dreamsub",
"name": "DreamSub", "name": "DreamSub",
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"active": true, "active": false,
"thumbnail": "dreamsub.png", "thumbnail": "dreamsub.png",
"banner": "dreamsub.png", "banner": "dreamsub.png",
"categories": ["anime", "vos"], "categories": ["anime", "vos"],
"settings": [] "settings": []
} }
+3 -2
View File
@@ -88,7 +88,7 @@ def peliculas(item):
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="([^"]+)">'
@@ -104,12 +104,13 @@ def peliculas(item):
@support.scrape @support.scrape
def episodios(item): def episodios(item):
anime = True anime = True
# debug = True
pagination = 100 pagination = 100
if item.data: if item.data:
data = item.data data = item.data
patron = r'<div class="sli-name">\s*<a href="(?P<url>[^"]+)"[^>]+>(?P<title>[^<]+)<' patron = r'<div class="sli-name">\s*<a\s+href="(?P<url>[^"]+)"[^>]+>(?P<title>[^<]+)<'
return locals() return locals()
-10
View File
@@ -1,10 +0,0 @@
{
"id": "dsda",
"name": "D.S.D.A",
"language": ["ita"],
"active": false,
"thumbnail": "dsda.png",
"banner": "dsda.png",
"categories": ["documentary"],
"settings": []
}
-140
View File
@@ -1,140 +0,0 @@
# -*- 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','peliculas')),
('Categorie {submenu}',('','menu')),
('Cerca... {bullet bold}',('','search')),]
return locals()
@support.scrape
def menu(item):
action = 'peliculas'
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(categoria):
support.info()
item = Item()
try:
if categoria == "documentales":
item.url = host + "/elenco-documentari"
item.action = "peliculas"
return peliculas(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
support.logger.error("{0}".format(line))
return []
def search(item, texto):
support.info(texto)
item.url = host + "/?s=" + texto
try:
return peliculas(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 peliculas(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 = 'episodios'
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 = 'peliculas'
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 episodios(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):
support.info()
if item.args == 'raccolta' or item.contentType == 'episode':
return support.server(item, item.url)
else:
return support.server(item)
+11 -4
View File
@@ -4,7 +4,7 @@
# by Greko # by Greko
# ------------------------------------------------------------ # ------------------------------------------------------------
from core import httptools, support from core import support
from core.item import Item from core.item import Item
# def findhost(url): # def findhost(url):
@@ -20,7 +20,7 @@ def mainlist(item):
support.info() support.info()
tvshow = [] tvshow = []
anime = ['/category/anime-cartoni-animati/'] anime = ['/category/anime-cartoni-animati/']
mix = [('Aggiornamenti {bullet bold} {TV}', ['/aggiornamento-episodi/', 'peliculas', 'newest']), mix = [('Aggiornamenti {bullet bold} {TV}', ['/aggiornamento-episodi-nuovi/', 'peliculas', 'newest']),
('Archivio {bullet bold} {TV}', ['/category/serie-tv-archive/', 'peliculas'])] ('Archivio {bullet bold} {TV}', ['/category/serie-tv-archive/', 'peliculas'])]
search = '' search = ''
@@ -42,6 +42,7 @@ def peliculas(item):
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodios(item):
# debug = True # debug = True
@@ -83,7 +84,7 @@ def newest(categoria):
item.contentType = 'tvshow' item.contentType = 'tvshow'
item.args = 'newest' item.args = 'newest'
try: try:
item.url = "%s/aggiornamento-episodi/" % host item.url = "%s/aggiornamento-nuovi-episodi/" % host
item.action = "peliculas" item.action = "peliculas"
itemlist = peliculas(item) itemlist = peliculas(item)
# Continua la ricerca in caso di errore # Continua la ricerca in caso di errore
@@ -98,4 +99,10 @@ def newest(categoria):
def findvideos(item): def findvideos(item):
support.info() support.info()
return support.server(item, item.other) itemlist = support.server(item, item.other)
# 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
+10
View File
@@ -0,0 +1,10 @@
{
"id": "eurostreaming_actor",
"name": "Eurostreaming Actor",
"active": true,
"language": ["ita","sub-ita"],
"thumbnail": "eurostreaming.png",
"banner": "eurostreaming.png",
"categories": ["tvshow","anime","vos"],
"settings": []
}
+97
View File
@@ -0,0 +1,97 @@
# -*- 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>.+?)[\<]?[/(](?P<year>.*?)[\)|a]'
patronNext = r'next.*?href="(.*?)"'
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-link="(?P<url>http.*?)".*?data.num..(?P<season>\d+)x(?P<episode>\d+)" data-title="(?P<title>[^"]+)'
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
View File
@@ -1,11 +0,0 @@
{
"id": "fastsubita",
"name": "Fastsubita",
"language": ["sub-ita"],
"active": false,
"thumbnail": "fastsubita.png",
"banner": "fastsubita.png",
"categories": ["tvshow", "vos"],
"not_active": ["include_in_newest_peliculas", "include_in_newest_anime"],
"settings": []
}
-214
View File
@@ -1,214 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per fastsubita.py
# ------------------------------------------------------------
"""
Su questo canale, nella categoria '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, scrapertools
from core.item import Item
from core.support import info
from platformcode import config
host = config.get_channel_url()
headers = [['Referer', host]]
@support.menu
def mainlist(item):
Tvshow = [
('Aggiornamenti', ['', 'peliculas', 'update']),
('Cerca... {bold}{TV}', ['', 'search'])
]
# search = ''
return locals()
@support.scrape
def peliculas(item):
support.info(item)
# support.dbg()
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 episodios_args(item)
# ogni puntata è un articolo a se
if item.fulltitle:
item.url = host + '?s=' + item.fulltitle
actLike = 'episodios'
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 = 'episodios'
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 episodios_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 episodios_args(item):
actLike = 'episodios'
# support.dbg()
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 episodios(item):
support.info(item)
return episodios_args(item)
@support.scrape
def genres(item):
support.info()
#support.dbg()
action = 'peliculas'
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):
support.info('search', item)
text = text.replace(' ', '+')
item.url = host + '?s=' + text
try:
item.args = 'search'
item.contentType = 'tvshow'
return peliculas(item)
# Se captura la excepcion, para no interrumpir al buscador global si un canal falla
except:
import sys
for line in sys.exc_info():
info('search log:', line)
return []
def newest(categoria):
support.info('newest ->', categoria)
itemlist = []
item = Item()
if categoria == 'series':
try:
item.contentType = 'tvshow'
item.args = 'newest'
item.url = host
item.action = 'peliculas'
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():
support.info('newest log: ', line)
return []
return itemlist
def findvideos(item):
support.info('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 episodios(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 != 'episodios':
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='episodios',
# contentTitle=titles,
# plot = "Vai alla Serie " + titles + " con tutte le puntate",
# ))
return itemlist
-11
View File
@@ -1,11 +0,0 @@
{
"id": "film4k",
"name": "Film4k",
"language": ["ita"],
"active": false,
"thumbnail": "film4k.png",
"banner": "film4k.png",
"categories": ["tvshow", "movie", "anime"],
"not_active": ["include_in_newest_peliculas", "include_in_newest_anime", "include_in_newest_series"],
"settings": []
}
-82
View File
@@ -1,82 +0,0 @@
# -*- 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', 'peliculas']),
('Più votati', ['ratings/?get=movies', 'peliculas'])]
tvshow = ['/tvshows',
('Più popolari', ['trending/?get=tv', 'peliculas']),
('Più votati', ['ratings/?get=tv', 'peliculas'])]
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 peliculas(item):
if 'anime' in item.url:
return support.dooplay_peliculas(item, True)
else:
return support.dooplay_peliculas(item, False)
def episodios(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 = 'peliculas'
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
View File
@@ -1,35 +0,0 @@
{
"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_peliculas",
"type": "bool",
"label": "@70727",
"default": false,
"enabled": false,
"visible": false
},
{
"id": "include_in_newest_series",
"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
}
]
}
-156
View File
@@ -1,156 +0,0 @@
# -*- 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
host = config.get_channel_url()
headers = [['Referer', host]]
@support.menu
def mainlist(item):
film = [
('Al Cinema ', ['', 'peliculas', 'cinema']),
('Categorie', ['', 'genres', 'genres']),
]
tvshow = ['/serie/ALL',
('Generi', ['', 'genres', 'genres'])
]
search = ''
return locals()
@support.scrape
def peliculas(item):
support.info()
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 = ''
patronNext = '<a class="page-link" href="([^"]+)">>>'
else:
action = 'episodios'
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 = 'episodios'
item.contentType = 'tvshow'
else:
item.action = 'findvideos'
item.contentType = 'movie'
return item
#debug = True
return locals()
@support.scrape
def episodios(item):
support.info()
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):
support.info()
if item.contentType == 'movie':
action = 'peliculas'
patron = r'<a href="(?P<url>.*?)">(?P<title>.*?)<'
patronBlock = r'CATEGORIES.*?<ul>(?P<block>.*?)</ul>'
else:
item.contentType = 'tvshow'
action = 'peliculas'
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):
support.info('search', item)
text = text.replace(' ', '+')
item.url = host + '/search/?s=' + text
try:
item.args = 'search'
return peliculas(item)
# Se captura la excepcion, para no interrumpir al buscador global si un canal falla
except:
import sys
for line in sys.exc_info():
support.info('search log:', line)
return []
def newest(categoria):
support.info('newest ->', categoria)
itemlist = []
item = Item()
try:
if categoria == 'peliculas':
item.url = host
item.contentType = 'movie'
item.action = 'peliculas'
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():
support.info({0}.format(line))
return []
return itemlist
def findvideos(item):
support.info()
return support.server(item)
+5 -5
View File
@@ -48,13 +48,13 @@ def peliculas(item):
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\-]+)\))?' 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 == 'search': if item.args == 'search':
action = 'select' action = 'check'
elif item.contentType == 'tvshow': elif item.contentType == 'tvshow':
action = 'episodios' action = 'episodios'
elif item.contentType == 'movie': elif item.contentType == 'movie':
action ='findvideos' action ='findvideos'
else: else:
action = 'select' action = 'check'
def itemHook(item): def itemHook(item):
item.title = item.title.replace(' - La Serie', '') item.title = item.title.replace(' - La Serie', '')
@@ -68,7 +68,7 @@ def episodios(item):
data = support.match(item.url, headers=headers).data data = support.match(item.url, headers=headers).data
if 'accordion-item' in 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)' patronBlock = r'<span class="season[^>]*>\d+[^>]+>[^>]+>[^>]+>[^>]+>\D*(?:STAGIONE|Stagione)[ -]+(?P<lang>[a-zA-Z\- ]+)[^<]*</span>(?P<block>.*?)<div id="(?:season|disqus)'
patron = r'<img src="(?P<thumb>[^"]+)">.*?<li class="season-no">(?P<season>\d+)(?:&#215;|×|x)(?P<episode>\d+)[^<0-9]*<\/li>(?P<data>.*?javascript:;">(?P<title>[^<]+).*?</tbody>)' patron = r'<img src="(?P<thumb>[^"]+)"(?:[^>]*>){4}\s*<li class="season-no">(?P<season>\d+)(?:&#215;|×|x)(?P<episode>\d+)[^<0-9]*<\/li>(?P<data>.*?javascript:;">(?P<title>[^<]+).*?</tbody>)'
else: else:
patronBlock = r'(?:STAGIONE|Stagione)(?:<[^>]+>)?\s*(?:(?P<lang>[A-Za-z- ]+))?(?P<block>.*?)(?:&nbsp;|<strong>|<div class="addtoany)' 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)' patron = r'(?:/>|p>)\s*(?P<season>\d+)(?:&#215;|×|x)(?P<episode>\d+)[^<]+(?P<data>.*?)(?:<br|</p)'
@@ -97,7 +97,7 @@ def genres(item):
return locals() return locals()
def select(item): def check(item):
support.info() support.info()
patron=r'class="taxonomy category"\s*><span property="name">([^>]+)</span></a><meta property="position" content="2">' patron=r'class="taxonomy category"\s*><span property="name">([^>]+)</span></a><meta property="position" content="2">'
block = support.match(item.url, patron=patron,headers=headers).match block = support.match(item.url, patron=patron,headers=headers).match
@@ -113,7 +113,7 @@ def select(item):
def search(item, texto): def search(item, texto):
support.info() support.info()
item.url = host + "/?s=" + texto item.url = host + "/search/" + texto
item.args = 'search' item.args = 'search'
try: try:
return peliculas(item) return peliculas(item)
+10
View File
@@ -0,0 +1,10 @@
{
"id": "filmstreaming",
"name": "Film Streaming",
"language": ["ita"],
"active": true,
"thumbnail": "filmstreaming.png",
"banner": "filmstreaming.png",
"categories": ["movie"],
"settings": []
}
+94
View File
@@ -0,0 +1,94 @@
# -*- 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)
+1 -1
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": false, "active": true,
"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"],
+4 -3
View File
@@ -35,18 +35,19 @@ def list(item):
@support.scrape @support.scrape
def peliculas(item): def peliculas(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>[^"]+).*?src="(?P<thumb>[^"]+).*?hdn">(?P<year>[0-9]{4})'
patronNext = 'pagenavi.*?<span>.</span>.*?<a href="([^"]+)' patronNext = 'pagenavi.*?<a href="([^"]+)">\d+'
action = 'episodios' action = 'episodios'
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodios(item):
patronBlock = r'<div class="tab-pane fade" id="season-(?P<season>.)"(?P<block>.*?)</div>' patronBlock = r'<div class="tab-pane fade" id="season-(?P<season>.)"(?P<block>.*?)</ul>\s*</div>'
patron = r'<a href="#" allowfullscreen data-link="(?P<url>[^"]+).*?title="(?P<title>[^"]+)(?P<lang>[sS][uU][bB]-?[iI][tT][aA])?\s*">(?P<episode>[^<]+)' 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 # debugBlock = True
return locals() return locals()
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"id": "guardaserieclick", "id": "guardaserieclick",
"name": "GuardaSerie.click", "name": "GuardaSerie.click",
"active": true, "active": false,
"language": ["ita", "vos"], "language": ["ita", "vos"],
"thumbnail": "guardaserieclick.png", "thumbnail": "guardaserieclick.png",
"bannermenu": "guardaserieclick.png", "bannermenu": "guardaserieclick.png",
+1 -1
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": true, "active": false,
"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"],
+10 -4
View File
@@ -18,27 +18,32 @@ 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 peliculas(item):
patronBlock = r'movies-list movies-list-full(?P<block>.*?)footer>' # debug = True
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*)' # patronBlock = r'movies-list movies-list-full(?P<block>.*?)footer>'
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 = 'episodios'
return locals() return locals()
@support.scrape @support.scrape
def episodios(item): def episodios(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) info(text)
item.contentType = 'tvshow' item.contentType = 'tvshow'
@@ -53,6 +58,7 @@ def search(item, text):
return [] return []
def findvideos(item): def findvideos(item):
support.info('findvideos', item) support.info('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
+1 -1
View File
@@ -25,7 +25,7 @@ def peliculas(item):
pagination = '' pagination = ''
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()
+8 -1
View File
@@ -46,12 +46,19 @@ def mainlist(item):
@support.scrape @support.scrape
def peliculas(item): def peliculas(item):
# debug = True # debug = True
action = 'findvideos'
sceneTitle = item.args[2] sceneTitle = item.args[2]
if item.args[1] in ['tvshow', 'anime', 'music', 'other']: if item.args[1] in ['tvshow', 'anime', 'music', 'other']:
patron = r'>[^"<]+' patron = r'>[^"<]+'
else: else:
patron = r'>(?P<quality>[^"<]+)' patron = r'>(?P<quality>[^"<]+)'
patron += '</td> <TD[^>]+><A class="tab" HREF="(?P<url>[^"]+)"\s*>(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<size>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<seed>[^<]+)' patron += '<TD[^>]+><A class="tab" HREF="(?P<url>[^"]+)"\s*>[^<]+<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<size>[^<]+)<[^>]+>[^>]+>[^>]+><form action="[^"]+/\d+/(?P<title>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<seed>[^<]+)'
def itemHook(item):
if not sceneTitle:
item.title = item.title.replace('_', ' ')
item.title = support.scrapertools.decodeHtmlentities(support.urlparse.unquote(item.title))
return item
if 'search' not in item.args: if 'search' not in item.args:
item.url += str(item.args[0]) item.url += str(item.args[0])
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"id": "ilgeniodellostreaming", "id": "ilgeniodellostreaming",
"name": "IlGenioDelloStreaming", "name": "IlGenioDelloStreaming",
"active": true, "active": false,
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"thumbnail": "ilgeniodellostreaming.png", "thumbnail": "ilgeniodellostreaming.png",
"banner": "ilgeniodellostreaming.png", "banner": "ilgeniodellostreaming.png",
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"id": "ilgeniodellostreaming_cam", "id": "ilgeniodellostreaming_cam",
"name": "IlGenioDelloStreaming CAM", "name": "IlGenioDelloStreaming CAM",
"active": false, "active": true,
"language": ["ita"], "language": ["ita"],
"thumbnail": "ilgeniodellostreaming.png", "thumbnail": "ilgeniodellostreaming.png",
"banner": "ilgeniodellostreaming.png", "banner": "ilgeniodellostreaming.png",
+12 -9
View File
@@ -25,15 +25,19 @@ def mainlist(item):
@support.scrape @support.scrape
def peliculas(item): def peliculas(item):
if item.args == 'sala': if item.text:
patronBlock = r'insala(?P<block>.*?)<header>' data = support.httptools.downloadpage(host + '/?s=' + item.text, post={'story': item.text, 'do': 'search', 'subaction': 'search'}).data
patron = r'<img src="(?P<thumb>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<rating>[^<]+)[^>]+>[^>]+>(?P<quality>[^<]+)[^>]+>[^>]+>[^>]+>[^>]+><a href="(?P<url>[^"]+)">(?P<title>[^<]+)[^>]+>[^>]+>[^>]+>(?P<year>\d{4})' patron = '<img src="(?P<thumb>[^"]+)(?:[^>]+>){8}\s*<a href="(?P<url>[^"]+)[^>]+>(?P<title>[^<]+)(?:[^>]+>){4}IMDb\s(?P<rating>[^<]+)(?:[^>]+>){2}(?P<year>\d+)'
elif item.args == 'az':
patron = r'<img src="(?P<thumb>[^"]+)[^>]+>[^>]+>[^>]+>[^>]+><a href="(?P<url>[^"]+)[^>]+>(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>.*?<span class="labelimdb">(?P<rating>[^>]+)<'
else: 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>[^<]+)<[^>]+>' if item.args == 'sala':
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()
@@ -55,8 +59,7 @@ def genres(item):
def search(item, text): def search(item, text):
info(text) info(text)
text = text.replace(' ', '+') item.text = text
item.url = host + "/search/" + text
try: try:
return peliculas(item) return peliculas(item)
except: except:
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"id": "italiaserie", "id": "italiaserie",
"name": "Italia Serie", "name": "Italia Serie",
"active": true, "active": false,
"language": ["ita","sub-ita"], "language": ["ita","sub-ita"],
"thumbnail": "italiaserie.png", "thumbnail": "italiaserie.png",
"bannermenu": "italiaserie.png", "bannermenu": "italiaserie.png",
+15 -12
View File
@@ -34,8 +34,8 @@ def mainlist(item):
def live(item): def live(item):
itemlist = [item.clone(title=support.typo('La7', 'bold'), fulltitle='La7', url= host + '/dirette-tv', action='play', forcethumb = True, no_return=True), itemlist = [item.clone(title=support.typo('La7', 'bold'), fulltitle='La7', url= host + '/dirette-tv', action='findvideos', forcethumb = True, no_return=True),
item.clone(title=support.typo('La7d', 'bold'), fulltitle='La7d', url= host + '/live-la7d', action='play', forcethumb = True, no_return=True)] item.clone(title=support.typo('La7d', 'bold'), fulltitle='La7d', url= host + '/live-la7d', action='findvideos', forcethumb = True, no_return=True)]
return support.thumb(itemlist, live=True) return support.thumb(itemlist, live=True)
@@ -57,7 +57,7 @@ def replay_menu(item):
@support.scrape @support.scrape
def replay(item): def replay(item):
action = 'play' 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 = support.typo(item.hour + ' - ' + item.name,'bold')
@@ -99,7 +99,7 @@ def peliculas(item):
def episodios(item): def episodios(item):
data = support.match(item).data data = support.match(item).data
# debug = True # debug = True
action = 'play' action = 'findvideos'
if '>puntate<' in data: if '>puntate<' in data:
patronBlock = r'>puntate<(?P<block>.*?)home-block-outbrain' patronBlock = r'>puntate<(?P<block>.*?)home-block-outbrain'
url = support.match(data, patron=r'>puntate<[^>]+>[^>]+>[^>]+><a href="([^"]+)"').match url = support.match(data, patron=r'>puntate<[^>]+>[^>]+>[^>]+><a href="([^"]+)"').match
@@ -127,7 +127,7 @@ def episodios(item):
return locals() return locals()
def play(item): def findvideos(item):
support.info() support.info()
if item.livefilter: if item.livefilter:
for it in live(item): for it in live(item):
@@ -135,13 +135,10 @@ def play(item):
item = it item = it
break break
data = support.match(item).data data = support.match(item).data
match = support.match(data, patron='/content/entry/data/(.*?).mp4').match
if match: url = support.match(data, patron=r'''["]?dash["]?\s*:\s*["']([^"']+)["']''').match
url = 'https://awsvodpkg.iltrovatore.it/local/hls/,/content/entry/data/' + support.match(item, patron='/content/entry/data/(.*?).mp4').match + '.mp4.urlset/master.m3u8' if url:
item = item.clone(title='Direct', url=url, server='directo', action='play')
else:
preurl = support.match(data, patron=r'preTokenUrl = "(.+?)"').match preurl = support.match(data, patron=r'preTokenUrl = "(.+?)"').match
url = support.match(data, patron=r'''["]?dash["]?\s*:\s*["']([^"']+)["']''').match
tokenHeader = { tokenHeader = {
'host': headers['host_token'], 'host': headers['host_token'],
'user-agent': headers['user-agent'], 'user-agent': headers['user-agent'],
@@ -168,4 +165,10 @@ def play(item):
lic_url='%s|%s|R{SSM}|'%(license_url, preLic) lic_url='%s|%s|R{SSM}|'%(license_url, preLic)
item.drm = DRM item.drm = DRM
item.license = lic_url item.license = lic_url
return support.servertools.find_video_items(item, data=url) else:
match = support.match(data, patron='/content/entry/data/(.*?).mp4').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'
item = item.clone(title='Direct', server='directo', url=url, action='play')
return support.server(item, itemlist=[item], Download=False, Videolibrary=False)
+3 -3
View File
@@ -1,10 +1,10 @@
{ {
"id": "mediasetplay", "id": "mediasetplay",
"name": "Mediaset Play", "name": "Mediaset play infinity [free]",
"active": true, "active": true,
"language": ["ita"], "language": ["ita"],
"thumbnail": "mediasetplay.png", "thumbnail": "mediasetplayinfinity.png",
"banner": "mediasetplay.png", "banner": "mediasetplayinfinity.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"],
+42 -27
View File
@@ -2,12 +2,14 @@
# ------------------------------------------------------------ # ------------------------------------------------------------
# Canale per Mediaset Play # Canale per Mediaset Play
# ------------------------------------------------------------ # ------------------------------------------------------------
import functools
from platformcode import logger, config from platformcode import logger, config
import uuid, datetime, xbmc import uuid, datetime, xbmc
import requests, sys import requests, sys
from core import support from core import jsontools, support, httptools
if sys.version_info[0] >= 3: if sys.version_info[0] >= 3:
from urllib.parse import urlencode, quote from urllib.parse import urlencode, quote
else: else:
@@ -23,6 +25,7 @@ loginData = {"client_id": clientid, "platform": "pc", "appName": "web//mediasetp
sessionUrl = "https://api.one.accedo.tv/session?appKey=59ad346f1de1c4000dfd09c5&uuid={uuid}&gid=default" sessionUrl = "https://api.one.accedo.tv/session?appKey=59ad346f1de1c4000dfd09c5&uuid={uuid}&gid=default"
session = requests.Session() session = requests.Session()
session.request = functools.partial(session.request, timeout=httptools.HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT)
session.headers.update({'Content-Type': 'application/json', 'User-Agent': support.httptools.get_user_agent(), 'Referer': host}) session.headers.update({'Content-Type': 'application/json', 'User-Agent': support.httptools.get_user_agent(), 'Referer': host})
entry = 'https://api.one.accedo.tv/content/entry/{id}?locale=it' entry = 'https://api.one.accedo.tv/content/entry/{id}?locale=it'
@@ -75,19 +78,26 @@ def live(item):
stations = res['stations'] stations = res['stations']
for it in stations.values(): for it in stations.values():
logger.debug(jsontools.dump(it))
plot = '' plot = ''
title = it['title'] title = it['title']
url = 'https:' + it['mediasetstation$pageUrl'] url = 'https:' + it['mediasetstation$pageUrl']
if 'plus' in title.lower() or 'premium' in title.lower(): continue if 'SVOD' in it['mediasetstation$channelsRights']: continue
thumb = it.get('thumbnails',{}).get('channel_logo-100x100',{}).get('url','')
if it['callSign'] in allguide: if it['callSign'] in allguide:
guide = allguide[it['callSign']] guide = allguide[it['callSign']]
plot = '[B]{}[/B]\n{}\n\nA Seguire:\n[B]{}[/B]\n{}'.format(guide['currentListing']['mediasetlisting$epgTitle'], plot = '[B]{}[/B]\n{}'.format(guide.get('currentListing', {}).get('mediasetlisting$epgTitle', ''),guide.get('currentListing', {}).get('description', ''))
guide['currentListing']['description'], if 'nextListing' in guide.keys():
guide['nextListing']['mediasetlisting$epgTitle'], plot += '\n\nA Seguire:\n[B]{}[/B]\n{}'.format(guide.get('nextListing', {}).get('mediasetlisting$epgTitle', ''),guide.get('nextListing', {}).get('description', ''))
guide['nextListing']['description'],) itemlist.append(item.clone(title=support.typo(title, 'bold'),
fulltitle=title, callSign=it['callSign'],
itemlist.append(item.clone(title=support.typo(title, 'bold'), fulltitle=title, callSign=it['callSign'], urls=guide['tuningInstruction']['urn:theplatform:tv:location:any'], plot=plot, url=url, action='play', forcethumb=True)) # urls=[guide['publicUrl']],
plot=plot,
url=url,
action='findvideos',
thumbnail=thumb,
forcethumb=True))
itemlist.sort(key=lambda it: support.channels_order.get(it.fulltitle, 999)) itemlist.sort(key=lambda it: support.channels_order.get(it.fulltitle, 999))
support.thumb(itemlist, live=True) support.thumb(itemlist, live=True)
@@ -131,7 +141,7 @@ def peliculas(item):
else: else:
contentType = 'movie' contentType = 'movie'
video_id = it['guid'] video_id = it['guid']
action = 'play' action = 'findvideos'
for k, v in it['thumbnails'].items(): for k, v in it['thumbnails'].items():
if 'image_vertical' in k and not thumb: if 'image_vertical' in k and not thumb:
thumb = v['url'].replace('.jpg', '@3.jpg') thumb = v['url'].replace('.jpg', '@3.jpg')
@@ -195,15 +205,18 @@ def episodios(item):
except: # per i test, xbmc.getLocalizedString non è supportato except: # per i test, xbmc.getLocalizedString non è supportato
for month in range(21, 33): months.append('dummy') for month in range(21, 33): months.append('dummy')
# i programmi tv vanno ordinati per data decrescente, gli episodi delle serie per data crescente
order = 'desc' if '/programmi-tv/' in item.url else 'asc'
itemlist = [] itemlist = []
res = requests.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-programs-v2?byCustomValue={subBrandId}{' + item.subbrand +'}&sort=:publishInfo_lastPublished|asc,tvSeasonEpisodeNumber').json()['entries'] res = requests.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-programs-v2?byCustomValue={subBrandId}{' + item.subbrand +'}&sort=:publishInfo_lastPublished|' + order + ',tvSeasonEpisodeNumber').json()['entries']
for it in res: for it in res:
thumb = '' thumb = ''
titleDate = '' titleDate = ''
if 'mediasetprogram$publishInfo_lastPublished' in it: if 'mediasetprogram$publishInfo_lastPublished' in it:
date = datetime.date.fromtimestamp(it['mediasetprogram$publishInfo_lastPublished'] / 1000) date = datetime.date.fromtimestamp(it['mediasetprogram$publishInfo_lastPublished'] / 1000)
titleDate =' [{} {}]'.format(date.day, months[date.month]) titleDate =' [{} {}]'.format(date.day, months[date.month-1])
title = '[B]{}[/B]{}'.format(it['title'], titleDate) title = '[B]{}[/B]{}'.format(it['title'], titleDate)
for k, v in it['thumbnails'].items(): for k, v in it['thumbnails'].items():
if 'image_keyframe' in k and not thumb: if 'image_keyframe' in k and not thumb:
@@ -215,29 +228,32 @@ def episodios(item):
thumbnail=thumb, thumbnail=thumb,
forcethumb=True, forcethumb=True,
contentType='episode', contentType='episode',
action='play', action='findvideos',
video_id=it['guid'])) video_id=it['guid']))
return itemlist return itemlist
def play(item): def findvideos(item):
logger.debug() logger.debug()
item.no_return=True item.no_return=True
# support.dbg()
mpd = config.get_setting('mpd', item.channel) mpd = config.get_setting('mpd', item.channel)
lic_url = 'https://widevine.entitlement.theplatform.eu/wv/web/ModularDrm/getRawWidevineLicense?releasePid={pid}&account=http://access.auth.theplatform.com/data/Account/2702976343&schema=1.0&token={token}|Accept=*/*&Content-Type=&User-Agent={ua}|R{{SSM}}|' lic_url = 'https://widevine.entitlement.theplatform.eu/wv/web/ModularDrm/getRawWidevineLicense?releasePid={pid}&account=http://access.auth.theplatform.com/data/Account/2702976343&schema=1.0&token={token}|Accept=*/*&Content-Type=&User-Agent={ua}|R{{SSM}}|'
url = '' url = ''
# support.dbg()
if item.urls: if item.urls:
url = '' url = ''
pid = '' pid = ''
Format = 'dash+xml' if mpd else 'x-mpegURL' # Format = 'dash+xml' if mpd else 'x-mpegURL'
for it in item.urls: # for it in item.urls:
if Format in it['format']: # if Format in it['format']:
item.url = requests.head(it['publicUrls'][0]).headers['Location'] item.url = requests.head(item.urls[0], headers={'User-Agent': support.httptools.get_user_agent()}).headers['Location']
pid = it['releasePids'][0] # pid = it['releasePids'][0]
# if mpd and 'widevine' in it['assetTypes']:
# break
if mpd: if mpd:
item.manifest = 'mpd' item.manifest = 'mpd'
@@ -246,15 +262,15 @@ def play(item):
else: else:
item.manifest = 'hls' item.manifest = 'hls'
return[item] return support.server(item, itemlist=[item], Download=False, Videolibrary=False)
elif item.video_id: elif item.video_id:
payload = '{"contentId":"' + item.video_id + ' ","streamType":"VOD","delivery":"Streaming","createDevice":true}' payload = {"contentId":item.video_id, "streamType":"VOD", "delivery":"Streaming", "createDevice":"true", "overrideAppName":"web//mediasetplay-web/5.2.4-6ad16a4"}
res = session.post('https://api-ott-prod-fe.mediaset.net/PROD/play/playback/check/v2.0?sid=' + sid, data=payload).json()['response']['mediaSelector'] res = session.post('https://api-ott-prod-fe.mediaset.net/PROD/play/playback/check/v2.0?sid=' + sid, json=payload).json()['response']['mediaSelector']
else: else:
payload = '{"channelCode":"' + item.callSign + '","streamType":"LIVE","delivery":"Streaming","createDevice":true}' payload = {"channelCode":item.callSign, "streamType":"LIVE", "delivery":"Streaming", "createDevice":"true", "overrideAppName":"web//mediasetplay-web/5.2.4-6ad16a4"}
res = session.post('https://api-ott-prod-fe.mediaset.net/PROD/play/playback/check/v2.0?sid=' + sid, data=payload).json()['response']['mediaSelector'] res = session.post('https://api-ott-prod-fe.mediaset.net/PROD/play/playback/check/v2.0?sid=' + sid, json=payload).json()['response']['mediaSelector']
url = res['url'] url = res['url']
mpd = True if 'dash' in res['formats'].lower() else False mpd = True if 'dash' in res['formats'].lower() else False
@@ -262,7 +278,7 @@ def play(item):
if url: if url:
sec_data = support.match(url + '?' + urlencode(res)).data sec_data = support.match(url + '?' + urlencode(res)).data
item.url = support.match(sec_data, patron=r'<video src="([^"]+)').match item.url = support.match(sec_data, patron=r'<video src="([^"]+)').match + '|User-Agent=' + support.httptools.get_user_agent()
pid = support.match(sec_data, patron=r'pid=([^|]+)').match pid = support.match(sec_data, patron=r'pid=([^|]+)').match
if mpd and pid: if mpd and pid:
@@ -272,11 +288,10 @@ def play(item):
else: else:
item.manifest = 'hls' item.manifest = 'hls'
return [item] return support.server(item, itemlist=[item], Download=False, Videolibrary=False)
def get_from_id(item): def get_from_id(item):
logger.debug()
sessionKey = session.get(sessionUrl.format(uuid=str(uuid.uuid4())), verify=False).json()['sessionKey'] sessionKey = session.get(sessionUrl.format(uuid=str(uuid.uuid4())), verify=False).json()['sessionKey']
session.headers.update({'x-session': sessionKey}) session.headers.update({'x-session': sessionKey})
res = session.get(entry.format(id=item.args)).json() res = session.get(entry.format(id=item.args)).json()
+4
View File
@@ -41,6 +41,10 @@ def peliculas(item):
patron= r'<img src="[^"]+" alt="(?P<title>[^"]+)" data-echo="(?P<thumb>[^"]+)"(?:[^>]+>){7}<a href="(?P<url>[^"]+)"' patron= r'<img src="[^"]+" alt="(?P<title>[^"]+)" data-echo="(?P<thumb>[^"]+)"(?:[^>]+>){7}<a href="(?P<url>[^"]+)"'
patronNext = r'<a href="([^"]+)">(?:&raquo|»)' patronNext = r'<a href="([^"]+)">(?:&raquo|»)'
typeContentDict = {'': 'music'} typeContentDict = {'': 'music'}
def itemHook(item):
item.contentType = 'music'
item.thumbnail = item.thumbnail.replace('https:','http:')
return item
return locals() return locals()
-11
View File
@@ -1,11 +0,0 @@
{
"id": "netfreex",
"name": "Netfreex",
"language": ["ita"],
"active": false,
"thumbnail": "netfreex.png",
"banner": "netfreex.png",
"categories": ["tvshow", "movie", "anime"],
"not_active": ["include_in_newest_peliculas", "include_in_newest_anime", "include_in_newest_series"],
"settings": []
}
-71
View File
@@ -1,71 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per netfreex
# ------------------------------------------------------------
from core import support
from core.item import Item
from platformcode import logger, config
# def findhost(url):
# return 'https://' + support.match('https://netfreex.uno/', patron='value="site:([^"]+)"').match
host = config.get_channel_url()
headers = ""
IDIOMAS = {'Italiano': 'IT'}
list_language = IDIOMAS.values()
@support.menu
def mainlist(item):
film = ['/film',
('Generi', ['', 'menu', 'genres'])
]
tvshow = ['/serietv']
anime = ['/genere/anime']
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 peliculas(item):
if 'anime' in item.url:
return support.dooplay_peliculas(item, True)
else:
return support.dooplay_peliculas(item, False)
def episodios(item):
return support.dooplay_get_episodes(item)
def findvideos(item):
from core import jsontools
itemlist = []
matches = support.match(item, patron=r'<li id="player-option-[0-9]".*?data-type="([^"]+)" data-post="([^"]+)" data-nume="([^"]+)".*?<span class="title".*?>([^<>]+)</span>(?:<span class="server">([^<>]+))?').matches
for Type, Post, Nume, Quality, Server in matches:
dataAdmin = support.match(host + '/wp-json/dooplayer/v1/post/%s?type=%s&source=%s' %(Post, Type, Nume)).data
js = jsontools.load(dataAdmin)
link = js['embed_url'] if 'embed_url' in js else ''
itemlist.append( item.clone(server=Server, quality=Quality, url=link, action='play'))
return support.server(item, itemlist=itemlist)
@support.scrape
def menu(item):
action = 'peliculas'
data = support.match(item, patron=r'<a href="#">Genere<(.*?)</ul').match
patronMenu= r'<a href="(?P<url>[^"]+)"[^>]*>(?P<title>[^<]+)<'
return locals()
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"id": "paramount", "id": "paramount",
"name": "Paramount Network", "name": "Paramount Network",
"active": true, "active": false,
"language": ["ita"], "language": ["ita"],
"thumbnail": "paramount.png", "thumbnail": "paramount.png",
"banner": "paramount.png", "banner": "paramount.png",
+19 -14
View File
@@ -7,6 +7,8 @@ from core import support, jsontools
from platformcode import autorenumber, logger from platformcode import autorenumber, logger
from collections import OrderedDict from collections import OrderedDict
from specials import videolibrary
host = support.config.get_channel_url() host = support.config.get_channel_url()
headers = [['Referer', host]] headers = [['Referer', host]]
@@ -64,7 +66,7 @@ def live(item):
logger.debug() logger.debug()
itemlist=[] itemlist=[]
for key, value in liveDict().items(): for key, value in liveDict().items():
itemlist.append(item.clone(title=support.typo(key,'bold'), contentTitle=key, fulltitle=key, show=key, url=value['url'], plot=value['plot'], action='play', forcethumb=True, no_return=True)) itemlist.append(item.clone(title=support.typo(key,'bold'), contentTitle=key, fulltitle=key, show=key, url=value['url'], plot=value['plot'], action='findvideos', forcethumb=True, no_return=True))
return support.thumb(itemlist, live=True) return support.thumb(itemlist, live=True)
@@ -107,6 +109,7 @@ def peliculas(item):
def episodios(item): def episodios(item):
logger.debug() logger.debug()
reEp = r'"isEpisodes":[^,]+,"items":(.*?])'
def load_more(url): def load_more(url):
second_url = host if url.startswith('/') else '' + url.replace('\u002F','/').replace('%5C','/') second_url = host if url.startswith('/') else '' + url.replace('\u002F','/').replace('%5C','/')
new_data = support.match(host + second_url).data new_data = support.match(host + second_url).data
@@ -114,11 +117,10 @@ def episodios(item):
return jsontools.load(match) return jsontools.load(match)
itemlist = [] itemlist = []
data = []
page_data = support.match(item.url).data page_data = support.match(item.url).data
seasons = support.match(page_data, patron=r'href="([^"]+)"[^>]+>Stagione\s*\d+').matches seasons = support.match(page_data, patron=r'href="([^"]+)"[^>]+>Stagione\s*\d+').matches
more = support.match(page_data, patron=r'loadingTitle":[^,]+,"url":"([^"]+)"').match more = support.match(page_data, patron=r'loadingTitle":[^,]+,"url":"([^"]+)"').match
data = jsontools.load(support.scrapertools.decodeHtmlentities(support.match(page_data, patron=r'"isEpisodes":[^,]+,"items":(.*?),"isKidsUI"').match)) data = jsontools.load(support.scrapertools.decodeHtmlentities(support.match(page_data, patron=reEp).match))
if data: if data:
if more: if more:
@@ -126,7 +128,7 @@ def episodios(item):
if seasons: if seasons:
for url in seasons: for url in seasons:
new_data = support.match(host + url).data new_data = support.match(host + url).data
data += jsontools.load(support.scrapertools.decodeHtmlentities(support.match(new_data, patron=r'isEpisodes":[^,]+,"items":(.*?),"isKidsUI"').match.replace('\x01','l').replace('\x02','a'))) data += jsontools.load(support.scrapertools.decodeHtmlentities(support.match(new_data, patron=reEp).match.replace('\x01','l').replace('\x02','a')))
match = support.match(new_data, patron=r'loadingTitle":[^,]+,"url":"([^"]+)"').match match = support.match(new_data, patron=r'loadingTitle":[^,]+,"url":"([^"]+)"').match
if match and match != load_more: if match and match != load_more:
data += load_more(match) data += load_more(match)
@@ -153,26 +155,29 @@ def episodios(item):
action='findvideos')) action='findvideos'))
itemlist.sort(key=lambda item: (item.season, item.episode)) itemlist.sort(key=lambda item: (item.season, item.episode))
if inspect.stack()[1][3] not in ['find_episodes']: if inspect.stack(0)[1][3] not in ['find_episodes']:
autorenumber.start(itemlist, item) autorenumber.start(itemlist, item)
return support.videolibrary(itemlist, item) return support.videolibrary(itemlist, item)
def findvideos(item): def findvideos(item):
logger.debug() logger.debug()
return support.server(item, itemlist=[item.clone(title='Paramount', server='directo', action='play')], Download=False)
def play(item):
logger.debug() logger.debug()
item.manifest = 'hls' item.manifest = 'hls'
mgid = support.match(item.url, patron=r'uri":"([^"]+)"').match mgid = support.match(item.url, patron=r'uri":"([^"]+)"').match
url = 'https://media.mtvnservices.com/pmt/e1/access/index.html?uri=' + mgid + '&configtype=edge&ref=' + item.url url = 'https://media.mtvnservices.com/pmt/e1/access/index.html?uri=' + mgid + '&configtype=edge&ref=' + item.url
ID, rootUrl = support.match(url, patron=[r'"id":"([^"]+)",',r'brightcove_mediagenRootURL":"([^"]+)"']).matches ID, rootUrl = support.match(url, patron=[r'"id":"([^"]+)",',r'brightcove_mediagenRootURL":"([^"]+)"']).matches
item.url = jsontools.load(support.match(rootUrl.replace('&device={device}','').format(uri = ID)).data)['package']['video']['item'][0]['rendition'][0]['src'] item.url = jsontools.load(support.match(rootUrl.replace('&device={device}','').format(uri = ID)).data)['package']['video']['item'][0]['rendition'][0]['src']
return support.server(item, itemlist=[item.clone(title='Paramount', server='directo', action='play')], Download=False, Videolibrary=False)
if item.livefilter:
d = liveDict()[item.livefilter] # def play(item):
item = item.clone(title=support.typo(item.livefilter, 'bold'), fulltitle=item.livefilter, url=d['url'], plot=d['plot'], action='play', forcethumb=True, no_return=True) # logger.debug()
support.thumb(item, live=True) # item.manifest = 'hls'
return [item] # mgid = support.match(item.url, patron=r'uri":"([^"]+)"').match
# url = 'https://media.mtvnservices.com/pmt/e1/access/index.html?uri=' + mgid + '&configtype=edge&ref=' + item.url
# ID, rootUrl = support.match(url, patron=[r'"id":"([^"]+)",',r'brightcove_mediagenRootURL":"([^"]+)"']).matches
# item.url = jsontools.load(support.match(rootUrl.replace('&device={device}','').format(uri = ID)).data)['package']['video']['item'][0]['rendition'][0]['src']
# return [item]
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"id": "piratestreaming", "id": "piratestreaming",
"name": "Pirate Streaming", "name": "Pirate Streaming",
"active": true, "active": false,
"language": ["ita"], "language": ["ita"],
"thumbnail": "piratestreaming.png", "thumbnail": "piratestreaming.png",
"bannermenu": "piratestreaming.png", "bannermenu": "piratestreaming.png",
+12
View File
@@ -0,0 +1,12 @@
{
"id": "plutotv",
"name": "Pluto TV",
"active": true,
"language": ["ita"],
"thumbnail": "plutotv.png",
"banner": "plutotv.png",
"categories": ["movie", "tvshow", "documentary", "live"],
"not_active": ["include_in_newest"],
"default_off": ["include_in_global_search"],
"settings": []
}
+130
View File
@@ -0,0 +1,130 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per Pluto TV
# ------------------------------------------------------------
import uuid, datetime
from platformcode import logger, config
from core.item import Item
from core import support, httptools
host = support.config.get_channel_url()
api = 'https://api.pluto.tv'
UUID = 'sid={}&deviceId={}'.format(uuid.uuid1().hex, uuid.uuid4().hex)
vod_url = '{}/v3/vod/categories?includeItems=true&deviceType=web&'.format(api, UUID)
@support.menu
def mainlist(item):
top = [('Dirette {bold}', ['/it/live-tv/', 'live'])]
menu = sorted([(it['name'], ['/it/on-demand', 'peliculas', it['items']]) for it in httptools.downloadpage(vod_url).json['categories'][1:]])
search = ''
return locals()
def live(item):
logger.debug()
now = datetime.datetime.now()
start = (now.strftime('%Y-%m-%dT%H:00:00Z'))
stop = (now + datetime.timedelta(hours=4)).strftime('%Y-%m-%dT%H:00:00Z')
live_url = '{}/v2/channels.json?{}'.format(api, UUID)
guide_url = '{}/v2/channels?start={}&stop={}&{}'.format(api, start, stop, UUID)
guide = {g['number']:[g['timelines'][0]['title'], g['timelines'][1]['title']] for g in httptools.downloadpage(guide_url).json}
itemlist = []
for it in httptools.downloadpage(live_url).json:
itemlist.append(item.clone(title= '[B]{}[/B] | {}'.format(it['name'], guide[it['number']][0]),
number=it['number'],
contentTitle=it['name'],
action='findvideos',
thumbnail=it['solidLogoPNG']['path'],
fanart=it['featuredImage']['path'],
plot='{}\n\n[B]A seguire:[/B]\n{}'.format(it['summary'], guide[it['number']][1]),
videourl= it['stitched']['urls'][0]['url'].split('?')[0],
forcethumb=True))
itemlist.sort(key=lambda it: it.number)
return itemlist
def search(item, text):
logger.debug('Search', text)
try:
item.search = text.lower()
item.args = []
for it in httptools.downloadpage(vod_url).json['categories'][1:]:
item.args.extend(it['items'])
return peliculas(item)
except:
import sys
for line in sys.exc_info():
support.logger.error("%s" % line)
return []
def peliculas(item):
logger.debug()
itemlist = []
recordlist = []
for i, it in enumerate(item.args):
if item.search in it['name'].lower():
itm = Item(channel=item.channel,
url=item.url,
title=it['name'],
contentTitle=it['name'],
contentSerieName= it['name'] if it['type'] == 'series' else '',
plot=it['description'],
contentType='tvshow' if it['type'] == 'series' else 'movie',
action='episodios' if it['type'] == 'series' else 'findvideos',
thumbnail= it['covers'][0]['url'],
fanart= it['covers'][2]['url'] if len(it['covers']) > 2 else '',
id= it['_id'],
videourl= it['stitched']['urls'][0]['url'].split('?')[0])
if i < 20 or item.search:
itemlist.append(itm)
else:
recordlist.append(it)
support.tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
if recordlist and not item.search:
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), thumbnail=support.thumb(), args=recordlist))
return itemlist
def episodios(item):
logger.debug()
itemlist = []
seasons = httptools.downloadpage('{}/v3/vod/series/{}/seasons?includeItems=true&deviceType=web&{}'.format(api, item.id, UUID)).json['seasons']
for season in seasons:
for episode in season['episodes']:
itemlist.append(item.clone(title='{}x{:02d} - {}'.format(episode['season'], episode['number'], episode['name']),
contrentTitle=episode['name'],
contentSeason=episode['season'],
contentEpisodeNumber=episode['number'],
plot=episode['description'],
thumbnail=episode['covers'][1]['url'],
videourl=episode['stitched']['urls'][0]['url'].split('?')[0],
action='findvideos'))
if config.get_setting('episode_info'):
support.tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
support.videolibrary(itemlist,item)
return itemlist
def findvideos(item):
item.server = 'directo'
item.manifest='hls'
params = '{}?deviceDNT=0&deviceVersion=unknow&appVersion=unknow&deviceType=web&deviceMake=firefox&deviceModel=firefox&appName=web&{}'
item.url = params.format(item.videourl, UUID)
return support.server(item, itemlist=[item], Download=False, Videolibrary=False)
-12
View File
@@ -1,12 +0,0 @@
{
"id": "polpotv",
"name": "PolpoTV",
"language": ["ita"],
"active": false,
"thumbnail": "polpotv.png",
"banner": "polpotv.png",
"categories": ["movie","tvshow"],
"not_active":[],
"default_off":["include_in_newest"],
"settings": []
}
-227
View File
@@ -1,227 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# KoD - XBMC Plugin
# Canale polpotv
# ------------------------------------------------------------
from core import support, jsontools
from core.item import Item
from platformcode import config
import datetime
host = config.get_channel_url()
headers = [['Accept', 'application/ld+json']]
@support.menu
def mainlist(item):
# menu = [
# ('Ultimi Film aggiunti', ['/api/movies', 'peliculas', '']),
# ('Ultime Serie TV aggiunte', ['/api/shows', 'peliculas', '']),
# ('Generi', ['/api/genres', 'search_movie_by_genre', '']),
# ('Anni {film}', ['', 'search_movie_by_year', '']),
# ('Cerca... bold', ['', 'search', ''])
# ]
film = ['/api/movies',
('Generi', ['/api/genres', 'search_movie_by_genre', '']),
('Anni', ['', 'search_movie_by_year', '']),]
tvshow=['/api/shows']
search=''
return locals()
def newest(categoria):
support.info()
item = Item()
if categoria == 'peliculas':
item.contentType = 'movie'
item.url = host + '/api/movies'
elif categoria == 'series':
item.contentType = 'tvshow'
item.url = host+'/api/shows'
return peliculas(item)
def peliculas(item):
support.info()
itemlist = []
data = support.match(item.url, headers=headers).data
json_object = jsontools.load(data)
for element in json_object['hydra:member']:
if 'shows' not in item.url:
item.contentType='movie'
else:
item.contentType='tvshow'
itemlist.append(get_itemlist_element(element, item))
support.tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
try:
if support.inspect.stack()[1][3] not in ['newest']:
support.nextPage(itemlist, item, next_page=json_object['hydra:view']['hydra:next'])
except:
pass
return itemlist
def episodios(item):
support.info()
itemlist = []
data = support.match(item.url, headers=headers).data
json_object = jsontools.load(data)
for season in json_object['seasons']:
seas_url=host+season['@id']+'/releases'
itemlist_season=get_season(item, seas_url, season['seasonNumber'])
if(len(itemlist_season)>0):
itemlist.extend(itemlist_season)
support.videolibrary(itemlist, item, 'color kod bold')
support.download(itemlist, item)
return itemlist
def get_season(item, seas_url, seasonNumber):
support.info()
itemlist = []
data = support.match(seas_url, headers=headers).data
json_object = jsontools.load(data)
for episode in json_object['hydra:member']:
itemlist.append(
item.clone(action='findvideos',
contentType='episode',
title=support.typo(str(seasonNumber)+"x"+str("%02d"%episode['episodeNumber']), 'bold'),
url=seas_url,
extra=str(len(json_object['hydra:member'])-episode['episodeNumber'])))
return itemlist[::-1]
def search(item, texto):
support.info(item.url, "search", texto)
itemlist=[]
try:
item.url = host + "/api/movies?originalTitle="+texto+"&translations.name=" +texto
data = support.match(item.url, headers=headers).data
json_object = jsontools.load(data)
for movie in json_object['hydra:member']:
item.contentType='movie'
itemlist.append(get_itemlist_element(movie,item))
item.url = host + "/api/shows?originalTitle="+texto+"&translations.name=" +texto
data = support.match(item.url, headers=headers).data
json_object = jsontools.load(data)
for tvshow in json_object['hydra:member']:
item.contentType='tvshow'
itemlist.append(get_itemlist_element(tvshow,item))
support.tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
return itemlist
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
support.logger.error("%s" % line)
return []
def search_movie_by_genre(item):
support.info()
itemlist = []
data = support.match(item.url, headers=headers).data
json_object = jsontools.load(data)
for genre in json_object['hydra:member']:
itemlist.append(
item.clone(action="peliculas",
title=support.typo(genre['name'],'bold'),
contentType='movie',
url="%s/api/movies?genres.id=%s" %(host,genre['id'])))
return support.thumb(itemlist, True)
def search_movie_by_year(item):
support.info()
now = datetime.datetime.now()
year = int(now.year)
itemlist = []
for i in range(100):
year_to_search = year - i
itemlist.append(
item.clone(channel=item.channel,url="%s/api/movies?releaseDate=%s" %(host,year_to_search),
plot="1",
type="movie",
title=support.typo(year_to_search,'bold'),
action="peliculas"))
return itemlist
def findvideos(item):
support.info()
itemlist = []
try:
data = support.match(item.url, headers=headers).data
json_object = jsontools.load(data)
array_index=0
if item.contentType!='movie':
array_index=int(item.extra)
for video in json_object['hydra:member'][array_index]['playlist']['videos']:
itemlist.append(
item.clone(action="play",
title='Direct',
url=video['src'],
server='directo',
quality=str(video['size'])+ 'p',
folder=False))
except:
pass
return support.server(item, itemlist=itemlist)
def get_itemlist_element(element,item):
support.info()
contentSerieName = ''
contentTitle =''
try:
if element['originalLanguage']['id']=='it':
scrapedtitle=element['originalTitle']
else:
scrapedtitle=element['translations'][1]['name']
if scrapedtitle=='':
scrapedtitle=element['originalTitle']
except:
scrapedtitle=element['originalTitle']
try:
scrapedplot=element['translations'][1]['overview']
except:
scrapedplot = ""
try:
scrapedthumbnail="https:"+element['bestPosters'].values()[0]
except:
scrapedthumbnail=""
# try:
# scrapedfanart="http:"+element['backdropPath']
# except:
# scrapedfanart=""
infoLabels = {}
if item.contentType=='movie':
contentTitle = scrapedtitle
next_action='findvideos'
quality=support.typo(element['lastQuality'].upper(), '_ [] color kod bold')
url="%s%s/releases"
infoLabels['tmdb_id']=element['tmdbId']
else:
contentSerieName = scrapedtitle
next_action='episodios'
quality=''
url="%s%s"
return item.clone(action=next_action,
title=support.typo(scrapedtitle, 'bold') + quality,
fulltitle=scrapedtitle,
show=scrapedtitle,
plot=scrapedplot,
# fanart=scrapedfanart,
thumbnail=scrapedthumbnail,
contentTitle=contentTitle,
contentSerieName=contentSerieName,
contentType=item.contentType,
url=url % (host, element['@id']),
infoLabels=infoLabels)
-10
View File
@@ -1,10 +0,0 @@
{
"id": "pufimovies",
"name": "PufiMovies",
"active": false,
"language": ["ita", "sub-ita"],
"thumbnail": "pufimovies.png",
"banner": "pufimovies.png",
"categories": ["movie","tvshow"],
"settings": []
}
-114
View File
@@ -1,114 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per PufiMovies
# ------------------------------------------------------------
from core import support
host = support.config.get_channel_url()
headers = [['Referer', host]]
@support.menu
def mainlist(item):
film = [
('Generi', ['', 'menu', 'Film']),
('Più Visti', ['','peliculas', 'most'])
]
tvshow = ['',
('Generi', ['', 'menu', 'Serie Tv']),
('Ultimi Episodi', ['','peliculas', 'last'])
]
search = ''
return locals()
@support.scrape
def menu(item):
action = 'peliculas'
patronBlock = item.args + r' Categorie</a>\s*<ul(?P<block>.*?)</ul>'
patronMenu = r'<a href="(?P<url>[^"]+)"[^>]+>(?P<title>[^>]+)<'
return locals()
def search(item, text):
support.info('search', item)
itemlist = []
text = text.replace(' ', '+')
item.url = host + '/search/keyword/' + text
try:
item.args = 'search'
itemlist = peliculas(item)
if itemlist[-1].action == 'peliculas':
itemlist.pop()
return itemlist
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
support.info('search log:', line)
return []
def newest(categoria):
support.info(categoria)
itemlist = []
item = support.Item()
item.url = host
item.action = 'peliculas'
try:
if categoria == 'peliculas':
item.contentType = 'movie'
itemlist = peliculas(item)
else:
item.args = 'last'
item.contentType = 'tvshow'
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():
support.logger.error("%s" % line)
return []
return itemlist
@support.scrape
def peliculas(item):
if item.contentType == 'tvshow' and not item.args:
action = 'episodios'
patron = r'<div class="movie-box">\s*<a href="(?P<url>[^"]+)">[^>]+>[^>]+>\D+Streaming\s(?P<lang>[^"]+)[^>]+>[^>]+>[^>]+>(?P<quality>[^<]+)[^>]+>[^>]+>[^>]+>\s*<img src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>(?P<rating>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+)[^>]+>[^>]+>[^>]+>\s*(?P<year>\d+)'
elif item.contentType == 'movie' and not item.args:
patron = r'<div class="existing_item col-6 col-lg-3 col-sm-4 col-xl-4">\s*<div class="movie-box">\s*<a href="(?P<url>(?:http(?:s)://[^/]+)?/(?P<type>[^/]+)/[^"]+)">[^>]+>[^>]+>\D+Streaming\s*(?P<lang>[^"]+)">[^>]+>[^>]+>(?P<quality>[^<]+)<[^>]+>[^>]+>[^>]+>\s*<img src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>(?P<rating>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+)[^>]+>[^>]+>[^>]+>\s*(?:(?P<year>\d+))?[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]*)<'
elif item.args == 'last':
patron = r'<div class="episode-box">[^>]+>[^>]+>[^>]+>\D+Streaming\s(?P<lang>[^"]+)">[^>]+>[^>]+>(?P<quality>[^<]+)<[^>]+>[^>]+>[^>]+>[^^>]+>[^>]+>\s*<img src="(?P<thumb>[^"]+)"[^[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>[^>]+>(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>\D*(?P<season>\d+)[^>]+>\D*(?P<episode>\d+)'
elif item.args == 'most':
patron =r'div class="sm-113 item">\s*<a href="(?P<url>[^"]+)">[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s<img src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<title>[^<]+)'
else:
patron = r'<div class="movie-box">\s*<a href="(?P<url>(?:http(?:s)://[^/]+)?/(?P<type>[^/]+)/[^"]+)">[^>]+>[^>]+>\D+Streaming\s*(?P<lang>[^"]+)">[^>]+>[^>]+>(?P<quality>[^<]+)<[^>]+>[^>]+>[^>]+>\s*<img src="(?P<thumb>[^"]+)"[^>]+>[^>]+>[^>]+>[^>]+>(?P<rating>[^<]+)<[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+)[^>]+>[^>]+>[^>]+>\s*(?:(?P<year>\d+))?[^>]+>[^>]+>[^>]+>[^>]+>(?P<plot>[^<]*)<'
typeActionDict = {'findvideos':['movie'], 'episodios':['tvshow']}
typeContentDict = {'movie':['movie'], 'tvshow':['tvshow']}
patronNext = r'<a href="([^"]+)"[^>]+>&raquo;'
return locals()
@support.scrape
def episodios(item):
patron = r'<div class="episode-box">[^>]+>[^>]+>[^>]+>\D+Streaming\s(?P<lang>[^"]+)">[^>]+>[^>]+>(?P<quality>[^<]+)<[^>]+>[^>]+>[^>]+>\s*<img src="(?P<thumb>[^"]+)"[^[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*<a href="(?P<url>[^"]+)"[^>]+>[^>]+>(?P<title>[^<]+)<[^>]+>[^>]+>[^>]+>\D*(?P<season>\d+)[^>]+>\D*(?P<episode>\d+)'
return locals()
def findvideos(item):
support.info()
# match = support.match(item, patron='wstream', debug=True)
return support.server(item)
+38 -14
View File
@@ -7,7 +7,7 @@ from core.item import Item
import datetime, xbmc import datetime, xbmc
import requests, sys import requests, sys
from core import jsontools, support from core import jsontools, scrapertools, support
from platformcode import logger from platformcode import logger
if sys.version_info[0] >= 3: if sys.version_info[0] >= 3:
@@ -114,7 +114,7 @@ def episodios(item):
if not itemlist: if not itemlist:
itemlist = addinfo(items, item) itemlist = addinfo(items, item)
# itemlist.sort(key=lambda it: (it.season, it.episode))
return itemlist return itemlist
@@ -126,6 +126,7 @@ def epMenu(item):
itemlist.append(item.clone(title=support.typo(it['name'], 'bold'), data=[it])) itemlist.append(item.clone(title=support.typo(it['name'], 'bold'), data=[it]))
else: else:
itemlist.append(item.clone(title=support.typo(it['name'], 'bold'), season_url=getUrl(it['path_id']), data='')) itemlist.append(item.clone(title=support.typo(it['name'], 'bold'), season_url=getUrl(it['path_id']), data=''))
# itemlist.sort(key=lambda it: it.title)
return itemlist return itemlist
@@ -141,7 +142,7 @@ def live(item):
current = it['currentItem'] current = it['currentItem']
next = it['nextItem'] next = it['nextItem']
plot = '[B]{}[/B]\n{}\n\nA Seguire: [B]{}[/B]\n{}'.format(current['name'], current['description'], next['name'], next['description']) plot = '[B]{}[/B]\n{}\n\nA Seguire: [B]{}[/B]\n{}'.format(current['name'], current['description'], next['name'], next['description'])
itemlist.append(item.clone(title=title, fulltitle=title, fanart=fanart, plot=plot, url=url, video_url=url + '.json', action='play')) itemlist.append(item.clone(title=title, fulltitle=title, fanart=fanart, plot=plot, url=url, video_url=url + '.json', action='findvideos'))
itemlist.sort(key=lambda it: support.channels_order.get(it.fulltitle, 999)) itemlist.sort(key=lambda it: support.channels_order.get(it.fulltitle, 999))
support.thumb(itemlist, live=True) support.thumb(itemlist, live=True)
return itemlist return itemlist
@@ -195,6 +196,7 @@ def replayChannels(item):
support.thumb(itemlist, live=True) support.thumb(itemlist, live=True)
return itemlist return itemlist
def replay(item): def replay(item):
logger.debug() logger.debug()
@@ -207,7 +209,7 @@ def replay(item):
plot = info['description'], plot = info['description'],
url = getUrl(it['weblink']), url = getUrl(it['weblink']),
video_url = getUrl(it['path_id']), video_url = getUrl(it['path_id']),
action = 'play', action = 'findvideos',
forcethumb = True) forcethumb = True)
@@ -215,17 +217,19 @@ def replay(item):
items = requests.get(item.channel_url).json().get('events', {}) items = requests.get(item.channel_url).json().get('events', {})
now = datetime.datetime.now() now = datetime.datetime.now()
h = int('{}{:02d}'.format(now.hour, now.minute)) h = int('{}{:02d}'.format(now.hour, now.minute))
today = now.strftime('%d-%m-%Y')
with futures.ThreadPoolExecutor() as executor: with futures.ThreadPoolExecutor() as executor:
itlist = [executor.submit(itInfo, it) for it in items if it['has_video'] and int(it['hour'].replace(':','')) <= h] itlist = [executor.submit(itInfo, it) for it in items if it['has_video'] and (int(it['hour'].replace(':','')) <= h or item.date != today)]
for res in futures.as_completed(itlist): for res in futures.as_completed(itlist):
if res.result(): if res.result():
itemlist.append(res.result()) itemlist.append(res.result())
if not itemlist: if not itemlist:
return [Item(title='Non ci sono Replay per questo Canale')] return [Item(title='Non ci sono Replay per questo Canale')]
itemlist.sort(key=lambda it: it.title)
return itemlist return itemlist
def play(item):
def findvideos(item):
logger.debug() logger.debug()
res = requests.get(item.video_url).json() res = requests.get(item.video_url).json()
@@ -239,9 +243,9 @@ def play(item):
item.drm = 'com.widevine.alpha' item.drm = 'com.widevine.alpha'
item.license = lic + '|' + host + '|R{SSM}|' item.license = lic + '|' + host + '|R{SSM}|'
item = item.clone(server='directo', url=url, no_return=True, manifest='hls') item = item.clone(server='directo', url=url, no_return=True) # , manifest='hls')
return [item] return support.server(item, itemlist=[item], Download=False, Videolibrary=False)
def getUrl(url): def getUrl(url):
@@ -257,20 +261,36 @@ def getUrl(url):
def addinfo(items, item): def addinfo(items, item):
def itInfo(key, item): def itInfo(n, key, item):
logger.debug(jsontools.dump(key)) logger.debug()
item.forcethumb = True item.forcethumb = True
episode = 0
season = 0
if key.get('titolo', ''): if key.get('titolo', ''):
key = requests.get(getUrl(key['path_id'])).json()['program_info'] key = requests.get(getUrl(key['path_id'])).json()['program_info']
info = requests.get(getUrl(key['info_url'])).json() if 'info_url' in key else {} info = requests.get(getUrl(key['info_url'])).json() if 'info_url' in key else {}
details = info.get('details',{})
for detail in details:
if detail['key'] == 'season':
s = scrapertools.find_single_match(detail['value'], '(\d+)')
if s: season = int(s)
if detail['key'] == 'episode':
e = scrapertools.find_single_match(detail['value'], '(\d+)')
if e: episode = int(e)
images = info.get('images', {}) images = info.get('images', {})
fanart = images.get('landscape', '') fanart = images.get('landscape', '')
thumb = images.get('portrait_logo', '') thumb = images.get('portrait_logo', '')
if not thumb: thumb = fanart if not thumb: thumb = fanart
title = key.get('name', '') title = key.get('name', '')
if key.get('episode_title'):
title = key.get('episode_title')
if episode:
title = '{:02d}. {}'.format(episode, title)
if season:
title = '{}x{}'.format(season, title)
it = item.clone(title=support.typo(title, 'bold'), it = item.clone(title=support.typo(title, 'bold'),
data='', data='',
@@ -280,10 +300,13 @@ def addinfo(items, item):
fanart=getUrl(fanart), fanart=getUrl(fanart),
url=getUrl(key.get('weblink', '')), url=getUrl(key.get('weblink', '')),
video_url=getUrl(key['path_id']), video_url=getUrl(key['path_id']),
plot=info.get('description', '')) season=season,
episode=episode,
plot=info.get('description', ''),
order=n)
if 'Genere' not in key.get('sub_type', '') and ('layout' not in key or key['layout'] == 'single'): if 'Genere' not in key.get('sub_type', '') and ('layout' not in key or key['layout'] == 'single'):
it.action = 'play' it.action = 'findvideos'
it.contentTitle = it.fulltitle it.contentTitle = it.fulltitle
else: else:
it.action = 'episodios' it.action = 'episodios'
@@ -292,8 +315,9 @@ def addinfo(items, item):
itemlist = [] itemlist = []
with futures.ThreadPoolExecutor() as executor: with futures.ThreadPoolExecutor() as executor:
itlist = [executor.submit(itInfo, it, item) for it in items] itlist = [executor.submit(itInfo, n, it, item) for n, it in enumerate(items)]
for res in futures.as_completed(itlist): for res in futures.as_completed(itlist):
if res.result(): if res.result():
itemlist.append(res.result()) itemlist.append(res.result())
itemlist.sort(key=lambda it: it.order)
return itemlist return itemlist
-11
View File
@@ -1,11 +0,0 @@
{
"id": "seriehd",
"name": "SerieHD",
"active": false,
"language": ["ita"],
"thumbnail": "seriehd.png",
"banner": "seriehd.png",
"categories": ["tvshow"],
"settings": [],
"cloudflare": true
}
-156
View File
@@ -1,156 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per SerieHD
# ------------------------------------------------------------
from core import support
def findhost(url):
return support.match(url, patron=r'<h2[^>]+><a href="([^"]+)"').match
host = support.config.get_channel_url()
headers = [['Referer', host]]
@support.menu
def mainlist(item):
tvshow = [('Genere', ['', 'menu', 'genre']),
('A-Z', ['', 'menu', 'a-z']),
('In Corso', ['/category/serie-tv-streaming/serie-in-corso', 'peliculas']),
('Complete', ['/category/serie-tv-streaming/serie-complete', 'peliculas']),
('Americane', ['/category/serie-tv-streaming/serie-tv-americane', 'peliculas']),
('Italiane', ['/category/serie-tv-streaming/serie-tv-italiane', 'peliculas']),
('Ultimi Episodi', ['/aggiornamenti', 'peliculas', 'last']),
('Evidenza', ['', 'peliculas', 'best'])]
return locals()
def search(item, texto):
support.info(texto)
item.contentType = 'tvshow'
item.url = host + "/?s=" + texto
try:
return peliculas(item)
# Continua la ricerca in caso di errore .
except:
import sys
for line in sys.exc_info():
support.logger.error("%s" % line)
return []
def newest(categoria):
support.info(categoria)
itemlist = []
item = support.Item()
item.url = host + '/aggiornamenti'
item.args = 'last'
try:
if categoria == "series":
item.contentType = 'tvshow'
return peliculas(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
support.logger.error("{0}".format(line))
return []
return itemlist
@support.scrape
def peliculas(item):
# debug = True
if item.args == 'last':
action = 'findvideos'
patron = r'singleUpdate">(?:[^>]+>){2}\s*<img src="(?P<thumb>[^"]+)"(?:[^>]+>){3}\s*<h2>(?P<title>[^<]+)<(?:[^>]+>){14,16}\s*<a href="(?P<url>[^"]+)">(?:[^>]+>){3}\s*(?P<season>\d+)\D+(?P<episode>\d+)(?:[^\(]*\()?(?P<lang>[^\)]+)?(?:\))?'
elif item.args == 'best':
action='episodios'
patron = r'col-md-3">\s*<a href="(?P<url>[^"]+)">[^>]+>\s*<div class="infoVetrina">[^>]+>(?P<year>\d{4})(?:[^>]+>){2}(?P<title>[^<]+)<(?:[^>]+>){4}(?P<rating>[^<]+)(?:[^>]+>){4}\s*<img src="(?P<thumb>[^"]+)"'
else:
action='episodios'
# patron = r'<a href="(?P<url>[^"]+)">[^>]+>\s*<div class="infoSeries">\s*<h2>(?P<title>[^<]+)<(?:[^>]+>){5}(?P<rating>[^<]+)?(?:[^>]+>){3}\s*<img src="(?P<thumb>[^"]+)"(?:[^>]+>){3}(?P<quality>[^<]+)<(?:[^>]+>){2}(?P<year>\d{4})'
patron = r'<a href="(?P<url>[^"]+)">[^>]+>\s*<div class="infoSeries">\s*<h2>(?P<title>[^<]+?)(?:\[(?P<lang>[^\]]+)\])?<(?:[^>]+>){5}(?P<rating>[^<]+)?(?:[^>]+>){3}\s*(?:<img src="(?P<thumb>[^"]+)"[^>]+>)?(?:[^>]+>){0,2}(?P<quality>[^<]+)<(?:[^>]+>){2}(?P<year>\d{4})'
patronNext=r'next page-numbers" href="([^"]+)"'
return locals()
@support.scrape
def episodios(item):
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:
# episode_url = support.urlparse.urljoin(item.url, episode_url)
# if '-' in episode: episode = episode.split('-')[0].zfill(2) + 'x' + episode.split('-')[1].zfill(2)
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').match
seasons = support.match(url, patronBlock=patron_season, patron=patron_option)
data = ''
# debugging
# support.dbg()
# for i, season in enumerate(seasons.matches):
# data += get_season(seasons.data if i == 0 else '', season[0], season[1])
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()
# debug = True
patron = r'(?P<season>\d+)x(?P<episode>\d+)\s*-\s*(?P<title>[^\|]+)\|(?P<url>[^ ]+)'
action = 'findvideos'
def itemlistHook(itemlist):
itemlist.sort(key=lambda item: (item.infoLabels['season'], item.infoLabels['episode']))
return itemlist
return locals()
@support.scrape
def menu(item):
if item.args == 'genre':
patronMenu = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)</a>'
else:
patronMenu = r'<a href="(?P<url>[^"]+)" class="">(?P<title>[^<]+)'
blacklist = ['Serie TV Streaming','Serie TV Americane','Serie TV Italiane','Serie Complete','Serie in Corso','altadefinizione']
action = 'peliculas'
return locals()
def findvideos(item):
item.url = item.url.replace('&amp;', '&')
support.info(item)
if item.args == 'last':
url = support.match(item, patron = r'<iframe id="iframeVid" width="[^"]+" height="[^"]+" src="([^"]+)" allowfullscreen').match
matches = support.match(url,patron=r'<a href="([^"]+)">(\d+)<', patronBlock=r'<h3>EPISODIO</h3><ul>(.*?)</ul>').matches
if matches: item.url = support.urlparse.urljoin(url, matches[-1][0])
return support.hdpass_get_servers(item)
def play(item):
if 'hdpass' in item.url:
return support.hdpass_get_url(item)
return [item]
-11
View File
@@ -1,11 +0,0 @@
{
"id": "serietvonline",
"name": "SerieTvOnline",
"active": false,
"language": ["ita"],
"thumbnail": "serietvonline.png",
"bannermenu": "serietvonline.png",
"categories": ["anime","tvshow","movie","documentary"],
"not_active": ["include_in_newest_anime"],
"settings": []
}
-184
View File
@@ -1,184 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per serietvonline.py
# ----------------------------------------------------------
"""
Novità. Indicare in quale/i sezione/i è presente il canale:
- film, serie
Avvisi:
- Al massimo 25 titoli per le sezioni: Film
- Al massimo 35 titoli per le sezioni: Tutte le altre
Per aggiungere in videoteca le Anime:
Se hanno la forma 1x01:
-si posso aggiungere direttamente dalla pagina della serie, sulla voce in fondo "aggiungi in videoteca".
Altrimenti:
- Prima fare la 'Rinumerazione' dal menu contestuale dal titolo della serie
"""
import re
from core import support, httptools, scrapertools
from platformcode import config
from core.item import Item
# def findhost(url):
# host = support.match(url, patron=r'href="([^"]+)">\s*cliccando qui').matches[-1]
# return host
host = config.get_channel_url()
headers = [['Referer', host]]
@support.menu
def mainlist(item):
support.info()
film = ['/ultimi-film-aggiunti/',
('A-Z', ['/lista-film/', 'peliculas', 'lista'])
]
tvshow = ['',
('Aggiornamenti', ['/ultimi-episodi-aggiunti/', 'peliculas', 'update']),
('Tutte', ['/lista-serie-tv/', 'peliculas', 'qualcosa']),
('Italiane', ['/lista-serie-tv-italiane/', 'peliculas', 'qualcosa']),
('Anni 50-60-70-80', ['/lista-serie-tv-anni-60-70-80/', 'peliculas', 'qualcosa']),
('HD', ['/lista-serie-tv-in-altadefinizione/', 'peliculas', 'qualcosa'])
]
anime = ['/lista-cartoni-animati-e-anime/']
documentari = [('Documentari {bullet bold}', ['/lista-documentari/' , 'peliculas' , 'doc', 'tvshow'])]
search = ''
return locals()
@support.scrape
def peliculas(item):
support.info()
anime = True
blacklist = ['DMCA', 'Contatti', 'Attenzione NON FARTI OSCURARE', 'Lista Cartoni Animati e Anime']
patronBlock = r'<h1>.+?</h1>(?P<block>.*?)<div class="footer_c">'
patronNext = r'<div class="siguiente"><a href="([^"]+)" >'
# debug = True
if item.args == 'search':
patronBlock = r'>Lista Serie Tv</a></li></ul></div><div id="box_movies">(?P<block>.*?)<div id="paginador">'
patron = r'<div class="movie">[^>]+[^>]+>\s*<img src="(?P<thumb>[^"]+)" alt="(?P<title>.+?)(?:(?P<year>\d{4})|")[^>]*>\s*<a href="(?P<url>[^"]+)'
elif item.contentType == 'episode':
pagination = 35
action = 'findvideos'
patron = r'<td><a href="(?P<url>[^"]+)"(?:[^>]+)?>\s?(?P<title>.*?)(?P<episode>\d+x\d+)[ ]?(?P<title2>[^<]+)?<'
elif item.contentType == 'tvshow':
# SEZIONE Serie TV- Anime - Documentari
pagination = 35
if not item.args and 'anime' not in item.url:
patron = r'<div class="movie">[^>]+>.+?src="(?P<thumb>[^"]+)" alt="[^"]+".+? href="(?P<url>[^"]+)">.*?<h2>(?P<title>[^"]+)</h2>\s?(?:<span class="year">(?P<year>\d+|\-\d+))?<'
else:
anime = True
patron = r'(?:<td>)?<a href="(?P<url>[^"]+)"(?:[^>]+)?>\s?(?P<title>[^<]+)(?P<episode>[\d\-x]+)?(?P<title2>[^<]+)?<'
else:
# SEZIONE FILM
pagination = 25
if item.args == 'lista':
patron = r'href="(?P<url>[^"]+)"[^>]+>(?P<title>.+?)(?:\s(?P<year>\d{4})|<)'
patronBlock = r'Lista dei film disponibili in streaming e anche in download\.</p>(?P<block>.*?)<div class="footer_c">'
else:
patron = r'<tr><td><a href="(?P<url>[^"]+)"(?:|.+?)?>(?:&nbsp;&nbsp;)?[ ]?(?P<title>.*?)[ ]?(?P<quality>HD)?[ ]?(?P<year>\d+)?(?: | HD[^<]*| Streaming[^<]*| MD(?: iSTANCE)? [^<]*)?</a>'
def itemHook(item):
if 'film' in item.url:
item.action = 'findvideos'
item.contentType = 'movie'
elif item.args == 'update':
pass
else:
item.contentType = 'tvshow'
item.action = 'episodios'
return item
return locals()
@support.scrape
def episodios(item):
support.info()
anime = True
action = 'findvideos'
patronBlock = r'<table>(?P<block>.*)<\/table>'
patron = r'<tr><td>(?P<title>.*?)?[ ](?:Parte)?(?P<episode>\d+x\d+|\d+)(?:|[ ]?(?P<title2>.+?)?(?:avi)?)<(?P<data>.*?)<\/td><tr>'
def itemlistHook(itemlist):
for i, item in enumerate(itemlist):
ep = support.match(item.title, patron=r'\d+x(\d+)').match
if ep == '00':
item.title = item.title.replace('x00', 'x' + str(i+1).zfill(2)).replace('- ..','')
return itemlist
return locals()
def search(item, text):
support.info("CERCA :" ,text, item)
item.url = "%s/?s=%s" % (host, text)
try:
item.args = 'search'
return peliculas(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
support.info("%s" % line)
return []
def newest(categoria):
support.info(categoria)
itemlist = []
item = Item()
if categoria == 'peliculas':
item.contentType = 'movie'
item.url = host + '/ultimi-film-aggiunti/'
elif categoria == 'series':
item.args = 'update'
item.contentType = 'episode'
item.url = host +'/ultimi-episodi-aggiunti/'
try:
item.action = 'peliculas'
itemlist = peliculas(item)
except:
import sys
for line in sys.exc_info():
support.info("{0}".format(line))
return []
return itemlist
def findvideos(item):
support.info()
if item.contentType == 'movie':
return support.server(item, headers=headers)
else:
if item.args != 'update':
return support.server(item, item.data)
else:
itemlist = []
item.infoLabels['mediatype'] = 'episode'
data = support.match(item.url, headers=headers).data
url_video = scrapertools.find_single_match(data, r'<tr><td>(.+?)</td><tr>', -1)
url_serie = scrapertools.find_single_match(data, r'<link rel="canonical" href="([^"]+)"\s?/>')
goseries = support.typo("Vai alla Serie:", ' bold')
series = support.typo(item.contentSerieName, ' bold color kod')
itemlist = support.server(item, data=url_video)
itemlist.append(item.clone(title=goseries + series, contentType='tvshow', url=url_serie, action='episodios', plot = goseries + series + "con tutte le puntate", args=''))
return itemlist
-53
View File
@@ -1,53 +0,0 @@
{
"id": "serietvsubita",
"name": "Serie TV Sub ITA",
"active": false,
"language": ["ita"],
"thumbnail": "serietvsubita.png",
"banner": "serietvsubita.png",
"categories": ["tvshow"],
"settings": [
{
"id": "include_in_global_search",
"type": "bool",
"label": "Includi ricerca globale",
"default": true,
"enabled": true,
"visible": true
},
{
"id": "include_in_newest_series",
"type": "bool",
"label": "Includi in Novità - Serie TV",
"default": true,
"enabled": true,
"visible": true
},
{
"id": "checklinks",
"type": "bool",
"label": "Verifica se i link esistono",
"default": false,
"enabled": true,
"visible": true
},
{
"id": "checklinks_number",
"type": "list",
"label": "Numero de link da verificare",
"default": 1,
"enabled": true,
"visible": "eq(-1,true)",
"lvalues": [ "1", "3", "5", "10" ]
},
{
"id": "filter_languages",
"type": "list",
"label": "Mostra link in lingua...",
"default": 0,
"enabled": true,
"visible": true,
"lvalues": ["Non filtrare","IT"]
}
]
}
-351
View File
@@ -1,351 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per Serietvsubita
# Thanks to Icarus crew & Alfa addon & 4l3x87
# ----------------------------------------------------------
import re
import time
from core import httptools, tmdb, scrapertools, support
from core.item import Item
from core.support import info
from platformcode import logger, config
host = config.get_channel_url()
headers = [['Referer', host]]
IDIOMAS = {'Italiano': 'IT'}
list_language = IDIOMAS.values()
@support.menu
def mainlist(item):
info()
itemlist = []
tvshowSub = [
('Novità {bold}',[ '', 'peliculas_tv', '', 'tvshow']),
('Serie TV {bold}',[ '', 'lista_serie', '', 'tvshow']),
('Per Lettera', ['', 'list_az', 'serie', 'tvshow'])
]
cerca = [(support.typo('Cerca...', 'bold'),[ '', 'search', '', 'tvshow'])]
## support.aplay(item, itemlist, list_servers, list_quality)
## support.channel_config(item, itemlist)
return locals()
# ----------------------------------------------------------------------------------------------------------------
def cleantitle(scrapedtitle):
scrapedtitle = scrapertools.decodeHtmlentities(scrapedtitle.strip())
scrapedtitle = scrapedtitle.replace('[HD]', '').replace('', '\'').replace('×', 'x').replace('Game of Thrones ','')\
.replace('In The Dark 2019', 'In The Dark (2019)').replace('"', "'").strip()
year = scrapertools.find_single_match(scrapedtitle, r'\((\d{4})\)')
if year:
scrapedtitle = scrapedtitle.replace('(' + year + ')', '')
return scrapedtitle.strip()
# ================================================================================================================
# ----------------------------------------------------------------------------------------------------------------
def findvideos(item):
info()
data = httptools.downloadpage(item.url, headers=headers, ignore_response_code=True).data
data = re.sub(r'\n|\t|\s+', ' ', data)
# recupero il blocco contenente i link
blocco = scrapertools.find_single_match(data, r'<div class="entry">([\s\S.]*?)<div class="post').replace('..:: Episodio ', 'Episodio ').strip()
matches = scrapertools.find_multiple_matches(blocco, r'(S(\d*)E(\d*))\s')
if len(matches) > 0:
for fullseasonepisode, season, episode in matches:
blocco = blocco.replace(fullseasonepisode + ' ', 'Episodio ' + episode + ' ')
blocco = blocco.replace('Episodio ', '..:: Episodio ')
episodio = item.infoLabels['episode']
patron = r'\.\.:: Episodio %s([\s\S]*?)(<div class="post|..:: Episodio)' % episodio
info(patron)
info(blocco)
matches = scrapertools.find_multiple_matches(blocco, patron)
if len(matches):
data = matches[0][0]
patron = r'href="(https?://www\.keeplinks\.(?:co|eu)/p(?:[0-9]*)/([^"]+))"'
matches = re.compile(patron, re.DOTALL).findall(data)
for keeplinks, id in matches:
headers2 = [['Cookie', 'flag[' + id + ']=1; defaults=1; nopopatall=' + str(int(time.time()))],
['Referer', keeplinks]]
html = httptools.downloadpage(keeplinks, headers=headers2).data
data += str(scrapertools.find_multiple_matches(html, '</lable><a href="([^"]+)" target="_blank"'))
return support.server(item, data=data)
# ================================================================================================================
# ----------------------------------------------------------------------------------------------------------------
def lista_serie(item):
info()
itemlist = []
PERPAGE = 15
p = 1 if not item.args else int(item.args)
if '||' in item.data:
series = item.data.split('\n\n')
matches = []
for i, serie in enumerate(series):
matches.append(serie.split('||'))
else:
# Extrae las entradas
patron = r'<li class="cat-item cat-item-\d+"><a href="([^"]+)"\s?>([^<]+)</a>'
matches = support.match(item, patron=patron, headers=headers).matches
for i, (scrapedurl, scrapedtitle) in enumerate(matches):
scrapedplot = ""
scrapedthumbnail = ""
if (p - 1) * PERPAGE > i: continue
if i >= p * PERPAGE: break
title = cleantitle(scrapedtitle)
itemlist.append(
item.clone(action="episodios",
title=title,
url=scrapedurl,
thumbnail=scrapedthumbnail,
fulltitle=title,
show=title,
plot=scrapedplot,
contentType='episode',
originalUrl=scrapedurl))
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
# Paginazione
if len(matches) >= p * PERPAGE:
item.args = p + 1
support.nextPage(itemlist, item, next_page=item.url)
return itemlist
# ================================================================================================================
# ----------------------------------------------------------------------------------------------------------------
def episodios(item, itemlist=[]):
info()
patron = r'<div class="post-meta">\s*<a href="([^"]+)"\s*title="([^"]+)"\s*class=".*?"></a>.*?'
patron += r'<p><a href="([^"]+)">'
html = support.match(item, patron=patron, headers=headers)
matches = html.matches
data = html.data
for scrapedurl, scrapedtitle, scrapedthumbnail in matches:
scrapedplot = ""
scrapedtitle = cleantitle(scrapedtitle)
if "(Completa)" in scrapedtitle:
data = httptools.downloadpage(scrapedurl, headers=headers).data
scrapedtitle = scrapedtitle.replace(" Miniserie", " Stagione 1")
title = scrapedtitle.split(" Stagione")[0].strip()
# recupero la stagione
season = scrapertools.find_single_match(scrapedtitle, 'Stagione ([0-9]*)')
blocco = scrapertools.find_single_match(data, r'<div class="entry">[\s\S.]*?<div class="post')
blocco = blocco.replace('<strong>Episodio ', '<strong>Episodio ').replace(' </strong>', ' </strong>')
blocco = blocco.replace('<strong>Episodio ', '<strong>S' + season.zfill(2) + 'E')
matches = scrapertools.find_multiple_matches(blocco, r'(S(\d*)E(\d*))\s')
episodes = []
if len(matches) > 0:
for fullepisode_s, season, episode in matches:
season = season.lstrip("0")
episodes.append([
"".join([season, "x", episode]),
season,
episode
])
else:
title = scrapedtitle.split(" S0")[0].strip()
title = title.split(" S1")[0].strip()
title = title.split(" S2")[0].strip()
episodes = scrapertools.find_multiple_matches(scrapedtitle, r'((\d*)x(\d*))')
for fullepisode, season, episode in episodes:
infoLabels = {}
infoLabels['season'] = season
infoLabels['episode'] = episode
fullepisode += ' ' + support.typo("Sub-ITA", '_ [] color kod')
itemlist.append(
item.clone(action="findvideos",
fulltitle=scrapedtitle,
show=scrapedtitle,
title=fullepisode,
url=scrapedurl,
thumbnail=scrapedthumbnail,
plot=scrapedplot,
contentSerieName=title,
infoLabels=infoLabels))
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
# Paginazionazione
patron = r'<strong class="on">\d+</strong>\s*<a href="([^<]+)">\d+</a>'
next_page = scrapertools.find_single_match(data, patron)
if next_page != "":
item.url = next_page
itemlist = episodios(item, itemlist)
else:
item.url = item.originalUrl
support.videolibrary(itemlist, item, 'bold color kod')
return itemlist
# ================================================================================================================
# ----------------------------------------------------------------------------------------------------------------
def peliculas_tv(item):
info()
itemlist = []
patron = r'<div class="post-meta">\s*<a href="([^"]+)"\s*title="([^"]+)"\s*class=".*?"></a>'
html = support.match(item, patron=patron, headers=headers)
matches = html.matches
data = html.data
for scrapedurl, scrapedtitle in matches:
if scrapedtitle in ["FACEBOOK", "RAPIDGATOR", "WELCOME!"]:
continue
scrapedthumbnail = ""
scrapedplot = ""
scrapedtitle = cleantitle(scrapedtitle)
infoLabels = {}
episode = scrapertools.find_multiple_matches(scrapedtitle, r'((\d*)x(\d*))')
if episode: # workaround per quando mettono le serie intere o altra roba, sarebbero da intercettare TODO
episode = episode[0]
title = scrapedtitle.split(" S0")[0].strip()
title = title.split(" S1")[0].strip()
title = title.split(" S2")[0].strip()
infoLabels['season'] = episode[1]
infoLabels['episode'] = episode[2].zfill(2)
itemlist.append(
item.clone(action="findvideos",
fulltitle=scrapedtitle,
show=scrapedtitle,
title=title + " - " + episode[0] + " " + support.typo("Sub-ITA", '_ [] color kod'),
url=scrapedurl,
thumbnail=scrapedthumbnail,
contentSerieName=title,
contentLanguage='Sub-ITA',
plot=scrapedplot,
infoLabels=infoLabels))
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
# Paginazione
patron = r'<strong class="on">\d+</strong>\s?<a href="([^<]+)">\d+</a>'
support.nextPage(itemlist, item, data, patron)
return itemlist
# ================================================================================================================
# ----------------------------------------------------------------------------------------------------------------
def newest(categoria):
info(categoria)
itemlist = []
item = Item()
item.url = host
item.extra = 'serie'
try:
if categoria == "series":
itemlist = peliculas_tv(item)
if itemlist[-1].action == 'peliculas_tv':
itemlist.pop(-1)
except:
import sys
for line in sys.exc_info():
logger.error("{0}".format(line))
return []
return itemlist
# ================================================================================================================
# ----------------------------------------------------------------------------------------------------------------
def search(item, texto):
info(texto)
itemlist = []
try:
patron = r'<li class="cat-item cat-item-\d+"><a href="([^"]+)"\s?>([^<]+)</a>'
matches = support.match(item, patron=patron, headers=headers).matches
for i, (scrapedurl, scrapedtitle) in enumerate(matches):
if texto.upper() in scrapedtitle.upper():
scrapedthumbnail = ""
scrapedplot = ""
title = cleantitle(scrapedtitle)
itemlist.append(
item.clone(action="episodios",
title=title,
url=scrapedurl,
thumbnail=scrapedthumbnail,
fulltitle=title,
show=title,
plot=scrapedplot,
contentType='episode',
originalUrl=scrapedurl))
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
except:
import sys
for line in sys.exc_info():
support.info('search log:', line)
return []
return itemlist
# ================================================================================================================
# ----------------------------------------------------------------------------------------------------------------
def list_az(item):
info()
itemlist = []
alphabet = dict()
patron = r'<li class="cat-item cat-item-\d+"><a href="([^"]+)"\s?>([^<]+)</a>'
matches = support.match(item, patron=patron, headers=headers).matches
for i, (scrapedurl, scrapedtitle) in enumerate(matches):
letter = scrapedtitle[0].upper()
if letter not in alphabet:
alphabet[letter] = []
alphabet[letter].append(scrapedurl + '||' + scrapedtitle)
for letter in sorted(alphabet):
itemlist.append(
item.clone(action="lista_serie",
data='\n\n'.join(alphabet[letter]),
title=letter,
fulltitle=letter,
args=''))
return itemlist
# ================================================================================================================
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"id": "serietvu", "id": "serietvu",
"name": "SerieTVU", "name": "SerieTVU",
"active": true, "active": false,
"language": ["ita", "sub-ita"], "language": ["ita", "sub-ita"],
"thumbnail": "serietvu.png", "thumbnail": "serietvu.png",
"banner": "serietvu.png", "banner": "serietvu.png",
-11
View File
@@ -1,11 +0,0 @@
{
"id": "streamingaltadefinizione",
"name": "Popcorn Stream",
"language": ["ita"],
"active": false,
"thumbnail": "popcornstream.png",
"banner": "popcornstream.png",
"categories": ["movie","tvshow","anime"],
"not_active":["include_in_newest_peliculas", "include_in_newest_series", "include_in_newest_anime"],
"settings": []
}
-72
View File
@@ -1,72 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per Popcorn Stream
# ------------------------------------------------------------
from core import support, httptools
from core.item import Item
from platformcode import config
import sys
if sys.version_info[0] >= 3:
from urllib.parse import unquote
else:
from urllib import unquote
def findhost(url):
data = httptools.downloadpage(url).data
return support.scrapertools.find_single_match(data, '<a href="([^"]+)')
host = config.get_channel_url(findhost)
headers = [['Referer', host]]
@support.menu
def mainlist(item):
film = ["/film/"]
anime = ["/genere/anime/"]
tvshow = ["/serietv/"]
top = [('Generi',['', 'genre'])]
return locals()
def search(item, text):
support.info("[streamingaltadefinizione.py] " + item.url + " search " + text)
item.url = item.url + "/?s=" + text
try:
return support.dooplay_search(item)
except:
import sys
for line in sys.exc_info():
support.logger.error("%s" % line)
return []
@support.scrape
def genre(item):
patronMenu = '<a href="(?P<url>[^"#]+)">(?P<title>[a-zA-Z]+)'
patronBlock='<a href="#">Genere</a><ul class="sub-menu">(?P<block>.*?)</ul>'
action='peliculas'
return locals()
def peliculas(item):
return support.dooplay_peliculas(item, True if "/genere/" in item.url else False)
def episodios(item):
return support.dooplay_get_episodes(item)
def findvideos(item):
itemlist = []
matches = support.match(item, patron=r'<a href="([^"]+)[^>]+>Download[^>]+>[^>]+>[^>]+><strong class="quality">([^<]+)<').matches
for url, quality in matches:
itemlist.append(
item.clone(caction="play",
url=unquote(support.match(url, patron=[r'dest=([^"]+)"',r'/(http[^"]+)">Click']).match),
quality=quality))
return support.server(item, itemlist=itemlist)
+111 -62
View File
@@ -2,30 +2,43 @@
# ------------------------------------------------------------ # ------------------------------------------------------------
# Canale per StreamingCommunity # Canale per StreamingCommunity
# ------------------------------------------------------------ # ------------------------------------------------------------
import functools
import json, requests, re, sys
from core import support, channeltools, httptools, jsontools, filetools
from platformcode import logger, config, platformtools
import json, requests, sys
from core import support, channeltools
from platformcode import logger
if sys.version_info[0] >= 3: if sys.version_info[0] >= 3:
from concurrent import futures from concurrent import futures
else: else:
from concurrent_py2 import futures from concurrent_py2 import futures
# def findhost(url):
# return 'https://' + support.match(url, patron='var domain\s*=\s*"([^"]+)').match
host = support.config.get_channel_url() host = support.config.get_channel_url()
session = requests.Session()
headers = {} headers = {}
def getHeaders():
def getHeaders(forced=False):
global headers global headers
global host
if not headers: if not headers:
# try:
headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14'} headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14'}
response = session.get(host, headers=headers) response = httptools.downloadpage(host, headers=headers)
csrf_token = support.match(response.text, patron='name="csrf-token" content="([^"]+)"').match # if not response.url.startswith(host):
# host = support.config.get_channel_url(findhost, forceFindhost=True)
csrf_token = support.match(response.data, patron='name="csrf-token" content="([^"]+)"').match
headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14', headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14',
'content-type': 'application/json;charset=UTF-8', 'content-type': 'application/json;charset=UTF-8',
'Referer': host, 'Referer': host,
'x-csrf-token': csrf_token, 'x-csrf-token': csrf_token,
'Cookie': '; '.join([x.name + '=' + x.value for x in response.cookies])} 'Cookie': '; '.join([x.name + '=' + x.value for x in response.cookies])}
# except:
# host = support.config.get_channel_url(findhost, forceFindhost=True)
# if not forced: getHeaders(True)
getHeaders() getHeaders()
@support.menu @support.menu
@@ -75,9 +88,12 @@ def newest(category):
itemlist = [] itemlist = []
item = support.Item() item = support.Item()
item.args = 1 item.args = 1
item.newest = True
if category == 'peliculas': if category == 'peliculas':
item.contentType = 'movie'
item.url = host + '/film' item.url = host + '/film'
else: else:
item.contentType = 'tvshow'
item.url = host + '/serie-tv' item.url = host + '/serie-tv'
try: try:
@@ -97,25 +113,29 @@ def newest(category):
def peliculas(item): def peliculas(item):
# getHeaders()
logger.debug() logger.debug()
if item.mainThumb: item.thumbnail = item.mainThumb
global host
itemlist = [] itemlist = []
items = []
recordlist = [] recordlist = []
videoType = 'movie' if item.contentType == 'movie' else 'tv' videoType = 'movie' if item.contentType == 'movie' else 'tv'
page = item.page if item.page else 0 page = item.page if item.page else 0
offset = page * 60 offset = page * 60
if item.records: if item.records:
records = item.records records = item.records
elif type(item.args) == int: elif type(item.args) == int:
data = support.scrapertools.decodeHtmlentities(support.match(item).data) data = support.scrapertools.decodeHtmlentities(support.match(item).data)
records = json.loads(support.match(data, patron=r'slider-title titles-json="(.*?)" slider-name="').matches[item.args]) records = json.loads(support.match(data, patron=r'slider-title titles-json="(.*?)"\s*slider-name="').matches[item.args])
elif not item.search: elif not item.search:
payload = json.dumps({'type': videoType, 'offset':offset, 'genre':item.args}) payload = json.dumps({'type': videoType, 'offset':offset, 'genre':item.args})
records = session.post(host + '/api/browse', headers=headers, data=payload).json()['records'] records = httptools.downloadpage(host + '/api/browse', headers=headers, post=payload).json['records']
else: else:
payload = json.dumps({'q': item.search}) payload = json.dumps({'q': item.search})
records = session.post(host + '/api/search', headers=headers, data=payload).json()['records'] records = httptools.downloadpage(host + '/api/search', headers=headers, post=payload).json['records']
if records and type(records[0]) == list: if records and type(records[0]) == list:
js = [] js = []
@@ -126,23 +146,34 @@ def peliculas(item):
for i, it in enumerate(js): for i, it in enumerate(js):
if i < 20: if i < 20:
itemlist.append(makeItem(i, it, item)) items.append(it)
else: else:
recordlist.append(it) recordlist.append(it)
with futures.ThreadPoolExecutor() as executor:
itlist = [executor.submit(makeItem, i, it, item) for i, it in enumerate(items)]
for res in futures.as_completed(itlist):
if res.result():
itemlist.append(res.result())
itemlist.sort(key=lambda item: item.n) itemlist.sort(key=lambda item: item.n)
if recordlist: if not item.newest:
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), thumbnail=support.thumb(), page=page, records=recordlist)) item.mainThumb = item.thumbnail
elif len(itemlist) >= 20: if recordlist:
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), thumbnail=support.thumb(), records=[], page=page + 1)) itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), thumbnail=support.thumb(), page=page, records=recordlist))
elif len(itemlist) >= 20:
itemlist.append(item.clone(title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), thumbnail=support.thumb(), records=[], page=page + 1))
support.tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True) support.tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
support.check_trakt(itemlist)
return itemlist return itemlist
def makeItem(n, it, item): def makeItem(n, it, item):
info = session.post(host + '/api/titles/preview/{}'.format(it['id']), headers=headers).json() info = httptools.downloadpage(host + '/api/titles/preview/{}'.format(it['id']), headers=headers, post={}).json
title, lang = support.match(info['name'], patron=r'([^\[|$]+)(?:\[([^\]]+)\])?').match logger.debug(it)
if not lang: title = info['name']
lang = 'ITA' lang = 'Sub-ITA' if 'sub-ita' in title.lower() else 'ITA'
title = support.cleantitle(re.sub('\[|\]|[Ss][Uu][Bb]-[Ii][Tt][Aa]', '', title))
itm = item.clone(title=support.typo(title,'bold') + support.typo(lang,'_ [] color kod bold')) itm = item.clone(title=support.typo(title,'bold') + support.typo(lang,'_ [] color kod bold'))
itm.contentType = info['type'].replace('tv', 'tvshow') itm.contentType = info['type'].replace('tv', 'tvshow')
itm.language = lang itm.language = lang
@@ -152,7 +183,6 @@ def makeItem(n, it, item):
if itm.contentType == 'movie': if itm.contentType == 'movie':
# itm.contentType = 'movie' # itm.contentType = 'movie'
itm.fulltitle = itm.show = itm.contentTitle = title itm.fulltitle = itm.show = itm.contentTitle = title
itm.contentTitle = ''
itm.action = 'findvideos' itm.action = 'findvideos'
itm.url = host + '/watch/%s' % it['id'] itm.url = host + '/watch/%s' % it['id']
@@ -174,55 +204,74 @@ def episodios(item):
js = json.loads(support.match(item.url, patron=r'seasons="([^"]+)').match.replace('&quot;','"')) js = json.loads(support.match(item.url, patron=r'seasons="([^"]+)').match.replace('&quot;','"'))
for episodes in js: for episodes in js:
# logger.debug(jsontools.dump(js))
for it in episodes['episodes']: for it in episodes['episodes']:
itemlist.append(
support.Item(channel=item.channel,
title=support.typo(str(episodes['number']) + 'x' + str(it['number']).zfill(2) + ' - ' + it['name'], 'bold'),
episode = it['number'],
season=episodes['number'],
thumbnail=it['images'][0]['original_url'] if 'images' in it and 'original_url' in it['images'][0] else item.thumbnail,
fanart=item.fanart,
plot=it['plot'],
action='findvideos',
contentType='episode',
contentSerieName=item.fulltitle,
url=host + '/watch/' + str(episodes['title_id']),
episodeid= '?e=' + str(it['id'])))
itemlist.append(
item.clone(title=support.typo(str(episodes['number']) + 'x' + str(it['number']).zfill(2) + ' - ' + support.cleantitle(it['name']), 'bold'),
episode=it['number'],
season=episodes['number'],
contentSeason=episodes['number'],
contentEpisodeNumber=it['number'],
thumbnail=it['images'][0].get('original_url', item.thumbnail) if it['images'] else item.thumbnail,
contentThumbnail=item.thumbnail,
fanart=item.fanart,
contentFanart=item.fanart,
plot=it['plot'],
action='findvideos',
contentType='episode',
contentSerieName=item.fulltitle,
url=host + '/watch/' + str(episodes['title_id']) + '?e=' + str(it['id'])))
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) support.videolibrary(itemlist, item)
support.download(itemlist, item) support.download(itemlist, item)
return itemlist return itemlist
def findvideos(item): def findvideos(item):
video_urls = [] itemlist = [item.clone(title = channeltools.get_channel_parameters(item.channel)['title'], url=item.url, server='streamingcommunityws')]
data = support.match(item.url + item.episodeid, headers=headers).data.replace('&quot;','"').replace('\\','') return support.server(item, itemlist=itemlist, referer=False)
url = support.match(data, patron=r'video_url"\s*:\s*"([^"]+)"').match
def calculateToken(): # def play(item):
from time import time # from time import time
from base64 import b64encode as b64 # from base64 import b64encode
import hashlib # from hashlib import md5
o = 48
n = support.match(host + '/client-address').data
i = 'Yc8U6r8KjAKAepEA'
t = int(time() + (3600 * o))
l = '{}{} {}'.format(t, n, i)
md5 = hashlib.md5(l.encode())
s = '?token={}&expires={}'.format(b64(md5.digest()).decode().replace('=', '').replace('+', "-").replace('\\', "_"), t)
return s
token = calculateToken()
def videourls(res): # data = support.httptools.downloadpage(item.url + item.episodeid, headers=headers).data.replace('&quot;','"').replace('\\','')
newurl = '{}/{}{}'.format(url, res, token) # scws_id = support.match(data, patron=r'scws_id"\s*:\s*(\d+)').match
if requests.head(newurl, headers=headers).status_code == 200: # # support.dbg()
video_urls.append(["m3u8 {} [StreamingCommunity]".format(res), newurl])
with futures.ThreadPoolExecutor() as executor: # if not scws_id:
for res in ['480p', '720p', '1080p']: # if '<strong>Prossimamente' in data:
executor.submit(videourls, res) # platformtools.dialog_ok('StreamingCommunity', 'Il sito notifica che il contenuto sarà disponibile prossimamente')
# platformtools.play_canceled = True
# return []
if not video_urls: video_urls = [["m3u8 [StreamingCommunity]", url + token]] # # Calculate Token
else: video_urls.sort(key=lambda url: int(support.match(url[0], patron=r'(\d+)p').match)) # # client_ip = support.httptools.downloadpage('https://scws.work/videos/{}'.format(scws_id)).json.get('client_ip')
itemlist = [item.clone(title = channeltools.get_channel_parameters(item.channel)['title'], server='directo', video_urls=video_urls, thumbnail=channeltools.get_channel_parameters(item.channel)["thumbnail"], forcethumb=True)] # client_ip = support.httptools.downloadpage('http://ip-api.com/json/').json.get('query')
return support.server(item, itemlist=itemlist)
# 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(scws_id, token, expires)
# subs = []
# urls = []
# info = support.match(url, patron=r'LANGUAGE="([^"]+)",\s*URI="([^"]+)|RESOLUTION=\d+x(\d+).*?(http[^"\s]+)', headers=headers).matches
# if info:
# for lang, sub, res, url in info:
# if sub and not logger.testMode: # ai test non piace questa parte
# if lang == 'auto': lang = 'ita-forced'
# s = config.get_temp_file(lang +'.srt')
# subs.append(s)
# filetools.write(s, support.vttToSrt(httptools.downloadpage(support.match(sub, patron=r'(http[^\s\n]+)').match).data))
# elif url:
# urls.append(['hls [{}]'.format(res), url])
# return [item.clone(title = channeltools.get_channel_parameters(item.channel)['title'], server='stt', video_urls=urls, subtitle=subs, manifest='hls', referer=False)]
# else:
# return [item.clone(title = channeltools.get_channel_parameters(item.channel)['title'], server='directo', url=url, manifest='hls', referer=False)]
+11
View File
@@ -0,0 +1,11 @@
{
"id": "streamingita",
"name": "StreamingITA",
"language": ["ita"],
"active": true,
"thumbnail": "streamingita.png",
"banner": "streamingita.png",
"categories": ["tvshow", "movie"],
"not_active": ["include_in_newest_peliculas", "include_in_newest_anime", "include_in_newest_series"],
"settings": []
}
+64
View File
@@ -0,0 +1,64 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per streamingITA
# ------------------------------------------------------------
from core import httptools, support
from platformcode import logger, config
host = config.get_channel_url()
headers = [['Referer', host]]
@support.menu
def mainlist(item):
film = ['/film']
top = [('Generi', ['/film', 'menu', 'genres']),
('Anno', ['/film', 'menu', 'releases'])]
tvshow = ['/tv']
search = ''
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 peliculas(item):
mixed = True if item.contentType == 'undefined' else False
return support.dooplay_peliculas(item, mixed)
def episodios(item):
itemlist = support.dooplay_get_episodes(item)
return itemlist
def findvideos(item):
data = []
for link in support.dooplay_get_links(item, host):
url = httptools.downloadpage(link['url'], only_headers=True, headers=headers).url
data.append(url)
return support.server(item, data)
@support.scrape
def menu(item):
action = 'peliculas'
item.contentType = 'undefined'
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()
+8 -8
View File
@@ -1,11 +1,11 @@
{ {
"id": "tantifilm", "id": "tantifilm",
"name": "Tantifilm", "name": "Tantifilm",
"language": ["ita"], "language": ["ita"],
"active": true, "active": true,
"thumbnail": "tantifilm.png", "thumbnail": "tantifilm.png",
"banner": "tantifilm.png", "banner": "tantifilm.png",
"categories": ["tvshow", "movie", "anime"], "categories": ["tvshow", "movie", "anime"],
"not_active":["include_in_newest_anime", "include_in_newest_peliculas"], "not_active": ["include_in_newest_anime", "include_in_newest_peliculas"],
"settings": [] "settings": []
} }
+118 -146
View File
@@ -3,19 +3,12 @@
# Canale per Tantifilm # Canale per Tantifilm
# ------------------------------------------------------------ # ------------------------------------------------------------
from core import scrapertools, httptools, support from core import support
from core.item import Item from core.item import Item
from core.support import info
from platformcode import logger from platformcode import logger
from platformcode import config from platformcode import config
# def findhost(url):
# permUrl = httptools.downloadpage(url).data
# host = scrapertools.find_single_match(permUrl, r'<a href="([^"]+)')
# return host
host = config.get_channel_url() host = config.get_channel_url()
headers = [['Referer', host]] headers = [['Referer', host]]
@@ -23,90 +16,32 @@ player_iframe = r'<iframe.*?src="([^"]+)"[^>]+></iframe>\s*<div class="player'
@support.menu @support.menu
def mainlist(item): def mainlist(item):
info() logger.debug()
top = [('Generi', ['', 'genres'])]
top = [('Generi', ['', 'category'])]
film = ['/film', film = ['/film',
('Al Cinema', ['/watch-genre/al-cinema/']), ('Al Cinema', ['/watch-genre/al-cinema/']),
('HD', ['/watch-genre/altadefinizione/']), ('HD', ['/watch-genre/altadefinizione/']),
('Sub-ITA', ['/watch-genre/sub-ita/']) ('Sub-ITA', ['/watch-genre/sub-ita/'])]
]
tvshow = ['/serie-tv/', tvshow = ['/serie-tv/',
('HD', ['/watch-genre/serie-altadefinizione/']), ('HD', ['/watch-genre/serie-altadefinizione/']),
('Miniserie', ['/watch-genre/miniserie-1/']), ('Miniserie', ['/watch-genre/miniserie-1/']),
('Programmi TV', ['/watch-genre/programmi-tv/']), ('Programmi TV', ['/watch-genre/programmi-tv/'])]
#('LIVE', ['/watch-genre/live/'])
]
anime = ['/watch-genre/anime/' anime = ['/watch-genre/anime/']
]
search = '' search = ''
return locals()
@support.scrape
def peliculas(item):
# debug = True
if item.args == 'search':
patron = r'<a href="(?P<url>[^"]+)" title="Permalink to\s*(?P<title>[^"]+) \((?P<year>[0-9]+)[^<]*\)[^"]*"[^>]+>\s*<img[^s]+src="(?P<thumb>[^"]+)".*?<div class="calitate">\s*<p>(?P<quality>[^<]+)<\/p>'
else:
patronNext = r'<a class="nextpostslink" rel="next" href="([^"]+)">'
patron = r'<div class="mediaWrap mediaWrapAlt">\s*<a href="(?P<url>[^"]+)"(?:[^>]+)?>?\s*(?:<img[^s]+src="(?P<thumb>[^"]+)"[^>]+>\s*)?<\/a>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+?)(?P<lang>[sS][uU][bB]\-[iI][tT][aA]+)?(?:[ ]?\((?P<year>\d{4})-?(?:\d{4})?)\).[^<]+[^>]+><\/a>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<quality>[a-zA-Z-0-9\.]+)?'
patronBlock = r'<div id="main_col">(?P<block>.*?)<!\-\- main_col \-\->'
# if item.args != 'all' and item.args != 'search':
# action = 'findvideos' if item.extra == 'movie' else 'episodios'
# item.contentType = 'movie' if item.extra == 'movie' else 'tvshow'
# debug = True
return locals()
@support.scrape
def episodios(item):
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 = 'Stagioni<\/a>.*?<ul class="nav navbar-nav">(.*?)<\/ul>'
patron_episode = 'Episodio<\/a>.*?<ul class="nav navbar-nav">(?P<block>.*?)<\/ul>'
patron_option = r'<a href="([^"]+?)".*?>[^>]+></i>\s*(\d+)'
url = support.match(item, patron=player_iframe).match
seasons = support.match(url, patronBlock=patron_season, patron=patron_option)
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()
patron = r'(?P<season>\d+)x(?P<episode>\d+)\s*-\s*(?P<title>[^\|]+)\|(?P<url>[^ ]+)'
action = 'findvideos'
def itemlistHook(itemlist):
itemlist.sort(key=lambda item: (item.infoLabels['season'], item.infoLabels['episode']))
return itemlist
return locals() return locals()
@support.scrape @support.scrape
def category(item): def genres(item):
blacklist = ['Ultimi Film Aggiornati', 'Anime', 'Serie TV Altadefinizione', 'HD AltaDefinizione', 'Al Cinema', 'Serie TV', 'Miniserie', 'Programmi Tv', 'Live', 'Trailers', 'Serie TV Aggiornate', 'Aggiornamenti', 'Featured'] blacklist = ['Ultimi Film Aggiornati', 'Anime', 'Serie TV Altadefinizione', 'HD AltaDefinizione', 'Al Cinema', 'Serie TV', 'Miniserie', 'Programmi Tv', 'Live', 'Trailers', 'Serie TV Aggiornate', 'Aggiornamenti', 'Featured']
patron = '<li><a href="(?P<url>[^"]+)"><span></span>(?P<title>[^<]+)</a></li>' patronMenu = '<li><a href="(?P<url>[^"]+)"><span></span>(?P<title>[^<]+)</a></li>'
patron_block = '<ul class="table-list">(.*?)</ul>' patron_block = '<ul class="table-list">(.*?)</ul>'
action = 'peliculas' action = 'peliculas'
@@ -114,8 +49,7 @@ def category(item):
def search(item, texto): def search(item, texto):
info(texto) logger.debug(texto)
item.url = host + "/?s=" + texto item.url = host + "/?s=" + texto
try: try:
@@ -136,12 +70,115 @@ def newest(categoria):
item = Item(url=host + '/aggiornamenti-serie-tv') item = Item(url=host + '/aggiornamenti-serie-tv')
data = support.match(item).data.replace('<u>','').replace('</u>','') data = support.match(item).data.replace('<u>','').replace('</u>','')
item.contentType = 'episode' item.contentType = 'episode'
patronBlock = r'Aggiornamenti Giornalieri Serie TV.*?<div class="sp-body folded">(?P<block>.*?)</div>' patronBlock = r'Aggiornamenti (?:Giornalieri )?Serie TV.*?<div class="sp-body folded">(?P<block>.*?)</div>'
patron = r'<p>(?P<title>.*?)\((?P<year>[0-9]{4})[^\)]*\)[^<]+<a href="(?P<url>[^"]+)">(?P<episode>[^ ]+) (?P<lang>[Ss][Uu][Bb].[Ii][Tt][Aa])?(?P<title2>[^<]+)?' patron = r'<p>(?P<title>.*?)\((?P<year>[0-9]{4})[^\)]*\)[^<]+<a href="(?P<url>[^"]+)">(?P<episode>[^ ]+) (?P<lang>[Ss][Uu][Bb].[Ii][Tt][Aa])?(?P<title2>[^<]+)?'
return locals()
@support.scrape
def peliculas(item):
action = 'check'
item.contentType = 'undefined'
if item.args == 'search':
patron = r'<a href="(?P<url>[^"]+)" title="Permalink to\s*(?P<title>[^"]+) \((?P<year>[0-9]+)[^<]*\)[^"]*"[^>]+>\s*<img[^s]+src="(?P<thumb>[^"]+)".*?<div class="calitate">\s*<p>(?P<quality>[^<]+)<\/p>'
else:
patronNext = r'<a class="nextpostslink" rel="next" href="([^"]+)">'
patron = r'<div class="mediaWrap mediaWrapAlt">\s*<a href="(?P<url>[^"]+)"(?:[^>]+)?>?\s*(?:<img[^s]+src="(?P<thumb>[^"]+)"[^>]+>\s*)?<\/a>[^>]+>[^>]+>[^>]+>(?P<title>[^<]+?)(?P<lang>[sS][uU][bB]\-[iI][tT][aA]+)?(?:[ ]?\((?P<year>\d{4})-?(?:\d{4})?)\).[^<]+[^>]+><\/a>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>\s*(?P<quality>[a-zA-Z-0-9\.]+)?'
patronBlock = r'<div id="main_col">(?P<block>.*?)<!\-\- main_col \-\->'
return locals() return locals()
@support.scrape
def episodios(item):
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 = 'Stagioni<\/a>.*?<ul class="nav navbar-nav">(.*?)<\/ul>'
patron_episode = 'Episodio<\/a>.*?<ul class="nav navbar-nav">(?P<block>.*?)<\/ul>'
patron_option = r'<a href="([^"]+?)".*?>[^>]+></i>\s*(\d+)'
if item.data:
url = support.match(item.data, patron=player_iframe).match
item.data = ''
else:
url = support.match(item, patron=player_iframe).match
seasons = support.match(url, patronBlock=patron_season, patron=patron_option)
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, '', season[0], season[1]))
for res in futures.as_completed(thL):
if res.result():
data += res.result()
patron = r'(?P<season>\d+)x(?P<episode>\d+)\s*-\s*(?P<title>[^\|]+)\|(?P<url>[^ ]+)'
# debug = True
action = 'findvideos'
def itemlistHook(itemlist):
itemlist.sort(key=lambda item: (item.infoLabels['season'], item.infoLabels['episode']))
return itemlist
return locals()
def check(item):
item.data = support.match(item.url, headers=headers).data
check = support.match(item.data, patron=r'<div class="category-film">(.*?)</div>').match
if 'sub' in check.lower():
item.contentLanguage = 'Sub-ITA'
logger.debug("CHECK : ", check)
# if 'anime' in check.lower():
# item.contentType = 'tvshow'
# logger.debug('select = ### è una anime ###')
# try:
# return episodios(item)
# except:
# pass
if 'serie' in check.lower():
item.contentType = 'tvshow'
return episodios(item)
else:
item.contentTitle = item.fulltitle
item.contentType = 'movie'
return findvideos(item)
def findvideos(item):
logger.debug()
data = item.data if item.data else support.match(item.url, headers=headers).data
itemlist = []
if '/serietv/series/names' in item.url:
itemlist.extend(support.server(item, itemlist=hdpass(Item(url=item.url))))
else:
urls = support.match(data, patron=player_iframe).matches
if item.otherLinks:
urls += support.match(item.otherLinks, patron=r'href="([^"]+)').matches
logger.debug('URLS', urls)
for u in urls:
if 'hdplayer.casa/series/' in u:
urls.remove(u)
itemlist.extend(support.server(item, itemlist=hdpass(Item(url=u))))
break
else:
itemlist.extend(support.server(item, urls))
support.addQualityTag(item, itemlist, data, 'Keywords:\s*(?:<span>)?([^<]+)')
return itemlist
@support.scrape @support.scrape
def hdpass(item): def hdpass(item):
patronBlock = r'<ul class="nav navbar-nav">(?P<block>.*?)</ul>' patronBlock = r'<ul class="nav navbar-nav">(?P<block>.*?)</ul>'
@@ -151,69 +188,4 @@ def hdpass(item):
url = support.match(item.url, patron='<iframe.*?src="([^"]+)').match url = support.match(item.url, patron='<iframe.*?src="([^"]+)').match
return Item(url=url) return Item(url=url)
return locals() return locals()
def findvideos(item):
info()
support.info("ITEMLIST: ", item)
data = support.match(item.url, headers=headers).data
check = support.match(data, patron=r'<div class="category-film">(.*?)</div>').match
if 'sub' in check.lower():
item.contentLanguage = 'Sub-ITA'
support.info("CHECK : ", check)
if 'anime' in check.lower():
item.contentType = 'tvshow'
item.data = data
support.info('select = ### è una anime ###')
try:
return episodios(item)
except:
pass
elif 'serie' in check.lower():
item.contentType = 'tvshow'
item.data = data
return episodios(item)
else:
item.contentTitle = item.fulltitle
item.contentType = 'movie'
# if 'protectlink' in data:
# urls = scrapertools.find_multiple_matches(data, r'<iframe src="[^=]+=(.*?)"')
# support.info("SONO QUI: ", urls)
# for url in urls:
# url = url.decode('base64')
# # tiro via l'ultimo carattere perchè non c'entra
# url, c = unshorten_only(url)
# if 'nodmca' in url:
# page = httptools.downloadpage(url, headers=headers).data
# url = '\t' + scrapertools.find_single_match(page, '<meta name="og:url" content="([^=]+)">')
# if url:
# listurl.add(url)
# data += '\n'.join(listurl)
info(data)
itemlist = []
# support.dbg()
if '/serietv/series/names' in item.url:
itemlist.extend(support.server(item, itemlist=hdpass(Item(url=item.url))))
else:
urls = support.match(data, patron=player_iframe).matches
# support.dbg()
if item.otherLinks:
urls += support.match(item.otherLinks, patron=r'href="([^"]+)').matches
info('URLS', urls)
for u in urls:
if 'hdplayer.casa/series/' in u:
urls.remove(u)
itemlist.extend(support.server(item, itemlist=hdpass(Item(url=u))))
break
if 'protectlink.stream' in u:
import base64
urls.remove(u)
urls.append(base64.b64decode(u.split('?data=')[1]))
else:
itemlist.extend(support.server(item, urls))
support.addQualityTag(item, itemlist, data, 'Keywords:\s*(?:<span>)?([^<]+)')
return itemlist
-11
View File
@@ -1,11 +0,0 @@
{
"id": "tapmovie",
"name": "Tap Movie",
"language": ["ita", "sub-ita"],
"active": true,
"thumbnail": "tapmovie.png",
"banner": "tapmovie.png",
"categories": ["movie", "tvshow", "anime"],
"not_active": ["include_in_newest"],
"settings": []
}
-102
View File
@@ -1,102 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per 'dvdita'
from core import support, httptools
from core.item import Item
import sys
if sys.version_info[0] >= 3: from concurrent import futures
else: from concurrent_py2 import futures
host = support.config.get_channel_url()
api_url = '/api/v2/'
per_page = 24
@support.menu
def mainlist(item):
film = ['/browse/movie']
tvshow = ['/browse/tvshow']
search = ''
# [Voce Menu,['url','action','args',contentType]
top = [('Generi', ['', 'genres', '', 'undefined'])]
return locals()
def episodios(item):
support.info(item)
itemlist = []
with futures.ThreadPoolExecutor() as executor:
thL = []
for season in httptools.downloadpage(host + api_url + 'tvshow', post={'tvshow_id': item.id}).json.get('season', []):
season_id = season['season_number']
thL.append(executor.submit(httptools.downloadpage, host + api_url + 'episodes', post={'tvshow_id': item.id, 'season_id': season_id}))
for th in futures.as_completed(thL):
for episode in th.result().json.get('episodes', []):
itemlist.append(item.clone(action="findvideos", contentSeason=episode['season_id'], contentEpisodeNumber=episode['episode_number'], id=item.id,
title=episode['season_id']+'x'+episode['episode_number'], contentType='episode'))
support.scraper.sort_episode_list(itemlist)
support.videolibrary(itemlist, item)
support.download(itemlist, item)
return itemlist
def genres(item):
itemlist = []
for n, genre in enumerate(httptools.downloadpage(host + api_url + 'categories', post={}).json.get('categories', [])):
itemlist.append(item.clone(action="peliculas", genre=genre.get('name'), title=genre.get('value'), n=n))
return support.thumb(itemlist, genre=True)
def peliculas(item, text=''):
support.info('search', item)
itemlist = []
filter_type = False
if item.genre:
text = item.genre
cmd = 'search/category'
else:
cmd = 'search'
if not text:
filter_type = True
try:
page = int(item.url.split('?p=')[1])
except:
page = 1
results = httptools.downloadpage(host + api_url + cmd, post={'search': text, 'page': page}).json.get('results', [])
for result in results:
contentType = 'movie' if result['type'] == 'FILM' else 'tvshow'
if not filter_type or (filter_type and contentType == item.contentType):
itemlist.append(item.clone(id=result.get('id'), title=result.get('title'), contentTitle=result.get('title'),
contentSerieName='' if contentType == 'movie' else result.get('title'),
contentPlot=result.get('description'), thumbnail=result.get('poster'),
fanart=result.get('backdrop'), year=result.get('year'), action='episodios' if contentType == 'tvshow' else 'findvideos',
url='{}/{}/{}-{}'.format('https://filmigratis.org', contentType, result.get('id'), support.scrapertools.slugify(result.get('title'))),
contentType=contentType))
support.tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
if len(results) >= per_page:
page += 1
support.nextPage(itemlist, item, next_page='https://filmigratis.org/category/' + str(item.n) + '/' + item.genre + '?p=' + str(page))
return itemlist
def search(item, text):
return peliculas(item, text)
def findvideos(item):
itemlist = []
if not item.contentSeason: # film
json = httptools.downloadpage(host + api_url + 'movie', post={'movie_id': item.id}).json
else:
json = httptools.downloadpage(host + api_url + 'episode/links', post={'tvshow_id': item.id, 'season_id': item.contentSeason, 'episode_id': item.contentEpisodeNumber}).json
for i in json.get('links', []) + json.get('special', []):
itemlist.append(Item(url=i.get('link')))
return support.server(item, itemlist=itemlist)
+33 -15
View File
@@ -3,8 +3,8 @@
# Canale per ToonItalia # Canale per ToonItalia
# ------------------------------------------------------------ # ------------------------------------------------------------
from core import scrapertools, support from core import httptools, scrapertools, support
import sys import inspect
host = support.config.get_channel_url() host = support.config.get_channel_url()
headers = [['Referer', host]] headers = [['Referer', host]]
@@ -90,24 +90,42 @@ def peliculas(item):
return locals() return locals()
@support.scrape
def episodios(item): def episodios(item):
anime = True @support.scrape
# debug = True def findepisode(item):
patron = r'>\s*(?:(?P<season>\d+)(?:&#215;|x|×))?(?P<episode>\d+)(?:\s+&#8211;\s+)?[ ]+(?P<title2>[^<]+)[ ]+<a (?P<data>.*?)(?:<br|</p)' actLike = 'episodios'
# data = '' patron = r'>\s*(?:(?P<season>\d+)(?:&#215;|x|×))?(?P<episode>\d+)(?:\s+&#8211;\s+)?[ ]+(?P<title2>[^<]+)[ ]+<a (?P<data>.*?)(?:<br|</p)'
# match = support.match(item, headers=headers, patron=r'(?: /> |<p>)(?:(?P<season>\d+)&#215;)?(?P<episode>\d+)(?:\s+&#8211;\s+)?(?P<title>[^<]+)<a (?P<data>.*?)(?:<br|</p)').matches return locals()
# if match:
# for m in match:
# data += '{}{:02d}|{}|{}|'.format(m[0]+'x' if m[0] else '', int(m[1]), clean_title(m[2]), m[3])
#
# patron = r'(?P<episode>[^|]+)\|(?P<title>[^|]+)\|(?P<data>[^|]+)\|'
return locals() itemlist = findepisode(item)
if not itemlist: itemlist = [item.clone(action='findvideos')]
if inspect.stack(0)[1][3] not in ['find_episodes']:
from platformcode import autorenumber
autorenumber.start(itemlist, item)
return itemlist
def findvideos(item): def findvideos(item):
return support.server(item, item.data if item.contentType != 'movie' else support.match(item.url, headers=headers).data ) servers = []
itemlist = []
if item.data:
data = item.data
else:
data = httptools.downloadpage(item.url, headers=headers).data
matches =support.match(data, patron='href="([^"]+)[^>]+>([^<\d]+)(\d+p)?').matches
if matches:
for match in matches:
itemlist.append(item.clone(server=match[1].strip().lower(), quality=match[2], url=match[0]))
if itemlist:
servers = support.server(item, itemlist=itemlist)
else:
servvers = support.server(item, data=data)
return servers
# return support.server(item, item.data if item.contentType != 'movie' else support.match(item.url, headers=headers).data )
def clean_title(title): def clean_title(title):
-10
View File
@@ -1,10 +0,0 @@
{
"id": "vedohd",
"name": "VedoHD",
"language": ["ita"],
"active": false,
"thumbnail": "vedohd.png",
"banner": "vedohd.png",
"categories": ["movie"],
"settings": []
}
-69
View File
@@ -1,69 +0,0 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per vedohd
# ------------------------------------------------------------
from core import scrapertools, support, autoplay
from platformcode import logger, config
host = config.get_channel_url()
headers = ""
IDIOMAS = {'Italiano': 'IT'}
list_language = IDIOMAS.values()
#esclusione degli articoli 'di servizio'
blacklist = ['CB01.UNO &#x25b6; TROVA L&#8217;INDIRIZZO UFFICIALE ', 'AVVISO IMPORTANTE CB01.UNO', 'GUIDA VEDOHD']
@support.menu
def mainlist(item):
film = [
('I più votati', ["ratings/?get=movies", 'peliculas']),
('I più popolari', ["trending/?get=movies", 'peliculas']),
('Generi', ['ratings/?get=movies', 'menu', 'genres']),
('Anno', ["", 'menu', 'releases']),
]
return locals()
def search(item, text):
logger.info("search",text)
item.url = item.url + "/?s=" + text
return support.dooplay_search(item, blacklist)
def peliculas(item):
return support.dooplay_peliculas(item, False, blacklist)
def findvideos(item):
itemlist = []
for link in support.dooplay_get_links(item, host):
if link['title'] != 'Trailer':
server, quality = scrapertools.find_single_match(link['title'], '([^ ]+) ?(HD|3D)?')
if quality:
title = server + " [COLOR blue][" + quality + "][/COLOR]"
else:
title = server
itemlist.append(item.clone(action="play", title=title, url=link['url'], server=server, quality=quality,))
autoplay.start(itemlist, item)
return itemlist
@support.scrape
def menu(item):
return support.dooplay_menu(item, item.args)
def play(item):
logger.debug()
data = support.swzz_get_url(item)
return support.server(item, data, headers=headers)
+69 -25
View File
@@ -2,14 +2,17 @@
# ------------------------------------------------------------ # ------------------------------------------------------------
# Canale per vvvvid # Canale per vvvvid
# ---------------------------------------------------------- # ----------------------------------------------------------
import functools, re
import requests, sys, inspect import requests, sys, inspect
from core import jsontools, support, tmdb from core import support, tmdb, httptools
from platformcode import autorenumber, logger, config from platformcode import autorenumber, logger, config
host = support.config.get_channel_url() host = 'https://www.vvvvid.it'
# Creating persistent session # Creating persistent session
current_session = requests.Session() current_session = requests.Session()
# current_session.request = functools.partial(current_session.request, timeout=httptools.HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT)
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36'} headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36'}
# Getting conn_id token from vvvvid and creating payload # Getting conn_id token from vvvvid and creating payload
@@ -24,7 +27,7 @@ except:
main_host = host + '/vvvvid/ondemand/' main_host = host + '/vvvvid/ondemand/'
# host = main_host pagination = 20
@support.menu @support.menu
@@ -87,6 +90,7 @@ def search(item, text):
def newest(categoria): def newest(categoria):
item = support.Item() item = support.Item()
item.args = 'channel/10007/last/' item.args = 'channel/10007/last/'
item.newest = True
if categoria == 'peliculas': if categoria == 'peliculas':
item.contentType = 'movie' item.contentType = 'movie'
item.url = main_host + 'film/' item.url = main_host + 'film/'
@@ -100,12 +104,13 @@ def newest(categoria):
def peliculas(item): def peliculas(item):
if not item.page:item.page = 1
itemlist = [] itemlist = []
# support.dbg()
if not item.args: if not item.args:
json_file =loadjs(item.url + 'channel/10005/last/') if not itemlist:
support.logger.debug(json_file) json_file =loadjs(item.url + 'channel/10005/last/')
make_itemlist(itemlist, item, json_file) support.logger.debug(json_file)
make_itemlist(itemlist, item, json_file)
elif ('=' not in item.args) and ('=' not in item.url): elif ('=' not in item.args) and ('=' not in item.url):
json_file=loadjs(item.url + item.args) json_file=loadjs(item.url + item.args)
@@ -127,6 +132,28 @@ def peliculas(item):
json_file=loadjs(item.url) json_file=loadjs(item.url)
item.args='' item.args=''
make_itemlist(itemlist, item, json_file) make_itemlist(itemlist, item, json_file)
itlist = []
if not item.newest:
for i, it in enumerate(itemlist):
if pagination and (item.page - 1) * pagination > i: continue # pagination
if pagination and i >= item.page * pagination: break # pagination
itlist.append(it)
if pagination and len(itemlist) >= pagination:
if inspect.stack(0)[1][3] != 'get_newest':
itlist.append(
item.clone(action='peliculas',
title=support.typo(config.get_localized_string(30992), 'color kod bold'),
fulltitle=item.fulltitle,
show=item.show,
url=item.url,
args=item.args,
page=item.page + 1,
thumbnail=support.thumb()))
itemlist = itlist
if 'category' in item.args: if 'category' in item.args:
support.thumb(itemlist,genre=True) support.thumb(itemlist,genre=True)
elif not 'filter' in item.args: elif not 'filter' in item.args:
@@ -165,7 +192,7 @@ def episodios(item):
action= 'findvideos', action= 'findvideos',
video_id= episode['video_id'])) video_id= episode['video_id']))
if inspect.stack()[1][3] not in ['find_episodes']: if inspect.stack(0)[1][3] not in ['find_episodes']:
autorenumber.start(itemlist, item) autorenumber.start(itemlist, item)
support.videolibrary(itemlist,item) support.videolibrary(itemlist,item)
@@ -184,9 +211,16 @@ def findvideos(item):
logger.info(episode) logger.info(episode)
if episode['video_id'] == item.video_id: if episode['video_id'] == item.video_id:
url = vvvvid_decoder.dec_ei(episode['embed_info'] or episode['embed_info_sd']) url = vvvvid_decoder.dec_ei(episode['embed_info'] or episode['embed_info_sd'])
if 'youtube' in url: item.url = url # if 'youtube' in url: item.url = url
item.url = url.replace('manifest.f4m','master.m3u8').replace('http://','https://').replace('/z/','/i/') item.url = url.replace('manifest.f4m','master.m3u8').replace('http://','https://').replace('/z/','/i/')
if 'https' not in item.url: if 'youtube' in url:
itemlist.append(
item.clone(action= 'play',
title= 'YouTube',
url= item.url,
server= 'youtube')
)
elif 'https' not in item.url:
url = support.match('https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/playlist.m3u').data url = support.match('https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/playlist.m3u').data
url = url.split()[-1] url = url.split()[-1]
itemlist.append( itemlist.append(
@@ -203,7 +237,8 @@ def findvideos(item):
item.clone(action= 'play', item.clone(action= 'play',
title=config.get_localized_string(30137), title=config.get_localized_string(30137),
url= item.url + '?' + key, url= item.url + '?' + key,
server= 'directo') server= 'directo',
manifest='hls')
) )
return support.server(item, itemlist=itemlist, Download=False) return support.server(item, itemlist=itemlist, Download=False)
@@ -214,23 +249,32 @@ def make_itemlist(itemlist, item, data):
for key in data['data']: for key in data['data']:
if search.lower() in encode(key['title']).lower(): if search.lower() in encode(key['title']).lower():
title = encode(key['title']) title = encode(key['title'])
fulltitle=title.split('-')[0].strip() fulltitle=re.split(' - |\(', title)[0].strip()
infoLabels['year'] = key['date_published'] ct = key.get('show_type_name', '').lower()
if ct == 'serie': contentType = 'tvshow'
elif ct == 'film': contentType = 'movie'
else: contentType = item.contentType
infoLabels['title'] = fulltitle infoLabels['title'] = fulltitle
if item.contentType != 'movie': infoLabels['tvshowtitle'] = fulltitle infoLabels['tvshowtitle'] = fulltitle
itemlist.append( infoLabels['mediatype'] = contentType
item.clone(title = support.typo(title, 'bold'), infoLabels['year'] = key['date_published']
fulltitle= title,
show= title, it = item.clone(title = support.typo(title, 'bold'),
url= main_host + str(key['show_id']) + '/seasons/', fulltitle= title,
action= 'findvideos' if item.contentType == 'movie' else 'episodios', show= title,
contentType = item.contentType, url= main_host + str(key['show_id']) + '/seasons/',
contentSerieName= fulltitle if item.contentType != 'movie' else '', action= 'findvideos' if contentType == 'movie' else 'episodios',
contentTitle= fulltitle if item.contentType == 'movie' else '', infoLabels=infoLabels,
infoLabels=infoLabels, thumbnail=support.thumb(contentType),
videolibrary=False)) videolibrary=False)
itemlist.append(it)
return itemlist return itemlist
def loadjs(url): def loadjs(url):
if '?category' not in url: if '?category' not in url:
url += '?full=true' url += '?full=true'
+1 -1
View File
@@ -253,7 +253,7 @@ def set_channel_info(parameters):
def auto_filter(auto_lang=False): def auto_filter(auto_lang=False):
list_lang = ['ita', 'vos', 'sub-ita'] list_lang = ['ita', 'vos', 'sub-ita']
if config.get_setting("channel_language") == 'auto' or auto_lang == True: if config.get_setting("channel_language") == 'auto' or auto_lang == True:
lang = config.get_localized_string(20001) lang = config.get_language()
else: else:
lang = config.get_setting("channel_language", default="all") lang = config.get_setting("channel_language", default="all")
+9 -6
View File
@@ -1,10 +1,12 @@
from platformcode import config, logger from platformcode import config, logger
import xbmc, sys, xbmcgui, os import xbmc, sys, xbmcgui, os
librerias = xbmc.translatePath(os.path.join(config.get_runtime_path(), 'lib')) librerias = xbmc.translatePath(os.path.join(config.get_runtime_path(), 'lib'))
sys.path.insert(0, librerias) sys.path.insert(0, librerias)
from core import jsontools, support from core import jsontools, support
from core.item import Item
addon_id = config.get_addon_core().getAddonInfo('id') addon_id = config.get_addon_core().getAddonInfo('id')
@@ -15,6 +17,7 @@ f.close()
def build_menu(): def build_menu():
# from core.support import dbg;dbg()
tmdbid = xbmc.getInfoLabel('ListItem.Property(tmdb_id)') tmdbid = xbmc.getInfoLabel('ListItem.Property(tmdb_id)')
mediatype = xbmc.getInfoLabel('ListItem.DBTYPE') mediatype = xbmc.getInfoLabel('ListItem.DBTYPE')
title = xbmc.getInfoLabel('ListItem.Title') title = xbmc.getInfoLabel('ListItem.Title')
@@ -24,9 +27,9 @@ def build_menu():
containerPath = xbmc.getInfoLabel('Container.FolderPath') containerPath = xbmc.getInfoLabel('Container.FolderPath')
logstr = "Selected ListItem is: 'IMDB: {}' - TMDB: {}' - 'Title: {}' - 'Year: {}'' - 'Type: {}'".format(imdb, tmdbid, title, year, mediatype) logstr = "Selected ListItem is: 'IMDB: {}' - TMDB: {}' - 'Title: {}' - 'Year: {}'' - 'Type: {}'".format(imdb, tmdbid, title, year, mediatype)
logger.info(logstr) logger.debug(logstr)
logger.info(filePath) logger.debug(filePath)
logger.info(containerPath) logger.debug(containerPath)
contextmenuitems = [] contextmenuitems = []
contextmenuactions = [] contextmenuactions = []
@@ -35,20 +38,20 @@ def build_menu():
logger.debug('check contextmenu', itemmodule) logger.debug('check contextmenu', itemmodule)
module = __import__(itemmodule, None, None, [itemmodule]) module = __import__(itemmodule, None, None, [itemmodule])
logger.info('Add contextmenu item ->', itemmodule) logger.debug('Add contextmenu item ->', itemmodule)
module_item_actions = module.get_menu_items() module_item_actions = module.get_menu_items()
contextmenuitems.extend([item for item, fn in module_item_actions]) contextmenuitems.extend([item for item, fn in module_item_actions])
contextmenuactions.extend([fn for item, fn in module_item_actions]) contextmenuactions.extend([fn for item, fn in module_item_actions])
if len(contextmenuitems) == 0: if len(contextmenuitems) == 0:
logger.info('No contextmodule found, build an empty one') logger.debug('No contextmodule found, build an empty one')
contextmenuitems.append(empty_item()) contextmenuitems.append(empty_item())
contextmenuactions.append(lambda: None) contextmenuactions.append(lambda: None)
ret = xbmcgui.Dialog().contextmenu(contextmenuitems) ret = xbmcgui.Dialog().contextmenu(contextmenuitems)
if ret > -1: if ret > -1:
logger.info('Contextmenu module index', ret, ', label=' + contextmenuitems[ret]) logger.debug('Contextmenu module index', ret, ', label=' + contextmenuitems[ret])
contextmenuactions[ret]() contextmenuactions[ret]()
+49
View File
@@ -0,0 +1,49 @@
import base64
import socket
from http.server import BaseHTTPRequestHandler, HTTPServer
import xbmc, random
from core import jsontools, httptools
from platformcode import logger
hostName = xbmc.getIPAddress()
serverPort = random.randint(49152, 65535)
ret = []
call = 'kodapp://app.kod/open?s={}&ua={}&cb=http://{}:{}/'
class MyServer(BaseHTTPRequestHandler):
def do_POST(self):
global ret
length = int(self.headers['content-length'])
postvars = self.rfile.read(length).decode()
ret = jsontools.load(postvars)
logger.info(ret)
self.send_response(200)
self.send_header("Content-type", "text/plain")
self.end_headers()
self.wfile.write(b"OK")
def call_url(url):
global serverPort
webServer = None
for t in range(10): # try up to 10 port if already in use
try:
webServer = HTTPServer((hostName, serverPort), MyServer)
break
except socket.error:
serverPort += 1
if webServer:
logger.info("Server started http://%s:%s" % (hostName, serverPort))
s = base64.b64encode(jsontools.dump({'url': url}).encode()).decode()
ua = base64.b64encode(httptools.get_user_agent().encode()).decode()
uri = call.format(s, ua, hostName, serverPort)
if logger.DEBUG_ENABLED:
uri += '&l=1'
activity = 'StartAndroidActivity("com.kodapp","android.intent.action.VIEW","",{})'.format(uri)
logger.info(activity)
xbmc.executebuiltin(activity)
while not ret:
webServer.handle_request()
logger.info("Server stopped.")
return ret
+12 -3
View File
@@ -27,7 +27,9 @@ def start(itemlist, item):
:return: try to auto-reproduce, in case of failure it returns the itemlist that it received in the beginning :return: try to auto-reproduce, in case of failure it returns the itemlist that it received in the beginning
''' '''
if item.global_search: if item.global_search or item.from_action or item.contentAction: # from_action means that's a special function calling this (ex: add to videolibrary)
return itemlist
if len([s for s in itemlist if s.server]) == 1:
return itemlist return itemlist
logger.debug() logger.debug()
@@ -39,7 +41,14 @@ def start(itemlist, item):
if not config.is_xbmc(): if not config.is_xbmc():
return itemlist return itemlist
if config.get_setting('autoplay') or (item.channel == 'community' and item.autoplay): import xbmc
control_info = xbmc.getInfoLabel('Container.FolderPath')
if control_info:
control_item = Item().fromurl(control_info)
if control_item.action == item.action:
return itemlist
if config.get_setting('autoplay') or item.autoplay:
# Save the current value of "Action and Player Mode" in preferences # Save the current value of "Action and Player Mode" in preferences
user_config_setting_action = config.get_setting("default_action") user_config_setting_action = config.get_setting("default_action")
# user_config_setting_player = config.get_setting("player_mode") # user_config_setting_player = config.get_setting("player_mode")
@@ -119,7 +128,7 @@ def start(itemlist, item):
max_intents_servers[videoitem.server.lower()] = max_intents max_intents_servers[videoitem.server.lower()] = max_intents
# If there are no items in the list, it is reported # If there are no items in the list, it is reported
if autoplay_elem == autoplay_list[-1]: if autoplay_elem == autoplay_list[-1] and autoplay_elem.server != 'torrent':
platformtools.dialog_notification('AutoPlay', config.get_localized_string(60072) % name) platformtools.dialog_notification('AutoPlay', config.get_localized_string(60072) % name)
else: else:
+33 -13
View File
@@ -30,7 +30,7 @@ cookies_file = os.path.join(config.get_data_path(), "cookies.dat")
# Headers by default, if nothing is specified # Headers by default, if nothing is specified
default_headers = dict() default_headers = dict()
default_headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36" % config.get_setting("chrome_ua_version") default_headers["User-Agent"] = "Mozilla/5.0 (Linux; Android 13; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36" % config.get_setting("chrome_ua_version")
default_headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" default_headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
default_headers["Accept-Language"] = "it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3" default_headers["Accept-Language"] = "it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3"
default_headers["Accept-Charset"] = "UTF-8" default_headers["Accept-Charset"] = "UTF-8"
@@ -48,11 +48,11 @@ directIP = {
'nored.icu': '31.220.1.77', 'nored.icu': '31.220.1.77',
'wstream.icu': '31.220.1.77', 'wstream.icu': '31.220.1.77',
'wstream.video': '31.220.1.77', 'wstream.video': '31.220.1.77',
'krask.xyz': '31.220.1.77' 'krask.xyz': '31.220.1.77',
} }
# Maximum wait time for downloadpage, if nothing is specified # Maximum wait time for downloadpage, if nothing is specified
HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT = config.get_setting('httptools_timeout', default=15) HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT = config.get_setting('httptools_timeout', default=5)
if HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT == 0: HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT = None if HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT == 0: HTTPTOOLS_DEFAULT_DOWNLOAD_TIMEOUT = None
# Random use of User-Agents, if nad is not specified # Random use of User-Agents, if nad is not specified
@@ -375,8 +375,14 @@ def downloadpage(url, **opt):
timeout=opt['timeout']) timeout=opt['timeout'])
else: else:
# Makes the request with POST method # Makes the request with POST method
req = session.post(url, data=payload, allow_redirects=opt.get('follow_redirects', True), req = session.post(url, data=payload, allow_redirects=False,
files=files, timeout=opt['timeout']) files=files, timeout=opt['timeout'])
# Make sure it follows redirects
i = 10
while opt.get('follow_redirects', True) and i > 0 and req.status_code == 301:
req = session.post(req.headers['Location'], data=payload, allow_redirects=False,
files=files, timeout=opt['timeout'])
i -= 1
elif opt.get('only_headers', False): elif opt.get('only_headers', False):
info_dict = fill_fields_pre(url, opt, proxy_data, file_name) info_dict = fill_fields_pre(url, opt, proxy_data, file_name)
@@ -412,6 +418,8 @@ def downloadpage(url, **opt):
return type('HTTPResponse', (), response) return type('HTTPResponse', (), response)
response_code = req.status_code response_code = req.status_code
response_headers = req.headers
cookies = req.cookies
response['url'] = req.url response['url'] = req.url
response['data'] = req.content if req.content else '' response['data'] = req.content if req.content else ''
@@ -425,13 +433,25 @@ def downloadpage(url, **opt):
if req.headers.get('Server', '').startswith('cloudflare') and response_code in [429, 503, 403]\ if req.headers.get('Server', '').startswith('cloudflare') and response_code in [429, 503, 403]\
and not opt.get('CF', False) and 'Ray ID' in response['data'] and not opt.get('post', None): and not opt.get('CF', False) and 'Ray ID' in response['data'] and not opt.get('post', None):
logger.debug("CF retry... for domain: %s" % domain) logger.debug("CF retry... for domain: %s" % domain)
from lib import proxytranslate from core import app
gResp = proxytranslate.process_request_proxy(url) ret = app.call_url(url)
if gResp: for elem in ret:
req = gResp['result'] if elem['key'] == 'html':
response_code = req.status_code response['data'] = elem['html']
response['url'] = gResp['url'] elif elem['key'] == 'cookie':
response['data'] = gResp['data'] for cookie in elem:
if cookie == 'key': # not a cookie
continue
elem[cookie]['domain'] = domain
set_cookies(elem[cookie], False)
response_code = [r['status'] for r in ret if r['key'] == 'request'][0]
# from lib import proxytranslate
# gResp = proxytranslate.process_request_proxy(url)
# if gResp:
# req = gResp['result']
# response_code = req.status_code
# response['url'] = gResp['url']
# response['data'] = gResp['data']
if not response['data']: if not response['data']:
response['data'] = '' response['data'] = ''
@@ -442,8 +462,8 @@ def downloadpage(url, **opt):
response['json'] = dict() response['json'] = dict()
response['code'] = response_code response['code'] = response_code
response['headers'] = req.headers response['headers'] = response_headers
response['cookies'] = req.cookies response['cookies'] = cookies
info_dict, response = fill_fields_post(info_dict, req, response, req_headers, inicio) info_dict, response = fill_fields_post(info_dict, req, response, req_headers, inicio)
+8 -2
View File
@@ -283,6 +283,12 @@ class Item(object):
def __str__(self): def __str__(self):
return '\r\t' + self.tostring('\r\t') return '\r\t' + self.tostring('\r\t')
def __eq__(self, other):
if type(other) == Item:
return self.__dict__ == other.__dict__
else:
return False
def set_parent_content(self, parentContent): def set_parent_content(self, parentContent):
""" """
Fill the contentDetails fields with the information of the item "parent" Fill the contentDetails fields with the information of the item "parent"
@@ -349,7 +355,7 @@ class Item(object):
dump = "".encode("utf8") dump = "".encode("utf8")
return str(urllib.quote(base64.b64encode(dump))) return str(urllib.quote(base64.b64encode(dump)))
def fromurl(self, url): def fromurl(self, url, silent=False):
""" """
Generate an item from a text string. The string can be created by the tourl () function or have Generate an item from a text string. The string can be created by the tourl () function or have
the old format: plugin: //plugin.video.kod/? channel = ... (+ other parameters) the old format: plugin: //plugin.video.kod/? channel = ... (+ other parameters)
@@ -363,7 +369,7 @@ class Item(object):
decoded = False decoded = False
try: try:
str_item = base64.b64decode(urllib.unquote(url)) str_item = base64.b64decode(urllib.unquote(url))
json_item = json.load(str_item, object_hook=self.toutf8) json_item = json.load(str_item, object_hook=self.toutf8, silent=silent)
if json_item is not None and len(json_item) > 0: if json_item is not None and len(json_item) > 0:
self.__dict__.update(json_item) self.__dict__.update(json_item)
decoded = True decoded = True
+10 -3
View File
@@ -16,15 +16,22 @@ if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int
def load(*args, **kwargs): def load(*args, **kwargs):
silent = False
if 'silent' in kwargs:
silent = kwargs['silent']
kwargs.pop('silent')
if "object_hook" not in kwargs: if "object_hook" not in kwargs:
kwargs["object_hook"] = to_utf8 kwargs["object_hook"] = to_utf8
try: try:
value = json.loads(*args, **kwargs) value = json.loads(*args, **kwargs)
except: except:
logger.error("**NOT** able to load the JSON") if not silent:
logger.error(traceback.format_exc()) logger.error("**NOT** able to load the JSON")
logger.error('ERROR STACK ' + str(stack()[1][3])) logger.error(traceback.format_exc())
if len(stack()) > 1:
logger.error('ERROR STACK {}'.format(stack()[2]) )
value = {} value = {}
return value return value
+5 -2
View File
@@ -59,13 +59,16 @@ class CipherSuiteAdapter(host_header_ssl.HostHeaderSSLAdapter):
cache = db['dnscache'].get(domain, {}) cache = db['dnscache'].get(domain, {})
ip = None ip = None
if type(cache) != dict or (cache.get('datetime') and if type(cache) != dict or (cache.get('datetime') and
current_date - cache.get('datetime') > datetime.timedelta(days=7)): current_date - cache.get('datetime') > datetime.timedelta(hours=1)):
cache = None cache = None
if not cache: # not cached if not cache: # not cached
try: try:
ip = doh.query(domain)[0] ip = doh.query(domain)[0]
logger.info('Query DoH: ' + domain + ' = ' + str(ip)) logger.info('Query DoH: ' + domain + ' = ' + str(ip))
# IPv6 address
if ':' in ip:
ip = '[' + ip + ']'
self.writeToCache(domain, ip) self.writeToCache(domain, ip)
except Exception: except Exception:
logger.error('Failed to resolve hostname, fallback to normal dns') logger.error('Failed to resolve hostname, fallback to normal dns')
@@ -96,7 +99,7 @@ class CipherSuiteAdapter(host_header_ssl.HostHeaderSSLAdapter):
domain = parse.netloc domain = parse.netloc
else: else:
raise requests.exceptions.URLRequired raise requests.exceptions.URLRequired
if not scrapertools.find_single_match(domain, '\d+\.\d+\.\d+\.\d+'): if not scrapertools.find_single_match(domain, '\d+\.\d+\.\d+\.\d+') and ':' not in domain:
ip = self.getIp(domain) ip = self.getIp(domain)
else: else:
ip = None ip = None

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