diff options
Diffstat (limited to 'server/models/video/video.ts')
-rw-r--r-- | server/models/video/video.ts | 153 |
1 files changed, 69 insertions, 84 deletions
diff --git a/server/models/video/video.ts b/server/models/video/video.ts index eacffe186..20e1f1c4a 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts | |||
@@ -1,18 +1,7 @@ | |||
1 | import * as Bluebird from 'bluebird' | 1 | import * as Bluebird from 'bluebird' |
2 | import { maxBy, minBy } from 'lodash' | 2 | import { maxBy, minBy } from 'lodash' |
3 | import { join } from 'path' | 3 | import { join } from 'path' |
4 | import { | 4 | import { CountOptions, FindOptions, IncludeOptions, Op, QueryTypes, ScopeOptions, Sequelize, Transaction, WhereOptions } from 'sequelize' |
5 | CountOptions, | ||
6 | FindOptions, | ||
7 | IncludeOptions, | ||
8 | ModelIndexesOptions, | ||
9 | Op, | ||
10 | QueryTypes, | ||
11 | ScopeOptions, | ||
12 | Sequelize, | ||
13 | Transaction, | ||
14 | WhereOptions | ||
15 | } from 'sequelize' | ||
16 | import { | 5 | import { |
17 | AllowNull, | 6 | AllowNull, |
18 | BeforeDestroy, | 7 | BeforeDestroy, |
@@ -136,8 +125,7 @@ import { | |||
136 | MVideoThumbnailBlacklist, | 125 | MVideoThumbnailBlacklist, |
137 | MVideoWithAllFiles, | 126 | MVideoWithAllFiles, |
138 | MVideoWithFile, | 127 | MVideoWithFile, |
139 | MVideoWithRights, | 128 | MVideoWithRights |
140 | MStreamingPlaylistFiles | ||
141 | } from '../../typings/models' | 129 | } from '../../typings/models' |
142 | import { MVideoFile, MVideoFileStreamingPlaylistVideo } from '../../typings/models/video/video-file' | 130 | import { MVideoFile, MVideoFileStreamingPlaylistVideo } from '../../typings/models/video/video-file' |
143 | import { MThumbnail } from '../../typings/models/video/thumbnail' | 131 | import { MThumbnail } from '../../typings/models/video/thumbnail' |
@@ -145,74 +133,6 @@ import { VideoFile } from '@shared/models/videos/video-file.model' | |||
145 | import { getHLSDirectory, getTorrentFileName, getTorrentFilePath, getVideoFilename, getVideoFilePath } from '@server/lib/video-paths' | 133 | import { getHLSDirectory, getTorrentFileName, getTorrentFilePath, getVideoFilename, getVideoFilePath } from '@server/lib/video-paths' |
146 | import validator from 'validator' | 134 | import validator from 'validator' |
147 | 135 | ||
148 | // FIXME: Define indexes here because there is an issue with TS and Sequelize.literal when called directly in the annotation | ||
149 | const indexes: (ModelIndexesOptions & { where?: WhereOptions })[] = [ | ||
150 | buildTrigramSearchIndex('video_name_trigram', 'name'), | ||
151 | |||
152 | { fields: [ 'createdAt' ] }, | ||
153 | { | ||
154 | fields: [ | ||
155 | { name: 'publishedAt', order: 'DESC' }, | ||
156 | { name: 'id', order: 'ASC' } | ||
157 | ] | ||
158 | }, | ||
159 | { fields: [ 'duration' ] }, | ||
160 | { fields: [ 'views' ] }, | ||
161 | { fields: [ 'channelId' ] }, | ||
162 | { | ||
163 | fields: [ 'originallyPublishedAt' ], | ||
164 | where: { | ||
165 | originallyPublishedAt: { | ||
166 | [Op.ne]: null | ||
167 | } | ||
168 | } | ||
169 | }, | ||
170 | { | ||
171 | fields: [ 'category' ], // We don't care videos with an unknown category | ||
172 | where: { | ||
173 | category: { | ||
174 | [Op.ne]: null | ||
175 | } | ||
176 | } | ||
177 | }, | ||
178 | { | ||
179 | fields: [ 'licence' ], // We don't care videos with an unknown licence | ||
180 | where: { | ||
181 | licence: { | ||
182 | [Op.ne]: null | ||
183 | } | ||
184 | } | ||
185 | }, | ||
186 | { | ||
187 | fields: [ 'language' ], // We don't care videos with an unknown language | ||
188 | where: { | ||
189 | language: { | ||
190 | [Op.ne]: null | ||
191 | } | ||
192 | } | ||
193 | }, | ||
194 | { | ||
195 | fields: [ 'nsfw' ], // Most of the videos are not NSFW | ||
196 | where: { | ||
197 | nsfw: true | ||
198 | } | ||
199 | }, | ||
200 | { | ||
201 | fields: [ 'remote' ], // Only index local videos | ||
202 | where: { | ||
203 | remote: false | ||
204 | } | ||
205 | }, | ||
206 | { | ||
207 | fields: [ 'uuid' ], | ||
208 | unique: true | ||
209 | }, | ||
210 | { | ||
211 | fields: [ 'url' ], | ||
212 | unique: true | ||
213 | } | ||
214 | ] | ||
215 | |||
216 | export enum ScopeNames { | 136 | export enum ScopeNames { |
217 | AVAILABLE_FOR_LIST_IDS = 'AVAILABLE_FOR_LIST_IDS', | 137 | AVAILABLE_FOR_LIST_IDS = 'AVAILABLE_FOR_LIST_IDS', |
218 | FOR_API = 'FOR_API', | 138 | FOR_API = 'FOR_API', |
@@ -292,7 +212,7 @@ export type AvailableForListIDsOptions = { | |||
292 | if (options.ids) { | 212 | if (options.ids) { |
293 | query.where = { | 213 | query.where = { |
294 | id: { | 214 | id: { |
295 | [ Op.in ]: options.ids // FIXME: sequelize ANY seems broken | 215 | [ Op.in ]: options.ids |
296 | } | 216 | } |
297 | } | 217 | } |
298 | } | 218 | } |
@@ -760,7 +680,72 @@ export type AvailableForListIDsOptions = { | |||
760 | })) | 680 | })) |
761 | @Table({ | 681 | @Table({ |
762 | tableName: 'video', | 682 | tableName: 'video', |
763 | indexes | 683 | indexes: [ |
684 | buildTrigramSearchIndex('video_name_trigram', 'name'), | ||
685 | |||
686 | { fields: [ 'createdAt' ] }, | ||
687 | { | ||
688 | fields: [ | ||
689 | { name: 'publishedAt', order: 'DESC' }, | ||
690 | { name: 'id', order: 'ASC' } | ||
691 | ] | ||
692 | }, | ||
693 | { fields: [ 'duration' ] }, | ||
694 | { fields: [ 'views' ] }, | ||
695 | { fields: [ 'channelId' ] }, | ||
696 | { | ||
697 | fields: [ 'originallyPublishedAt' ], | ||
698 | where: { | ||
699 | originallyPublishedAt: { | ||
700 | [Op.ne]: null | ||
701 | } | ||
702 | } | ||
703 | }, | ||
704 | { | ||
705 | fields: [ 'category' ], // We don't care videos with an unknown category | ||
706 | where: { | ||
707 | category: { | ||
708 | [Op.ne]: null | ||
709 | } | ||
710 | } | ||
711 | }, | ||
712 | { | ||
713 | fields: [ 'licence' ], // We don't care videos with an unknown licence | ||
714 | where: { | ||
715 | licence: { | ||
716 | [Op.ne]: null | ||
717 | } | ||
718 | } | ||
719 | }, | ||
720 | { | ||
721 | fields: [ 'language' ], // We don't care videos with an unknown language | ||
722 | where: { | ||
723 | language: { | ||
724 | [Op.ne]: null | ||
725 | } | ||
726 | } | ||
727 | }, | ||
728 | { | ||
729 | fields: [ 'nsfw' ], // Most of the videos are not NSFW | ||
730 | where: { | ||
731 | nsfw: true | ||
732 | } | ||
733 | }, | ||
734 | { | ||
735 | fields: [ 'remote' ], // Only index local videos | ||
736 | where: { | ||
737 | remote: false | ||
738 | } | ||
739 | }, | ||
740 | { | ||
741 | fields: [ 'uuid' ], | ||
742 | unique: true | ||
743 | }, | ||
744 | { | ||
745 | fields: [ 'url' ], | ||
746 | unique: true | ||
747 | } | ||
748 | ] | ||
764 | }) | 749 | }) |
765 | export class VideoModel extends Model<VideoModel> { | 750 | export class VideoModel extends Model<VideoModel> { |
766 | 751 | ||