add elad files
This commit is contained in:
3
constants.py
Normal file
3
constants.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
FAILED_LOGIN_MESSAGE = 'שם המשתמש ו/או הסיסמה שהזנת שגויים'
|
||||||
|
|
||||||
|
SERIES_NAME_YEAR_PATTERN = r'^(.*)\s(\d{4})$'
|
||||||
1
cookie.json
Normal file
1
cookie.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
2
credentials.yaml
Normal file
2
credentials.yaml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
username: elad2911@gmail.com
|
||||||
|
password: Elad29112000
|
||||||
178
main.py
Normal file
178
main.py
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
import json
|
||||||
|
import re
|
||||||
|
from bs4 import BeautifulSoup
|
||||||
|
import utils
|
||||||
|
from sdarot_api import SdarotApi
|
||||||
|
|
||||||
|
import requests, time
|
||||||
|
|
||||||
|
SDAROT_DOMAIN = "sdarot.buzz"
|
||||||
|
|
||||||
|
|
||||||
|
def get_sdarot_cookies():
|
||||||
|
return {"Sdarot": requests.get(f"https://{SDAROT_DOMAIN}/index").cookies["Sdarot"]}
|
||||||
|
|
||||||
|
|
||||||
|
def login_to_sdarot_tv(username, password, cookies):
|
||||||
|
data = {
|
||||||
|
'username': username,
|
||||||
|
'password': password,
|
||||||
|
'submit_login': ''
|
||||||
|
}
|
||||||
|
|
||||||
|
response = requests.post(f'https://{SDAROT_DOMAIN}/login', data=data, cookies=cookies)
|
||||||
|
if 'שם המשתמש ו/או הסיסמה שהזנת שגויים' in response.text:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def get_series_dictionary(cookies):
|
||||||
|
data = "srl=1"
|
||||||
|
series_json = requests.get(f"https://www.{SDAROT_DOMAIN}/ajax/index?srl=1", cookies=cookies, data=data).json()
|
||||||
|
with open('series.json', 'w') as file:
|
||||||
|
json.dump(series_json, file)
|
||||||
|
return series_json
|
||||||
|
|
||||||
|
|
||||||
|
def get_serie_seasons_list(sid, cookies):
|
||||||
|
with open('series_metadata.json') as file:
|
||||||
|
series_metadata = json.load(file)
|
||||||
|
if str(sid) in series_metadata:
|
||||||
|
print(sid)
|
||||||
|
return series_metadata[str(sid)]
|
||||||
|
|
||||||
|
response = requests.get(f'https://{SDAROT_DOMAIN}/watch/{sid}', cookies=cookies)
|
||||||
|
|
||||||
|
serie_html = BeautifulSoup(response.text, 'html.parser')
|
||||||
|
|
||||||
|
seasons_ul = serie_html.find('ul', attrs={'id': 'season'})
|
||||||
|
|
||||||
|
seasons_li = seasons_ul.select('li[data-season]')
|
||||||
|
|
||||||
|
series_metadata[sid] = {}
|
||||||
|
for season_li in seasons_li:
|
||||||
|
season_number = season_li.get('data-season')
|
||||||
|
season_episodes = get_serie_season_episodes(sid, season_number, cookies)
|
||||||
|
time.sleep(2)
|
||||||
|
series_metadata[sid][season_number] = season_episodes
|
||||||
|
|
||||||
|
with open('series_metadata.json', 'w') as file:
|
||||||
|
json.dump(series_metadata, file)
|
||||||
|
return series_metadata[sid]
|
||||||
|
|
||||||
|
|
||||||
|
def get_serie_season_episodes(sid, season, cookies):
|
||||||
|
response = requests.get(f'https://{SDAROT_DOMAIN}/ajax/watch?episodeList={sid}&season={season}',cookies=cookies)
|
||||||
|
print(response.status_code)
|
||||||
|
series_html = BeautifulSoup(response.text, 'html.parser')
|
||||||
|
print(series_html)
|
||||||
|
episodes_li = series_html.select('li[data-episode]')
|
||||||
|
return [episode_li.get('data-episode') for episode_li in episodes_li]
|
||||||
|
|
||||||
|
def download_serie_seasons(cookies, serie_name, sid, season, season_dictionary):
|
||||||
|
if season:
|
||||||
|
for episode in season_dictionary[season]:
|
||||||
|
token = create_new_token(cookies, sid, season, episode)
|
||||||
|
time.sleep(32)
|
||||||
|
video_url = get_video_url(cookies, token, sid, season, episode)
|
||||||
|
download_video(cookies, video_url, f"{serie_name} S{season}E{episode}.mp4")
|
||||||
|
else:
|
||||||
|
for season in season_dictionary.keys:
|
||||||
|
for episode in season_dictionary[season]:
|
||||||
|
token = create_new_token(cookies, sid, season, episode)
|
||||||
|
time.sleep(32)
|
||||||
|
video_url = get_video_url(cookies, token, sid, season, episode)
|
||||||
|
download_video(cookies, video_url, f"{serie_name} S{season}E{episode}.mp4")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def create_new_token(cookies, sid, season, ep):
|
||||||
|
form_data = {
|
||||||
|
'preWatch': 'true',
|
||||||
|
'SID': sid,
|
||||||
|
'season': season,
|
||||||
|
'ep': ep
|
||||||
|
}
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'Referer': f'https://www.{SDAROT_DOMAIN}/',
|
||||||
|
'accepts': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'
|
||||||
|
}
|
||||||
|
|
||||||
|
res = requests.post(f"https://www.{SDAROT_DOMAIN}/ajax/watch", data=form_data, cookies=cookies, headers=headers)
|
||||||
|
return res.content.decode()
|
||||||
|
|
||||||
|
|
||||||
|
def get_video_url(cookies, token, sid, season, episode):
|
||||||
|
form_data = {
|
||||||
|
'watch': 'true',
|
||||||
|
'token': token,
|
||||||
|
'serie': sid,
|
||||||
|
'season': season,
|
||||||
|
'episode': episode,
|
||||||
|
'type': 'episode'
|
||||||
|
}
|
||||||
|
|
||||||
|
headers = {
|
||||||
|
'Referer': f'https://www.{SDAROT_DOMAIN}/',
|
||||||
|
'accepts': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'
|
||||||
|
}
|
||||||
|
|
||||||
|
res = requests.post(f"https://{SDAROT_DOMAIN}/ajax/watch", data=form_data, cookies=cookies, headers=headers)
|
||||||
|
return "https:" + res.json()["watch"]["480"]
|
||||||
|
|
||||||
|
|
||||||
|
def download_video(cookies, video_url, file_path):
|
||||||
|
response = requests.get(video_url, stream=True, cookies=cookies, timeout=5)
|
||||||
|
|
||||||
|
with open(file_path, "wb") as file:
|
||||||
|
for chunk in response.iter_content(chunk_size=8192):
|
||||||
|
file.write(chunk)
|
||||||
|
|
||||||
|
def check_for_cookies():
|
||||||
|
with open('cookie.json') as cookie_file:
|
||||||
|
cookies_json = json.load(cookie_file)
|
||||||
|
return cookies_json
|
||||||
|
|
||||||
|
|
||||||
|
def check_for_series_dictionary():
|
||||||
|
with open('series.json') as file:
|
||||||
|
series = json.load(file)
|
||||||
|
return series
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
sdarot_api = SdarotApi()
|
||||||
|
sdarot_cookies = check_for_cookies()
|
||||||
|
if not sdarot_cookies:
|
||||||
|
username, password = utils.get_credentials()
|
||||||
|
sdarot_cookies = sdarot_api.get_cookies()
|
||||||
|
utils.save_cookies(sdarot_cookies)
|
||||||
|
has_logged_in = sdarot_api.login(username, password)
|
||||||
|
if not has_logged_in:
|
||||||
|
print('Failed to log in')
|
||||||
|
return
|
||||||
|
|
||||||
|
series = check_for_series_dictionary()
|
||||||
|
if not series:
|
||||||
|
series = sdarot_api.get_series_dictionary()
|
||||||
|
utils.save_series_dictionary(series)
|
||||||
|
|
||||||
|
serie_name = input('Enter a serie you want to download\n')
|
||||||
|
|
||||||
|
sid = utils.get_matched_series_ids(series, serie_name)[0]["id"]
|
||||||
|
|
||||||
|
seasons_dictionary = get_serie_seasons_list(sid, sdarot_cookies) # stopped after this
|
||||||
|
season = input('Enter the season you wanna download or press enter for all seasons\n')
|
||||||
|
download_serie_seasons(sdarot_cookies, serie_name, sid, season, seasons_dictionary)
|
||||||
|
# token = create_new_token(sdarot_cookies, sid, 1, 1)
|
||||||
|
# print(token)
|
||||||
|
# print("Start 30 seconds...")
|
||||||
|
# time.sleep(32)
|
||||||
|
# video_url = get_video_url(sdarot_cookies, token, sid, 1, 1)
|
||||||
|
# download_video(sdarot_cookies, video_url, "example.mp4")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
110
sdarot_api.py
Normal file
110
sdarot_api.py
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
import requests, os
|
||||||
|
|
||||||
|
from constants import *
|
||||||
|
|
||||||
|
SDAROT_DOMAIN = "sdarot.buzz"
|
||||||
|
|
||||||
|
DOWNLOAD_DIRECTORY_PATH = 'downloads'
|
||||||
|
|
||||||
|
class SdarotApi:
|
||||||
|
def __init__(self):
|
||||||
|
self.session = requests.session()
|
||||||
|
self.session.headers.update({
|
||||||
|
'Referer': f'https://www.{SDAROT_DOMAIN}/',
|
||||||
|
'accepts': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7'
|
||||||
|
})
|
||||||
|
|
||||||
|
def get_cookies(self):
|
||||||
|
sdarot_cookies = self.session.get(f"https://{SDAROT_DOMAIN}/index").cookies['Sdarot']
|
||||||
|
self.session.cookies.update({"Sdarot": sdarot_cookies})
|
||||||
|
return {"Sdarot": sdarot_cookies}
|
||||||
|
|
||||||
|
def login(self, username, password):
|
||||||
|
form_data = {
|
||||||
|
'username': username,
|
||||||
|
'password': password,
|
||||||
|
'submit_login': ''
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
response = self.session.post(f'https://{SDAROT_DOMAIN}/login', data=form_data)
|
||||||
|
if FAILED_LOGIN_MESSAGE in response.text:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
except Exception as ex:
|
||||||
|
print('Error in login', ex)
|
||||||
|
raise ex
|
||||||
|
|
||||||
|
def get_series_dictionary(self):
|
||||||
|
try:
|
||||||
|
series_json = self.session.get(f"https://www.{SDAROT_DOMAIN}/ajax/index?srl=1").json()
|
||||||
|
return series_json
|
||||||
|
|
||||||
|
except Exception as ex:
|
||||||
|
print('Failed to get series dictionary', ex)
|
||||||
|
raise ex
|
||||||
|
|
||||||
|
def get_series_seasons_list(self, sid):
|
||||||
|
try:
|
||||||
|
response = self.session.get(f'https://{SDAROT_DOMAIN}/watch/{sid}')
|
||||||
|
return response
|
||||||
|
|
||||||
|
except Exception as ex:
|
||||||
|
print('Failed to get serie seasons', ex)
|
||||||
|
|
||||||
|
def get_series_season_episodes(self, sid, season):
|
||||||
|
try:
|
||||||
|
response = self.session.get(f'https://{SDAROT_DOMAIN}/ajax/watch?episodeList={sid}&season={season}')
|
||||||
|
return response
|
||||||
|
|
||||||
|
except Exception as ex:
|
||||||
|
print('Failed to get season episodes', ex)
|
||||||
|
|
||||||
|
def get_episode_token(self, sid, season, episode):
|
||||||
|
form_data = {
|
||||||
|
'preWatch': 'true',
|
||||||
|
'SID': sid,
|
||||||
|
'season': season,
|
||||||
|
'ep': episode
|
||||||
|
}
|
||||||
|
try:
|
||||||
|
res = self.session.post(f"https://www.{SDAROT_DOMAIN}/ajax/watch", data=form_data)
|
||||||
|
return res.content.decode()
|
||||||
|
|
||||||
|
except Exception as ex:
|
||||||
|
print('Failed to get episode token', ex)
|
||||||
|
|
||||||
|
def get_episode_url(self, token, sid, season, episode):
|
||||||
|
form_data = {
|
||||||
|
'watch': 'true',
|
||||||
|
'token': token,
|
||||||
|
'serie': sid,
|
||||||
|
'season': season,
|
||||||
|
'episode': episode,
|
||||||
|
'type': 'episode'
|
||||||
|
}
|
||||||
|
|
||||||
|
try:
|
||||||
|
res = self.session.post(f"https://{SDAROT_DOMAIN}/ajax/watch", data=form_data)
|
||||||
|
watch_json_response = res.json()["watch"]
|
||||||
|
qualities = [int(quality) for quality in watch_json_response.keys()]
|
||||||
|
max_quality = max(qualities)
|
||||||
|
return "https:" + watch_json_response[str(max_quality)]
|
||||||
|
|
||||||
|
except Exception as ex:
|
||||||
|
print('Failed to get episode url', ex)
|
||||||
|
|
||||||
|
def download_episode(self, episode_url, file_path):
|
||||||
|
full_download_path = os.path.join(DOWNLOAD_DIRECTORY_PATH, file_path)
|
||||||
|
try:
|
||||||
|
response = self.session.get(episode_url, stream=True, timeout=5)
|
||||||
|
|
||||||
|
with open(full_download_path, "wb") as file:
|
||||||
|
for chunk in response.iter_content(chunk_size=8192):
|
||||||
|
file.write(chunk)
|
||||||
|
|
||||||
|
except Exception as ex:
|
||||||
|
print('Failed to download episode', ex)
|
||||||
|
|
||||||
|
|
||||||
7
serie.py
Normal file
7
serie.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
class Serie:
|
||||||
|
def __init__(self, sid, name, seasons):
|
||||||
|
self.sid = sid
|
||||||
|
self.name = name
|
||||||
|
self.seasons = seasons
|
||||||
|
|
||||||
|
def get_serie_seasons(self):
|
||||||
1
series.json
Normal file
1
series.json
Normal file
File diff suppressed because one or more lines are too long
1
series_metadata.json
Normal file
1
series_metadata.json
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{"383": {"1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60"], "2": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55"], "3": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51"], "4": ["1", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47"]}, "695": {"1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"], "2": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"], "3": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"], "4": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"], "5": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"]}}
|
||||||
31
utils.py
Normal file
31
utils.py
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
import json
|
||||||
|
import yaml
|
||||||
|
import re
|
||||||
|
|
||||||
|
from constants import SERIES_NAME_YEAR_PATTERN
|
||||||
|
|
||||||
|
|
||||||
|
def get_credentials():
|
||||||
|
with open('credentials.yaml') as file:
|
||||||
|
sdarot_credentials = yaml.full_load(file)
|
||||||
|
return sdarot_credentials.get('username'), sdarot_credentials.get('password')
|
||||||
|
|
||||||
|
|
||||||
|
def save_cookies(cookies):
|
||||||
|
with open('cookie.json') as cookie_file:
|
||||||
|
json.dump(cookies, cookie_file)
|
||||||
|
|
||||||
|
|
||||||
|
def save_series_dictionary(series_json):
|
||||||
|
with open('series.json', 'w') as file:
|
||||||
|
json.dump(series_json, file)
|
||||||
|
|
||||||
|
|
||||||
|
def get_matched_series_ids(series_dictionary, series_name):
|
||||||
|
year = ''
|
||||||
|
match = re.match(SERIES_NAME_YEAR_PATTERN, series_name)
|
||||||
|
if match:
|
||||||
|
series_name = match.group(1)
|
||||||
|
year = match.group(2)
|
||||||
|
return list(filter(lambda obj: (series_name in obj['eng'].lower() or series_name in obj['heb']) and year in obj['year'], series_dictionary))
|
||||||
|
|
||||||
Reference in New Issue
Block a user