TVDB özelliği eklendi.

This commit is contained in:
2025-10-28 04:14:42 +03:00
parent a2adc9958a
commit 8e07fb4e05
7 changed files with 3154 additions and 6 deletions

View File

@@ -8,12 +8,29 @@
import Sharing from "./routes/Sharing.svelte";
import Trash from "./routes/Trash.svelte";
import Movies from "./routes/Movies.svelte";
import TvShows from "./routes/TvShows.svelte";
import Login from "./routes/Login.svelte";
import { API } from "./utils/api.js";
import { refreshMovieCount } from "./stores/movieStore.js";
import { refreshTvShowCount } from "./stores/tvStore.js";
const token = localStorage.getItem("token");
let menuOpen = false;
let wsCounts;
let refreshTimer = null;
const scheduleMediaRefresh = () => {
if (refreshTimer) return;
refreshTimer = setTimeout(async () => {
refreshTimer = null;
try {
await Promise.all([refreshMovieCount(), refreshTvShowCount()]);
} catch (err) {
console.warn("Medya sayacı yenileme başarısız:", err);
}
}, 400);
};
// Menü aç/kapat (hamburger butonuyla)
const toggleMenu = () => {
@@ -28,7 +45,48 @@
onMount(() => {
if (token) {
refreshMovieCount();
refreshTvShowCount();
const authToken = localStorage.getItem("token");
if (authToken) {
const wsUrl = `${API.replace("http", "ws")}?token=${authToken}`;
try {
wsCounts = new WebSocket(wsUrl);
wsCounts.onmessage = (event) => {
try {
const msg = JSON.parse(event.data);
if (msg.type === "fileUpdate") {
scheduleMediaRefresh();
} else if (
msg.type === "progress" &&
Array.isArray(msg.torrents) &&
msg.torrents.some((t) => Number(t.progress) >= 1)
) {
scheduleMediaRefresh();
}
} catch (err) {
console.warn("WS mesajı çözümlenemedi:", err);
}
};
wsCounts.onerror = () => scheduleMediaRefresh();
} catch (err) {
console.warn("WS bağlantısı kurulamadı:", err);
}
}
}
return () => {
if (wsCounts) {
try {
wsCounts.close();
} catch (err) {
/* no-op */
}
wsCounts = null;
}
if (refreshTimer) {
clearTimeout(refreshTimer);
refreshTimer = null;
}
};
});
</script>
@@ -45,6 +103,7 @@
<Route path="/" component={Files} />
<Route path="/files" component={Files} />
<Route path="/movies" component={Movies} />
<Route path="/tv" component={TvShows} />
<Route path="/transfers" component={Transfers} />
<Route path="/sharing" component={Sharing} />
<Route path="/trash" component={Trash} />

View File

@@ -2,17 +2,24 @@
import { Link } from "svelte-routing";
import { createEventDispatcher, onDestroy } from "svelte";
import { movieCount } from "../stores/movieStore.js";
import { tvShowCount } from "../stores/tvStore.js";
export let menuOpen = false;
const dispatch = createEventDispatcher();
let hasMovies = false;
let hasShows = false;
const unsubscribe = movieCount.subscribe((count) => {
const unsubscribeMovie = movieCount.subscribe((count) => {
hasMovies = (count ?? 0) > 0;
});
const unsubscribeTv = tvShowCount.subscribe((count) => {
hasShows = (count ?? 0) > 0;
});
onDestroy(() => {
unsubscribe();
unsubscribeMovie();
unsubscribeTv();
});
// Menü öğesine tıklanınca sidebar'ı kapat
@@ -51,6 +58,20 @@
</Link>
{/if}
{#if hasShows}
<Link
to="/tv"
class="item"
getProps={({ isCurrent }) => ({
class: isCurrent ? "item active" : "item",
})}
on:click={handleLinkClick}
>
<i class="fa-solid fa-tv icon"></i>
Tv Shows
</Link>
{/if}
<Link
to="/transfers"
class="item"

View File

@@ -3,6 +3,7 @@
import { API, apiFetch } from "../utils/api.js";
import { cleanFileName } from "../utils/filename.js";
import { refreshMovieCount } from "../stores/movieStore.js";
import { refreshTvShowCount } from "../stores/tvStore.js";
let files = [];
let showModal = false;
let selectedVideo = null;
@@ -65,6 +66,7 @@ let isPlaying = false;
allSelected = files.length > 0 && selectedItems.size === files.length;
tryAutoPlay();
refreshMovieCount();
refreshTvShowCount();
}
function formatSize(bytes) {
if (!bytes) return "0 MB";
@@ -336,7 +338,7 @@ let isPlaying = false;
selectedItems = new Set(failed);
allSelected = failed.length > 0 && failed.length === files.length;
await refreshMovieCount();
await Promise.all([refreshMovieCount(), refreshTvShowCount()]);
}
onMount(async () => {
await loadFiles(); // önce dosyaları getir

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,16 @@
import { writable } from "svelte/store";
import { apiFetch } from "../utils/api.js";
export const tvShowCount = writable(0);
export async function refreshTvShowCount() {
try {
const resp = await apiFetch("/api/tvshows");
if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
const list = await resp.json();
tvShowCount.set(Array.isArray(list) ? list.length : 0);
} catch (err) {
console.warn("⚠️ TV show count güncellenemedi:", err?.message || err);
tvShowCount.set(0);
}
}

View File

@@ -15,5 +15,5 @@ services:
USERNAME: ${USERNAME}
PASSWORD: ${PASSWORD}
TMDB_API_KEY: ${TMDB_API_KEY}
TTVDB_API_KEY: ${TTVDB_API_KEY}
TVDB_API_KEY: ${TVDB_API_KEY}
VIDEO_THUMBNAIL_TIME: ${VIDEO_THUMBNAIL_TIME}

File diff suppressed because it is too large Load Diff