From 077bb1afd2fba43f737e70c26397b94d9ca60566 Mon Sep 17 00:00:00 2001 From: Francesco Grazioso Date: Sat, 11 May 2024 12:50:11 +0200 Subject: [PATCH] start implementing download select episodes for tv series (to be tested) + run black and eslint --- api/endpoints/views.py | 27 +++++++++++++----- frontend/src/api/api.ts | 51 +++++++++++++++++++++++++--------- frontend/src/api/interfaces.ts | 1 + frontend/src/api/utils.ts | 11 +++++++- frontend/src/views/Details.vue | 23 +++++++++------ 5 files changed, 84 insertions(+), 29 deletions(-) diff --git a/api/endpoints/views.py b/api/endpoints/views.py index 68594e9..ba7a107 100644 --- a/api/endpoints/views.py +++ b/api/endpoints/views.py @@ -57,6 +57,7 @@ class SearchView(viewsets.ViewSet): try: match self.type_media: case "TV": + def stream_episodes(): self.site_version, self.domain = get_version_and_domain() @@ -74,32 +75,43 @@ class SearchView(viewsets.ViewSet): for i_season in range(1, seasons_count + 1): video_source.obj_episode_manager.clear() video_source.collect_title_season(i_season) - episodes_count = video_source.obj_episode_manager.get_length() + episodes_count = ( + video_source.obj_episode_manager.get_length() + ) episodes[i_season] = {} for i_episode in range(1, episodes_count + 1): episode = video_source.obj_episode_manager.episodes[ i_episode - 1 - ] + ] episodes[i_season][i_episode] = episode.__dict__ yield f'{json.dumps({"episodes": episodes})}\n\n' - response = StreamingHttpResponse(stream_episodes(), content_type='text/event-stream') + response = StreamingHttpResponse( + stream_episodes(), content_type="text/event-stream" + ) return response case "TV_ANIME": + def stream_episodes(): - episodes_downloader = EpisodeDownloader(self.media_id, self.media_slug) + episodes_downloader = EpisodeDownloader( + self.media_id, self.media_slug + ) episoded_count = episodes_downloader.get_count_episodes() for i in range(1, episoded_count + 1): - episode_info = episodes_downloader.get_info_episode(index_ep=i) + episode_info = episodes_downloader.get_info_episode( + index_ep=i + ) episode_info["episode_id"] = i episode_info["episode_total"] = episoded_count print(f"Getting episode {i} of {episoded_count} info...") - yield f'{json.dumps(episode_info)}\n\n' + yield f"{json.dumps(episode_info)}\n\n" - response = StreamingHttpResponse(stream_episodes(), content_type='text/event-stream') + response = StreamingHttpResponse( + stream_episodes(), content_type="text/event-stream" + ) return response except Exception as e: @@ -120,6 +132,7 @@ class DownloadView(viewsets.ViewSet): self.media_slug = request.data.get("media_slug") self.type_media = request.data.get("type_media").upper() self.download_id = request.data.get("download_id") + self.tv_series_episode_id = request.data.get("tv_series_episode_id") if self.type_media in ["TV", "MOVIE"]: self.site_version, self.domain = get_version_and_domain() diff --git a/frontend/src/api/api.ts b/frontend/src/api/api.ts index 0e73fda..244cb66 100644 --- a/frontend/src/api/api.ts +++ b/frontend/src/api/api.ts @@ -1,8 +1,8 @@ -import axios from 'axios'; -import type { AxiosResponse } from 'axios'; -import type {DownloadResponse, MediaItemResponse} from '@/api/interfaces'; +import axios from "axios"; +import type { AxiosResponse } from "axios"; +import type { DownloadResponse, MediaItemResponse } from "@/api/interfaces"; -const BASE_URL = 'http://localhost:8000/api'; +const BASE_URL = "http://localhost:8000/api"; const api = axios.create({ baseURL: BASE_URL, @@ -16,32 +16,57 @@ async function post(url: string, data: any): Promise> { return api.post(url, data); } -export default function search(query: string, type: string): Promise> { +export default function search( + query: string, + type: string +): Promise> { return get(`/search?search_terms=${query}&type=${type}`); } -export async function getEpisodesInfo(mediaId: number, mediaSlug: string, mediaType: string): Promise { +export async function getEpisodesInfo( + mediaId: number, + mediaSlug: string, + mediaType: string +): Promise { const url = `/search/get_episodes_info?media_id=${mediaId}&media_slug=${mediaSlug}&type_media=${mediaType}`; return fetch(`${BASE_URL}${url}`, { - method: 'GET', + method: "GET", headers: { - 'Content-Type': 'text/event-stream', + "Content-Type": "text/event-stream", }, }); } -async function downloadMedia(mediaId: number, mediaSlug: string, mediaType: string, downloadId?: number): Promise> { +async function downloadMedia( + mediaId: number, + mediaSlug: string, + mediaType: string, + downloadId?: number, + tvSeriesEpisodeId?: number +): Promise> { const url = `/download/`; const data = { media_id: mediaId, media_slug: mediaSlug, type_media: mediaType, download_id: downloadId, + tv_series_episode_id: tvSeriesEpisodeId, }; return post(url, data); } -export const downloadFilm = (mediaId: number, mediaSlug: string) => downloadMedia(mediaId, mediaSlug, 'MOVIE'); -export const downloadTvSeries = (mediaId: number, mediaSlug: string, downloadId: number) => downloadMedia(mediaId, mediaSlug, 'TV', downloadId); -export const downloadAnimeFilm = (mediaId: number, mediaSlug: string) => downloadMedia(mediaId, mediaSlug, 'OVA'); -export const downloadAnimeSeries = (mediaId: number, mediaSlug: string, downloadId: number) => downloadMedia(mediaId, mediaSlug, 'TV_ANIME', downloadId); +export const downloadFilm = (mediaId: number, mediaSlug: string) => + downloadMedia(mediaId, mediaSlug, "MOVIE"); +export const downloadTvSeries = ( + mediaId: number, + mediaSlug: string, + downloadId: number, + tvSeriesEpisodeId?: number +) => downloadMedia(mediaId, mediaSlug, "TV", downloadId, tvSeriesEpisodeId); +export const downloadAnimeFilm = (mediaId: number, mediaSlug: string) => + downloadMedia(mediaId, mediaSlug, "OVA"); +export const downloadAnimeSeries = ( + mediaId: number, + mediaSlug: string, + downloadId: number +) => downloadMedia(mediaId, mediaSlug, "TV_ANIME", downloadId); diff --git a/frontend/src/api/interfaces.ts b/frontend/src/api/interfaces.ts index b1d88b3..d33f703 100644 --- a/frontend/src/api/interfaces.ts +++ b/frontend/src/api/interfaces.ts @@ -45,6 +45,7 @@ export interface Episode { season_id: number; // TV Show exclusive created_by: any; // TV Show exclusive updated_at: string; // TV Show exclusive + season_index: number; // TV Show exclusive } export interface Season { diff --git a/frontend/src/api/utils.ts b/frontend/src/api/utils.ts index 25a0f8a..4432fdd 100644 --- a/frontend/src/api/utils.ts +++ b/frontend/src/api/utils.ts @@ -1,5 +1,5 @@ import {downloadAnimeFilm, downloadAnimeSeries, downloadFilm, downloadTvSeries} from "@/api/api"; -import type {DownloadResponse, Episode, MediaItem} from "@/api/interfaces"; +import type {DownloadResponse, Episode, MediaItem, Season} from "@/api/interfaces"; export const handleTVDownload = async (tvShowEpisodes: any[], item: MediaItem) => { alertDownload(); @@ -10,6 +10,15 @@ export const handleTVDownload = async (tvShowEpisodes: any[], item: MediaItem) = } }; +export const handleTVEpisodesDownload = async (episodes: Episode[], item: MediaItem) => { + alertDownload(); + for (const episode of episodes) { + const i = episodes.indexOf(episode); + const res = (await downloadTvSeries(item.id, item.slug, episode.season_index + 1, i)).data; + handleDownloadError(res); + } +} + export const handleMovieDownload = async (item: MediaItem) => { alertDownload(); const res = (await downloadFilm(item.id, item.slug)).data; diff --git a/frontend/src/views/Details.vue b/frontend/src/views/Details.vue index 536f481..390c0ce 100644 --- a/frontend/src/views/Details.vue +++ b/frontend/src/views/Details.vue @@ -1,6 +1,6 @@