aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBobby <[email protected]>2025-03-11 01:14:10 +0530
committerBobby <[email protected]>2025-03-11 01:14:10 +0530
commit9085fa19a9972f0c31f0ba92505c77a52acf3d66 (patch)
treeb7f4f57e95fb0467014d20a8ce227a062c500a8f
parentf5ef9d42ebe7b2be932b35db7c5d801e9cfeb2c1 (diff)
downloadthatcomputerscientist-9085fa19a9972f0c31f0ba92505c77a52acf3d66.tar.xz
thatcomputerscientist-9085fa19a9972f0c31f0ba92505c77a52acf3d66.zip
separate video/tracks in anime stream service and encodedev
-rw-r--r--apps/anime/views.py11
-rw-r--r--internal/crypto_utilities.py16
-rw-r--r--requirements.txt1
-rw-r--r--services/stream/urls.py3
-rw-r--r--services/stream/views.py22
-rw-r--r--static/js/libs/videoPlayer.js16
-rw-r--r--templates/shared/anime/anime.html6
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,