From fbad87b0472f574409f7aa3ae7f8b54927d0cdd6 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 2 Aug 2018 15:34:09 +0200 Subject: Add ability to import video with youtube-dl --- server/models/video/video-import.ts | 105 ++++++++++++++++++++++++++++++++++++ server/models/video/video.ts | 2 +- 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 server/models/video/video-import.ts (limited to 'server/models/video') diff --git a/server/models/video/video-import.ts b/server/models/video/video-import.ts new file mode 100644 index 000000000..89eeafd6a --- /dev/null +++ b/server/models/video/video-import.ts @@ -0,0 +1,105 @@ +import { + AllowNull, + BelongsTo, + Column, + CreatedAt, + DataType, + Default, + DefaultScope, + ForeignKey, + Is, + Model, + Table, + UpdatedAt +} from 'sequelize-typescript' +import { CONSTRAINTS_FIELDS } from '../../initializers' +import { throwIfNotValid } from '../utils' +import { VideoModel } from './video' +import { isVideoImportStateValid, isVideoImportTargetUrlValid } from '../../helpers/custom-validators/video-imports' +import { VideoImport, VideoImportState } from '../../../shared' +import { VideoChannelModel } from './video-channel' +import { AccountModel } from '../account/account' + +@DefaultScope({ + include: [ + { + model: () => VideoModel, + required: true, + include: [ + { + model: () => VideoChannelModel, + required: true, + include: [ + { + model: () => AccountModel, + required: true + } + ] + } + ] + } + ] +}) + +@Table({ + tableName: 'videoImport', + indexes: [ + { + fields: [ 'videoId' ], + unique: true + } + ] +}) +export class VideoImportModel extends Model { + @CreatedAt + createdAt: Date + + @UpdatedAt + updatedAt: Date + + @AllowNull(false) + @Is('VideoImportTargetUrl', value => throwIfNotValid(value, isVideoImportTargetUrlValid, 'targetUrl')) + @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_IMPORTS.URL.max)) + targetUrl: string + + @AllowNull(false) + @Default(null) + @Is('VideoImportState', value => throwIfNotValid(value, isVideoImportStateValid, 'state')) + @Column + state: VideoImportState + + @AllowNull(true) + @Default(null) + @Column(DataType.TEXT) + error: string + + @ForeignKey(() => VideoModel) + @Column + videoId: number + + @BelongsTo(() => VideoModel, { + foreignKey: { + allowNull: false + }, + onDelete: 'CASCADE' + }) + Video: VideoModel + + static loadAndPopulateVideo (id: number) { + return VideoImportModel.findById(id) + } + + toFormattedJSON (): VideoImport { + const videoFormatOptions = { + additionalAttributes: { state: true, waitTranscoding: true, scheduledUpdate: true } + } + const video = Object.assign(this.Video.toFormattedJSON(videoFormatOptions), { + tags: this.Video.Tags.map(t => t.name) + }) + + return { + targetUrl: this.targetUrl, + video + } + } +} diff --git a/server/models/video/video.ts b/server/models/video/video.ts index a6c4620b2..459fcb31e 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -377,7 +377,7 @@ type AvailableForListOptions = { include: [ { model: () => VideoFileModel.unscoped(), - required: true + required: false } ] }, -- cgit v1.2.3