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