X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fvideo-playlist.ts;h=9f9e0b069a03197a8fd8ee06fa007121a1357d64;hb=2650d6d489f775a38c5c3fdb65daabc7d55c15b5;hp=b17fd106019b0d38e0db03014d643c876780d28f;hpb=c18431505fd1d769554e9f848799284f84c30110;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/video-playlist.ts b/server/models/video/video-playlist.ts index b17fd1060..9f9e0b069 100644 --- a/server/models/video/video-playlist.ts +++ b/server/models/video/video-playlist.ts @@ -1,3 +1,6 @@ +import * as Bluebird from 'bluebird' +import { join } from 'path' +import { FindOptions, literal, Op, ScopeOptions, Transaction, WhereOptions } from 'sequelize' import { AllowNull, BelongsTo, @@ -15,14 +18,19 @@ import { Table, UpdatedAt } from 'sequelize-typescript' +import { MAccountId, MChannelId } from '@server/types/models' +import { ActivityIconObject } from '../../../shared/models/activitypub/objects' +import { PlaylistObject } from '../../../shared/models/activitypub/objects/playlist-object' import { VideoPlaylistPrivacy } from '../../../shared/models/videos/playlist/video-playlist-privacy.model' -import { buildServerIdsFollowedBy, buildWhereIdOrUUID, getSort, isOutdated, throwIfNotValid } from '../utils' +import { VideoPlaylistType } from '../../../shared/models/videos/playlist/video-playlist-type.model' +import { VideoPlaylist } from '../../../shared/models/videos/playlist/video-playlist.model' +import { activityPubCollectionPagination } from '../../helpers/activitypub' +import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' import { isVideoPlaylistDescriptionValid, isVideoPlaylistNameValid, isVideoPlaylistPrivacyValid } from '../../helpers/custom-validators/video-playlists' -import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' import { ACTIVITY_PUB, CONSTRAINTS_FIELDS, @@ -32,18 +40,7 @@ import { VIDEO_PLAYLIST_TYPES, WEBSERVER } from '../../initializers/constants' -import { VideoPlaylist } from '../../../shared/models/videos/playlist/video-playlist.model' -import { AccountModel, ScopeNames as AccountScopeNames, SummaryOptions } from '../account/account' -import { ScopeNames as VideoChannelScopeNames, VideoChannelModel } from './video-channel' -import { join } from 'path' -import { VideoPlaylistElementModel } from './video-playlist-element' -import { PlaylistObject } from '../../../shared/models/activitypub/objects/playlist-object' -import { activityPubCollectionPagination } from '../../helpers/activitypub' -import { VideoPlaylistType } from '../../../shared/models/videos/playlist/video-playlist-type.model' -import { ThumbnailModel } from './thumbnail' -import { ActivityIconObject } from '../../../shared/models/activitypub/objects' -import { FindOptions, literal, Op, ScopeOptions, Transaction, WhereOptions } from 'sequelize' -import * as Bluebird from 'bluebird' +import { MThumbnail } from '../../types/models/video/thumbnail' import { MVideoPlaylistAccountThumbnail, MVideoPlaylistAP, @@ -51,8 +48,12 @@ import { MVideoPlaylistFull, MVideoPlaylistFullSummary, MVideoPlaylistIdWithElements -} from '../../typings/models/video/video-playlist' -import { MThumbnail } from '../../typings/models/video/thumbnail' +} from '../../types/models/video/video-playlist' +import { AccountModel, ScopeNames as AccountScopeNames, SummaryOptions } from '../account/account' +import { buildServerIdsFollowedBy, buildWhereIdOrUUID, getPlaylistSort, isOutdated, throwIfNotValid } from '../utils' +import { ThumbnailModel } from './thumbnail' +import { ScopeNames as VideoChannelScopeNames, VideoChannelModel } from './video-channel' +import { VideoPlaylistElementModel } from './video-playlist-element' enum ScopeNames { AVAILABLE_FOR_LIST = 'AVAILABLE_FOR_LIST', @@ -230,7 +231,7 @@ export class VideoPlaylistModel extends Model { @AllowNull(true) @Is('VideoPlaylistDescription', value => throwIfNotValid(value, isVideoPlaylistDescriptionValid, 'description', true)) - @Column + @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_PLAYLISTS.DESCRIPTION.max)) description: string @AllowNull(false) @@ -311,7 +312,7 @@ export class VideoPlaylistModel extends Model { const query = { offset: options.start, limit: options.count, - order: getSort(options.sort) + order: getPlaylistSort(options.sort) } const scopes: (string | ScopeOptions)[] = [ @@ -340,15 +341,24 @@ export class VideoPlaylistModel extends Model { }) } - static listPublicUrlsOfForAP (accountId: number, start: number, count: number) { + static listPublicUrlsOfForAP (options: { account?: MAccountId, channel?: MChannelId }, start: number, count: number) { + const where = { + privacy: VideoPlaylistPrivacy.PUBLIC + } + + if (options.account) { + Object.assign(where, { ownerAccountId: options.account.id }) + } + + if (options.channel) { + Object.assign(where, { videoChannelId: options.channel.id }) + } + const query = { attributes: [ 'url' ], offset: start, limit: count, - where: { - ownerAccountId: accountId, - privacy: VideoPlaylistPrivacy.PUBLIC - } + where } return VideoPlaylistModel.findAndCountAll(query) @@ -480,6 +490,14 @@ export class VideoPlaylistModel extends Model { return join(STATIC_PATHS.THUMBNAILS, this.Thumbnail.filename) } + getWatchUrl () { + return WEBSERVER.URL + '/videos/watch/playlist/' + this.uuid + } + + getEmbedStaticPath () { + return '/video-playlists/embed/' + this.uuid + } + setAsRefreshed () { this.changed('updatedAt', true) @@ -510,6 +528,7 @@ export class VideoPlaylistModel extends Model { }, thumbnailPath: this.getThumbnailStaticPath(), + embedPath: this.getEmbedStaticPath(), type: { id: this.type,