From 5f648ef72bf3d2c692e332582f903d74d506f9d4 Mon Sep 17 00:00:00 2001 From: UrloMythus Date: Tue, 9 Jul 2024 16:42:23 +0200 Subject: [PATCH] Added StreamingCommunity and rewrote Readme.md --- .gitignore | 3 +- README.md | 30 ++++- __pycache__/convert.cpython-311.pyc | Bin 1489 -> 1164 bytes __pycache__/filmpertutti.cpython-311.pyc | Bin 11669 -> 6660 bytes __pycache__/info.cpython-311.pyc | Bin 1212 -> 1988 bytes __pycache__/loadenv.cpython-311.pyc | Bin 738 -> 822 bytes .../streamingcommunity.cpython-311.pyc | Bin 0 -> 5205 bytes convert.py | 17 +-- example.env | 7 +- filmpertutti.py | 46 +++---- info.py | 22 +++- loadenv.py | 5 +- run.py | 31 +++-- streamingcommunity.py | 120 +++++++++++++----- 14 files changed, 186 insertions(+), 95 deletions(-) create mode 100644 __pycache__/streamingcommunity.cpython-311.pyc diff --git a/.gitignore b/.gitignore index 2eea525..5727f84 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.env \ No newline at end of file +.env +streamingcommunity.py \ No newline at end of file diff --git a/README.md b/README.md index 5261455..8f9b7ab 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,35 @@ # MammaMia -A Stremio Addon for HTTPS Stream in Italian -Note that for now only filmpertutti is avaiable which uses Mixdrop. Mixdrop allows to see the videos only from the same IP they were generated so, if you want to scrape filmpertutti, you have to host this project locally. + +A Stremio Addon for high quality HTTPS Stream in Italian + +While hosting, this project, remember that Filmpertutti uses Mixdrop. Mixdrop only allows seeing the videos only from the same IP where they were generated so, if you want to scrape filmpertutti, you have to host this project locally. Else, you can only scrape streamingcommunity. + + # Installation + Install required packages -`` + +`` pip install -r requirements.txt `` - -Just execute: +Then to start the Flask server just execute: `` python3 run.py `` +# How to add to Stremio +Just paste the URL/manifest.json in your search bar. # Enviroment Variables -TMDB_KEY = "Your key here" -DOMAIN = "domain here" +| Enviroment Variable | Value | +|-------------------------|---| +|TMDB_KEY|INSERT YOUR API KEY HERE| +| FT_DOMAIN | INSERT FILMPERTUTTI DOMAIN | +|SC_DOMAIN | INSERT STREAMINGCOMMUNITY DOMAIN| +|FILMPERTUTTI|Put "1" if you want Filmpertutti to be enabled, "0" if disabled Altought keep in mind that you will only be able to use it if you get the link from the same IP of your streaming server.| +|STREAMINGCOMMUNITY|Put "1" if enabled, "0" if disabled| + + + +Here is [linked](https://developer.themoviedb.org/docs/getting-started) a tutorial about how to get a TMDB KEY \ No newline at end of file diff --git a/__pycache__/convert.cpython-311.pyc b/__pycache__/convert.cpython-311.pyc index 34e2f252a11605b067be249fac2b61ff651dc68f..3531123fbc7c6ea8ee6297f8c17d62cc648ff9af 100644 GIT binary patch delta 571 zcmcb}-NUKAoR^o20SIon_olfpF)%y^abSQI%J>{IQQd(X$cti+;sC*kIi7whj0_CZ z8A^a83}nICDU3A?vl-?xr7)GSz+@SKA}P#snAWf?1KP71h#{bsv4(L0^W=$)%Job& zOew6AFbRet5mbH(8$vFH9l;J}0IK6a@QX}KIN^q%$>B0%8PM(4tKlACBvM;2LkdGM zgC?inb;zb}&-D1j2xy4md7GIQFT$)o-tjRiAm04YexrhTK$pI8C$j>WIy~SFR zo0O7R%nTHr+{zr!FAijY0=#%RkZ53-Y|G*)!Nw|bgI{Dq{1txH1&LSqHCBjR;n%ys zp*MLQi;ds~4($j0!W|`_f$AAFxr+EFv#{#u3IaK|7~_jT#;s&1k^oXgVnE^-hfQvN zN@-52U6Cx13-W1k?&Ks^Cu1?W2^kZ!res}Y5N_b;Q0xetz&Jti0}~gc$Oi^Y0&F4x Dnet(O delta 875 zcma)3&1(};5TE_te7VhsXe`lS(xyQp;-xkeF(Snrj7XuPAR*;#OC(?JZsTRs=D0!* zO}CJO7J`SiQV%_P@^46B4`ER#2tsd#-g?ou#x+^III#2P_vSahnR(lC^*xDwpU(~0 z_Aj(nZc_l?Enpk@CpgQs6ZaX6UT|$GyYZC(=l~*AsDqSIp=m$qdI^XgD}@S)$Ofh0;ca_m4-SY?;T`Ofh*elS3-|_c@5xX69_AhX zAS?_BS*0_KN3|5mBh{HML@6!NpJ3)NS|2$;p8Va$y!+dK`e(&vWQH#QqN1GyjD`= zBx^EqtyEO>JeindC2MDsmBoTwt(crxE6Puq^8??4D`<_%%0TQG!~ zgODNII^uf5Y>%JSUsLl}4wjCdeSXsu7JB@`u@KahGdve0-BM8hLfyP`5d)Kb_~daW zo0F`uKZ0}(A5sLnbAG;DMQbJTo)pK>dPI3uzeGPs1t&M}w$t0`K1?)uZTgfB5TR4} I*ZtP|1*!V1DgXcg diff --git a/__pycache__/filmpertutti.cpython-311.pyc b/__pycache__/filmpertutti.cpython-311.pyc index 3297d422dcbff30cf43a3e1110b2b2c1a24fe935..254eebc668eeaace81f4198098029638df4ee6ba 100644 GIT binary patch delta 3731 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 literal 0 HcmV?d00001 diff --git a/convert.py b/convert.py index e9f360f..f18a3ed 100644 --- a/convert.py +++ b/convert.py @@ -1,24 +1,15 @@ import requests from tmdbv3api import TMDb, Movie, TV from loadenv import load_env -TMDB_KEY, DOMAIN = load_env() - -def get_TMDb_id_from_IMDb_id(imdb_id): - if ":" in imdb_id: - season = imdb_id.split(":")[1] - episode = imdb_id[-1] - ismovie = 0 - imdb_id = imdb_id.split(":")[0] - else: - ismovie = 1 +TMDB_KEY, _, _, _,_ = load_env() +def get_TMDb_id_from_IMDb_id(imdb_id): response = requests.get(f'https://api.themoviedb.org/3/find/{imdb_id}', params={'external_source': 'imdb_id', 'api_key': f'{TMDB_KEY}'}) tmbda = response.json() if tmbda['movie_results']: - print(tmbda) - return tmbda['movie_results'][0]['id'], ismovie + return tmbda['movie_results'][0]['id'] elif tmbda['tv_results']: print(tmbda['tv_results'][0]['id']) - return tmbda['tv_results'][0]['id'], season, episode , ismovie + return tmbda['tv_results'][0]['id'] else: return None \ No newline at end of file diff --git a/example.env b/example.env index 728c59d..be021ba 100644 --- a/example.env +++ b/example.env @@ -1,2 +1,7 @@ TMDB_KEY= "INSERT YOUR API KEY HERE" -DOMAIN = "INSERT DOMAIN" +FT_DOMAIN = "INSERT FILMPERTUTTI DOMAIN" +SC_DOMAIN = "INSERT STREAMINGCOMMUNITY DOMAIN" +FILMPERTUTTI= "Put 1 if enabled, 0 if disabled" +STREAMINGCOMMUNITY = "Put 1 if enabled, 0 if disabled" + + diff --git a/filmpertutti.py b/filmpertutti.py index 20e3ccd..bc6a294 100644 --- a/filmpertutti.py +++ b/filmpertutti.py @@ -1,21 +1,24 @@ from tmdbv3api import TMDb, Movie, TV import requests -from bs4 import BeautifulSoup +from bs4 import BeautifulSoup,SoupStrainer import string import re from datetime import datetime import dateparser from convert import get_TMDb_id_from_IMDb_id from loadenv import load_env -from info import get_info +from info import get_info, is_movie from convert_date import convert_US_date +import logging -TMDB_KEY, DOMAIN = load_env() +_, FT_DOMAIN,_,_ ,_= load_env() +#Some basic headers headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.10; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', 'Accept-Language': 'en-US,en;q=0.5' } +#Map months to check if date = date month_mapping = { 'Jan': 'Gennaio', 'Feb': 'Febbraio', 'Mar': 'Marzo', 'Apr': 'Aprile', 'May': 'Maggio', 'Jun': 'Giugno', 'Jul': 'Luglio', 'Aug': 'Agosto', @@ -24,6 +27,7 @@ month_mapping = { def search(query,date): response = requests.get(query).json() + #Get link tid of every item and then open the link to see if the date = date for json in response: link = json['link'] tid = json['id'] @@ -38,7 +42,6 @@ def search(query,date): # Swap to YY-MM-DD formatting using dateparser release_date = dateparser.parse(date_string, languages=['it']).strftime("%Y-%m-%d") - print(release_date) if release_date == date: url = link tid = tid @@ -46,19 +49,20 @@ def search(query,date): return url, tid def get_episode_link(season,episode,tid,url): - episode = int(episode) - season = int(season) + #Get the link from where we have to obtain mixdrop link tlink = f'{url}?show_video=true&post_id={tid}&season_id={season-1}&episode_id={episode-1}' return tlink def get_film(url): + #Get the link from where we have to obtain mixdrop link tlink = url + "?show_video=true" return tlink def get_real_link(tlink): + #Some basic code to get the mixdrop link page = requests.get(tlink, headers=headers) - soup = BeautifulSoup(page.content, features="lxml") + soup = BeautifulSoup(page.content, features="lxml",parse_only=SoupStrainer('iframe')) iframe_src = soup.find('iframe')['src'] iframe_page = requests.get(iframe_src, headers=headers) @@ -67,7 +71,6 @@ def get_real_link(tlink): mega_button = iframe_soup.find('div', attrs={'class': 'megaButton', 'rel': 'nofollow'}, string='MIXDROP') if mega_button: real_link = mega_button.get('meta-link') - print(f'Real link: {real_link}') return real_link def get_true_link(real_link): @@ -82,36 +85,35 @@ def get_true_link(real_link): s = 'https:' for c in schema: s += d[c] if c in d else c - print(s) return s -def get_stream_link(imbd): - general = get_TMDb_id_from_IMDb_id(imbd) - if len(general)==4 : - tmdba,season,episode,ismovie = general - else: - tmdba,ismovie = general +def filmpertutti(imdb): + general = is_movie(imdb) + ismovie = general[0] + imdb_id = general[1] + if ismovie == 0 : + season = int(general[2]) + episode = int(general[3]) + tmdba = get_TMDb_id_from_IMDb_id(imdb_id) type = "Filmpertutti" showname,date = get_info(tmdba,ismovie,type) showname = showname.replace(" ", "+").replace("–", "+").replace("—","+") - query = f'https://filmpertutti.{DOMAIN}/wp-json/wp/v2/posts?search={showname}&page=1&_fields=link,id' - print(query) + #Build the query + query = f'https://filmpertutti.{FT_DOMAIN}/wp-json/wp/v2/posts?search={showname}&page=1&_fields=link,id' url,tid = search(query,date) - print(ismovie) - print(url) if ismovie == 0: episode_link = get_episode_link(season,episode,tid,url) - print(episode_link) #Let's get mixdrop link real_link = get_real_link(episode_link) #let's get delivery link, streaming link streaming_link = get_true_link(real_link) + print(streaming_link) return streaming_link elif ismovie == 1: film_link = get_film(url) - print(film_link) #Let's get mixdrop link real_link = get_real_link(film_link) #let's get delivery link, streaming link streaming_link = get_true_link(real_link) - return streaming_link + print(streaming_link) + return streaming_link \ No newline at end of file diff --git a/info.py b/info.py index 248c6db..0cdd4a9 100644 --- a/info.py +++ b/info.py @@ -1,7 +1,7 @@ from loadenv import load_env from tmdbv3api import TMDb, Movie, TV from convert_date import convert_US_date, convert_IT_date -TMDB_KEY, DOMAIN, FILMPERTUTTI,STREAMINGCOMMUNITY = load_env() +TMDB_KEY,_,_,FILMPERTUTTI,STREAMINGCOMMUNITY = load_env() def get_info(tmbda,ismovie,type): tmdb = TMDb() @@ -25,10 +25,18 @@ def get_info(tmbda,ismovie,type): if type == "Filmpertutti": #GET US RELEASE DATE because filmpertutti somewhy uses US release date date = convert_US_date(date) - elif type == "StreamingCommunity": - date = convert_IT_date(date) - print (date) - if ismovie==0: - return showname,date + return showname,date + + +def is_movie(imdb_id): + if "tmdb:" in imdb_id: + imdb_id = imdb_id.replace("tmdb:","") + if ":" in imdb_id: + season = imdb_id.split(":")[1] + episode = imdb_id[-1] + ismovie = 0 + imdb_id = imdb_id.split(":")[0] + return ismovie,imdb_id,season,episode else: - return showname,date \ No newline at end of file + ismovie = 1 + return ismovie,imdb_id \ No newline at end of file diff --git a/loadenv.py b/loadenv.py index 6fce1d2..ed4144d 100644 --- a/loadenv.py +++ b/loadenv.py @@ -3,7 +3,8 @@ from dotenv import load_dotenv load_dotenv(".env") def load_env(): TMDB_KEY = os.getenv('TMDB_KEY') - DOMAIN = os.getenv('DOMAIN') + FT_DOMAIN = os.getenv('FT_DOMAIN') + SC_DOMAIN= os.getenv('SC_DOMAIN') FILMPERTUTTI = os.getenv('FILMPERTUTTI') STREAMINGCOMMUNITY = os.getenv('STREAMINGCOMMUNITY') - return TMDB_KEY, DOMAIN, FILMPERTUTTI, STREAMINGCOMMUNITY \ No newline at end of file + return TMDB_KEY, FT_DOMAIN, SC_DOMAIN, FILMPERTUTTI, STREAMINGCOMMUNITY \ No newline at end of file diff --git a/run.py b/run.py index 6991599..8cc2083 100644 --- a/run.py +++ b/run.py @@ -1,7 +1,9 @@ from flask import Flask, jsonify, abort -from filmpertutti import get_stream_link +from filmpertutti import filmpertutti +from streamingcommunity import streaming_community from loadenv import load_env -TMDB_KEY, DOMAIN, FILMPERTUTTI, STREAMINGCOMMUNITY = load_env() +TMDB_KEY, FT_DOMAIN, SC_DOMAIN, FILMPERTUTTI, STREAMINGCOMMUNITY = load_env() + app = Flask(__name__) @@ -35,16 +37,27 @@ def root(): @app.route('/stream//.json') def addon_stream(type, id): if type not in MANIFEST['types']: - abort(404) - if FILMPERTUTTI == 1: - url = get_stream_link(id) # call the function to dynamically get stream links - elif STREAMINGCOMMUNITY == 1: - return "Not implemented yet" + abort(404) + streams = {'streams': []} + if STREAMINGCOMMUNITY == "1": + url_streaming_community = streaming_community(id) + print(url_streaming_community) + if url_streaming_community is not None: + streams['streams'].append({'title': 'StreamingCommunity 1080p', 'url': f'{url_streaming_community}?rendition=1080p'}) + streams['streams'].append({'title': 'StreamingCommunity 720p', 'url': f'{url_streaming_community}?rendition=720p'}) + + # If FILMPERTUTTI == 1, scrape that site + if FILMPERTUTTI == "1": + url_filmpertutti = filmpertutti(id) + if url_filmpertutti is not None: + streams['streams'].append({'title': 'Filmpertutti', 'url': url_filmpertutti}) - - streams = {'streams': [{'title': 'Stream URL', 'url': url}]} + # If no streams were added, abort with a 404 error + if not streams['streams']: + abort(404) return respond_with(streams) + if __name__ == '__main__': app.run(host='0.0.0.0', port=8080) diff --git a/streamingcommunity.py b/streamingcommunity.py index aa4c89f..6e6345a 100644 --- a/streamingcommunity.py +++ b/streamingcommunity.py @@ -1,48 +1,102 @@ from tmdbv3api import TMDb, Movie, TV -import requests +import requests +import logging from bs4 import BeautifulSoup,SoupStrainer from datetime import datetime import dateparser from convert import get_TMDb_id_from_IMDb_id from loadenv import load_env -from info import get_info -TMDB_KEY= load_env() +from info import get_info, is_movie +#Get domain +_, _,SC_DOMAIN,_ ,_= load_env() + headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.10; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', 'Accept-Language': 'en-US,en;q=0.5' } -def streaming_community(imbd): - print(load_env) - general = get_TMDb_id_from_IMDb_id(imbd) - if len(general)==4 : - tmdba,season,episode,ismovie = general + +def search(query,date,ismovie): + #Do a request to get the ID of serie/move and it's slug in the URL + response = requests.get(query).json() + for item in response['data']: + tid = item['id'] + slug = item['slug'] + return tid,slug + + +def get_film(tid): + #Access the iframe + url = f'https://streamingcommunity.{SC_DOMAIN}/iframe/{tid}' + response = requests.get(url, headers=headers) + iframe = BeautifulSoup(response.text, 'lxml') + #Get the link of iframe + iframe = iframe.find('iframe').get("src") + #Get the ID containted in the src of iframe + vixid = iframe.split("/embed/")[1].split("?")[0] + #Build the url with 1080p, to get the highest resolution + url = f'https://vixcloud.co/playlist/{vixid}' + return url + +def get_season_episode_id(tid,slug,season,episode): + #Set some basic headers for the request + headers = { + 'user-agent': "Mozilla/5.0 (Windows NT 10.10; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3", + 'x-inertia': 'true', + #Version of streaming community + 'x-inertia-version': 'c1bdf1189cb68fca28151c8e909bd053' + } + #Get episode ID + response = requests.get(f'https://streamingcommunity.{SC_DOMAIN}/titles/{tid}-{slug}/stagione-{season}', headers=headers) + # Print the json got + json_response = response.json().get('props', {}).get('loadedSeason', {}).get('episodes', []) + for dict_episode in json_response: + if dict_episode['number'] == episode: + return dict_episode['id'] + +def get_episode_link(episode_id,tid): + #The parameters for the request + params = { + 'episode_id': episode_id, + 'next_episode': '1' + } + #Let's try to get the link from iframe source + # Make a request to get iframe source + response = requests.get(f"https://streamingcommunity.{SC_DOMAIN}/iframe/{tid}", params=params) + + # Parse response with BeautifulSoup to get iframe source + soup = BeautifulSoup(response.text, "lxml") + iframe = soup.find("iframe").get("src") + vixid = iframe.split("/embed/")[1].split("?")[0] + url = f"https://vixcloud.co/playlist/{vixid}" + return url + + +def streaming_community(imdb): + general = is_movie(imdb) + ismovie = general[0] + imdb_id = general[1] + if ismovie == 0 : + season = int(general[2]) + episode = int(general[3]) + if "tt" in imdb: + #If it is a imbd then conver it to tmbd + tmdba = get_TMDb_id_from_IMDb_id(imdb_id) else: - tmdba,ismovie = general + #else just equals them + tmdba = imdb_id.replace("tmdb:","") type = "StreamingCommunity" showname,date = get_info(tmdba,ismovie,type) showname = showname.replace(" ", "+").replace("–", "+").replace("—","+") - query = f'https://streamingcommunity.boston/api/search?q={showname}' - date,tid,slug = search(query,date) - if ismovie == 0: + query = f'https://streamingcommunity.{SC_DOMAIN}/api/search?q={showname}' + tid,slug = search(query,date,ismovie) + if ismovie == 1: + #TID means temporaly ID url = get_film(tid) - return "NOT IMPLEMENTED YET" - - - -def search(query,date): - response = requests.get(query).json() - for json in response: - release_date = json['last_air_date'] - tid = json['id'] - slug = json['slug'] - if date == release_date: - return date,tid,slug -def get_film(tid): - url = f'https://streamingcommunity.boston/watch/{tid}' - response = requests.get(url, headers=headers) - soup = BeautifulSoup(response.text, 'lxml', parse_only=SoupStrainer('iframe')) - vixid = soup['src'] - vixid = vixid.split("/embed/")[1].split("?")[0] - print (vixid) - -streaming_community("tt16426418") \ No newline at end of file + print(url) + return url + if ismovie == 0: + #Uid = URL ID + episode_id = get_season_episode_id(tid,slug,season,episode) + url = get_episode_link(episode_id,tid) + print(url) + return url \ No newline at end of file