From 28cb58356e18be4e2c1d8d20ee06c75ea2a4d9ac Mon Sep 17 00:00:00 2001 From: Theta-Dev Date: Sat, 21 May 2022 00:05:41 +0200 Subject: [PATCH 1/2] fixed scheduler init, add redis to CI --- .drone.yml | 40 +++++++++++++++++++++++- ucast/apps.py | 5 --- ucast/management/__init__.py | 0 ucast/management/commands/__init__.py | 0 ucast/management/commands/rqscheduler.py | 11 +++++++ ucast/service/cover.py | 14 ++++----- ucast/service/util.py | 8 +++-- ucast/tasks/download.py | 11 ------- ucast/tasks/schedule.py | 27 ++++++++++++++++ 9 files changed, 90 insertions(+), 26 deletions(-) create mode 100644 ucast/management/__init__.py create mode 100644 ucast/management/commands/__init__.py create mode 100644 ucast/management/commands/rqscheduler.py create mode 100644 ucast/tasks/schedule.py diff --git a/.drone.yml b/.drone.yml index 33803de..0bd5e51 100644 --- a/.drone.yml +++ b/.drone.yml @@ -7,9 +7,47 @@ platform: arch: '' steps: - - name: Test + - name: install dependencies image: thetadev256/ucast-dev + volumes: + - name: cache + path: /root/.cache commands: - poetry install + + - name: lint + image: thetadev256/ucast-dev + volumes: + - name: cache + path: /root/.cache + commands: - poetry run invoke lint + + - name: start worker + image: thetadev256/ucast-dev + volumes: + - name: cache + path: /root/.cache + environment: + UCAST_REDIS_HOST: redis + commands: + - poetry run invoke worker + detach: true + + - name: test + image: thetadev256/ucast-dev + volumes: + - name: cache + path: /root/.cache + environment: + UCAST_REDIS_HOST: redis + commands: - poetry run invoke test + +services: + - name: redis + image: redis:alpine + +volumes: + - name: cache + temp: { } diff --git a/ucast/apps.py b/ucast/apps.py index 41af053..ad4b110 100644 --- a/ucast/apps.py +++ b/ucast/apps.py @@ -4,8 +4,3 @@ from django.apps import AppConfig class UcastConfig(AppConfig): default_auto_field = "django.db.models.BigAutoField" name = "ucast" - - def ready(self): - from ucast.tasks import download - - download.schedule_update_channels() diff --git a/ucast/management/__init__.py b/ucast/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ucast/management/commands/__init__.py b/ucast/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ucast/management/commands/rqscheduler.py b/ucast/management/commands/rqscheduler.py new file mode 100644 index 0000000..6a357ff --- /dev/null +++ b/ucast/management/commands/rqscheduler.py @@ -0,0 +1,11 @@ +from django_rq.management.commands import rqscheduler + +from ucast.tasks import schedule + + +class Command(rqscheduler.Command): + def handle(self, *args, **kwargs): + print("Starting ucast scheduler") + schedule.clear_scheduled_jobs() + schedule.register_scheduled_jobs() + super(Command, self).handle(*args, **kwargs) diff --git a/ucast/service/cover.py b/ucast/service/cover.py index a50ef90..ef195b1 100644 --- a/ucast/service/cover.py +++ b/ucast/service/cover.py @@ -197,9 +197,9 @@ def _get_baseimage(thumbnail: Image.Image, style: CoverStyle): ctn_width = int(COVER_WIDTH / thumbnail.height * thumbnail.width) ctn_x_left = int((ctn_width - COVER_WIDTH) / 2) - ctn = thumbnail.resize((ctn_width, COVER_WIDTH), Image.LANCZOS).filter( - ImageFilter.GaussianBlur(20) - ) + ctn = thumbnail.resize( + (ctn_width, COVER_WIDTH), Image.Resampling.LANCZOS + ).filter(ImageFilter.GaussianBlur(20)) cover.paste(ctn, (-ctn_x_left, 0)) return cover @@ -219,9 +219,9 @@ def _resize_thumbnail(thumbnail: Image.Image) -> Image.Image: tn_crop_y_top = int((tn_resize_height - tn_height) / 2) tn_crop_y_bottom = tn_resize_height - tn_crop_y_top - return thumbnail.resize((COVER_WIDTH, tn_resize_height), Image.LANCZOS).crop( - (0, tn_crop_y_top, COVER_WIDTH, tn_crop_y_bottom) - ) + return thumbnail.resize( + (COVER_WIDTH, tn_resize_height), Image.Resampling.LANCZOS + ).crop((0, tn_crop_y_top, COVER_WIDTH, tn_crop_y_bottom)) def _prepare_text_background( @@ -357,7 +357,7 @@ def _draw_text_avatar( ) if avatar: - avt = avatar.resize((avt_size, avt_size), Image.LANCZOS) + avt = avatar.resize((avt_size, avt_size), Image.Resampling.LANCZOS) circle_mask = Image.new("L", (avt_size, avt_size)) circle_mask_draw = ImageDraw.Draw(circle_mask) diff --git a/ucast/service/util.py b/ucast/service/util.py index a918721..2a54fff 100644 --- a/ucast/service/util.py +++ b/ucast/service/util.py @@ -32,14 +32,18 @@ def download_image_file(url: str, download_path: Path) -> Path: def resize_avatar(original_file: Path, new_file: Path): avatar = Image.open(original_file) avatar_new_height = int(AVATAR_SM_WIDTH / avatar.width * avatar.height) - avatar = avatar.resize((AVATAR_SM_WIDTH, avatar_new_height), Image.LANCZOS) + avatar = avatar.resize( + (AVATAR_SM_WIDTH, avatar_new_height), Image.Resampling.LANCZOS + ) avatar.save(new_file) def resize_thumbnail(original_file: Path, new_file: Path): thumbnail = Image.open(original_file) tn_new_height = int(THUMBNAIL_SM_WIDTH / thumbnail.width * thumbnail.height) - thumbnail = thumbnail.resize((THUMBNAIL_SM_WIDTH, tn_new_height), Image.LANCZOS) + thumbnail = thumbnail.resize( + (THUMBNAIL_SM_WIDTH, tn_new_height), Image.Resampling.LANCZOS + ) thumbnail.save(new_file) diff --git a/ucast/tasks/download.py b/ucast/tasks/download.py index 924947c..c997a59 100644 --- a/ucast/tasks/download.py +++ b/ucast/tasks/download.py @@ -1,8 +1,6 @@ import os -from datetime import datetime import django_rq -from django.conf import settings from django.utils import timezone from ucast.models import Channel, Video @@ -120,15 +118,6 @@ def import_channel(channel_id: str, limit: int = None): _load_scraped_video(vid, channel) -def schedule_update_channels(): - django_rq.get_scheduler().schedule( - datetime.utcnow(), - update_channels, - id="schedule_update_channels", - interval=settings.YT_UPDATE_INTERVAL, - ) - - def update_channels(): """ Update all channels from their RSS feeds and download new videos. diff --git a/ucast/tasks/schedule.py b/ucast/tasks/schedule.py new file mode 100644 index 0000000..e1fe798 --- /dev/null +++ b/ucast/tasks/schedule.py @@ -0,0 +1,27 @@ +import logging +from datetime import datetime + +import django_rq +from django.conf import settings + +from ucast.tasks import download + +scheduler = django_rq.get_scheduler() +log = logging.getLogger(__name__) + + +def clear_scheduled_jobs(): + """Delete all scheduled jobs to prevent duplicates""" + for job in scheduler.get_jobs(): + log.debug("Deleting scheduled job %s", job) + job.delete() + + +def register_scheduled_jobs(): + """Register all scheduled jobs""" + scheduler.schedule( + datetime.utcnow(), + download.update_channels, + id="schedule_update_channels", + interval=settings.YT_UPDATE_INTERVAL, + ) From 4b6733b9b6148332fc42f6ece4c55fbb91bee4b5 Mon Sep 17 00:00:00 2001 From: Theta-Dev Date: Sat, 21 May 2022 03:10:16 +0200 Subject: [PATCH 2/2] add tests for yt, storage, util --- .gitignore | 5 - pyproject.toml | 3 + tasks.py | 4 +- ucast/service/storage.py | 21 -- ucast/service/util.py | 30 ++- ucast/service/youtube.py | 39 +--- ucast/tasks/download.py | 11 +- ucast/tests/__init__.py | 2 +- ucast/tests/_testfiles/audio/audio1.mp3 | Bin 0 -> 109317 bytes .../{testfiles => _testfiles}/avatar/a1.jpg | Bin .../{testfiles => _testfiles}/avatar/a2.jpg | Bin .../{testfiles => _testfiles}/avatar/a3.jpg | Bin .../{testfiles => _testfiles}/cover/blank.png | Bin .../cover/c1_blur.png | Bin .../cover/c1_gradient.png | Bin .../cover/c1_noavatar.png | Bin .../cover/c2_blur.png | Bin .../cover/c2_gradient.png | Bin .../cover/c3_blur.png | Bin .../cover/c3_gradient.png | Bin .../{testfiles => _testfiles}/sources.md | 5 +- .../thumbnail/t1.webp | Bin .../thumbnail/t2.webp | Bin .../thumbnail/t3.webp | Bin ucast/tests/service/__init__.py | 0 ucast/tests/{ => service}/test_cover.py | 0 ucast/tests/service/test_storage.py | 56 +++++ ucast/tests/service/test_util.py | 92 ++++++++ ucast/tests/service/test_youtube.py | 214 ++++++++++++++++++ ucast/tests/test_util.py | 24 -- ucast/tests/test_youtube.py | 126 ----------- 31 files changed, 406 insertions(+), 226 deletions(-) create mode 100644 ucast/tests/_testfiles/audio/audio1.mp3 rename ucast/tests/{testfiles => _testfiles}/avatar/a1.jpg (100%) rename ucast/tests/{testfiles => _testfiles}/avatar/a2.jpg (100%) rename ucast/tests/{testfiles => _testfiles}/avatar/a3.jpg (100%) rename ucast/tests/{testfiles => _testfiles}/cover/blank.png (100%) rename ucast/tests/{testfiles => _testfiles}/cover/c1_blur.png (100%) rename ucast/tests/{testfiles => _testfiles}/cover/c1_gradient.png (100%) rename ucast/tests/{testfiles => _testfiles}/cover/c1_noavatar.png (100%) rename ucast/tests/{testfiles => _testfiles}/cover/c2_blur.png (100%) rename ucast/tests/{testfiles => _testfiles}/cover/c2_gradient.png (100%) rename ucast/tests/{testfiles => _testfiles}/cover/c3_blur.png (100%) rename ucast/tests/{testfiles => _testfiles}/cover/c3_gradient.png (100%) rename ucast/tests/{testfiles => _testfiles}/sources.md (72%) rename ucast/tests/{testfiles => _testfiles}/thumbnail/t1.webp (100%) rename ucast/tests/{testfiles => _testfiles}/thumbnail/t2.webp (100%) rename ucast/tests/{testfiles => _testfiles}/thumbnail/t3.webp (100%) create mode 100644 ucast/tests/service/__init__.py rename ucast/tests/{ => service}/test_cover.py (100%) create mode 100644 ucast/tests/service/test_storage.py create mode 100644 ucast/tests/service/test_util.py create mode 100644 ucast/tests/service/test_youtube.py delete mode 100644 ucast/tests/test_util.py delete mode 100644 ucast/tests/test_youtube.py diff --git a/.gitignore b/.gitignore index d4414bf..261201c 100644 --- a/.gitignore +++ b/.gitignore @@ -14,11 +14,6 @@ node_modules # Jupyter .ipynb_checkpoints -# Media files -*.webm -*.mp4 -*.mp3 - # Application data /_run* *.sqlite3 diff --git a/pyproject.toml b/pyproject.toml index 9975146..d2f33af 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,6 +44,9 @@ honcho = "^1.1.0" requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" +[tool.pytest.ini_options] +DJANGO_SETTINGS_MODULE = "ucast_project.settings" + [tool.flake8] extend-ignore = "E501" diff --git a/tasks.py b/tasks.py index 16dd469..62c614f 100644 --- a/tasks.py +++ b/tasks.py @@ -91,8 +91,8 @@ def get_cover(c, vid=""): cv_file = tests.DIR_TESTFILES / "cover" / f"c{ti}_gradient.png" cv_blur_file = tests.DIR_TESTFILES / "cover" / f"c{ti}_blur.png" - tn_file = youtube.download_thumbnail(vinfo, tn_file) - util.download_file(channel_metadata.avatar_url, av_file) + youtube.download_thumbnail(vinfo, tn_file) + util.download_image_file(channel_metadata.avatar_url, av_file) cover.create_cover_file( tn_file, av_file, title, channel_name, cover.COVER_STYLE_GRADIENT, cv_file diff --git a/ucast/service/storage.py b/ucast/service/storage.py index a8e41b7..fbf5206 100644 --- a/ucast/service/storage.py +++ b/ucast/service/storage.py @@ -1,32 +1,11 @@ import os from pathlib import Path -from typing import Tuple -import slugify from django.conf import settings UCAST_DIRNAME = "_ucast" -def _get_slug(str_in: str) -> str: - return slugify.slugify(str_in, lowercase=False, separator="_") - - -def _get_unique_slug(str_in: str, root_dir: Path, extension="") -> Tuple[Path, str]: - original_slug = _get_slug(str_in) - slug = original_slug - i = 0 - - while True: - testfile = root_dir / (slug + extension) - - if not testfile.exists(): - return testfile, slug - - i += 1 - slug = f"{original_slug}_{i}" - - class ChannelFolder: def __init__(self, dir_root: Path): self.dir_root = dir_root diff --git a/ucast/service/util.py b/ucast/service/util.py index 2a54fff..6e260ee 100644 --- a/ucast/service/util.py +++ b/ucast/service/util.py @@ -1,4 +1,4 @@ -import shutil +import io from pathlib import Path import requests @@ -15,18 +15,26 @@ def download_file(url: str, download_path: Path): open(download_path, "wb").write(r.content) -def download_image_file(url: str, download_path: Path) -> Path: - download_file(url, download_path) - img = Image.open(download_path) - img_ext = img.format.lower() - img.close() +def download_image_file(url: str, download_path: Path): + """ + Download an image and convert it to the type given + by the path. + :param url: Image URL + :param download_path: Download path + """ + r = requests.get(url, allow_redirects=True) + r.raise_for_status() + + img = Image.open(io.BytesIO(r.content)) + img_ext = img.format.lower() if img_ext == "jpeg": img_ext = "jpg" - new_path = download_path.with_suffix("." + img_ext) - shutil.move(download_path, new_path) - return new_path + if "." + img_ext == download_path.suffix: + open(download_path, "wb").write(r.content) + else: + img.save(download_path) def resize_avatar(original_file: Path, new_file: Path): @@ -47,5 +55,5 @@ def resize_thumbnail(original_file: Path, new_file: Path): thumbnail.save(new_file) -def get_slug(str_in: str) -> str: - return slugify.slugify(str_in, lowercase=False, separator="_") +def get_slug(text: str) -> str: + return slugify.slugify(text, lowercase=False, separator="_") diff --git a/ucast/service/youtube.py b/ucast/service/youtube.py index 00b1c69..ef68cce 100644 --- a/ucast/service/youtube.py +++ b/ucast/service/youtube.py @@ -92,7 +92,7 @@ class ChannelMetadata: avatar_url: str -def download_thumbnail(vinfo: VideoDetails, download_path: Path) -> Path: +def download_thumbnail(vinfo: VideoDetails, download_path: Path): """ Download the thumbnail image of a YouTube video and save it at the given filepath. The thumbnail file ending is added to the path. @@ -108,7 +108,8 @@ def download_thumbnail(vinfo: VideoDetails, download_path: Path) -> Path: logging.info(f"downloading thumbnail {url}...") try: - return util.download_image_file(url, download_path) + util.download_image_file(url, download_path) + return except requests.HTTPError: logging.warning(f"downloading thumbnail {url} failed") pass @@ -158,20 +159,20 @@ def download_audio( def tag_audio(audio_path: Path, vinfo: VideoDetails, cover_path: Path): title_text = f"{vinfo.published.date().isoformat()} {vinfo.title}" + comment = f"https://youtu.be/{vinfo.id}\n\n{vinfo.description}" - audio = id3.ID3(audio_path) - audio["TPE1"] = id3.TPE1(encoding=3, text=vinfo.channel_name) # Artist - audio["TALB"] = id3.TALB(encoding=3, text=vinfo.channel_name) # Album - audio["TIT2"] = id3.TIT2(encoding=3, text=title_text) # Title - audio["TYER"] = id3.TYER(encoding=3, text=str(vinfo.published.year)) # Year - audio["TDAT"] = id3.TDAT(encoding=3, text=vinfo.published.strftime("%d%m")) # Date - audio["COMM"] = id3.COMM(encoding=3, text=f"YT-ID: {vinfo.id}") # Comment + tag = id3.ID3(audio_path) + tag["TPE1"] = id3.TPE1(encoding=3, text=vinfo.channel_name) # Artist + tag["TALB"] = id3.TALB(encoding=3, text=vinfo.channel_name) # Album + tag["TIT2"] = id3.TIT2(encoding=3, text=title_text) # Title + tag["TDRC"] = id3.TDRC(encoding=3, text=vinfo.published.date().isoformat()) # Date + tag["COMM"] = id3.COMM(encoding=3, text=comment) # Comment with open(cover_path, "rb") as albumart: - audio["APIC"] = id3.APIC( + tag["APIC"] = id3.APIC( encoding=3, mime="image/png", type=3, desc="Cover", data=albumart.read() ) - audio.save() + tag.save() def channel_url_from_id(channel_id: str) -> str: @@ -231,22 +232,6 @@ def get_channel_metadata(channel_url: str) -> ChannelMetadata: return ChannelMetadata(channel_id, name, description, avatar) -def download_avatar(avatar_url: str, download_path: Path) -> Path: - """ - Download the avatar image of a channel. The .jpg file ending - is added to the path. - - :param avatar_url: Channel avatar URL - :param download_path: Download path - :return: Path with file ending - """ - logging.info(f"downloading avatar {avatar_url}...") - - download_path = download_path.with_suffix(".jpg") - util.download_file(avatar_url, download_path) - return download_path - - def get_channel_videos_from_feed(channel_id: str) -> List[VideoScraped]: """ Return videos of a channel using YouTube's RSS feed. Using the feed is fast, diff --git a/ucast/tasks/download.py b/ucast/tasks/download.py index c997a59..0dedb97 100644 --- a/ucast/tasks/download.py +++ b/ucast/tasks/download.py @@ -19,10 +19,8 @@ def _get_or_create_channel(channel_id: str) -> Channel: channel_slug = Channel.get_new_slug(channel_data.name) channel_folder = store.get_channel_folder(channel_slug) - avatar_file = youtube.download_avatar( - channel_data.avatar_url, channel_folder.file_avatar - ) - util.resize_avatar(avatar_file, channel_folder.file_avatar_sm) + util.download_image_file(channel_data.avatar_url, channel_folder.file_avatar) + util.resize_avatar(channel_folder.file_avatar, channel_folder.file_avatar_sm) channel = Channel( id=channel_id, @@ -79,9 +77,8 @@ def download_video(video: Video): details = youtube.download_audio(video.id, audio_file) # Download/convert thumbnails - tn_path = youtube.download_thumbnail( - details, channel_folder.get_thumbnail(video.slug) - ) + tn_path = channel_folder.get_thumbnail(video.slug) + youtube.download_thumbnail(details, tn_path) util.resize_thumbnail(tn_path, channel_folder.get_thumbnail(video.slug, True)) cover_file = channel_folder.get_cover(video.slug) cover.create_cover_file( diff --git a/ucast/tests/__init__.py b/ucast/tests/__init__.py index 293ff6c..c066208 100644 --- a/ucast/tests/__init__.py +++ b/ucast/tests/__init__.py @@ -1,3 +1,3 @@ from importlib.resources import files -DIR_TESTFILES = files("ucast.tests.testfiles") +DIR_TESTFILES = files("ucast.tests._testfiles") diff --git a/ucast/tests/_testfiles/audio/audio1.mp3 b/ucast/tests/_testfiles/audio/audio1.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..97431c9b5a7fb0713f3dd0f042d5b0212cf537f7 GIT binary patch literal 109317 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

%fL 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 literal 0 HcmV?d00001 diff --git a/ucast/tests/testfiles/avatar/a1.jpg b/ucast/tests/_testfiles/avatar/a1.jpg similarity index 100% rename from ucast/tests/testfiles/avatar/a1.jpg rename to ucast/tests/_testfiles/avatar/a1.jpg diff --git a/ucast/tests/testfiles/avatar/a2.jpg b/ucast/tests/_testfiles/avatar/a2.jpg similarity index 100% rename from ucast/tests/testfiles/avatar/a2.jpg rename to ucast/tests/_testfiles/avatar/a2.jpg diff --git a/ucast/tests/testfiles/avatar/a3.jpg b/ucast/tests/_testfiles/avatar/a3.jpg similarity index 100% rename from ucast/tests/testfiles/avatar/a3.jpg rename to ucast/tests/_testfiles/avatar/a3.jpg diff --git a/ucast/tests/testfiles/cover/blank.png b/ucast/tests/_testfiles/cover/blank.png similarity index 100% rename from ucast/tests/testfiles/cover/blank.png rename to ucast/tests/_testfiles/cover/blank.png diff --git a/ucast/tests/testfiles/cover/c1_blur.png b/ucast/tests/_testfiles/cover/c1_blur.png similarity index 100% rename from ucast/tests/testfiles/cover/c1_blur.png rename to ucast/tests/_testfiles/cover/c1_blur.png diff --git a/ucast/tests/testfiles/cover/c1_gradient.png b/ucast/tests/_testfiles/cover/c1_gradient.png similarity index 100% rename from ucast/tests/testfiles/cover/c1_gradient.png rename to ucast/tests/_testfiles/cover/c1_gradient.png diff --git a/ucast/tests/testfiles/cover/c1_noavatar.png b/ucast/tests/_testfiles/cover/c1_noavatar.png similarity index 100% rename from ucast/tests/testfiles/cover/c1_noavatar.png rename to ucast/tests/_testfiles/cover/c1_noavatar.png diff --git a/ucast/tests/testfiles/cover/c2_blur.png b/ucast/tests/_testfiles/cover/c2_blur.png similarity index 100% rename from ucast/tests/testfiles/cover/c2_blur.png rename to ucast/tests/_testfiles/cover/c2_blur.png diff --git a/ucast/tests/testfiles/cover/c2_gradient.png b/ucast/tests/_testfiles/cover/c2_gradient.png similarity index 100% rename from ucast/tests/testfiles/cover/c2_gradient.png rename to ucast/tests/_testfiles/cover/c2_gradient.png diff --git a/ucast/tests/testfiles/cover/c3_blur.png b/ucast/tests/_testfiles/cover/c3_blur.png similarity index 100% rename from ucast/tests/testfiles/cover/c3_blur.png rename to ucast/tests/_testfiles/cover/c3_blur.png diff --git a/ucast/tests/testfiles/cover/c3_gradient.png b/ucast/tests/_testfiles/cover/c3_gradient.png similarity index 100% rename from ucast/tests/testfiles/cover/c3_gradient.png rename to ucast/tests/_testfiles/cover/c3_gradient.png diff --git a/ucast/tests/testfiles/sources.md b/ucast/tests/_testfiles/sources.md similarity index 72% rename from ucast/tests/testfiles/sources.md rename to ucast/tests/_testfiles/sources.md index 92f6d05..8fdcc6a 100644 --- a/ucast/tests/testfiles/sources.md +++ b/ucast/tests/_testfiles/sources.md @@ -1,10 +1,11 @@ -### Quellen der Thumbnails/Avatarbilder zum Testen +### Quellen der Thumbnails/Avatarbilder/Audiodateien zum Testen - a1/t1: [ThetaDev @ Embedded World 2019](https://www.youtube.com/watch?v=ZPxEr4YdWt8), by [ThetaDev](https://www.youtube.com/channel/UCGiJh0NZ52wRhYKYnuZI08Q) (CC-BY) - a2/t2: [Sintel - Open Movie by Blender Foundation](https://www.youtube.com/watch?v=eRsGyueVLvQ), by [Blender](https://www.youtube.com/c/BlenderFoundation) (CC-BY) - a3/t3: [Systemabsturz Teaser zur DiVOC bb3](https://www.youtube.com/watch?v=uFqgQ35wyYY), by [media.ccc.de](https://www.youtube.com/channel/UC2TXq_t06Hjdr2g_KdKpHQg) (CC-BY) +- audio1: [No copyright intro free fire intro](https://www.youtube.com/watch?v=I0RRENheeTo), by [Shahzaib Hassan](https://www.youtube.com/channel/UCmLTTbctUZobNQrr8RtX8uQ), (CC-BY) ### Weitere Testvideos - [Persuasion (Instrumental) – RYYZN (No Copyright Music)](https://www.youtube.com/watch?v=DWjFW7Yq1fA), by [RYYZN](https://soundcloud.com/ryyzn) (CC-BY) -- [Small pink flowers | #shorts | Free Stock Video](https://www.youtube.com/watch?v=lcQZ6YwQHiw), by [Shahzaib Hassan](https://www.youtube.com/channel/UCmLTTbctUZobNQrr8RtX8uQ), (CC-BY) \ No newline at end of file +- [Small pink flowers | #shorts | Free Stock Video](https://www.youtube.com/watch?v=lcQZ6YwQHiw), by [Shahzaib Hassan](https://www.youtube.com/channel/UCmLTTbctUZobNQrr8RtX8uQ), (CC-BY) diff --git a/ucast/tests/testfiles/thumbnail/t1.webp b/ucast/tests/_testfiles/thumbnail/t1.webp similarity index 100% rename from ucast/tests/testfiles/thumbnail/t1.webp rename to ucast/tests/_testfiles/thumbnail/t1.webp diff --git a/ucast/tests/testfiles/thumbnail/t2.webp b/ucast/tests/_testfiles/thumbnail/t2.webp similarity index 100% rename from ucast/tests/testfiles/thumbnail/t2.webp rename to ucast/tests/_testfiles/thumbnail/t2.webp diff --git a/ucast/tests/testfiles/thumbnail/t3.webp b/ucast/tests/_testfiles/thumbnail/t3.webp similarity index 100% rename from ucast/tests/testfiles/thumbnail/t3.webp rename to ucast/tests/_testfiles/thumbnail/t3.webp diff --git a/ucast/tests/service/__init__.py b/ucast/tests/service/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ucast/tests/test_cover.py b/ucast/tests/service/test_cover.py similarity index 100% rename from ucast/tests/test_cover.py rename to ucast/tests/service/test_cover.py diff --git a/ucast/tests/service/test_storage.py b/ucast/tests/service/test_storage.py new file mode 100644 index 0000000..3c5a29c --- /dev/null +++ b/ucast/tests/service/test_storage.py @@ -0,0 +1,56 @@ +import os +import tempfile +from pathlib import Path + +from ucast.service import storage + + +def test_create_channel_folders(settings): + tmpdir_o = tempfile.TemporaryDirectory() + tmpdir = Path(tmpdir_o.name) + settings.DOWNLOAD_ROOT = tmpdir + + store = storage.Storage() + cf1 = store.get_channel_folder("ThetaDev") + cf2 = store.get_channel_folder("Jeff_Geerling") + cf1b = store.get_channel_folder("ThetaDev") + + cf1_path = tmpdir / "ThetaDev" + cf2_path = tmpdir / "Jeff_Geerling" + + assert cf1.dir_root == cf1_path + assert cf1b.dir_root == cf1_path + assert cf2.dir_root == cf2_path + + assert os.path.isdir(cf1_path) + assert os.path.isdir(cf2_path) + + +def test_channel_folder(): + tmpdir_o = tempfile.TemporaryDirectory() + tmpdir = Path(tmpdir_o.name) + ucast_dir = tmpdir / "_ucast" + + cf = storage.ChannelFolder(tmpdir) + + # Verify internal paths + assert cf.file_avatar == ucast_dir / "avatar.jpg" + assert cf.file_avatar_sm == ucast_dir / "avatar_sm.webp" + assert cf.dir_covers == ucast_dir / "covers" + assert cf.dir_thumbnails == ucast_dir / "thumbnails" + + # Create the folder + assert not cf.does_exist() + cf.create() + assert cf.does_exist() + + assert cf.get_cover("my_video_title") == ucast_dir / "covers" / "my_video_title.png" + assert ( + cf.get_thumbnail("my_video_title") + == ucast_dir / "thumbnails" / "my_video_title.webp" + ) + assert ( + cf.get_thumbnail("my_video_title", True) + == ucast_dir / "thumbnails" / "my_video_title_sm.webp" + ) + assert cf.get_audio("my_video_title") == tmpdir / "my_video_title.mp3" diff --git a/ucast/tests/service/test_util.py b/ucast/tests/service/test_util.py new file mode 100644 index 0000000..f095804 --- /dev/null +++ b/ucast/tests/service/test_util.py @@ -0,0 +1,92 @@ +import tempfile +from pathlib import Path + +import pytest +from PIL import Image, ImageChops + +from ucast import tests +from ucast.service import util + +TEST_FILE_URL = "https://yt3.ggpht.com/ytc/AKedOLSnFfmpibLLoqyaYdsF6bJ-zaLPzomII__FrJve1w=s900-c-k-c0x00ffffff-no-rj" + + +def test_download_file(): + tmpdir_o = tempfile.TemporaryDirectory() + tmpdir = Path(tmpdir_o.name) + download_file = tmpdir / "download.jpg" + expected_tn_file = tests.DIR_TESTFILES / "avatar" / "a1.jpg" + + util.download_file(TEST_FILE_URL, download_file) + + downloaded_avatar = Image.open(download_file) + expected_avatar = Image.open(expected_tn_file) + + diff = ImageChops.difference(downloaded_avatar, expected_avatar) + assert diff.getbbox() is None + + +def test_download_image_file(): + tmpdir_o = tempfile.TemporaryDirectory() + tmpdir = Path(tmpdir_o.name) + download_file = tmpdir / "download.jpg" + expected_tn_file = tests.DIR_TESTFILES / "avatar" / "a1.jpg" + + util.download_image_file(TEST_FILE_URL, download_file) + + downloaded_avatar = Image.open(download_file) + expected_avatar = Image.open(expected_tn_file) + + diff = ImageChops.difference(downloaded_avatar, expected_avatar) + assert diff.getbbox() is None + + +def test_download_image_file_conv(): + tmpdir_o = tempfile.TemporaryDirectory() + tmpdir = Path(tmpdir_o.name) + download_file = tmpdir / "download.png" + expected_tn_file = tests.DIR_TESTFILES / "avatar" / "a1.jpg" + + util.download_image_file(TEST_FILE_URL, download_file) + + downloaded_avatar = Image.open(download_file) + expected_avatar = Image.open(expected_tn_file) + + diff = ImageChops.difference(downloaded_avatar, expected_avatar) + assert diff.getbbox() is None + + +def test_resize_avatar(): + tmpdir_o = tempfile.TemporaryDirectory() + tmpdir = Path(tmpdir_o.name) + source_file = tests.DIR_TESTFILES / "avatar" / "a1.jpg" + resized_file = tmpdir / "avatar.webp" + + util.resize_avatar(source_file, resized_file) + + resized_avatar = Image.open(resized_file) + assert resized_avatar.size == (100, 100) + + +def test_resize_thumbnail(): + tmpdir_o = tempfile.TemporaryDirectory() + tmpdir = Path(tmpdir_o.name) + source_file = tests.DIR_TESTFILES / "thumbnail" / "t1.webp" + resized_file = tmpdir / "thumbnail.webp" + + util.resize_thumbnail(source_file, resized_file) + + resized_thumbnail = Image.open(resized_file) + assert resized_thumbnail.size == (360, 202) + + +@pytest.mark.parametrize( + "text,expected_slug", + [ + ("Hello World πŸ‘‹", "Hello_World"), + ("Γ„Γ€Γ–ΓΆΓœΓΌΓŸ", "AaOoUuss"), + ("μ˜€μ§•μ–΄ κ²Œμž„", "ojingeo_geim"), + ], +) +def test_slug(text: str, expected_slug: str): + slug = util.get_slug(text) + assert slug == expected_slug diff --git a/ucast/tests/service/test_youtube.py b/ucast/tests/service/test_youtube.py new file mode 100644 index 0000000..0b45228 --- /dev/null +++ b/ucast/tests/service/test_youtube.py @@ -0,0 +1,214 @@ +import datetime +import io +import re +import shutil +import subprocess +import tempfile +from pathlib import Path + +import pytest +from mutagen import id3 +from PIL import Image, ImageChops + +from ucast import tests +from ucast.service import youtube + +VIDEO_ID_THETADEV = "ZPxEr4YdWt8" +VIDEO_ID_SHORT = "lcQZ6YwQHiw" +VIDEO_ID_PERSUASION = "DWjFW7Yq1fA" + +CHANNEL_ID_THETADEV = "UCGiJh0NZ52wRhYKYnuZI08Q" +CHANNEL_ID_BLENDER = "UCSMOQeBJ2RAnuFungnQOxLg" +CHANNEL_URL_BLENDER = "https://www.youtube.com/c/BlenderFoundation" + + +@pytest.fixture(scope="module") +def video_details() -> youtube.VideoDetails: + return youtube.get_video_details(VIDEO_ID_THETADEV) + + +def test_download_thumbnail(video_details): + tmpdir_o = tempfile.TemporaryDirectory() + tmpdir = Path(tmpdir_o.name) + tn_file = tmpdir / "thumbnail.webp" + expected_tn_file = tests.DIR_TESTFILES / "thumbnail" / "t1.webp" + + youtube.download_thumbnail(video_details, tn_file) + + tn = Image.open(tn_file) + expected_tn = Image.open(expected_tn_file) + + diff = ImageChops.difference(tn, expected_tn) + assert diff.getbbox() is None + + +def test_get_video_details(video_details): + assert video_details.id == VIDEO_ID_THETADEV + assert video_details.title == "ThetaDev @ Embedded World 2019" + assert video_details.channel_id == "UCGiJh0NZ52wRhYKYnuZI08Q" + assert ( + video_details.description + == """This february I spent one day at the Embedded World in Nuremberg. They showed tons of interesting electronics stuff, so I had to take some pictures and videos for you to see ;-) + +Sorry for the late upload, I just didn't have time to edit my footage. + +Embedded World: https://www.embedded-world.de/ + +My website: https://thdev.org +Twitter: https://twitter.com/Theta_Dev""" + ) + assert video_details.duration == 267 + assert not video_details.is_currently_live + assert not video_details.is_livestream + assert not video_details.is_short + assert video_details.published == datetime.datetime( + 2019, 6, 2, tzinfo=datetime.timezone.utc + ) + + +def test_get_video_details_short(): + vinfo = youtube.get_video_details(VIDEO_ID_SHORT) + assert vinfo.id == VIDEO_ID_SHORT + assert ( + vinfo.title + == "Small pink flowers | #shorts | Free Stock Video | \ +creative commons short videos | creative #short" + ) + assert not vinfo.is_currently_live + assert not vinfo.is_livestream + assert vinfo.is_short + + +def test_download_audio(): + tmpdir_o = tempfile.TemporaryDirectory() + tmpdir = Path(tmpdir_o.name) + download_file = tmpdir / "download.mp3" + + vinfo = youtube.download_audio(VIDEO_ID_PERSUASION, download_file) + assert vinfo.id == VIDEO_ID_PERSUASION + assert vinfo.title == "Persuasion (Instrumental) – RYYZN (No Copyright Music)" + assert vinfo.duration == 100 + + # Check with ffmpeg if the audio file is valid + res = subprocess.run( + ["ffmpeg", "-i", str(download_file)], + capture_output=True, + universal_newlines=True, + ) + assert "Stream #0:0: Audio: mp3" in res.stderr + + match = re.search(r"Duration: (\d{2}:\d{2}:\d{2})", res.stderr) + assert match[1] == "00:01:40" + + +def test_tag_audio(video_details): + tmpdir_o = tempfile.TemporaryDirectory() + tmpdir = Path(tmpdir_o.name) + audio_file = tmpdir / "audio.mp3" + cover_file = tests.DIR_TESTFILES / "cover" / "c1_blur.png" + shutil.copyfile(tests.DIR_TESTFILES / "audio" / "audio1.mp3", audio_file) + + youtube.tag_audio(audio_file, video_details, cover_file) + + tag = id3.ID3(audio_file) + assert tag["TPE1"].text[0] == "ThetaDev" + assert tag["TALB"].text[0] == "ThetaDev" + assert tag["TIT2"].text[0] == "2019-06-02 ThetaDev @ Embedded World 2019" + assert tag["TDRC"].text[0].text == "2019-06-02" + assert ( + tag["COMM::XXX"].text[0] + == """https://youtu.be/ZPxEr4YdWt8 + +This february I spent one day at the Embedded World in Nuremberg. They showed tons of interesting electronics stuff, so I had to take some pictures and videos for you to see ;-) + +Sorry for the late upload, I just didn't have time to edit my footage. + +Embedded World: https://www.embedded-world.de/ + +My website: https://thdev.org +Twitter: https://twitter.com/Theta_Dev""" + ) + + tag_cover = tag["APIC:Cover"] + assert tag_cover.mime == "image/png" + + tag_cover_img = Image.open(io.BytesIO(tag_cover.data)) + expected_cover_img = Image.open(cover_file) + diff = ImageChops.difference(tag_cover_img, expected_cover_img) + assert diff.getbbox() is None + + +@pytest.mark.parametrize( + "channel_str,channel_url", + [ + ( + "https://www.youtube.com/channel/UCGiJh0NZ52wRhYKYnuZI08Q", + "https://www.youtube.com/channel/UCGiJh0NZ52wRhYKYnuZI08Q", + ), + ( + "https://www.youtube.com/c/MrBeast6000", + "https://www.youtube.com/c/MrBeast6000", + ), + ( + "https://www.youtube.com/user/LinusTechTips", + "https://www.youtube.com/user/LinusTechTips", + ), + ( + "UCGiJh0NZ52wRhYKYnuZI08Q", + "https://www.youtube.com/channel/UCGiJh0NZ52wRhYKYnuZI08Q", + ), + ( + "https://piped.mha.fi/user/LinusTechTips", + "https://www.youtube.com/user/LinusTechTips", + ), + ], +) +def test_channel_url_from_str(channel_str: str, channel_url: str): + url = youtube.channel_url_from_str(channel_str) + assert url == channel_url + + +@pytest.mark.parametrize( + "channel_url,channel_id,name,avatar_url", + [ + ( + youtube.channel_url_from_id(CHANNEL_ID_THETADEV), + CHANNEL_ID_THETADEV, + "ThetaDev", + "https://yt3.ggpht.com/ytc/AKedOLSnFfmpibLLoqyaYdsF6bJ-zaLPzomII__FrJve1w=s900-c-k-c0x00ffffff-no-rj", + ), + ( + CHANNEL_URL_BLENDER, + CHANNEL_ID_BLENDER, + "Blender", + "https://yt3.ggpht.com/ytc/AKedOLT_31fFSD3FWEBnHZnyZeJx-GPHJwYCQKcEpaq8NQ=s900-c-k-c0x00ffffff-no-rj", + ), + ], +) +def test_channel_metadata( + channel_url: str, channel_id: str, name: str, avatar_url: str +): + metadata = youtube.get_channel_metadata(channel_url) + assert metadata.id == channel_id + assert metadata.name == name + assert metadata.avatar_url == avatar_url + assert metadata.description + + +def test_get_channel_videos_from_feed(): + videos = youtube.get_channel_videos_from_feed(CHANNEL_ID_THETADEV) + assert videos + + v1 = videos[0] + assert len(v1.id) == 11 + assert v1.published.tzinfo == datetime.timezone.utc + assert v1.published.second > 0 or v1.published.minute > 0 or v1.published.hour > 0 + + +def test_get_channel_videos_from_scraper(): + videos = youtube.get_channel_videos_from_scraper(CHANNEL_ID_THETADEV) + assert videos + + v1 = videos[0] + assert len(v1.id) == 11 + assert v1.published is None diff --git a/ucast/tests/test_util.py b/ucast/tests/test_util.py deleted file mode 100644 index eb10259..0000000 --- a/ucast/tests/test_util.py +++ /dev/null @@ -1,24 +0,0 @@ -import tempfile -from pathlib import Path - -from PIL import Image, ImageChops - -from ucast import tests -from ucast.service import util - -TEST_FILE_URL = "https://yt3.ggpht.com/ytc/AKedOLSnFfmpibLLoqyaYdsF6bJ-zaLPzomII__FrJve1w=s900-c-k-c0x00ffffff-no-rj" - - -def test_download_file(): - tmpdir_o = tempfile.TemporaryDirectory() - tmpdir = Path(tmpdir_o.name) - download_file = tmpdir / "download.jpg" - expected_tn_file = tests.DIR_TESTFILES / "avatar" / "a1.jpg" - - util.download_file(TEST_FILE_URL, download_file) - - downloaded_avatar = Image.open(download_file) - expected_avatar = Image.open(expected_tn_file) - - diff = ImageChops.difference(downloaded_avatar, expected_avatar) - assert diff.getbbox() is None diff --git a/ucast/tests/test_youtube.py b/ucast/tests/test_youtube.py deleted file mode 100644 index 0cedf7c..0000000 --- a/ucast/tests/test_youtube.py +++ /dev/null @@ -1,126 +0,0 @@ -import datetime -import re -import subprocess -import tempfile -from pathlib import Path - -import pytest -from PIL import Image, ImageChops - -from ucast import tests -from ucast.service import youtube - -VIDEO_ID_THETADEV = "ZPxEr4YdWt8" -VIDEO_ID_SHORT = "lcQZ6YwQHiw" -VIDEO_ID_PERSUASION = "DWjFW7Yq1fA" - -CHANNEL_ID_THETADEV = "UCGiJh0NZ52wRhYKYnuZI08Q" -CHANNEL_ID_BLENDER = "UCSMOQeBJ2RAnuFungnQOxLg" -CHANNEL_URL_BLENDER = "https://www.youtube.com/c/BlenderFoundation" - - -@pytest.fixture(scope="module") -def video_info() -> youtube.VideoDetails: - return youtube.get_video_details(VIDEO_ID_THETADEV) - - -def test_download_thumbnail(video_info): - tmpdir_o = tempfile.TemporaryDirectory() - tmpdir = Path(tmpdir_o.name) - tn_file = tmpdir / "thumbnail" - expected_tn_file = tests.DIR_TESTFILES / "thumbnail" / "t1.webp" - - tn_file = youtube.download_thumbnail(video_info, tn_file) - assert tn_file.suffix == ".webp" - - tn = Image.open(tn_file) - expected_tn = Image.open(expected_tn_file) - - diff = ImageChops.difference(tn, expected_tn) - assert diff.getbbox() is None - - -def test_get_video_info(video_info): - assert video_info.id == VIDEO_ID_THETADEV - assert video_info.title == "ThetaDev @ Embedded World 2019" - assert video_info.channel_id == "UCGiJh0NZ52wRhYKYnuZI08Q" - assert ( - video_info.description - == """This february I spent one day at the Embedded World in Nuremberg. They showed tons of interesting electronics stuff, so I had to take some pictures and videos for you to see ;-) - -Sorry for the late upload, I just didn't have time to edit my footage. - -Embedded World: https://www.embedded-world.de/ - -My website: https://thdev.org -Twitter: https://twitter.com/Theta_Dev""" - ) - assert video_info.duration == 267 - assert not video_info.is_currently_live - assert not video_info.is_livestream - assert not video_info.is_short - assert video_info.published == datetime.datetime( - 2019, 6, 2, tzinfo=datetime.timezone.utc - ) - - -def test_get_video_info_short(): - vinfo = youtube.get_video_details(VIDEO_ID_SHORT) - assert vinfo.id == VIDEO_ID_SHORT - assert ( - vinfo.title - == "Small pink flowers | #shorts | Free Stock Video | \ -creative commons short videos | creative #short" - ) - assert not vinfo.is_currently_live - assert not vinfo.is_livestream - assert vinfo.is_short - - -def test_download_video(): - tmpdir_o = tempfile.TemporaryDirectory() - tmpdir = Path(tmpdir_o.name) - download_file = tmpdir / "download.mp3" - - vinfo = youtube.download_audio(VIDEO_ID_PERSUASION, download_file) - assert vinfo.id == VIDEO_ID_PERSUASION - assert vinfo.title == "Persuasion (Instrumental) – RYYZN (No Copyright Music)" - assert vinfo.duration == 100 - - # Check with ffmpeg if the audio file is valid - res = subprocess.run( - ["ffmpeg", "-i", str(download_file)], - capture_output=True, - universal_newlines=True, - ) - assert "Stream #0:0: Audio: mp3" in res.stderr - - match = re.search(r"Duration: (\d{2}:\d{2}:\d{2})", res.stderr) - assert match[1] == "00:01:40" - - -@pytest.mark.parametrize( - "channel_url,channel_id,name,avatar_url", - [ - ( - youtube.channel_url_from_id(CHANNEL_ID_THETADEV), - CHANNEL_ID_THETADEV, - "ThetaDev", - "https://yt3.ggpht.com/ytc/AKedOLSnFfmpibLLoqyaYdsF6bJ-zaLPzomII__FrJve1w=s900-c-k-c0x00ffffff-no-rj", - ), - ( - CHANNEL_URL_BLENDER, - CHANNEL_ID_BLENDER, - "Blender", - "https://yt3.ggpht.com/ytc/AKedOLT_31fFSD3FWEBnHZnyZeJx-GPHJwYCQKcEpaq8NQ=s900-c-k-c0x00ffffff-no-rj", - ), - ], -) -def test_channel_metadata( - channel_url: str, channel_id: str, name: str, avatar_url: str -): - metadata = youtube.get_channel_metadata(channel_url) - assert metadata.id == channel_id - assert metadata.name == name - assert metadata.avatar_url == avatar_url - assert metadata.description