X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fthumbnail.ts;h=e396784d29124f7f43af55c855c561b5d9506ce2;hb=3d527ba173a37bd61ec8ad742642bb320d12995c;hp=206e9a3d62b4021d946242b7db0989ac7ffe3b91;hpb=9cc8d43e37a61709e7275c2a799bdf976dd940ca;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/thumbnail.ts b/server/models/video/thumbnail.ts index 206e9a3d6..e396784d2 100644 --- a/server/models/video/thumbnail.ts +++ b/server/models/video/thumbnail.ts @@ -1,12 +1,26 @@ import { join } from 'path' -import { AfterDestroy, AllowNull, BelongsTo, Column, CreatedAt, Default, ForeignKey, Model, Table, UpdatedAt } from 'sequelize-typescript' -import { STATIC_PATHS, WEBSERVER } from '../../initializers/constants' +import { + AfterDestroy, + AllowNull, + BelongsTo, + Column, + CreatedAt, + DataType, + Default, + ForeignKey, + Model, + Table, + UpdatedAt +} from 'sequelize-typescript' +import { CONSTRAINTS_FIELDS, LAZY_STATIC_PATHS, STATIC_PATHS, WEBSERVER } from '../../initializers/constants' import { logger } from '../../helpers/logger' import { remove } from 'fs-extra' import { CONFIG } from '../../initializers/config' import { VideoModel } from './video' import { VideoPlaylistModel } from './video-playlist' import { ThumbnailType } from '../../../shared/models/videos/thumbnail.type' +import { MVideoAccountLight } from '@server/typings/models' +import { buildRemoteVideoBaseUrl } from '@server/helpers/activitypub' @Table({ tableName: 'thumbnail', @@ -41,9 +55,13 @@ export class ThumbnailModel extends Model { type: ThumbnailType @AllowNull(true) - @Column + @Column(DataType.STRING(CONSTRAINTS_FIELDS.COMMONS.URL.max)) fileUrl: string + @AllowNull(true) + @Column + automaticallyGenerated: boolean + @ForeignKey(() => VideoModel) @Column videoId: number @@ -74,7 +92,7 @@ export class ThumbnailModel extends Model { @UpdatedAt updatedAt: Date - private static types: { [ id in ThumbnailType ]: { label: string, directory: string, staticPath: string } } = { + private static readonly types: { [ id in ThumbnailType ]: { label: string, directory: string, staticPath: string } } = { [ThumbnailType.MINIATURE]: { label: 'miniature', directory: CONFIG.STORAGE.THUMBNAILS_DIR, @@ -83,12 +101,12 @@ export class ThumbnailModel extends Model { [ThumbnailType.PREVIEW]: { label: 'preview', directory: CONFIG.STORAGE.PREVIEWS_DIR, - staticPath: STATIC_PATHS.PREVIEWS + staticPath: LAZY_STATIC_PATHS.PREVIEWS } } @AfterDestroy - static removeFilesAndSendDelete (instance: ThumbnailModel) { + static removeFiles (instance: ThumbnailModel) { logger.info('Removing %s file %s.', ThumbnailModel.types[instance.type].label, instance.filename) // Don't block the transaction @@ -96,21 +114,36 @@ export class ThumbnailModel extends Model { .catch(err => logger.error('Cannot remove thumbnail file %s.', instance.filename, err)) } + static loadByName (filename: string) { + const query = { + where: { + filename + } + } + + return ThumbnailModel.findOne(query) + } + static generateDefaultPreviewName (videoUUID: string) { return videoUUID + '.jpg' } - getFileUrl () { + getFileUrl (video: MVideoAccountLight) { + const staticPath = ThumbnailModel.types[this.type].staticPath + this.filename + + if (video.isOwned()) return WEBSERVER.URL + staticPath if (this.fileUrl) return this.fileUrl - const staticPath = ThumbnailModel.types[this.type].staticPath - return WEBSERVER.URL + staticPath + this.filename + // Fallback if we don't have a file URL + return buildRemoteVideoBaseUrl(video, staticPath) } - removeThumbnail () { + getPath () { const directory = ThumbnailModel.types[this.type].directory - const thumbnailPath = join(directory, this.filename) + return join(directory, this.filename) + } - return remove(thumbnailPath) + removeThumbnail () { + return remove(this.getPath()) } }