Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 26 additions & 43 deletions ricecooker/classes/files.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ class File(object):
is_primary = False
duration = None
skip_upload = False
default_preset = None

def __init__(
self,
Expand Down Expand Up @@ -91,8 +92,11 @@ def validate(self):
def get_preset(self):
if self.preset:
return self.preset
if self.default_preset:
return self.default_preset
raise NotImplementedError(
"preset must be set if preset isn't specified when creating File object"
f"preset must be set if preset and default_preset isn't specified when creating {self.__class__.__name__} "
f"object for file {self.filename} ({self.original_filename})"
)

def get_filename(self):
Expand Down Expand Up @@ -195,13 +199,16 @@ def process_file(self):
self.validate()
pipeline = config.FILE_PIPELINE or fallback_pipeline
try:
metadata = pipeline.execute(self.path, context=self.context)[0]
metadata = pipeline.execute(
self.path, context=self.context, skip_cache=config.UPDATE
)[0]
metadata = metadata.to_dict()
for key in metadata:
if key == "path":
# Don't overwrite the input path.
continue
setattr(self, key, metadata[key])
self.validate()
if not self.filename:
raise InvalidFileException("File could not be processed by pipeline")
return super().process_file()
Expand All @@ -219,15 +226,13 @@ class ImageDownloadFile(DownloadFile):
class SlideImageFile(ImageDownloadFile):
default_ext = file_formats.PNG
is_primary = True
default_preset = format_presets.SLIDESHOW_IMAGE

def __init__(self, path, caption="", descriptive_text="", **kwargs):
self.caption = caption
self.descriptive_text = descriptive_text
super(ImageDownloadFile, self).__init__(path, **kwargs)

def get_preset(self):
return format_presets.SLIDESHOW_IMAGE


class ThumbnailFile(ThumbnailPresetMixin, ImageDownloadFile):
default_ext = file_formats.PNG
Expand All @@ -237,58 +242,46 @@ class AudioFile(DownloadFile):
default_ext = file_formats.MP3
allowed_formats = AudioCompressionHandler.EXTENSIONS
is_primary = True
default_preset = format_presets.AUDIO

def __init__(self, path, ffmpeg_settings=None, **kwargs):
super(AudioFile, self).__init__(path, **kwargs)
self.context["audio_settings"] = ffmpeg_settings or {}

def get_preset(self):
return self.preset or format_presets.AUDIO


class DocumentFile(DownloadFile):
default_ext = file_formats.PDF
allowed_formats = {file_formats.PDF}
is_primary = True

def get_preset(self):
return self.preset or format_presets.DOCUMENT
default_preset = format_presets.DOCUMENT


class EPubFile(DownloadFile):
default_ext = file_formats.EPUB
allowed_formats = {file_formats.EPUB}
is_primary = True

def get_preset(self):
return self.preset or format_presets.EPUB
default_preset = format_presets.EPUB


class BloomPubFile(DownloadFile):
default_ext = file_formats.BLOOMPUB
allowed_formats = {file_formats.BLOOMPUB, file_formats.BLOOMD}
is_primary = True

def get_preset(self):
return self.preset or format_presets.BLOOMPUB
default_preset = format_presets.BLOOMPUB


class HTMLZipFile(DownloadFile):
default_ext = file_formats.HTML5
allowed_formats = {file_formats.HTML5}
is_primary = True

def get_preset(self):
return self.preset or format_presets.HTML5_ZIP
default_preset = format_presets.HTML5_ZIP


class H5PFile(DownloadFile):
default_ext = file_formats.H5P
allowed_formats = {file_formats.H5P}
is_primary = True

def get_preset(self):
return self.preset or format_presets.H5P_ZIP
default_preset = format_presets.H5P_ZIP


class VideoFile(DownloadFile):
Expand All @@ -300,9 +293,6 @@ def __init__(self, path, ffmpeg_settings=None, **kwargs):
super(VideoFile, self).__init__(path, **kwargs)
self.context["video_settings"] = ffmpeg_settings or {}

def get_preset(self):
return self.preset


class WebVideoFile(DownloadFile):
is_primary = True
Expand All @@ -323,9 +313,6 @@ def __init__(
self.context["max_height"] = maxheight
self.context["high_resolution"] = high_resolution

def get_preset(self):
return self.preset


class YouTubeVideoFile(WebVideoFile):
def __init__(self, youtube_id, **kwargs):
Expand All @@ -335,6 +322,7 @@ def __init__(self, youtube_id, **kwargs):


class YouTubeSubtitleFile(File):
default_preset = format_presets.VIDEO_SUBTITLE
"""
Helper class for downloading youtube subtitles.
Args:
Expand All @@ -360,13 +348,11 @@ def __init__(self, youtube_id, language=None, **kwargs):
}
assert self.language, "Subtitles must have a language"

def get_preset(self):
return self.preset or format_presets.VIDEO_SUBTITLE


class SubtitleFile(DownloadFile):
default_ext = file_formats.VTT
allowed_formats = SubtitleConversionHandler.EXTENSIONS
default_preset = format_presets.VIDEO_SUBTITLE

def __init__(self, path, **kwargs):
"""
Expand All @@ -384,9 +370,6 @@ def __init__(self, path, **kwargs):
"default_ext": self.subtitlesformat,
}

def get_preset(self):
return self.preset or format_presets.VIDEO_SUBTITLE


class Base64ImageFile(ThumbnailPresetMixin, DownloadFile):
default_ext = file_formats.PNG
Expand All @@ -396,23 +379,22 @@ def __init__(self, encoding, **kwargs):


class _ExerciseBase64ImageFile(Base64ImageFile):
def get_preset(self):
return self.preset or format_presets.EXERCISE_IMAGE
default_preset = format_presets.EXERCISE_IMAGE

def get_replacement_str(self):
return self.get_filename() or self.path


class _ExerciseImageFile(ImageDownloadFile):
default_preset = format_presets.EXERCISE_IMAGE

def get_replacement_str(self):
return self.get_filename() or self.path

def get_preset(self):
return self.preset or format_presets.EXERCISE_IMAGE


class _ExerciseGraphieFile(File):
default_ext = file_formats.GRAPHIE
default_preset = format_presets.EXERCISE_GRAPHIE

def __init__(self, path):
self.original_filename = path.split("/")[-1].split(".")[0]
Expand All @@ -426,9 +408,6 @@ def validate(self):
except ValueError:
raise ValueError("_ExerciseGraphieFile must have a valid URL")

def get_preset(self):
return self.preset or format_presets.EXERCISE_GRAPHIE

def get_replacement_str(self):
if "http" in self.path:
return self.path.split("/")[-1].split(".")[0] or self.path
Expand Down Expand Up @@ -523,27 +502,31 @@ def extractor_fun(self, fpath_in, thumbpath_out, **kwargs):

class ExtractedPdfThumbnailFile(ExtractedThumbnailFile):
extractor_kwargs = {"page_number": 0, "crop": None}
allowed_formats = DocumentFile.allowed_formats

def extractor_fun(self, fpath_in, thumbpath_out, **kwargs):
create_image_from_pdf_page(fpath_in, thumbpath_out, **kwargs)


class ExtractedEPubThumbnailFile(ExtractedThumbnailFile):
extractor_kwargs = {"crop": None}
allowed_formats = EPubFile.allowed_formats

def extractor_fun(self, fpath_in, thumbpath_out, **kwargs):
create_image_from_epub(fpath_in, thumbpath_out, **kwargs)


class ExtractedHTMLZipThumbnailFile(ExtractedThumbnailFile):
extractor_kwargs = {"crop": "smart"}
allowed_formats = HTMLZipFile.allowed_formats

def extractor_fun(self, fpath_in, thumbpath_out, **kwargs):
create_image_from_zip(fpath_in, thumbpath_out, **kwargs)


class ExtractedVideoThumbnailFile(ExtractedThumbnailFile):
extractor_kwargs = {"overwrite": True}
allowed_formats = VideoFile.allowed_formats

def extractor_fun(self, fpath_in, thumbpath_out, **kwargs):
extract_thumbnail_from_video(fpath_in, thumbpath_out, **kwargs)
Expand Down
6 changes: 2 additions & 4 deletions ricecooker/classes/licenses.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,10 @@ def get_id(self):
def validate(self):
assert (
not self.require_copyright_holder or self.copyright_holder != ""
), "Assertion Failed: {} License requires a copyright holder".format(
self.license_id
)
), "{} License requires a copyright holder".format(self.license_id)
assert isinstance(
self.copyright_holder, str
), "Assertion Failed: Copyright holder must be a string"
), "Copyright holder must be a string"

def truncate_fields(self):
if (
Expand Down
Loading
Loading