feat: add folderName property, show in gdrive and torrentio formats. deprecate stream.name, add stream.filename and stream.folderName

closes #147
This commit is contained in:
Viren070
2025-05-01 19:12:40 +01:00
parent 0f4d6b769d
commit feca66d9d5
9 changed files with 102 additions and 66 deletions
+5
View File
@@ -70,7 +70,10 @@ export type ParseValue = {
showDie: boolean | null;
};
stream?: {
/** @deprecated Use filename instead */
name: string | null;
filename: string | null;
folderName: string | null;
size: number | null;
personal: boolean | null;
quality: string | null;
@@ -117,7 +120,9 @@ const convertStreamToParseValue = (stream: ParsedStream): ParseValue => {
showDie: Settings.SHOW_DIE,
},
stream: {
filename: stream.filename || null,
name: stream.filename || null,
folderName: stream.folderName || null,
size: stream.size || null,
personal: stream.personal !== undefined ? stream.personal : null,
quality: stream.quality === 'Unknown' ? null : stream.quality,
+4 -3
View File
@@ -93,10 +93,11 @@ export function gdriveFormat(
description += '\n';
}
if (!minimalistic && stream.filename) {
description += stream.filename ? `📄 ${stream.filename}` : '📄 Unknown';
description += '\n';
if (!minimalistic && (stream.filename || stream.folderName)) {
description += stream.folderName ? `📁 ${stream.folderName}\n` : '';
description += stream.filename ? `📄 ${stream.filename}\n` : '📄 Unknown\n';
}
if (stream.message) {
description += `📢 ${stream.message}`;
}
+2 -2
View File
@@ -35,8 +35,8 @@ export function torrentioFormat(stream: ParsedStream): {
description += `\n${stream.message}`;
}
if (stream.filename) {
description += `\n${stream.filename}`;
if (stream.filename || stream.folderName) {
description += `\n${stream.folderName}/${stream.filename}`;
}
if (
stream.size ||
+1
View File
@@ -22,6 +22,7 @@ export interface ParsedStream extends ParsedNameData {
name: string;
};
filename?: string;
folderName?: string;
message?: string;
size?: number;
provider?: {
+52 -48
View File
@@ -235,68 +235,73 @@ export class BaseWrapper {
}
}
protected createParsedResult(
parsedInfo: ParsedNameData,
stream: Stream,
filename?: string,
size?: number,
provider?: ParsedStream['provider'],
seeders?: number,
usenetAge?: string,
indexer?: string,
duration?: number,
personal?: boolean,
infoHash?: string,
message?: string
): ParseResult {
protected createParsedResult(data: {
parsedInfo: ParsedNameData;
stream: Stream;
filename?: string;
folderName?: string;
size?: number;
provider?: ParsedStream['provider'];
seeders?: number;
usenetAge?: string;
indexer?: string;
duration?: number;
personal?: boolean;
infoHash?: string;
message?: string;
}): ParseResult {
if (data.folderName === data.filename) {
data.folderName = undefined;
}
return {
type: 'stream',
result: {
...parsedInfo,
...data.parsedInfo,
proxied: false,
message: message,
message: data.message,
addon: { name: this.addonName, id: this.addonId },
filename: filename,
size: size,
url: stream.url,
externalUrl: stream.externalUrl,
_infoHash: infoHash,
filename: data.filename,
folderName: data.folderName,
size: data.size,
url: data.stream.url,
externalUrl: data.stream.externalUrl,
_infoHash: data.infoHash,
torrent: {
infoHash: stream.infoHash,
fileIdx: stream.fileIdx,
sources: stream.sources,
seeders: seeders,
infoHash: data.stream.infoHash,
fileIdx: data.stream.fileIdx,
sources: data.stream.sources,
seeders: data.seeders,
},
provider: provider,
provider: data.provider,
usenet: {
age: usenetAge,
age: data.usenetAge,
},
indexers: indexer,
duration: duration,
personal: personal,
type: stream.infoHash
indexers: data.indexer,
duration: data.duration,
personal: data.personal,
type: data.stream.infoHash
? 'p2p'
: usenetAge
: data.usenetAge
? 'usenet'
: provider
: data.provider
? 'debrid'
: stream.url?.endsWith('.m3u8')
: data.stream.url?.endsWith('.m3u8')
? 'live'
: 'unknown',
stream: {
subtitles: stream.subtitles,
subtitles: data.stream.subtitles,
behaviorHints: {
countryWhitelist: stream.behaviorHints?.countryWhitelist,
notWebReady: stream.behaviorHints?.notWebReady,
countryWhitelist: data.stream.behaviorHints?.countryWhitelist,
notWebReady: data.stream.behaviorHints?.notWebReady,
proxyHeaders:
stream.behaviorHints?.proxyHeaders?.request ||
stream.behaviorHints?.proxyHeaders?.response
data.stream.behaviorHints?.proxyHeaders?.request ||
data.stream.behaviorHints?.proxyHeaders?.response
? {
request: stream.behaviorHints?.proxyHeaders?.request,
response: stream.behaviorHints?.proxyHeaders?.response,
request: data.stream.behaviorHints?.proxyHeaders?.request,
response: data.stream.behaviorHints?.proxyHeaders?.response,
}
: undefined,
videoHash: stream.behaviorHints?.videoHash,
videoHash: data.stream.behaviorHints?.videoHash,
},
},
},
@@ -406,19 +411,18 @@ export class BaseWrapper {
// if its a p2p result, it is not from a debrid service
provider = undefined;
}
return this.createParsedResult(
return this.createParsedResult({
parsedInfo,
stream,
filename,
size,
provider,
seeders ? parseInt(seeders) : undefined,
undefined,
seeders: seeders ? parseInt(seeders) : undefined,
indexer,
duration,
stream.personal,
stream.infoHash || this.extractInfoHash(stream.url || '')
);
personal: stream.personal,
infoHash: stream.infoHash || this.extractInfoHash(stream.url || ''),
});
}
protected parseServiceData(
+4 -4
View File
@@ -56,12 +56,12 @@ export class DMMCast extends BaseWrapper {
? this.extractSizeInBytes(stream.title.split('\n').pop()!, 1024)
: 0;
const parseResult: ParseResult = this.createParsedResult(
parsedFilename,
const parseResult: ParseResult = this.createParsedResult({
parsedInfo: parsedFilename,
stream,
filename,
sizeInBytes
);
size: sizeInBytes,
});
if (parseResult.type === 'stream') {
parseResult.result.message = message;
}
+10 -1
View File
@@ -36,7 +36,16 @@ export class MediaFusion extends BaseWrapper {
result: stream.description,
};
}
return super.parseStream(stream);
const parseResult = super.parseStream(stream);
if (parseResult.type === 'stream' && parseResult.result) {
const torrentNameRegex = /📂\s*(.+)/;
const description = stream.description || stream.title;
const match = torrentNameRegex.exec(description || '');
if (match && match[1].trim() !== parseResult.result.filename) {
parseResult.result.folderName = match[1].trim();
}
}
return parseResult;
}
}
+6 -7
View File
@@ -80,20 +80,19 @@ export class Torbox extends BaseWrapper {
cached: stream.is_cached !== undefined ? stream.is_cached : true,
};
const parsedStream: ParseResult = this.createParsedResult(
parsedFilename,
const parsedStream: ParseResult = this.createParsedResult({
parsedInfo: parsedFilename,
stream,
filename,
size,
provider,
seeders,
age,
source,
undefined,
usenetAge: age,
indexer: source,
personal,
infoHash,
message
);
message,
});
return parsedStream;
}
+18 -1
View File
@@ -1,4 +1,9 @@
import { AddonDetail, StreamRequest } from '@aiostreams/types';
import {
AddonDetail,
ParseResult,
Stream,
StreamRequest,
} from '@aiostreams/types';
import { ParsedStream, Config } from '@aiostreams/types';
import { BaseWrapper } from './base';
import { addonDetails, createLogger } from '@aiostreams/utils';
@@ -30,6 +35,18 @@ export class Torrentio extends BaseWrapper {
}
);
}
protected parseStream(stream: Stream): ParseResult {
const parseResult = super.parseStream(stream);
if (parseResult.type === 'stream' && parseResult.result) {
const description = stream.description || stream.title;
const folderName = description?.split('\n')?.[0];
if (folderName !== parseResult.result.filename) {
parseResult.result.folderName = folderName;
}
}
return parseResult;
}
}
export async function getTorrentioStreams(