From dce65e417c14725f32b72bbd19b784e545b13268 Mon Sep 17 00:00:00 2001 From: Nicolas DEROUINEAU Date: Tue, 18 Jun 2024 11:47:03 +0200 Subject: [PATCH] Add migration file --- backend/StreamServerApp/database_utils.py | 6 +- .../media_management/cover_downloader.py | 80 +++++++++++++------ .../migrations/0026_auto_20240618_0917.py | 39 +++++++++ backend/StreamServerApp/tasks.py | 21 ++--- docker-compose-debug.yml | 4 +- 5 files changed, 111 insertions(+), 39 deletions(-) create mode 100644 backend/StreamServerApp/migrations/0026_auto_20240618_0917.py diff --git a/backend/StreamServerApp/database_utils.py b/backend/StreamServerApp/database_utils.py index 8c00e51..84029a0 100644 --- a/backend/StreamServerApp/database_utils.py +++ b/backend/StreamServerApp/database_utils.py @@ -216,7 +216,7 @@ def add_one_video_to_database(full_path, v.episode = video_type_and_info['episode'] if created: - return_value = Add_video_return_value.SERIES_CREATED + return_value = Add_video_return_value.SERIES_CREATED.value elif video_type_and_info['type'] == 'Movie': movie, created = Movie.objects.get_or_create( @@ -224,11 +224,11 @@ def add_one_video_to_database(full_path, v.movie = movie if created: - return_value = Add_video_return_value.MOVIE_CREATED + return_value = Add_video_return_value.MOVIE_CREATED.value v.save() if os.getenv('TMBD_KEY'): - if return_value in [Add_video_return_value.SERIES_CREATED, Add_video_return_value.MOVIE_CREATED]: + if return_value in [Add_video_return_value.SERIES_CREATED.value, Add_video_return_value.MOVIE_CREATED.value]: download_cover_async.delay( v.id, video_type_and_info['title'], True if video_type_and_info['type'] == 'Series' else False) diff --git a/backend/StreamServerApp/media_management/cover_downloader.py b/backend/StreamServerApp/media_management/cover_downloader.py index 3640b8b..9b9d578 100644 --- a/backend/StreamServerApp/media_management/cover_downloader.py +++ b/backend/StreamServerApp/media_management/cover_downloader.py @@ -1,27 +1,59 @@ import requests import os -auth_key = os.getenv('TMBD_KEY') -if not auth_key: - print("no auth key") - -configuration_url = 'https://api.themoviedb.org/3/configuration?&api_key={}'.format(auth_key) -response = requests.get(configuration_url) -value = response.json() - -base_url = value["images"]["base_url"] -poster_size = value["images"]["poster_sizes"][0] - -def download_cover(name, outputfile, is_tv_show=False): - if is_tv_show: - api_url = 'https://api.themoviedb.org/3/search/tv?query={}&api_key={}'.format(name, auth_key) - else: - api_url = 'https://api.themoviedb.org/3/search/movie?query={}&api_key={}'.format(name, auth_key) - response = requests.get(api_url) - value = response.json() - - poster_url = "{}/{}{}".format(base_url, poster_size, value["results"][0]["poster_path"]) - response = requests.get(poster_url) - - with open(outputfile, mode="wb") as file: - file.write(response.content) \ No newline at end of file +import logging +logger = logging.getLogger("root") + + +class cover_downloader: + + def __init__(self): + + env_auth_key = os.getenv('TMBD_KEY') + if not auth_key: + logger("cover downloader: no auth key") + return + self.auth_key = env_auth_key + + configuration_url = 'https://api.themoviedb.org/3/configuration?&api_key={}'.format( + self.auth_key ) + + response = requests.get(configuration_url) + if response.status_code != 200: + logger("cover downloader: Failed to get configuration") + return + value = response.json() + + self.base_url = value["images"]["base_url"] + self.poster_size = value["images"]["poster_sizes"][0] + + def download_cover(self, name, outputfile, is_tv_show=False): + + if self.auth_key: + + if is_tv_show: + api_url = 'https://api.themoviedb.org/3/search/tv?query={}&api_key={}'.format( + name.replace(" ", "+"), self.auth_key) + else: + api_url = 'https://api.themoviedb.org/3/search/movie?query={}&api_key={}'.format( + name.replace(" ", "+"), self.auth_key) + response = requests.get(api_url) + if response.status_code != 200: + logger("cover downloader: Failed to search movie") + return -1 + value = response.json() + + poster_url = "{}/{}{}".format(self.base_url, self.poster_size, + value["results"][0]["poster_path"]) + response = requests.get(poster_url) + if response.status_code != 200: + logger("cover downloader: Failed to download cover") + return -1 + + with open(outputfile, mode="wb") as file: + file.write(response.content) + + return 1 + else: + logger("cover downloader: No properly initialized") + return -1 diff --git a/backend/StreamServerApp/migrations/0026_auto_20240618_0917.py b/backend/StreamServerApp/migrations/0026_auto_20240618_0917.py new file mode 100644 index 0000000..736a570 --- /dev/null +++ b/backend/StreamServerApp/migrations/0026_auto_20240618_0917.py @@ -0,0 +1,39 @@ +# Generated by Django 4.2 on 2024-06-18 09:17 + +from django.db import migrations +from StreamServerApp.models import Video, Series, Movie, Subtitle +from StreamServerApp.media_management.cover_downloader import cover_downloader +import os + +def get_cover(apps, schema_editor): + + if os.getenv('TMBD_KEY'): + + movies = Movie.objects.all() + for movie in movies: + movie.video_set + output_file = "/usr/src/static/{}.jpeg".format(movie.title) + cover_downloader.download_cover(serie.title, output_file, True) + + series = Series.objects.all() + for serie in series: + output_file = "/usr/src/static/{}.jpeg".format(serie.title) + ret = cover_downloader.download_cover(serie.title, output_file, True) + if ret: + serie.thumbnail = output_file + serie.save() + + + + + + +class Migration(migrations.Migration): + + dependencies = [ + ('StreamServerApp', '0025_video_audio_path'), + ] + + operations = [ + migrations.RunPython(code=get_cover, reverse_code=migrations.RunPython.noop), + ] diff --git a/backend/StreamServerApp/tasks.py b/backend/StreamServerApp/tasks.py index 63ab28f..2b46f66 100644 --- a/backend/StreamServerApp/tasks.py +++ b/backend/StreamServerApp/tasks.py @@ -1,7 +1,7 @@ from celery import shared_task from StreamServerApp.models import Video, Series, Movie, Subtitle from django.conf import settings -from StreamServerApp.media_management.cover_downloader import download_cover +from StreamServerApp.media_management.cover_downloader import cover_downloader import logging @@ -28,14 +28,15 @@ def get_subtitles_async(video_id, video_path, remote_url): @shared_task def download_cover_async(id, name, is_tv_show=False): output_file = "/usr/src/static/{}.jpeg".format(name) - download_cover(name, is_tv_show) - video = Video.objects.get(id=id) - if is_tv_show: - serie = Series.objects.get(id=video.series_id) - serie.thumbnail = output_file - serie.save() - else: - video.thumbnail = output_file - video.save() + ret = cover_downloader.download_cover(name, output_file, is_tv_show) + if ret: + video = Video.objects.get(id=id) + if is_tv_show: + serie = Series.objects.get(id=video.series_id) + serie.thumbnail = output_file + serie.save() + else: + video.thumbnail = output_file + video.save() return 0 diff --git a/docker-compose-debug.yml b/docker-compose-debug.yml index e60de37..fb64a28 100644 --- a/docker-compose-debug.yml +++ b/docker-compose-debug.yml @@ -36,7 +36,7 @@ services: - ./log/:/debug/ - ./Videos/:/usr/src/app/Videos - progress_volume:/usr/progress/ - - static_volume:/usr/src/app/staticfiles + - static_volume:/usr/static/ - /static/ - ipython:/root/.ipython - torrent:/usr/torrent/:rw @@ -50,7 +50,7 @@ services: volumes: - ./backend/:/usr/src/app/ - ./Videos/:/usr/src/app/Videos - - static_volume:/usr/src/app/staticfiles + - static_volume:/usr/static/ - torrent:/usr/torrent/:rw - secrets_volume:/secrets/ ports: