Advertisement
Guest User

nick

a guest
Aug 23rd, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.91 KB | None | 0 0
  1. import os
  2. import re
  3. import ffmpeg
  4. import requests
  5. import xml.etree.ElementTree as ET
  6.  
  7. MGID = "mgid:arc:promotion:nick.com:0cdfdb4d-ab75-45a4-9ee0-a5ec3205c248"
  8.  
  9. class Episode:
  10.     def __init__(self, show, item):
  11.         self.show = show
  12.         self.name = item["title"]
  13.         self.mgid = item["mgid"]
  14.  
  15.     @staticmethod
  16.     def _download_item(url, output):
  17.         item = requests.get(url, params={
  18.             "acceptMethods": "hls",
  19.             "format": "json",
  20.         }).json()["package"]["video"]["item"][0]
  21.         src = item["rendition"][-1]["src"]
  22.         if "transcript" in item:
  23.             subtitles = next(i for i in item["transcript"][0]["typographic"] if i["format"] == "ttml")
  24.             with open(output + ".ttml", "w", encoding="utf-8") as file:
  25.                 file.write(requests.get(subtitles["src"]).text)
  26.         sizes = re.findall(r"(,stream_(\d+)x(\d+)(?:_\d+)+)", src)
  27.         if sizes:
  28.             size = max(sizes, key=lambda x: int(x[2]))
  29.             src = re.sub(r",stream_[^/]+", size[0], src)
  30.         ffmpeg.input(src).output(output + ".mp4", vcodec="copy").run()
  31.  
  32.     def download(self):
  33.         name = self.name.replace("/", " ")
  34.         if '"' in name:
  35.             name = name[name.index('"') + 1:name.rindex('"')]
  36.         dirname = os.path.join(self.show.name, name)
  37.         if not os.path.isdir(dirname):
  38.             os.makedirs(dirname)
  39.         root = ET.fromstring(requests.get("http://udat.mtvnservices.com/service1/dispatch.htm", params={
  40.             "feed": "nick_arc_player_prime",
  41.             "mgid": self.mgid,
  42.         }).text)
  43.         namespace = {"media": "http://search.yahoo.com/mrss/"}
  44.         thumbnail = root.find(".//image/url", namespace).text
  45.         for item in root.findall(".//item"):
  46.             url = item.find("media:group/media:content", namespace).get("url")
  47.             title = item.find("media:group/media:title", namespace).text.replace("/", " ").replace(":", " ").strip()
  48.             if '"' in title:
  49.                 title = title[title.index('"') + 1:title.rindex('"')] + title[title.rindex('"') + 1:]
  50.             self._download_item(url, os.path.join(dirname, title))
  51.  
  52.     def __str__(self):
  53.         return self.name
  54.  
  55. class Show:
  56.     def __init__(self, item):
  57.         self.name = item["title"]
  58.         self.links = item["links"]
  59.  
  60.     @classmethod
  61.     def get_shows(cls, mgid):
  62.         items = requests.get(f"http://api.playplex.viacom.com/feeds/networkapp/intl/promolist/1.9/{mgid}", params={
  63.             "platform": "android",
  64.             "brand": "nick",
  65.             "version": "18.21.1",
  66.             "region": "us",
  67.             "key": "networkapp1.0",
  68.         }).json()["data"]["items"]
  69.         for item in items:
  70.             if item["entityType"] == "series":
  71.                 yield cls(item)
  72.  
  73.     def get_episodes(self):
  74.         items = requests.get(self.links["episode"]).json()["data"]["items"]
  75.         for item in items:
  76.             yield Episode(self, item)
  77.  
  78.     def __str__(self):
  79.         return self.name
  80.  
  81. def choose(items, name):
  82.     items = list(items)
  83.     for i, item in enumerate(items, 1):
  84.         print(f"{i}. {item}")
  85.     return items[int(input(f"Which {name}? ")) - 1]
  86.  
  87. def main():
  88.     show = choose(Show.get_shows(MGID), "show")
  89.     episode = choose(show.get_episodes(), "episode")
  90.     episode.download()
  91.  
  92. if __name__ == "__main__":
  93.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement