mirror of
https://github.com/sakaljurgis/kodi-api-server.git
synced 2026-07-08 20:37:41 +00:00
refactor streamer to use stream providers (e.g. to plugin web torrent)
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
import { FileEntity } from '../../../VideoFiles/Entity/file.entity';
|
||||
import { ReadStreamCreatable } from '../../Interface/read-stream-creatable.interface';
|
||||
import { MimeService } from '../../Mime/mime.service';
|
||||
import { Stats } from 'fs';
|
||||
import { stat } from 'fs/promises';
|
||||
import { Injectable, NotFoundException } from '@nestjs/common';
|
||||
import { ReadStreamCreatableFile } from './read-stream-creatable-file.dto';
|
||||
import { ReadStreamCreatableProviderInterface } from '../read-stream-creatable-provider.interface';
|
||||
import { StreamProviderEnum } from '../stream-provider.enum';
|
||||
|
||||
@Injectable()
|
||||
export class FsReadStreamCreatableProvider
|
||||
implements ReadStreamCreatableProviderInterface
|
||||
{
|
||||
constructor(private readonly mimeService: MimeService) {}
|
||||
|
||||
supports(fileEntity: FileEntity): boolean {
|
||||
return fileEntity.streamProvider === StreamProviderEnum.fs;
|
||||
}
|
||||
|
||||
async getReadStreamCreatable(
|
||||
fileEntity: FileEntity,
|
||||
): Promise<ReadStreamCreatable> {
|
||||
const filePath = fileEntity.path;
|
||||
const stats: Stats | false = await stat(filePath).catch(() => false);
|
||||
if (stats === false) {
|
||||
//todo - set the file to deleted, since no longer available. Events?
|
||||
throw new NotFoundException('file not found');
|
||||
}
|
||||
const mimeType = this.mimeService.getMime(filePath);
|
||||
|
||||
return new ReadStreamCreatableFile(filePath, stats.size, mimeType);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import { createReadStream, ReadStream } from 'fs';
|
||||
import { ReadStreamOptions } from '../../Interface/read-stream-options.interface';
|
||||
import { ReadStreamCreatable } from '../../Interface/read-stream-creatable.interface';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
@Injectable()
|
||||
export class ReadStreamCreatableFile implements ReadStreamCreatable {
|
||||
constructor(
|
||||
private readonly path: string,
|
||||
readonly length: number,
|
||||
readonly mimeType: string,
|
||||
) {
|
||||
this.path = path;
|
||||
this.length = length;
|
||||
this.mimeType = mimeType;
|
||||
}
|
||||
|
||||
createReadStream(options: ReadStreamOptions): ReadStream {
|
||||
return createReadStream(this.path, options);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
import { FileEntity } from '../../VideoFiles/Entity/file.entity';
|
||||
import { ReadStreamCreatable } from '../Interface/read-stream-creatable.interface';
|
||||
|
||||
export interface ReadStreamCreatableProviderInterface {
|
||||
supports(fileEntity: FileEntity): boolean;
|
||||
getReadStreamCreatable(fileEntity: FileEntity): Promise<ReadStreamCreatable>;
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import { ReadStreamCreatable } from '../Interface/read-stream-creatable.interface';
|
||||
import { FileEntity } from '../../VideoFiles/Entity/file.entity';
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { ReadStreamCreatableProviderInterface } from './read-stream-creatable-provider.interface';
|
||||
|
||||
export const ReadStreamCreatableProviders = 'ReadStreamCreatableProviders';
|
||||
|
||||
@Injectable()
|
||||
export class ReadStreamCreatableProvider {
|
||||
constructor(
|
||||
@Inject(ReadStreamCreatableProviders)
|
||||
private providers: Array<ReadStreamCreatableProviderInterface>,
|
||||
) {}
|
||||
getReadStreamCreatable(fileEntity: FileEntity): Promise<ReadStreamCreatable> {
|
||||
for (const provider of this.providers) {
|
||||
if (provider.supports(fileEntity)) {
|
||||
return provider.getReadStreamCreatable(fileEntity);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
export enum StreamProviderEnum {
|
||||
fs = 'fs', //filesystem
|
||||
wt = 'wt', //web torrent
|
||||
}
|
||||
Reference in New Issue
Block a user