diff options
| author | Bobby <[email protected]> | 2025-03-11 01:14:10 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2025-03-11 01:14:10 +0530 |
| commit | 9085fa19a9972f0c31f0ba92505c77a52acf3d66 (patch) | |
| tree | b7f4f57e95fb0467014d20a8ce227a062c500a8f | |
| parent | f5ef9d42ebe7b2be932b35db7c5d801e9cfeb2c1 (diff) | |
| download | thatcomputerscientist-9085fa19a9972f0c31f0ba92505c77a52acf3d66.tar.xz thatcomputerscientist-9085fa19a9972f0c31f0ba92505c77a52acf3d66.zip | |
separate video/tracks in anime stream service and encodedev
| -rw-r--r-- | apps/anime/views.py | 11 | ||||
| -rw-r--r-- | internal/crypto_utilities.py | 16 | ||||
| -rw-r--r-- | requirements.txt | 1 | ||||
| -rw-r--r-- | services/stream/urls.py | 3 | ||||
| -rw-r--r-- | services/stream/views.py | 22 | ||||
| -rw-r--r-- | static/js/libs/videoPlayer.js | 16 | ||||
| -rw-r--r-- | templates/shared/anime/anime.html | 6 |
7 files changed, 57 insertions, 18 deletions
diff --git a/apps/anime/views.py b/apps/anime/views.py index 5544c484..c1757dc2 100644 --- a/apps/anime/views.py +++ b/apps/anime/views.py @@ -2,6 +2,7 @@ import os from django.urls import reverse import requests from django.shortcuts import redirect, render +from internal.crypto_utilities import encode_url from thatcomputerscientist.utils import i18npatterns from internal.cache_utils import cache_data @@ -203,8 +204,6 @@ def anime_results(**kwargs): f"{CONSUMET_BASE_URL}/meta/anilist/advanced-search", params=params ) - print(response.text) - return response.json() @@ -298,8 +297,14 @@ def anime(request, anime_id, e=None): streaming_data = get_anime_streaming_data( anime_id, anime_data["current_episode"], dub ) - print(streaming_data) + streaming_data["data"]["sources"] = streaming_data["data"]["sources"][0] + streaming_data["data"]["sources"]["url"] = encode_url( + streaming_data["data"]["sources"]["url"] + ) + + for track in streaming_data["data"]["tracks"]: + track["file"] = encode_url(track["file"]) else: streaming_data = {} diff --git a/internal/crypto_utilities.py b/internal/crypto_utilities.py new file mode 100644 index 00000000..adc8506b --- /dev/null +++ b/internal/crypto_utilities.py @@ -0,0 +1,16 @@ +import os +from cryptography.fernet import Fernet +import base64 + +AUTHORIZATION_STRING = os.getenv("AUTHORIZATION_STRING") +SECRET_KEY = base64.urlsafe_b64encode(AUTHORIZATION_STRING[:32].encode()) + +cipher = Fernet(SECRET_KEY) + + +def encode_url(url): + return cipher.encrypt(url.encode()).decode() + + +def decode_url(encrypted_url): + return cipher.decrypt(encrypted_url.encode()).decode() diff --git a/requirements.txt b/requirements.txt index d683761b..a9dd8535 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,3 +9,4 @@ bs4 pillow minio pygments +cryptography diff --git a/services/stream/urls.py b/services/stream/urls.py index aaedb926..7aa9ea5e 100644 --- a/services/stream/urls.py +++ b/services/stream/urls.py @@ -6,5 +6,6 @@ app_name = "stream" urlpatterns = [ path("random-song", views.random_song, name="random_song"), path("song/<int:song_id>", views.stream_song, name="stream_song"), - path("anime/", views.anime_stream, name="anime_stream"), + path("anime", views.anime_stream, name="anime_stream"), + path("track", views.track_stream, name="track_stream"), ] diff --git a/services/stream/views.py b/services/stream/views.py index 516c3ba4..4e4a4cce 100644 --- a/services/stream/views.py +++ b/services/stream/views.py @@ -5,6 +5,7 @@ import re from urllib.parse import quote, urljoin, urlparse from django.conf import settings +from internal.crypto_utilities import decode_url, encode_url from services.stream.songs import MUSIC_FILES import requests from django.http import ( @@ -69,10 +70,19 @@ def stream_song(request, song_id: int) -> HttpResponse: def anime_stream(request): + return handle_stream(request) + + +def track_stream(request): + return handle_stream(request, isTrack=True) + + +def handle_stream(request, isTrack=False): if not request.user.is_authenticated: return HttpResponseForbidden("Access not allowed") - url = request.GET.get("url") + url = request.GET.get("video_id") if not isTrack else request.GET.get("track_id") + url = decode_url(url) if not str(url).endswith(".vtt"): referrer = request.META.get("HTTP_REFERER") @@ -116,7 +126,10 @@ def anime_stream(request): # Handle both absolute and relative URLs if not line.startswith("http"): line = urljoin(base_url, line) - proxy_url = f"/services/stream/anime?url={quote(line)}" + proxy_url = ( + f"/services/stream/anime?video_id={quote(encode_url(line))}" + ) + # proxy_url = f"/services/stream/anime?url={quote(line)}" modified_content.append(proxy_url) else: modified_content.append(line) @@ -139,7 +152,10 @@ def anime_stream(request): # If it's not a full URL, join it with the base URL if not sprite_url.startswith("http"): sprite_url = urljoin(base_url, sprite_url) - return f"/watch/stream?url={quote(sprite_url)}" + return ( + f"/services/stream/track?track_id={quote(encode_url(sprite_url))}" + ) + # return f"/watch/stream?url={quote(sprite_url)}" # Replace all image URLs with proxied versions modified_content = re.sub(sprite_pattern, replace_url, content) diff --git a/static/js/libs/videoPlayer.js b/static/js/libs/videoPlayer.js index 076d2aed..474741e0 100644 --- a/static/js/libs/videoPlayer.js +++ b/static/js/libs/videoPlayer.js @@ -1,7 +1,7 @@ class VideoPlayer { static defaultConfig = { selectors: { - container: '.win98-player', + container: '.shifoo-video-player', video: '#video-player', controls: { play: '#playBtn', @@ -321,17 +321,17 @@ class VideoPlayer { } getQualityButtonHTML(text) { - return `<svg class="win98-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke="currentColor"> + return `<svg class="shifoo-video-player-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" d="M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.325.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 0 1 1.37.49l1.296 2.247a1.125 1.125 0 0 1-.26 1.431l-1.003.827c-.293.241-.438.613-.43.992a7.723 7.723 0 0 1 0 .255c-.008.378.137.75.43.991l1.004.827c.424.35.534.955.26 1.43l-1.298 2.247a1.125 1.125 0 0 1-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.47 6.47 0 0 1-.22.128c-.331.183-.581.495-.644.869l-.213 1.281c-.09.543-.56.94-1.11.94h-2.594c-.55 0-1.019-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 0 1-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 0 1-1.369-.49l-1.297-2.247a1.125 1.125 0 0 1 .26-1.431l1.004-.827c.292-.24.437-.613.43-.991a6.932 6.932 0 0 1 0-.255c.007-.38-.138-.751-.43-.992l-1.004-.827a1.125 1.125 0 0 1-.26-1.43l1.297-2.247a1.125 1.125 0 0 1 1.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.086.22-.128.332-.183.582-.495.644-.869l.214-1.28Z" /> <path stroke-linecap="round" stroke-linejoin="round" d="M15 12a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z" /> </svg> - <svg class="win98-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke="currentColor"> + <svg class="shifoo-video-player-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" d="M8.25 15 12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9" /> </svg>${text}`; } setupBufferingIndicator() { - const playerContainer = this.elements.video.closest('.win98-player-content'); + const playerContainer = this.elements.video.closest('.shifoo-video-player-content'); let loadingTimeout; const isBuffering = () => { @@ -464,7 +464,7 @@ class VideoPlayer { // Update the CC button text const defaultTrack = this.config.source.tracks[defaultTrackIndex]; this.elements.controls.cc.innerHTML = ` - <svg class="win98-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke="currentColor"> + <svg class="shifoo-video-player-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" d="M8.25 15 12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9" /> </svg>${defaultTrack.label} `; @@ -541,7 +541,7 @@ class VideoPlayer { // Update button text this.elements.controls.cc.innerHTML = ` - <svg class="win98-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke="currentColor"> + <svg class="shifoo-video-player-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke-width="2" stroke="currentColor"> <path stroke-linecap="round" stroke-linejoin="round" d="M8.25 15 12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9" /> </svg>${e.target.textContent} `; @@ -592,7 +592,7 @@ class VideoPlayer { }); this.isHoveringControls = false; - const controlsArea = this.elements.container.querySelector('.win98-controls'); + const controlsArea = this.elements.container.querySelector('.shifoo-video-player-controls'); controlsArea.addEventListener('mouseenter', () => { this.isHoveringControls = true; @@ -704,7 +704,7 @@ class VideoPlayer { } updateMuteButton(isAudio) { - this.elements.controls.mute.querySelector('.win98-icon').innerHTML = isAudio ? + this.elements.controls.mute.querySelector('.shifoo-video-player-icon').innerHTML = isAudio ? '<path stroke-linecap="round" stroke-linejoin="round" d="M19.114 5.636a9 9 0 0 1 0 12.728M16.463 8.288a5.25 5.25 0 0 1 0 7.424M6.75 8.25l4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.704-.507-1.938-1.354A9.009 9.009 0 0 1 2.25 12c0-.83.112-1.633.322-2.396C2.806 8.756 3.63 8.25 4.51 8.25H6.75Z" />' : '<path stroke-linecap="round" stroke-linejoin="round" d="M17.25 9.75 19.5 12m0 0 2.25 2.25M19.5 12l2.25-2.25M19.5 12l-2.25 2.25m-10.5-6 4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.704-.507-1.938-1.354A9.009 9.009 0 0 1 2.25 12c0-.83.112-1.633.322-2.396C2.806 8.756 3.63 8.25 4.51 8.25H6.75Z" />'; } diff --git a/templates/shared/anime/anime.html b/templates/shared/anime/anime.html index ddfd2c25..b6ebbe4e 100644 --- a/templates/shared/anime/anime.html +++ b/templates/shared/anime/anime.html @@ -255,14 +255,14 @@ {{ streaming_data.data.tracks|json_script:'tracks-data' }} <script> document.addEventListener('DOMContentLoaded', () => { - const videoStreamingURL = `/services/stream/anime/?url=${encodeURIComponent('{{ streaming_data.data.sources.url }}')}` + const videoStreamingURL = `/services/stream/anime?video_id=${encodeURIComponent('{{ streaming_data.data.sources.url }}')}` var tracks = [] try { tracks = JSON.parse(document.getElementById('tracks-data').textContent) .filter((track) => track.kind === 'captions') .map((track) => ({ ...track, - file: `/services/stream/anime/?url=${encodeURIComponent(track.file)}` + file: `/services/stream/track?track_id=${encodeURIComponent(track.file)}` })) } catch (error) {} @@ -273,7 +273,7 @@ } let player - if (videoStreamingURL !== '/services/stream/anime/?url=') { + if (videoStreamingURL !== '/services/stream/anime?video_id=') { player = new VideoPlayer({ source: { url: videoStreamingURL, |
