| import datetime
|
| import json
|
| import logging
|
| import os
|
| import re
|
| import urllib
|
|
|
| import googleapiclient
|
| import requests
|
| import src.functions.drivetools
|
|
|
| LOGGER = logging.getLogger()
|
|
|
|
|
| def parseMovie(name):
|
|
|
| reg_1 = r"^[\(\[\{](?P<year>\d{4})[\)\]\}]\s(?P<title>[^.]+).*(?P<extention>\..*)?$"
|
|
|
| reg_2 = r"^(?P<title>.*)\s[\(\[\{](?P<year>\d{4})[\)\]\}].*(?P<extention>\..*)?$"
|
|
|
| reg_3 = r"^(?P<title>(?:(?!\.\d{4}).)*)\.(?P<year>\d{4}).*(?P<extention>\..*)?$"
|
| reg_4 = r"^(?P<year>)(?P<title>.*).*(?P<extention>\..*?$)"
|
| if re.match(reg_1, name):
|
| match = re.search(reg_1, name)
|
| elif re.match(reg_2, name):
|
| match = re.search(reg_2, name)
|
| elif re.match(reg_3, name):
|
| match = re.search(reg_3, name)
|
| return match["title"].replace(".", " "), match["year"]
|
| elif re.match(reg_4, name):
|
| match = re.search(reg_4, name)
|
| else:
|
| return None, None
|
| return match["title"], match["year"]
|
|
|
|
|
| def parseTV(name):
|
|
|
| reg_1 = r"^[\(\[\{](?P<year>\d{4})[\)\]\}]\s(?P<title>[^.]+).*$"
|
|
|
| reg_2 = r"^(?P<title>.*)\s[\(\[\{](?P<year>\d{4})[\)\]\}].*$"
|
|
|
| reg_3 = r"^(?P<title>(?:(?!\.\d{4}).)*)\.(?P<year>\d{4}).*$"
|
| reg_4 = r"^(?P<year>)(?P<title>.*)$"
|
| if re.match(reg_1, name):
|
| match = re.search(reg_1, name)
|
| elif re.match(reg_2, name):
|
| match = re.search(reg_2, name)
|
| elif re.match(reg_3, name):
|
| match = re.search(reg_3, name)
|
| return match["title"].replace(".", " "), match["year"]
|
| elif re.match(reg_4, name):
|
| match = re.search(reg_4, name)
|
| else:
|
| return None, None
|
| return match["title"], match["year"]
|
|
|
|
|
| def mediaIdentifier(
|
| ider_vars,
|
| title,
|
| year,
|
| movie=False,
|
| tv=False,
|
| anime=False,
|
| ):
|
| if year == None or year == "":
|
| tmp_year = "1900"
|
| else:
|
| tmp_year = year
|
| header = {
|
| 'x-cors-api-key': 'temp_4f366722ffa4bdd63246e0a9227c56e8',
|
| }
|
| if movie == True and anime == False:
|
| if ider_vars["adult"] == True:
|
| search_url = "https://proxy.cors.sh/https://api.themoviedb.org/3/search/movie?api_key=%s&query=%s&primary_release_year=%s&language=%s&include_adult=true" % (
|
| ider_vars["tmdb_api_key"],
|
| urllib.parse.quote(title.encode("utf-8")),
|
| year,
|
| ider_vars["language"],
|
| )
|
| else:
|
| search_url = "https://proxy.cors.sh/https://api.themoviedb.org/3/search/movie?api_key=%s&query=%s&primary_release_year=%s&language=%s" % (
|
| ider_vars["tmdb_api_key"],
|
| urllib.parse.quote(title.encode("utf-8")),
|
| year,
|
| ider_vars["language"],
|
| )
|
| try:
|
| search_content = requests.get(search_url, headers=header).json()
|
| except Exception as e:
|
| search_content = {"total_results": 0}
|
| LOGGER.error(
|
| "\033[31mERROR RETRIEVING TMDB DATA FOR '%s'!\033[0m" % (title),
|
| )
|
| LOGGER.error(str(e))
|
| if search_content.get("total_results", 0) > 0:
|
| data = search_content["results"][0]
|
| if data.get("backdrop_path"):
|
| data["backdrop_path"] = ider_vars["backdrop_base_url"] + data.get(
|
| "backdrop_path"
|
| )
|
| else:
|
| data["backdrop_path"] = None
|
| if data.get("poster_path"):
|
| data["poster_path"] = ider_vars["poster_base_url"] + data.get(
|
| "poster_path"
|
| )
|
| else:
|
| data["poster_path"] = None
|
| else:
|
| data = dict(
|
| {
|
| "adult": False,
|
| "backdrop_path": None,
|
| "genre_ids": [],
|
| "id": None,
|
| "original_language": None,
|
| "overview": None,
|
| "popularity": 70.412,
|
| "poster_path": None,
|
| "release_date": "%s-01-01" % (tmp_year),
|
| "title": title,
|
| "vote_average": 0.0,
|
| },
|
| )
|
| adult = data.get("adult", False)
|
| apiId = data.get("id")
|
| backdropPath = data.get("backdrop_path", None)
|
| genres = data.get("genre_ids", [])
|
| tmp_genres = []
|
| for genre in genres:
|
| for item in ider_vars["movie_genre_ids"]["genres"]:
|
| if item["id"] == genre:
|
| tmp_genres.append(item["name"])
|
| break
|
| genres = tmp_genres
|
| language = data.get("original_language", None)
|
| overview = data.get("overview", None)
|
| popularity = data.get("popularity", 0.0)
|
| posterPath = data.get("poster_path", None)
|
| releaseDate = data.get("release_date", "%s-01-01" % (tmp_year))
|
| title = data.get("title", title)
|
| voteAverage = data.get("vote_average", 0.0)
|
| return (
|
| adult,
|
| apiId,
|
| backdropPath,
|
| genres,
|
| language,
|
| overview,
|
| popularity,
|
| posterPath,
|
| releaseDate,
|
| title,
|
| voteAverage,
|
| )
|
| elif tv == True and anime == False:
|
| if ider_vars["adult"] == True:
|
| search_url = "https://proxy.cors.sh/https://api.themoviedb.org/3/search/tv?api_key=%s&query=%s&first_air_date_year=%s&language=%s&include_adult=true" % (
|
| ider_vars["tmdb_api_key"],
|
| urllib.parse.quote(title.encode("utf-8")),
|
| year,
|
| ider_vars["language"],
|
| )
|
| else:
|
| search_url = "https://proxy.cors.sh/https://api.themoviedb.org/3/search/tv?api_key=%s&query=%s&first_air_date_year=%s&language=%s" % (
|
| ider_vars["tmdb_api_key"],
|
| urllib.parse.quote(title.encode("utf-8")),
|
| year,
|
| ider_vars["language"],
|
| )
|
| try:
|
| header = {
|
| 'x-cors-api-key': 'temp_4f366722ffa4bdd63246e0a9227c56e8',
|
| }
|
| search_content = requests.get(search_url, headers=header).json()
|
| except Exception as e:
|
| search_content = {"total_results": 0}
|
| LOGGER.error(
|
| "\033[31mERROR RETRIEVING TMDB DATA FOR '%s'!\033[0m" % (title,),
|
| )
|
| LOGGER.error(str(e))
|
| if search_content.get("total_results", 0) > 0:
|
| data = search_content["results"][0]
|
| if data.get("backdrop_path"):
|
| data["backdrop_path"] = ider_vars["backdrop_base_url"] + data.get(
|
| "backdrop_path"
|
| )
|
| else:
|
| data["backdrop_path"] = None
|
| if data.get("poster_path"):
|
| data["poster_path"] = ider_vars["poster_base_url"] + data.get(
|
| "poster_path"
|
| )
|
| else:
|
| data["poster_path"] = None
|
| else:
|
| data = dict(
|
| {
|
| "backdrop_path": None,
|
| "first_air_date": "%s-01-01" % (tmp_year),
|
| "genre_ids": [],
|
| "id": None,
|
| "name": title,
|
| "original_language": None,
|
| "overview": None,
|
| "popularity": 0.0,
|
| "poster_path": None,
|
| "vote_average": 0.0,
|
| },
|
| )
|
| apiId = data.get("id")
|
| backdropPath = data.get("backdrop_path", None)
|
| genres = data.get("genre_ids", [])
|
| tmp_genres = []
|
| for genre in genres:
|
| for item in ider_vars["tv_genre_ids"]["genres"]:
|
| if item["id"] == genre:
|
| tmp_genres.append(item["name"])
|
| break
|
| genres = tmp_genres
|
| language = data.get("original_language", None)
|
| overview = data.get("overview", None)
|
| popularity = data.get("popularity", 0.0)
|
| posterPath = data.get("poster_path", None)
|
| releaseDate = data.get("first_air_date", "%s-01-01" % (tmp_year))
|
| title = data.get("name", title)
|
| voteAverage = data.get("vote_average", 0.0)
|
| return (
|
| apiId,
|
| backdropPath,
|
| genres,
|
| language,
|
| overview,
|
| popularity,
|
| posterPath,
|
| releaseDate,
|
| title,
|
| voteAverage,
|
| )
|
| elif movie == True and anime == True:
|
| query = """
|
| query ($search: String, $seasonYear: Int, $isAdult: Boolean) {
|
| Media(search: $search, seasonYear: $seasonYear, type: ANIME, isAdult: $isAdult) {
|
| title {
|
| english
|
| romaji
|
| native
|
| }
|
| id
|
| description
|
| genres
|
| isAdult
|
| averageScore
|
| popularity
|
| startDate {
|
| year
|
| month
|
| day
|
| }
|
| bannerImage
|
| coverImage {
|
| large
|
| }
|
| }
|
| }
|
| """
|
| variables = {"search": title}
|
| if ider_vars["adult"] == False:
|
| variables["isAdult"] = False
|
| if year != None and year != "":
|
| variables["seasonYear"] = year
|
| try:
|
| response = requests.post(
|
| "https://graphql.anilist.co",
|
| json={"query": query, "variables": variables},
|
| ).json()
|
| except Exception as e:
|
| response = None
|
| LOGGER.error(
|
| "\033[31mERROR RETRIEVING ANILIST DATA FOR '%s'!\033[0m" % (title),
|
| )
|
| LOGGER.error(str(e))
|
| data = dict(
|
| {
|
| "isAdult": False,
|
| "id": None,
|
| "title": {"english": title},
|
| "startDate": {"year": tmp_year, "month": "01", "day": "01"},
|
| "genres": [],
|
| "original_language": None,
|
| "description": None,
|
| "popularity": 0.0,
|
| "bannerImage": "",
|
| "coverImage": {"large": None},
|
| "averageScore": 0.0,
|
| },
|
| )
|
| if response != None:
|
| if isinstance(response.get("data"), dict):
|
| if response.get("data", {}).get("Media", None):
|
| data = response["data"]["Media"]
|
| if data.get("title", {}).get("english") == None:
|
| if data.get("title", {}).get("romaji") == None:
|
| if data.get("title", {}).get("native") == None:
|
| data["title"] = title
|
| else:
|
| data["title"] = data["title"]["native"]
|
| else:
|
| data["title"] = data["title"]["romaji"]
|
| else:
|
| data["title"] = data["title"]["english"]
|
| startDate = data.get("startDate", {})
|
| releases_date = "%s-%s-%s" % (
|
| startDate.get("year", tmp_year),
|
| startDate.get("month", "01"),
|
| startDate.get("day", "01"),
|
| )
|
| if "None" in releases_date:
|
| releases_date = "%s-%s-%s" % (tmp_year, "01", "01")
|
| genres = []
|
| for genre in data.get("genres", []):
|
| genres.append(genre)
|
| if data.get("bannerImage") != None and data.get("bannerImage") != "":
|
| data["bannerImage"] = data["bannerImage"].replace("/small/", "/large/")
|
| if data.get("description") != None and data.get("description") != "":
|
| data["description"] = re.sub(re.compile("<.*?>"), "", data["description"])
|
| return (
|
| data.get("isAdult", False),
|
| data.get("id"),
|
| data.get("bannerImage"),
|
| genres,
|
| data.get("original_language"),
|
| data.get("description"),
|
| data.get("popularity", 0.0),
|
| data.get("coverImage", {}).get("large"),
|
| releases_date,
|
| data.get("title", title),
|
| data.get("averageScore", 0.0),
|
| )
|
| elif tv == True and anime == True:
|
| query = """
|
| query ($search: String, $seasonYear: Int, $isAdult: Boolean) {
|
| Media(search: $search, seasonYear: $seasonYear, type: ANIME, isAdult: $isAdult) {
|
| title {
|
| english
|
| romaji
|
| native
|
| }
|
| id
|
| description
|
| genres
|
| isAdult
|
| averageScore
|
| popularity
|
| startDate {
|
| year
|
| month
|
| day
|
| }
|
| bannerImage
|
| coverImage {
|
| large
|
| }
|
| }
|
| }
|
| """
|
| variables = {"search": title}
|
| if ider_vars["adult"] == False:
|
| variables["isAdult"] = False
|
| if year != None and year != "":
|
| variables["seasonYear"] = year
|
| try:
|
| response = requests.post(
|
| "https://graphql.anilist.co",
|
| json={"query": query, "variables": variables},
|
| ).json()
|
| except Exception as e:
|
| response = None
|
| LOGGER.error(
|
| "\033[31mERROR RETRIEVING ANILIST DATA FOR '%s'!\033[0m" % (title),
|
| )
|
| LOGGER.error(str(e))
|
| data = dict(
|
| {
|
| "isAdult": False,
|
| "id": None,
|
| "title": {"english": title},
|
| "startDate": {"year": tmp_year, "month": "01", "day": "01"},
|
| "genres": [],
|
| "original_language": None,
|
| "description": None,
|
| "popularity": 0.0,
|
| "bannerImage": "",
|
| "coverImage": {"large": None},
|
| "averageScore": 0.0,
|
| },
|
| )
|
| if response != None:
|
| if isinstance(response.get("data"), dict):
|
| if response.get("data", {}).get("Media", None):
|
| data = response["data"]["Media"]
|
| title_dict = data.get("title", {})
|
| if title_dict.get("english") == None:
|
| if title_dict.get("romaji") == None:
|
| if title_dict.get("native") == None:
|
| data["title"] = title
|
| else:
|
| data["title"] = title_dict["native"]
|
| else:
|
| data["title"] = title_dict["romaji"]
|
| else:
|
| data["title"] = title_dict["english"]
|
| startDate = data.get("startDate", {})
|
| releases_date = "%s-%s-%s" % (
|
| startDate.get("year", tmp_year),
|
| startDate.get("month", "01"),
|
| startDate.get("day", "01"),
|
| )
|
| if "None" in releases_date:
|
| releases_date = "%s-%s-%s" % (tmp_year, "01", "01")
|
| genres = []
|
| for genre in data.get("genres", []):
|
| genres.append(genre)
|
| if data.get("bannerImage") != None and data.get("bannerImage") != "":
|
| data["bannerImage"] = data["bannerImage"].replace("/small/", "/large/")
|
| if data.get("description") != None and data.get("description") != "":
|
| data["description"] = re.sub(re.compile("<.*?>"), "", data["description"])
|
| return (
|
| data.get("isAdult", False),
|
| data.get("id"),
|
| data.get("bannerImage"),
|
| genres,
|
| data.get("original_language"),
|
| data.get("description"),
|
| data.get("popularity", 0.0),
|
| data.get("coverImage", {}).get("large"),
|
| releases_date,
|
| data.get("title", title),
|
| data.get("averageScore", 0.0),
|
| )
|
|
|
|
|
| def readMetadata(config):
|
| if os.path.exists("./metadata.json"):
|
| with open("./metadata.json", "r") as r:
|
| metadata = json.load(r)
|
| else:
|
| metadata = []
|
| build_interval = config.get("build_interval")
|
| if not build_interval:
|
| build_interval = 0
|
| for category in config["category_list"]:
|
| tmp = {
|
| "kind": "drive#file",
|
| "id": "",
|
| "name": "",
|
| "mimeType": "application/vnd.google-apps.folder",
|
| "teamDriveId": "",
|
| "driveId": "",
|
| "type": "directory",
|
| "children": [],
|
| "categoryInfo": category,
|
| "length": 0,
|
| "buildTime": str(
|
| datetime.datetime.utcnow()
|
| - datetime.timedelta(minutes=build_interval + 1)
|
| ),
|
| }
|
| metadata.append(tmp)
|
| return metadata
|
|
|
|
|
| def writeMetadata(config):
|
| header = {
|
| 'x-cors-api-key': 'temp_4f366722ffa4bdd63246e0a9227c56e8',
|
| }
|
| configuration_content = json.loads(
|
| requests.get(
|
| "https://proxy.cors.sh/https://api.themoviedb.org/3/configuration?api_key=%s"
|
| % (config.get("tmdb_api_key")), headers=header
|
| ).content
|
| )
|
| backdrop_base_url = (
|
| configuration_content["images"]["secure_base_url"]
|
| + configuration_content["images"]["backdrop_sizes"][3]
|
| )
|
| poster_base_url = (
|
| configuration_content["images"]["secure_base_url"]
|
| + configuration_content["images"]["poster_sizes"][3]
|
| )
|
| header = {
|
| 'x-cors-api-key': 'temp_4f366722ffa4bdd63246e0a9227c56e8',
|
| }
|
| movie_genre_ids = json.loads(
|
| requests.get(
|
| "https://proxy.cors.sh/https://api.themoviedb.org/3/genre/movie/list?api_key=%s"
|
| % (config.get("tmdb_api_key")), headers=header
|
| ).content
|
| )
|
| tv_genre_ids = json.loads(
|
| requests.get(
|
| "https://proxy.cors.sh/https://api.themoviedb.org/3/genre/tv/list?api_key=%s"
|
| % (config.get("tmdb_api_key")), headers=header
|
| ).content
|
| )
|
|
|
| placeholder_metadata = []
|
| count = 0
|
| for category in config["category_list"]:
|
| ider_vars = {
|
| "tmdb_api_key": config.get("tmdb_api_key"),
|
| "backdrop_base_url": backdrop_base_url,
|
| "poster_base_url": poster_base_url,
|
| "movie_genre_ids": movie_genre_ids,
|
| "tv_genre_ids": tv_genre_ids,
|
| "language": category.get("language", config.get("language", "en")),
|
| "adult": category.get("adult", config.get("adult", False)),
|
| }
|
| count += 1
|
| start_time = datetime.datetime.utcnow()
|
| config, drive = src.functions.credentials.refreshCredentials(config)
|
| LOGGER.info(
|
| "\033[32mBUILDING METADATA FOR CATEGORY %s/%s %s...\033[0m\n"
|
| % (count, len(config["category_list"]), category["name"])
|
| )
|
| try:
|
| root = (
|
| drive.files()
|
| .get(fileId=category["id"], supportsAllDrives=True)
|
| .execute()
|
| )
|
| except Exception as e:
|
| LOGGER.error(
|
| "\033[31mERROR RETRIEVING FOLDER '%s'!\033[0m" % (category["name"]),
|
| )
|
| LOGGER.error(str(e))
|
| if category["type"] == "Movies":
|
| tree = root
|
| tree["type"] = "directory"
|
| tree["children"] = []
|
| tmp_metadata = src.functions.drivetools.driveWalk(
|
| root, drive, root, "video"
|
| )
|
| tmp_metadata["categoryInfo"] = category
|
| tmp_metadata["length"] = len(tmp_metadata["children"])
|
| tmp_metadata["buildTime"] = str(datetime.datetime.utcnow())
|
| if category.get("anilist") == True:
|
| items_count = 0
|
| items_length = len(tmp_metadata["children"])
|
| for item in tmp_metadata["children"]:
|
| items_count += 1
|
| LOGGER.info(
|
| "\033[93mSCRAPING %s/%s %s...\033[0m"
|
| % (items_count, items_length, item["name"]),
|
| )
|
| if item["type"] == "file":
|
| title, year = parseMovie(item["name"])
|
| if title == None:
|
| title = item["name"]
|
| if year == None:
|
| year = ""
|
| item["api"] = "anilist"
|
| (
|
| item["adult"],
|
| item["apiId"],
|
| item["backdropPath"],
|
| item["genres"],
|
| item["language"],
|
| item["overview"],
|
| item["popularity"],
|
| item["posterPath"],
|
| item["releaseDate"],
|
| item["title"],
|
| item["voteAverage"],
|
| ) = mediaIdentifier(
|
| ider_vars,
|
| title,
|
| year,
|
| movie=True,
|
| tv=False,
|
| anime=True,
|
| )
|
| else:
|
| items_count = 0
|
| items_length = len(tmp_metadata["children"])
|
| for item in tmp_metadata["children"]:
|
| items_count += 1
|
| LOGGER.info(
|
| "\033[93mSCRAPING %s/%s %s...\033[0m"
|
| % (items_count, items_length, item["name"])
|
| )
|
| if item["type"] == "file":
|
| title, year = parseMovie(item["name"])
|
| if title == None:
|
| title = item["name"]
|
| if year == None:
|
| year = ""
|
| item["api"] = "tmdb"
|
| (
|
| item["adult"],
|
| item["apiId"],
|
| item["backdropPath"],
|
| item["genres"],
|
| item["language"],
|
| item["overview"],
|
| item["popularity"],
|
| item["posterPath"],
|
| item["releaseDate"],
|
| item["title"],
|
| item["voteAverage"],
|
| ) = mediaIdentifier(
|
| ider_vars,
|
| title,
|
| year,
|
| movie=True,
|
| tv=False,
|
| anime=False,
|
| )
|
|
|
| placeholder_metadata.append(tmp_metadata)
|
| elif category["type"] == "TV Shows":
|
| if root["mimeType"] == "application/vnd.google-apps.folder":
|
| if config.get("build_type") == "full":
|
| root["type"] = "directory"
|
| root["children"] = []
|
| for item in src.functions.drivetools.driveIter(
|
| root, drive, "video"
|
| ):
|
| if root["mimeType"] == "application/vnd.google-apps.folder":
|
| item["children"] = []
|
| for x in src.functions.drivetools.driveIter(
|
| item, drive, "video"
|
| ):
|
| if (
|
| x["mimeType"]
|
| == "application/vnd.google-apps.folder"
|
| ):
|
| x["children"] = []
|
| for y in src.functions.drivetools.driveIter(
|
| x, drive, "video"
|
| ):
|
| if "video" in y["mimeType"]:
|
| x["children"].append(y)
|
| item["children"].append(x)
|
| root["children"].append(item)
|
| else:
|
| root["type"] = "directory"
|
| root["children"] = []
|
| for item in src.functions.drivetools.driveIter(
|
| root, drive, "video"
|
| ):
|
| if root["mimeType"] == "application/vnd.google-apps.folder":
|
| root["children"].append(item)
|
| tmp_metadata = root
|
| tmp_metadata["categoryInfo"] = category
|
| tmp_metadata["length"] = len(tmp_metadata["children"])
|
| tmp_metadata["buildTime"] = str(datetime.datetime.utcnow())
|
| if category.get("anilist") == True:
|
| items_count = 0
|
| items_length = len(tmp_metadata["children"])
|
| for item in tmp_metadata["children"]:
|
| items_count += 1
|
| LOGGER.info(
|
| "\033[93mSCRAPING %s/%s %s...\033[0m"
|
| % (items_count, items_length, item["name"]),
|
| )
|
| if item["type"] == "directory":
|
| title, year = parseTV(item["name"])
|
| if title == None:
|
| title = item["name"]
|
| if year == None:
|
| year = ""
|
| item["api"] = "anilist"
|
| (
|
| item["adult"],
|
| item["apiId"],
|
| item["backdropPath"],
|
| item["genres"],
|
| item["language"],
|
| item["overview"],
|
| item["popularity"],
|
| item["posterPath"],
|
| item["releaseDate"],
|
| item["title"],
|
| item["voteAverage"],
|
| ) = mediaIdentifier(
|
| ider_vars,
|
| title,
|
| year,
|
| movie=False,
|
| tv=True,
|
| anime=True,
|
| )
|
| else:
|
| items_count = 0
|
| items_length = len(tmp_metadata["children"])
|
| for item in tmp_metadata["children"]:
|
| items_count += 1
|
| LOGGER.info(
|
| "\033[93mSCRAPING %s/%s %s...\033[0m"
|
| % (items_count, items_length, item["name"]),
|
| )
|
| if item["type"] == "directory":
|
| title, year = parseTV(item["name"])
|
| if title == None:
|
| title = item["name"]
|
| if year == None:
|
| year = ""
|
| item["api"] = "tmdb"
|
| (
|
| item["apiId"],
|
| item["backdropPath"],
|
| item["genres"],
|
| item["language"],
|
| item["overview"],
|
| item["popularity"],
|
| item["posterPath"],
|
| item["releaseDate"],
|
| item["title"],
|
| item["voteAverage"],
|
| ) = mediaIdentifier(
|
| ider_vars,
|
| title,
|
| year,
|
| movie=False,
|
| tv=True,
|
| anime=False,
|
| )
|
|
|
| placeholder_metadata.append(tmp_metadata)
|
| LOGGER.info("\nDONE IN %s.\n" % (str(datetime.datetime.utcnow() - start_time)))
|
|
|
| metadata = placeholder_metadata
|
|
|
| with open("./metadata.json", "w+") as w:
|
| json.dump(obj=metadata, fp=w, sort_keys=True, indent=4)
|
|
|
| if os.getenv("LIBDRIVE_CLOUD"):
|
| config, drive = src.functions.credentials.refreshCredentials(config)
|
| params = {
|
| "supportsAllDrives": True,
|
| "includeItemsFromAllDrives": True,
|
| "fields": "files(id,name)",
|
| "q": "'%s' in parents and trashed = false and mimeType = 'application/json'"
|
| % (os.getenv("LIBDRIVE_CLOUD")),
|
| }
|
| files = drive.files().list(**params).execute()["files"]
|
| metadata_file = next((i for i in files if i["name"] == "metadata.json"), None)
|
| file_metadata = {
|
| "name": "metadata.json",
|
| "mimeType": "application/json",
|
| "parents": [os.getenv("LIBDRIVE_CLOUD")],
|
| }
|
| media = googleapiclient.http.MediaFileUpload(
|
| "./metadata.json", mimetype="application/json", resumable=True
|
| )
|
| if metadata_file:
|
| params = {
|
| "fileId": metadata_file["id"],
|
| "media_body": media,
|
| "supportsAllDrives": True,
|
| }
|
| drive.files().update(**params).execute()
|
| else:
|
| params = {
|
| "body": file_metadata,
|
| "media_body": media,
|
| "supportsAllDrives": True,
|
| }
|
| drive.files().create(**params).execute()
|
| return metadata
|
|
|
|
|
| def jsonExtract(obj, key, val, multi=False):
|
| arr = []
|
|
|
| def extract(obj, arr, key, val):
|
| if isinstance(obj, dict):
|
| for k, v in obj.items():
|
| if isinstance(v, (dict, list)):
|
| extract(v, arr, key, val)
|
| elif key and val:
|
| if k == key and v == val:
|
| arr.append(obj)
|
| elif key or val:
|
| if k == key or v == val:
|
| arr.append(obj)
|
| elif isinstance(obj, list):
|
| for item in obj:
|
| extract(item, arr, key, val)
|
| return arr
|
|
|
| results = extract(obj, arr, key, val)
|
| if multi == False and len(results) > 0:
|
| return results[0]
|
| elif multi == True and len(results) > 0:
|
| return results
|
| else:
|
| return None
|
|
|