Files
MediaManager-maxdorninger-1/web/src/lib/utils.ts

108 lines
3.1 KiB
TypeScript

import { type ClassValue, clsx } from 'clsx';
import { twMerge } from 'tailwind-merge';
import { goto } from '$app/navigation';
import { resolve } from '$app/paths';
import { toast } from 'svelte-sonner';
import client from '$lib/api';
export const qualityMap: { [key: number]: string } = {
1: '4K/UHD',
2: '1080p/FullHD',
3: '720p/HD',
4: '480p/SD',
5: 'unknown'
};
export const torrentStatusMap: { [key: number]: string } = {
1: 'finished',
2: 'downloading',
3: 'error',
4: 'unknown'
};
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
export function getTorrentQualityString(value: number): string {
return qualityMap[value] || 'unknown';
}
export function getTorrentStatusString(value: number): string {
return torrentStatusMap[value] || 'unknown';
}
export function getFullyQualifiedMediaName(media: { name: string; year: number | null }): string {
let name = media.name;
if (media.year != null) {
name += ' (' + media.year + ')';
}
return name;
}
export function convertTorrentSeasonRangeToIntegerRange(torrent: {
season?: number[];
seasons?: number[];
}): string {
if (torrent?.season?.length === 1) return torrent.season[0]?.toString() || '';
if (torrent?.season?.length && torrent.season.length >= 2) {
const lastSeason = torrent.season.at(-1);
return torrent.season[0]?.toString() + '-' + (lastSeason?.toString() || '');
}
if (torrent?.seasons?.length === 1) return torrent.seasons[0]?.toString() || '';
if (torrent?.seasons?.length && torrent.seasons.length >= 2) {
const lastSeason = torrent.seasons.at(-1);
return torrent.seasons[0]?.toString() + '-' + (lastSeason?.toString() || '');
} else {
console.log('Error parsing season range: ' + torrent?.seasons + torrent?.season);
return 'Error parsing season range: ' + torrent?.seasons + torrent?.season;
}
}
export async function handleLogout() {
await client.POST('/api/v1/auth/cookie/logout');
await goto(resolve('/login', {}));
}
export async function handleOauth() {
const { error, data } = await client.GET(`/api/v1/auth/oauth/authorize`, {
params: {
query: {
scopes: ['openid', 'email', 'profile']
}
}
});
if (!error && data?.authorization_url) {
window.location.href = data.authorization_url;
} else {
toast.error('Failed to initiate OAuth login.');
}
}
export function formatSecondsToOptimalUnit(seconds: number): string {
if (seconds < 0) return '0s';
const units = [
{ name: 'y', seconds: 365.25 * 24 * 60 * 60 }, // year (accounting for leap years)
{ name: 'mo', seconds: 30.44 * 24 * 60 * 60 }, // month (average)
{ name: 'd', seconds: 24 * 60 * 60 }, // day
{ name: 'h', seconds: 60 * 60 }, // hour
{ name: 'm', seconds: 60 }, // minute
{ name: 's', seconds: 1 } // second
];
for (const unit of units) {
const value = seconds / unit.seconds;
if (value >= 1) {
return `${Math.floor(value)}${unit.name}`;
}
}
return '0s';
}
export function handleQueryNotificationToast(count: number = 0, query: string = "") {
if (count > 0 && query.length > 0) toast.success(`Found ${count} ${count > 1 ? 'result' : 'results'} for search term "${query}".`);
else if (count == 0) toast.info(`No results found for "${query}".`);
}