Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3.6
- # -*- coding: utf-8 -*-
- import pymsl # version==1.2
- import re
- import requests
- import json
- import readline # fix input()
- s = requests.Session()
- user_auth_data = {
- "scheme": "EMAIL_PASSWORD",
- "authdata": {
- "email": email,
- "password": password
- }
- }
- client = pymsl.MslClient(user_auth_data, profiles=['playready-h264mpl30-dash', 'playready-h264mpl31-dash', 'playready-h264hpl30-dash', 'playready-h264hpl31-dash', 'heaac-2-dash', 'BIF240', 'BIF320', 'webvtt-lssdh-ios8'])
- while True:
- url = input("Paste title URL: ")
- print("Fetching title page")
- try:
- resp = requests.get(url)
- viewable_ids = []
- title_json = json.loads(re.findall('netflix.reactContext = {.*};', resp.text)[0].replace('netflix.reactContext = ', '').replace(';', '').replace('\\x', '\\u00'))
- except Exception:
- print("An error occurred while fetching the page")
- print("Please check your URL and try again")
- continue
- try:
- print("Title: %s" % (title_json["models"]["nonmemberTitle"]["data"]["title"]))
- print("Synopsis: %s" % (title_json["models"]["nonmemberTitle"]["data"]["synopsis"]))
- episodes = title_json["models"]["nonmemberTitle"]["data"]["episodes"]
- season_list = [1]
- if title_json["models"]["nonmemberTitle"]["data"]["seasonCount"] > 1:
- print("Seems like there are multiple seasons available")
- while True:
- try:
- print("Enter season(s) you want to download (split with comma) or enter nothing to download all")
- season_list = input("e.g. 1,2,3,5,6,8: ")
- if season_list == '':
- season_list = list(range(1, title_json["models"]["nonmemberTitle"]["data"]["seasonCount"] + 1))
- else:
- season_list = season_list.split(',')
- flag = False
- for season in season_list:
- if int(season) < 1 or int(season) > title_json["models"]["nonmemberTitle"]["data"]["seasonCount"]:
- flag = True
- break
- if flag:
- print("Invalid input")
- continue
- break
- except Exception:
- print("Invalid input")
- for episode in episodes:
- for season in season_list:
- if episode["seasonInfo"]["num"] == int(season):
- viewable_ids.append(episode["episodeId"])
- break
- except Exception:
- print("Either your URL is invalid or this title isn't available in your current country/region")
- print("Please check your URL, VPN connection or proxy settings")
- continue
- title = re.sub('[^0-9a-zA-Z]+', '-', title_json["models"]["nonmemberTitle"]["data"]["title"]).lower()
- for id in viewable_ids:
- for episode in episodes:
- if episode["episodeId"] == id:
- print("Processing episode S%sE%s \"%s\"" % (episode["seasonInfo"]["num"], episode["episodeNum"], episode["title"]))
- episode_title = re.sub('[^0-9a-zA-Z]+', '-', episode["title"]).lower()
- break
- print("Requesting manifest")
- try:
- manifest = client.load_manifest(id)
- item = manifest["result"]
- except pymsl.exceptions.ManifestError as e:
- print(eval(str(e))["error"]["display"])
- break
- # Subtitle
- timedtext_available = []
- for timedtexttrack in item["timedtexttracks"]:
- if not timedtexttrack["isNoneTrack"]:
- timedtext_available.append("%s (%s)" % (timedtexttrack["languageDescription"], timedtexttrack["trackType"]))
- print("Subtitle available in %s" % (', '.join(timedtext_available)))
- subs = item["timedtexttracks"]
- for sub in subs:
- if sub["isNoneTrack"]:
- continue
- print("Downloading %s (%s) subtitle" % (sub["languageDescription"], sub["trackType"]))
- sub_url = sub["ttDownloadables"]["webvtt-lssdh-ios8"]["downloadUrls"][list(sub["ttDownloadables"]["webvtt-lssdh-ios8"]["downloadUrls"])[0]]
- file_content = s.get(sub_url).text
- file_content = re.sub(r'([\d]+)\.([\d]+)', r'\1,\2', file_content)
- file_content = re.sub(r'WEBVTT\n\n', '', file_content)
- file_content = re.sub(r'NOTE.*\n', '', file_content)
- file_content = re.sub(r'\n\s+\n', '', file_content)
- file_content = re.sub(r' position:.+%', '', file_content)
- file_content = re.sub(r'{.*?}', '', file_content)
- file_content = re.sub('<c\..*?>', '', file_content)
- file_content = re.sub('</c\..*?>', '', file_content)
- with open("%s-%s-%s.srt" % (title, episode_title, sub["language"]), "w+", newline="\r\n", encoding="utf-8-sig") as srt_file: # Use UTF-8-BOM encoding to make sure Aegisub can read it properly
- srt_file.write(file_content)
Add Comment
Please, Sign In to add comment