Merge pull request #1010 from tcely/patch-3
Some checks failed
CI / info (push) Has been cancelled
CI / test (3.10) (push) Has been cancelled
CI / test (3.11) (push) Has been cancelled
CI / test (3.12) (push) Has been cancelled
CI / test (3.8) (push) Has been cancelled
CI / test (3.9) (push) Has been cancelled
CI / containerise (push) Has been cancelled

Add `NoThumbnailException`
This commit is contained in:
meeb 2025-05-03 18:19:01 +10:00 committed by GitHub
commit f4769efdb7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 34 additions and 3 deletions

View File

@ -22,6 +22,13 @@ class NoMetadataException(Exception):
pass pass
class NoThumbnailException(Exception):
'''
Raised when a thumbnail was not found at the remote URL.
'''
pass
class DownloadFailedException(Exception): class DownloadFailedException(Exception):
''' '''
Raised when a downloaded media file is expected to be present, but doesn't Raised when a downloaded media file is expected to be present, but doesn't

View File

@ -8,6 +8,7 @@ import os
import json import json
import math import math
import random import random
import requests
import time import time
import uuid import uuid
from io import BytesIO from io import BytesIO
@ -29,7 +30,8 @@ from background_task.exceptions import InvalidTaskError
from background_task.models import Task, CompletedTask from background_task.models import Task, CompletedTask
from common.logger import log from common.logger import log
from common.errors import ( NoFormatException, NoMediaException, from common.errors import ( NoFormatException, NoMediaException,
NoMetadataException, DownloadFailedException, ) NoMetadataException, NoThumbnailException,
DownloadFailedException, )
from common.utils import ( django_queryset_generator as qs_gen, from common.utils import ( django_queryset_generator as qs_gen,
remove_enclosed, ) remove_enclosed, )
from .choices import Val, TaskQueue from .choices import Val, TaskQueue
@ -352,8 +354,21 @@ def index_source_task(source_id):
) )
if new_media_instance: if new_media_instance:
log.info(f'Indexed new media: {source} / {media}') log.info(f'Indexed new media: {source} / {media}')
log.info(f'Scheduling tasks to download thumbnail for: {media.key}')
thumbnail_fmt = 'https://i.ytimg.com/vi/{}/{}default.jpg'
vn_fmt = _('Downloading {} thumbnail for: "{}": {}')
for prefix in ('hq', 'sd', 'maxres',):
thumbnail_url = thumbnail_fmt.format(
media.key,
prefix,
)
download_media_thumbnail(
str(media.pk),
thumbnail_url,
verbose_name=vn_fmt.format(prefix, media.key, media.name),
)
log.info(f'Scheduling task to download metadata for: {media.url}') log.info(f'Scheduling task to download metadata for: {media.url}')
verbose_name = _('Downloading metadata for: {}: "{}"') verbose_name = _('Downloading metadata for: "{}": {}')
download_media_metadata( download_media_metadata(
str(media.pk), str(media.pk),
verbose_name=verbose_name.format(media.key, media.name), verbose_name=verbose_name.format(media.key, media.name),
@ -548,7 +563,15 @@ def download_media_thumbnail(media_id, url):
return return
width = getattr(settings, 'MEDIA_THUMBNAIL_WIDTH', 430) width = getattr(settings, 'MEDIA_THUMBNAIL_WIDTH', 430)
height = getattr(settings, 'MEDIA_THUMBNAIL_HEIGHT', 240) height = getattr(settings, 'MEDIA_THUMBNAIL_HEIGHT', 240)
i = get_remote_image(url) try:
try:
i = get_remote_image(url)
except requests.HTTPError as re:
if 404 != re.response.status_code:
raise
raise NoThumbnailException(re.response.reason) from re
except NoThumbnailException as e:
raise InvalidTaskError(str(e.__cause__)) from e
if (i.width > width) and (i.height > height): if (i.width > width) and (i.height > height):
log.info(f'Resizing {i.width}x{i.height} thumbnail to ' log.info(f'Resizing {i.width}x{i.height} thumbnail to '
f'{width}x{height}: {url}') f'{width}x{height}: {url}')

View File

@ -65,6 +65,7 @@ def get_remote_image(url, force_rgb=True):
'(KHTML, like Gecko) Chrome/69.0.3497.64 Safari/537.36') '(KHTML, like Gecko) Chrome/69.0.3497.64 Safari/537.36')
} }
r = requests.get(url, headers=headers, stream=True, timeout=60) r = requests.get(url, headers=headers, stream=True, timeout=60)
r.raise_for_status()
r.raw.decode_content = True r.raw.decode_content = True
i = Image.open(r.raw) i = Image.open(r.raw)
if force_rgb: if force_rgb: