Scripting way to upload videos to peertube and youtube
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

260 lines
7.9 KiB

#!/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