refactor streamer to use stream providers (e.g. to plugin web torrent)

This commit is contained in:
Jurgis Sakalauskas
2023-01-04 14:26:05 +02:00
parent 8c900a774e
commit 3c9ea2fb39
13 changed files with 123 additions and 56 deletions
@@ -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
}