Guest User

Untitled

a guest
Jan 23rd, 2019
406
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.00 KB | None | 0 0
  1. #!/usr/bin/env python3.6
  2. # -*- coding: utf-8 -*-
  3.  
  4. import pymsl # version==1.2
  5. import re
  6. import requests
  7. import json
  8. import readline # fix input()
  9.  
  10. s = requests.Session()
  11.  
  12. user_auth_data = {
  13. "scheme": "EMAIL_PASSWORD",
  14. "authdata": {
  15. "email": email,
  16. "password": password
  17. }
  18. }
  19.  
  20. 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'])
  21.  
  22. while True:
  23. url = input("Paste title URL: ")
  24. print("Fetching title page")
  25. try:
  26. resp = requests.get(url)
  27. viewable_ids = []
  28. title_json = json.loads(re.findall('netflix.reactContext = {.*};', resp.text)[0].replace('netflix.reactContext = ', '').replace(';', '').replace('\\x', '\\u00'))
  29. except Exception:
  30. print("An error occurred while fetching the page")
  31. print("Please check your URL and try again")
  32. continue
  33.  
  34. try:
  35. print("Title: %s" % (title_json["models"]["nonmemberTitle"]["data"]["title"]))
  36. print("Synopsis: %s" % (title_json["models"]["nonmemberTitle"]["data"]["synopsis"]))
  37. episodes = title_json["models"]["nonmemberTitle"]["data"]["episodes"]
  38.  
  39. season_list = [1]
  40. if title_json["models"]["nonmemberTitle"]["data"]["seasonCount"] > 1:
  41. print("Seems like there are multiple seasons available")
  42. while True:
  43. try:
  44. print("Enter season(s) you want to download (split with comma) or enter nothing to download all")
  45. season_list = input("e.g. 1,2,3,5,6,8: ")
  46. if season_list == '':
  47. season_list = list(range(1, title_json["models"]["nonmemberTitle"]["data"]["seasonCount"] + 1))
  48. else:
  49. season_list = season_list.split(',')
  50. flag = False
  51. for season in season_list:
  52. if int(season) < 1 or int(season) > title_json["models"]["nonmemberTitle"]["data"]["seasonCount"]:
  53. flag = True
  54. break
  55. if flag:
  56. print("Invalid input")
  57. continue
  58. break
  59. except Exception:
  60. print("Invalid input")
  61.  
  62. for episode in episodes:
  63. for season in season_list:
  64. if episode["seasonInfo"]["num"] == int(season):
  65. viewable_ids.append(episode["episodeId"])
  66. break
  67.  
  68. except Exception:
  69. print("Either your URL is invalid or this title isn't available in your current country/region")
  70. print("Please check your URL, VPN connection or proxy settings")
  71. continue
  72.  
  73. title = re.sub('[^0-9a-zA-Z]+', '-', title_json["models"]["nonmemberTitle"]["data"]["title"]).lower()
  74. for id in viewable_ids:
  75. for episode in episodes:
  76. if episode["episodeId"] == id:
  77. print("Processing episode S%sE%s \"%s\"" % (episode["seasonInfo"]["num"], episode["episodeNum"], episode["title"]))
  78. episode_title = re.sub('[^0-9a-zA-Z]+', '-', episode["title"]).lower()
  79. break
  80. print("Requesting manifest")
  81. try:
  82. manifest = client.load_manifest(id)
  83. item = manifest["result"]
  84. except pymsl.exceptions.ManifestError as e:
  85. print(eval(str(e))["error"]["display"])
  86. break
  87.  
  88. # Subtitle
  89. timedtext_available = []
  90. for timedtexttrack in item["timedtexttracks"]:
  91. if not timedtexttrack["isNoneTrack"]:
  92. timedtext_available.append("%s (%s)" % (timedtexttrack["languageDescription"], timedtexttrack["trackType"]))
  93. print("Subtitle available in %s" % (', '.join(timedtext_available)))
  94. subs = item["timedtexttracks"]
  95. for sub in subs:
  96. if sub["isNoneTrack"]:
  97. continue
  98. print("Downloading %s (%s) subtitle" % (sub["languageDescription"], sub["trackType"]))
  99. sub_url = sub["ttDownloadables"]["webvtt-lssdh-ios8"]["downloadUrls"][list(sub["ttDownloadables"]["webvtt-lssdh-ios8"]["downloadUrls"])[0]]
  100. file_content = s.get(sub_url).text
  101. file_content = re.sub(r'([\d]+)\.([\d]+)', r'\1,\2', file_content)
  102. file_content = re.sub(r'WEBVTT\n\n', '', file_content)
  103. file_content = re.sub(r'NOTE.*\n', '', file_content)
  104. file_content = re.sub(r'\n\s+\n', '', file_content)
  105. file_content = re.sub(r' position:.+%', '', file_content)
  106. file_content = re.sub(r'{.*?}', '', file_content)
  107. file_content = re.sub('<c\..*?>', '', file_content)
  108. file_content = re.sub('</c\..*?>', '', file_content)
  109. 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
  110. srt_file.write(file_content)
Add Comment
Please, Sign In to add comment