diff --git a/api/endpoints/views.py b/api/endpoints/views.py index 0df7062..68594e9 100644 --- a/api/endpoints/views.py +++ b/api/endpoints/views.py @@ -7,13 +7,15 @@ from rest_framework import viewsets from rest_framework.decorators import action from rest_framework.response import Response -from Src.Api.Animeunity import title_search as anime_search -from Src.Api.Animeunity.Core.Vix_player.player import VideoSource as anime_source -from Src.Api.Animeunity.site import media_search_manager as anime_media_manager - -from Src.Api.Streamingcommunity import title_search as sc_search, get_version_and_domain -from Src.Api.Streamingcommunity.Core.Vix_player.player import VideoSource as film_video_source -from Src.Api.Streamingcommunity.site import media_search_manager as film_media_manager +from Src.Api import search, get_version_and_domain, download_film, anime_download_film +from Src.Api.anime import EpisodeDownloader +from Src.Api.Class.Video import VideoSource +from Src.Api.film import ROOT_PATH +from Src.Api.series import SERIES_FOLDER, STREAM_SITE_NAME +from Src.Api.site import media_search_manager, anime_search +from Src.Lib.FFmpeg.my_m3u8 import Downloader +from Src.Util.mapper import map_episode_title +from Src.Util.os import remove_special_characters class SearchView(viewsets.ViewSet): @@ -22,16 +24,15 @@ class SearchView(viewsets.ViewSet): self.search_query = request.query_params.get("search_terms") self.type_search = request.query_params.get("type") - media_manager = anime_media_manager if self.type_search == "anime" else film_media_manager - media_manager.media_list = [] + media_search_manager.media_list = [] self.len_database = 0 if self.type_search == "film": _, self.domain = get_version_and_domain() - self.len_database = sc_search(self.search_query, self.domain) + self.len_database = search(self.search_query, self.domain) elif self.type_search == "anime": self.len_database = anime_search(self.search_query) - media_list = media_manager.media_list + media_list = media_search_manager.media_list if self.len_database != 0: data_to_return = [] @@ -50,23 +51,22 @@ class SearchView(viewsets.ViewSet): @action(detail=False, methods=["get"]) def get_episodes_info(self, request): self.media_id = request.query_params.get("media_id") - self.media_slug = request.query_params.get("media_slug") + self.media_slug = request.data.get("media_slug") self.type_media = request.query_params.get("type_media") try: match self.type_media: case "TV": - def stream_episodes(): - self.version, self.domain = get_version_and_domain() + self.site_version, self.domain = get_version_and_domain() + + video_source = VideoSource() + video_source.set_url_base_name(STREAM_SITE_NAME) + video_source.set_version(self.site_version) + video_source.set_domain(self.domain) + video_source.set_series_name(self.media_slug) + video_source.set_media_id(self.media_id) - video_source = film_video_source() - video_source.setup( - version=self.version, - domain=self.domain, - media_id=self.media_id, - series_name=self.media_slug - ) video_source.collect_info_seasons() seasons_count = video_source.obj_title_manager.get_length() @@ -74,42 +74,32 @@ 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.to_dict() + ] + 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(): - video_source = anime_source() - video_source.setup( - media_id = self.media_id, - series_name = self.media_slug - ) - episoded_count = video_source.get_count_episodes() + episodes_downloader = EpisodeDownloader(self.media_id, self.media_slug) + episoded_count = episodes_downloader.get_count_episodes() - for i in range(0, episoded_count): - episode_info = video_source.get_info_episode(i).to_dict() + for i in range(1, episoded_count + 1): + 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: @@ -121,37 +111,8 @@ class SearchView(viewsets.ViewSet): ) return Response({"error": "No media found with that search query"}) - - @action(detail=False, methods=["get"]) - def get_preview(self, request): - self.media_id = request.query_params.get("media_id") - self.media_slug = request.query_params.get("media_slug") - self.type_media = request.query_params.get("type_media") - - try: - if self.type_media in ["TV", "MOVIE"]: - version, domain = get_version_and_domain() - video_source = film_video_source() - video_source.setup(media_id=self.media_id, version=version, domain=domain, series_name=self.media_slug) - video_source.get_preview() - return Response(video_source.obj_preview.to_dict()) - if self.type_media in ["TV_ANIME", "OVA", "SPECIAL"]: - video_source = anime_source() - video_source.setup(media_id=self.media_id, series_name=self.media_slug) - video_source.get_preview() - return Response(video_source.obj_preview.to_dict()) - except Exception as e: - return Response( - { - "error": "Error while getting preview info", - "message": str(e), - } - ) - - return Response({"error": "No media found with that search query"}) -''' class DownloadView(viewsets.ViewSet): def create(self, request): @@ -159,7 +120,6 @@ 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() @@ -238,4 +198,3 @@ class DownloadView(viewsets.ViewSet): } return Response(response_dict) -''' diff --git a/frontend/src/api/api.ts b/frontend/src/api/api.ts index 8f573bb..fcae885 100644 --- a/frontend/src/api/api.ts +++ b/frontend/src/api/api.ts @@ -1,44 +1,47 @@ -import axios from 'axios' -import type {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'; -function get(url: string): Promise { - return axios.get(`${BASE_URL}${url}`) - .then(response => response.data) - .catch(error => { - throw error; - }); +const api = axios.create({ + baseURL: BASE_URL, +}); + +async function get(url: string): Promise> { + return api.get(url); } -function post(url: string, data: any): Promise { - return axios.post(`${BASE_URL}${url}`, data) - .then(response => response.data) - .catch(error => { - throw error; - }); +async function post(url: string, data: any): Promise> { + return api.post(url, data); } -export default function search(query: string, type: string) : Promise { - return get(`/search?search_terms=${query}&type=${type}`) +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 { - const url = `${BASE_URL}/search/get_episodes_info?media_id=${mediaId}&media_slug=${mediaSlug}&type_media=${mediaType}`; - return await fetch(url, { - method: 'GET', - headers: { - 'Content-Type': 'text/event-stream' - } - }); + const url = `/search/get_episodes_info?media_id=${mediaId}&media_slug=${mediaSlug}&type_media=${mediaType}`; + return fetch(`${BASE_URL}${url}`, { + method: 'GET', + headers: { + 'Content-Type': 'text/event-stream', + }, + }); } -export async function downloadFilm(mediaId: number, mediaSlug: string, mediaType: string): Promise { - const url = `/download/`; - const data = { - media_id: mediaId, - media_slug: mediaSlug, - type_media: mediaType - }; - return post(url, data); -} \ No newline at end of file +async function downloadMedia(mediaId: number, mediaSlug: string, mediaType: string, downloadId?: number): Promise> { + const url = `/download/`; + const data = { + media_id: mediaId, + media_slug: mediaSlug, + type_media: mediaType, + download_id: downloadId, + }; + 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); diff --git a/frontend/src/api/interfaces.ts b/frontend/src/api/interfaces.ts index 770eef1..b13418c 100644 --- a/frontend/src/api/interfaces.ts +++ b/frontend/src/api/interfaces.ts @@ -45,7 +45,6 @@ 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 4432fdd..25a0f8a 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, Season} from "@/api/interfaces"; +import type {DownloadResponse, Episode, MediaItem} from "@/api/interfaces"; export const handleTVDownload = async (tvShowEpisodes: any[], item: MediaItem) => { alertDownload(); @@ -10,15 +10,6 @@ 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 16d69b1..8ef5435 100644 --- a/frontend/src/views/Details.vue +++ b/frontend/src/views/Details.vue @@ -1,17 +1,27 @@