#!/usr/bin/python # coding: utf-8 from configparser import RawConfigParser, NoOptionError, NoSectionError from os.path import dirname, splitext, basename, isfile, getmtime, exists from yapsy.PluginManager import PluginManagerSingleton import pluginInterfaces as pi import re import unidecode import logging import datetime logger = logging.getLogger("Prismedia") VALID_PRIVACY_STATUSES = ("public", "private", "unlisted") VALID_CATEGORIES = ( "music", "films", "vehicles", "sports", "travels", "gaming", "people", "comedy", "entertainment", "news", "how to", "education", "activism", "science & technology", "science", "technology", "animals" ) VALID_LANGUAGES = ("arabic", "english", "french", "german", "hindi", "italian", "japanese", "korean", "mandarin", "portuguese", "punjabi", "russian", "spanish") VALID_PROGRESS = ("percentage", "bigfile", "accurate") def helperFunctionalities(options): pluginManager = PluginManagerSingleton.get() optionName = "--heartbeat" if options.get(optionName): for plugin in pluginManager.getPluginsOfCategory(pi.PluginTypes.PLATFORM): plugin.plugin_object.heartbeat() return False else: options.pop(optionName) return True def get_exception_string(e): if hasattr(e, "message"): return str(e.message) else: return str(e) def validateVideo(path): supported_types = ["video/mp4"] detected_type = magic.from_file(path, mime=True) if detected_type not in supported_types: print("File", path, "detected type is `" + detected_type + "` which is not one of", supported_types) force_file = ["y", "yes"] is_forcing = input("Are you sure you selected the correct file? (y/N)") if is_forcing.lower() not in force_file: return False return path def validateCategory(category): if category.lower() in VALID_CATEGORIES: return True else: return False def validatePrivacy(privacy): if privacy.lower() in VALID_PRIVACY_STATUSES: return True else: return False # TODO: remove me? # def validatePlatform(platform): # for plfrm in platform.split(','): # if plfrm.lower().replace(" ", "") not in VALID_PLATFORM: # return False # # return True def validateLanguage(language): if language.lower() in VALID_LANGUAGES: return True else: return False def validateDate(date): return datetime.datetime.strptime(date, "%Y-%m-%dT%H:%M:%S") def validatePublishDate(publishDate): # Check date format and if date is future try: now = datetime.datetime.now() publishAt = validateDate(publishDate) if now >= publishAt: return False except ValueError: return False return True def validateOriginalDate(originalDate): # Check date format and if date is past try: now = datetime.datetime.now() originalDate = validateDate(originalDate) if now <= originalDate: return False except ValueError: return False return True def validateThumbnail(thumbnail): supported_types = ['image/jpg', 'image/jpeg'] if exists(thumbnail) and \ magic.from_file(thumbnail, mime=True) in supported_types: return thumbnail else: return False def validateLogLevel(loglevel): numeric_level = getattr(logging, loglevel, None) if not isinstance(numeric_level, int): return False return True def validateProgress(progress): for prgs in progress.split(','): if prgs.lower().replace(" ", "") not in VALID_PROGRESS: return False return True def ask_overwrite(question): while True: reply = str(input(question + ' (Yes/[No]): ') or "No").lower().strip() if reply[:1] == 'y': return True if reply[:1] == 'n': return False def remove_empty_kwargs(**kwargs): good_kwargs = {} if kwargs is not None: for key, value in kwargs.items(): if value: good_kwargs[key] = value return good_kwargs def searchOriginalDate(options): fileModificationDate = str(getmtime(options.get('--file'))).split('.') return datetime.datetime.fromtimestamp(int(fileModificationDate[0])).isoformat() # # return the nfo as a RawConfigParser object # def loadNFO(filename): # try: # logger.info("Loading " + filename + " as NFO") # nfo = RawConfigParser() # nfo.read(filename, encoding='utf-8') # return nfo # except Exception as e: # logger.critical("Problem loading NFO file " + filename + ": " + str(e)) # exit(1) # return False # # # def parseNFO(options): # video_directory = dirname(options.get('--file')) # directory_name = basename(video_directory) # nfo_txt = False # nfo_directory = False # nfo_videoname = False # nfo_file = False # nfo_cli = False # # if isfile(video_directory + "/" + "nfo.txt"): # nfo_txt = loadNFO(video_directory + "/" + "nfo.txt") # elif isfile(video_directory + "/" + "NFO.txt"): # nfo_txt = loadNFO(video_directory + "/" + "NFO.txt") # # if isfile(video_directory + "/" + directory_name + ".txt"): # nfo_directory = loadNFO(video_directory + "/" + directory_name + ".txt") # # if options.get('--name'): # if isfile(video_directory + "/" + options.get('--name')): # nfo_videoname = loadNFO(video_directory + "/" + options.get('--name') + ".txt") # # video_file = splitext(basename(options.get('--file')))[0] # if isfile(video_directory + "/" + video_file + ".txt"): # nfo_file = loadNFO(video_directory + "/" + video_file + ".txt") # # if options.get('--nfo'): # if isfile(options.get('--nfo')): # nfo_cli = loadNFO(options.get('--nfo')) # else: # logger.critical("Given NFO file does not exist, please check your path.") # exit(1) # # # If there is no NFO and strict option is enabled, then stop there # if options.get('--withNFO'): # if not isinstance(nfo_cli, RawConfigParser) and \ # not isinstance(nfo_file, RawConfigParser) and \ # not isinstance(nfo_videoname, RawConfigParser) and \ # not isinstance(nfo_directory, RawConfigParser) and \ # not isinstance(nfo_txt, RawConfigParser): # logger.critical("You have required the strict presence of NFO but none is found, please use a NFO.") # exit(1) # # # We need to load NFO in this exact order to keep the priorities # # options in cli > nfo_cli > nfo_file > nfo_videoname > nfo_directory > nfo_txt # for nfo in [nfo_cli, nfo_file, nfo_videoname, nfo_directory, nfo_txt]: # if nfo: # # We need to check all options and replace it with the nfo value if not defined (None or False) # for key, value in options.items(): # key = key.replace("--", "") # try: # # get string options # if value is None and nfo.get('video', key): # options['--' + key] = nfo.get('video', key) # # get boolean options # elif value is False and nfo.getboolean('video', key): # options['--' + key] = nfo.getboolean('video', key) # except NoOptionError: # continue # except NoSectionError: # logger.critical(nfo + " misses section [video], please check syntax of your NFO.") # exit(1) # return options def cleanString(toclean): toclean = unidecode.unidecode(toclean) cleaned = re.sub('[^A-Za-z0-9]+', '', toclean) return cleaned def getOption(options, optionName, defaultValue=None): value = options.get(optionName) options.pop(optionName) if value is None: return defaultValue return value