#!/usr/bin/env python3
|
|
|
|
import toml
|
|
import pathlib
|
|
from datetime import datetime
|
|
|
|
_autouploadFiles = []
|
|
|
|
class AutoUpload(object):
|
|
"""AutoUpload is a class handling the state of videos automatically uploaded by prismedia"""
|
|
|
|
_videoSuffix = ".mp4"
|
|
|
|
urlSuffix = "-url"
|
|
errorSuffix = "-error"
|
|
publishSuffix = "-publish"
|
|
lastUpdateTimeKey = "update-time"
|
|
|
|
def __init__(self, autouploadFile):
|
|
super(AutoUpload, self).__init__()
|
|
|
|
# print("content of file")
|
|
# with open(autouploadFile, "r") as file:
|
|
# print(file.readlines())
|
|
|
|
self._baseAutouploadFile = autouploadFile
|
|
self._basePath = pathlib.Path(autouploadFile).resolve().parent
|
|
self._load()
|
|
|
|
def nextVideo(self, platform, recursive=True):
|
|
"""Get the path to the next video to upload for a specific platform"""
|
|
|
|
# Get next video from current autoupload file
|
|
for nextVideo in self._autoUploadConfig["videos"]:
|
|
if platform + AutoUpload.urlSuffix not in self._autoUploadConfig["videos"][nextVideo]:
|
|
videoPath = (self._basePath / nextVideo).with_suffix(self._videoSuffix).resolve().as_posix()
|
|
return Video(self, platform, nextVideo, videoPath, (self._baseAutouploadFile, self._autoUploadConfig))
|
|
|
|
# Get next video from another autoupload file
|
|
if recursive:
|
|
for file in _autouploadFiles:
|
|
if file[0] != self._baseAutouploadFile:
|
|
nextVideo = file[1].nextVideo(platform, False)
|
|
if nextVideo:
|
|
videoPath = (self._basePath / nextVideo.videoName).with_suffix(self._videoSuffix).resolve().as_posix()
|
|
return Video(self, platform, nextVideo.videoName, nextVideo.videoPath, (file[0], file[1]._autoUploadConfig))
|
|
|
|
# No video to upload for this platforms
|
|
return None
|
|
|
|
def reload(self):
|
|
"""Reload the configuration"""
|
|
|
|
_autouploadFiles.clear()
|
|
self._load()
|
|
|
|
def _load(self):
|
|
"""Private helper function
|
|
Load the configuration file."""
|
|
# We can reuse this function to reload the configuration after saving the files, or not
|
|
|
|
self._autoUploadConfig = toml.load(self._baseAutouploadFile)
|
|
_autouploadFiles.append((self._baseAutouploadFile, self))
|
|
|
|
# This should take care of circular references
|
|
# TODO: make a test for this
|
|
for autouploadFile in self._autoUploadConfig.get("autoupload", []):
|
|
alreadyPresentAutoupload = False
|
|
|
|
for file in _autouploadFiles:
|
|
if file[0] == autouploadFile:
|
|
alreadyPresentAutoupload = True
|
|
|
|
if not alreadyPresentAutoupload:
|
|
AutoUpload(autouploadFile)
|
|
|
|
# TODO: remove me / should only be here for debug
|
|
# print("setting autouplad config")
|
|
# print(self._baseAutouploadFile)
|
|
# print(self._autoUploadConfig)
|
|
|
|
|
|
class Video(object):
|
|
"""Returned by AutoUpload when looking for the next Video to upload."""
|
|
|
|
def __init__(self, parent, platform, videoName, videoPath, autouploadFile):
|
|
super(Video, self).__init__()
|
|
self._autouploadFile = autouploadFile
|
|
|
|
self.parent = parent
|
|
self.platform = platform
|
|
self.videoName = videoName
|
|
self.videoPath = videoPath
|
|
|
|
def success(self, url, publishDate):
|
|
"""Last video asked was successfully uploaded"""
|
|
|
|
updateTime = datetime.today()
|
|
|
|
# Remove last error if there were any
|
|
self._autouploadFile[1]["videos"][self.videoName].pop(self.platform + AutoUpload.errorSuffix, None)
|
|
|
|
self._autouploadFile[1]["videos"][self.videoName][AutoUpload.lastUpdateTimeKey] = updateTime
|
|
self._autouploadFile[1]["videos"][self.videoName][self.platform + AutoUpload.urlSuffix] = url
|
|
self._autouploadFile[1]["videos"][self.videoName][self.platform + AutoUpload.publishSuffix] = publishDate
|
|
|
|
self._write()
|
|
|
|
def error(self, errorString):
|
|
"""There was an error on upload of last video"""
|
|
|
|
updateTime = datetime.today()
|
|
|
|
self._autouploadFile[1]["videos"][self.videoName][AutoUpload.lastUpdateTimeKey] = updateTime
|
|
self._autouploadFile[1]["videos"][self.videoName][self.platform + AutoUpload.errorSuffix] = errorString
|
|
|
|
self._write()
|
|
|
|
def _write(self):
|
|
"""Private helper function
|
|
Write current autoupload state on file(s)"""
|
|
|
|
with open(self._autouploadFile[0], "w", encoding="utf-8", errors="strict") as f:
|
|
toml.dump(self._autouploadFile[1], f, encoder=toml.TomlPreserveInlineDictEncoder()) # can we also inherit from toml.TomlPreserveCommentEncoder()?
|
|
|
|
self.parent.reload()
|