From 6e19feedab92cce151c42b50b8f6079eef063c64 Mon Sep 17 00:00:00 2001 From: hewdrey <42557338+hewdrey@users.noreply.github.com> Date: Fri, 21 Feb 2025 17:04:43 +0100 Subject: [PATCH] feat: visual update on stream description (#40) Co-authored-by: hewdrey --- server/src/controllers/stream.controller.ts | 3 + server/src/services/stream/stream.service.ts | 58 +++++++++++++++---- .../ncore/ncore-torrent-details.ts | 6 ++ .../services/torrent-source/ncore/types.ts | 2 +- server/src/services/torrent-source/types.ts | 1 + 5 files changed, 58 insertions(+), 12 deletions(-) diff --git a/server/src/controllers/stream.controller.ts b/server/src/controllers/stream.controller.ts index a7a90ea..9fe0a9f 100644 --- a/server/src/controllers/stream.controller.ts +++ b/server/src/controllers/stream.controller.ts @@ -46,6 +46,8 @@ export class StreamController { user, }); + const { preferredLanguage } = user; + const streams = orderedTorrents.map((torrent, i) => this.streamService.convertTorrentToStream({ torrent, @@ -53,6 +55,7 @@ export class StreamController { deviceToken, season, episode, + preferredLanguage, }), ); diff --git a/server/src/services/stream/stream.service.ts b/server/src/services/stream/stream.service.ts index 38562d4..e87eaa5 100644 --- a/server/src/services/stream/stream.service.ts +++ b/server/src/services/stream/stream.service.ts @@ -7,6 +7,7 @@ import { formatBytes } from '@/utils/bytes'; import { ConfigService } from '../config'; import { UserService } from '../user'; import { User } from '@/types/user'; +import { Language } from '@/db/schema/users'; export class StreamService { constructor( @@ -20,12 +21,14 @@ export class StreamService { deviceToken, season, episode, + preferredLanguage, }: { torrent: TorrentDetails; isRecommended: boolean; deviceToken: string; season: number | undefined; episode: number | undefined; + preferredLanguage: Language; }): Stream { const config = this.configService.getConfig(); const torrentFileIndex = torrent.getMediaFileIndex({ season, episode }); @@ -35,10 +38,15 @@ export class StreamService { const infoHash = encodeURIComponent(torrent.infoHash); const fileIndex = encodeURIComponent(torrentFileIndex); - const description = this.getStreamDescription(torrent, isRecommended, { - season, - episode, - }); + const description = this.getStreamDescription( + torrent, + isRecommended, + { + season, + episode, + }, + preferredLanguage, + ); return { url: `${config.addonUrl}/api/auth/${deviceToken}/stream/play/${sourceName}/${sourceId}/${infoHash}/${fileIndex}`, description, @@ -53,21 +61,49 @@ export class StreamService { torrent: TorrentDetails, isRecommended: boolean, { season, episode }: { season: number | undefined; episode: number | undefined }, + preferredLanguage: Language, ): string { const languageEmoji = languageEmojiMap[torrent.getLanguage()]; const fileIndex = torrent.getMediaFileIndex({ season, episode }); const file = torrent.files[fileIndex] as TorrentFileDetails; const fileSizeString = formatBytes(file.length); - const mediaType = season && episode ? 'show' : 'movie'; + const isShow = season && episode; + let mediaType = ''; + switch (preferredLanguage) { + case Language.HU: + mediaType = isShow ? 'sorozat' : 'film'; + break; + default: + mediaType = isShow ? 'show' : 'movie'; + } + + let recommendedLine = ''; + if (isRecommended && !torrent.isSpeculated) { + switch (preferredLanguage) { + case Language.HU: + recommendedLine = '⭐️ Ajánlott\n'; + break; + default: + recommendedLine = '⭐️ Recommended\n'; + } + } + + let warningLine = ''; + if (torrent.isSpeculated) { + switch (preferredLanguage) { + case Language.HU: + warningLine = `⚠️ Bizonytalan forrás ⚠️\nEz lehet egy másik ${mediaType}!\n`; + break; + default: + warningLine = `⚠️ Speculated source ⚠️\nThis might be a different ${mediaType}!\n`; + } + } - const recommendedLine = - isRecommended && !torrent.isSpeculated ? '⭐️ Recommended\n' : ''; - const warningLine = torrent.isSpeculated - ? `⚠️ Speculated ⚠️\nThis might be a different ${mediaType}!\n` - : ''; const typeLine = `${languageEmoji} | ${torrent.displayResolution(torrent.getResolution(file.name))} | ${fileSizeString}\n`; - return warningLine + recommendedLine + typeLine + torrent.getName(); + const title = isShow ? `${file.name}\n` : `${torrent.getName()}\n`; + const seeders = `⬆️ ${torrent.getSeeders()}\n`; + return warningLine + recommendedLine + typeLine + title + seeders; } public async orderTorrents({ diff --git a/server/src/services/torrent-source/ncore/ncore-torrent-details.ts b/server/src/services/torrent-source/ncore/ncore-torrent-details.ts index 3f6414c..95cf102 100644 --- a/server/src/services/torrent-source/ncore/ncore-torrent-details.ts +++ b/server/src/services/torrent-source/ncore/ncore-torrent-details.ts @@ -25,6 +25,7 @@ export class NcoreTorrentDetails extends TorrentDetails { private category: TorrentCategory; private release_name: string; + private seeders: number; constructor(ncoreTorrent: NcoreTorrent, parsedDetails: ParsedTorrentDetails) { super(); @@ -39,6 +40,7 @@ export class NcoreTorrentDetails extends TorrentDetails { : Resolution.R720P; this.category = ncoreTorrent.category; this.release_name = ncoreTorrent.release_name; + this.seeders = ncoreTorrent.seeders; } public displayResolution(resolution: Resolution): string { @@ -53,6 +55,10 @@ export class NcoreTorrentDetails extends TorrentDetails { return HUNGARIAN_CATEGORIES.includes(this.category) ? Language.HU : Language.EN; } + public getSeeders(): number { + return this.seeders; + } + private getNcoreResolutionByCategory = (category: TorrentCategory): NcoreResolution => { switch (category) { case MovieCategory.SD_HUN: diff --git a/server/src/services/torrent-source/ncore/types.ts b/server/src/services/torrent-source/ncore/types.ts index 4625ab2..466b8ed 100644 --- a/server/src/services/torrent-source/ncore/types.ts +++ b/server/src/services/torrent-source/ncore/types.ts @@ -12,7 +12,7 @@ export type NcoreTorrent = { size: `${number}`; type: 'movie' | 'show'; leechers: `${number}`; - seeders: `${number}`; + seeders: number; }; export type NcorePageResponseJson = { diff --git a/server/src/services/torrent-source/types.ts b/server/src/services/torrent-source/types.ts index 0666490..22af734 100644 --- a/server/src/services/torrent-source/types.ts +++ b/server/src/services/torrent-source/types.ts @@ -41,6 +41,7 @@ export abstract class TorrentDetails implements ParsedTorrentDetails { */ abstract displayResolution(resolution: Resolution): string; abstract getLanguage(): Language; + abstract getSeeders(): number; /** * Returns the name of the torrent. Usually the release name of the torrent. */