diff options
Diffstat (limited to 'server/models/video/video.ts')
-rw-r--r-- | server/models/video/video.ts | 60 |
1 files changed, 13 insertions, 47 deletions
diff --git a/server/models/video/video.ts b/server/models/video/video.ts index 3321deed3..2e6b6aeec 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts | |||
@@ -24,10 +24,11 @@ import { | |||
24 | Table, | 24 | Table, |
25 | UpdatedAt | 25 | UpdatedAt |
26 | } from 'sequelize-typescript' | 26 | } from 'sequelize-typescript' |
27 | import { v4 as uuidv4 } from 'uuid' | ||
27 | import { buildNSFWFilter } from '@server/helpers/express-utils' | 28 | import { buildNSFWFilter } from '@server/helpers/express-utils' |
28 | import { getPrivaciesForFederation, isPrivacyForFederation, isStateForFederation } from '@server/helpers/video' | 29 | import { getPrivaciesForFederation, isPrivacyForFederation, isStateForFederation } from '@server/helpers/video' |
29 | import { LiveManager } from '@server/lib/live-manager' | 30 | import { LiveManager } from '@server/lib/live-manager' |
30 | import { getHLSDirectory, getTorrentFileName, getTorrentFilePath, getVideoFilename, getVideoFilePath } from '@server/lib/video-paths' | 31 | import { getHLSDirectory, getVideoFilePath } from '@server/lib/video-paths' |
31 | import { getServerActor } from '@server/models/application/application' | 32 | import { getServerActor } from '@server/models/application/application' |
32 | import { ModelCache } from '@server/models/model-cache' | 33 | import { ModelCache } from '@server/models/model-cache' |
33 | import { VideoFile } from '@shared/models/videos/video-file.model' | 34 | import { VideoFile } from '@shared/models/videos/video-file.model' |
@@ -60,7 +61,6 @@ import { | |||
60 | CONSTRAINTS_FIELDS, | 61 | CONSTRAINTS_FIELDS, |
61 | LAZY_STATIC_PATHS, | 62 | LAZY_STATIC_PATHS, |
62 | REMOTE_SCHEME, | 63 | REMOTE_SCHEME, |
63 | STATIC_DOWNLOAD_PATHS, | ||
64 | STATIC_PATHS, | 64 | STATIC_PATHS, |
65 | VIDEO_CATEGORIES, | 65 | VIDEO_CATEGORIES, |
66 | VIDEO_LANGUAGES, | 66 | VIDEO_LANGUAGES, |
@@ -78,6 +78,7 @@ import { | |||
78 | MStreamingPlaylistFilesVideo, | 78 | MStreamingPlaylistFilesVideo, |
79 | MUserAccountId, | 79 | MUserAccountId, |
80 | MUserId, | 80 | MUserId, |
81 | MVideo, | ||
81 | MVideoAccountLight, | 82 | MVideoAccountLight, |
82 | MVideoAccountLightBlacklistAllFiles, | 83 | MVideoAccountLightBlacklistAllFiles, |
83 | MVideoAP, | 84 | MVideoAP, |
@@ -130,7 +131,6 @@ import { VideoShareModel } from './video-share' | |||
130 | import { VideoStreamingPlaylistModel } from './video-streaming-playlist' | 131 | import { VideoStreamingPlaylistModel } from './video-streaming-playlist' |
131 | import { VideoTagModel } from './video-tag' | 132 | import { VideoTagModel } from './video-tag' |
132 | import { VideoViewModel } from './video-view' | 133 | import { VideoViewModel } from './video-view' |
133 | import { v4 as uuidv4 } from 'uuid' | ||
134 | 134 | ||
135 | export enum ScopeNames { | 135 | export enum ScopeNames { |
136 | AVAILABLE_FOR_LIST_IDS = 'AVAILABLE_FOR_LIST_IDS', | 136 | AVAILABLE_FOR_LIST_IDS = 'AVAILABLE_FOR_LIST_IDS', |
@@ -790,7 +790,7 @@ export class VideoModel extends Model { | |||
790 | // Remove physical files and torrents | 790 | // Remove physical files and torrents |
791 | instance.VideoFiles.forEach(file => { | 791 | instance.VideoFiles.forEach(file => { |
792 | tasks.push(instance.removeFile(file)) | 792 | tasks.push(instance.removeFile(file)) |
793 | tasks.push(instance.removeTorrent(file)) | 793 | tasks.push(file.removeTorrent()) |
794 | }) | 794 | }) |
795 | 795 | ||
796 | // Remove playlists file | 796 | // Remove playlists file |
@@ -853,18 +853,14 @@ export class VideoModel extends Model { | |||
853 | return undefined | 853 | return undefined |
854 | } | 854 | } |
855 | 855 | ||
856 | static listLocal (): Promise<MVideoWithAllFiles[]> { | 856 | static listLocal (): Promise<MVideo[]> { |
857 | const query = { | 857 | const query = { |
858 | where: { | 858 | where: { |
859 | remote: false | 859 | remote: false |
860 | } | 860 | } |
861 | } | 861 | } |
862 | 862 | ||
863 | return VideoModel.scope([ | 863 | return VideoModel.findAll(query) |
864 | ScopeNames.WITH_WEBTORRENT_FILES, | ||
865 | ScopeNames.WITH_STREAMING_PLAYLISTS, | ||
866 | ScopeNames.WITH_THUMBNAILS | ||
867 | ]).findAll(query) | ||
868 | } | 864 | } |
869 | 865 | ||
870 | static listAllAndSharedByActorForOutbox (actorId: number, start: number, count: number) { | 866 | static listAllAndSharedByActorForOutbox (actorId: number, start: number, count: number) { |
@@ -1623,6 +1619,10 @@ export class VideoModel extends Model { | |||
1623 | 'resolution', | 1619 | 'resolution', |
1624 | 'size', | 1620 | 'size', |
1625 | 'extname', | 1621 | 'extname', |
1622 | 'filename', | ||
1623 | 'fileUrl', | ||
1624 | 'torrentFilename', | ||
1625 | 'torrentUrl', | ||
1626 | 'infoHash', | 1626 | 'infoHash', |
1627 | 'fps', | 1627 | 'fps', |
1628 | 'videoId', | 1628 | 'videoId', |
@@ -1891,14 +1891,14 @@ export class VideoModel extends Model { | |||
1891 | let files: VideoFile[] = [] | 1891 | let files: VideoFile[] = [] |
1892 | 1892 | ||
1893 | if (Array.isArray(this.VideoFiles)) { | 1893 | if (Array.isArray(this.VideoFiles)) { |
1894 | const result = videoFilesModelToFormattedJSON(this, baseUrlHttp, baseUrlWs, this.VideoFiles) | 1894 | const result = videoFilesModelToFormattedJSON(this, this, baseUrlHttp, baseUrlWs, this.VideoFiles) |
1895 | files = files.concat(result) | 1895 | files = files.concat(result) |
1896 | } | 1896 | } |
1897 | 1897 | ||
1898 | for (const p of (this.VideoStreamingPlaylists || [])) { | 1898 | for (const p of (this.VideoStreamingPlaylists || [])) { |
1899 | p.Video = this | 1899 | p.Video = this |
1900 | 1900 | ||
1901 | const result = videoFilesModelToFormattedJSON(p, baseUrlHttp, baseUrlWs, p.VideoFiles) | 1901 | const result = videoFilesModelToFormattedJSON(p, this, baseUrlHttp, baseUrlWs, p.VideoFiles) |
1902 | files = files.concat(result) | 1902 | files = files.concat(result) |
1903 | } | 1903 | } |
1904 | 1904 | ||
@@ -1956,12 +1956,6 @@ export class VideoModel extends Model { | |||
1956 | .catch(err => logger.warn('Cannot delete file %s.', filePath, { err })) | 1956 | .catch(err => logger.warn('Cannot delete file %s.', filePath, { err })) |
1957 | } | 1957 | } |
1958 | 1958 | ||
1959 | removeTorrent (videoFile: MVideoFile) { | ||
1960 | const torrentPath = getTorrentFilePath(this, videoFile) | ||
1961 | return remove(torrentPath) | ||
1962 | .catch(err => logger.warn('Cannot delete torrent %s.', torrentPath, { err })) | ||
1963 | } | ||
1964 | |||
1965 | async removeStreamingPlaylistFiles (streamingPlaylist: MStreamingPlaylist, isRedundancy = false) { | 1959 | async removeStreamingPlaylistFiles (streamingPlaylist: MStreamingPlaylist, isRedundancy = false) { |
1966 | const directoryPath = getHLSDirectory(this, isRedundancy) | 1960 | const directoryPath = getHLSDirectory(this, isRedundancy) |
1967 | 1961 | ||
@@ -1977,7 +1971,7 @@ export class VideoModel extends Model { | |||
1977 | 1971 | ||
1978 | // Remove physical files and torrents | 1972 | // Remove physical files and torrents |
1979 | await Promise.all( | 1973 | await Promise.all( |
1980 | streamingPlaylistWithFiles.VideoFiles.map(file => streamingPlaylistWithFiles.removeTorrent(file)) | 1974 | streamingPlaylistWithFiles.VideoFiles.map(file => file.removeTorrent()) |
1981 | ) | 1975 | ) |
1982 | } | 1976 | } |
1983 | } | 1977 | } |
@@ -2054,34 +2048,6 @@ export class VideoModel extends Model { | |||
2054 | return [ baseUrlWs + '/tracker/socket', baseUrlHttp + '/tracker/announce' ] | 2048 | return [ baseUrlWs + '/tracker/socket', baseUrlHttp + '/tracker/announce' ] |
2055 | } | 2049 | } |
2056 | 2050 | ||
2057 | getTorrentUrl (videoFile: MVideoFile, baseUrlHttp: string) { | ||
2058 | return baseUrlHttp + STATIC_PATHS.TORRENTS + getTorrentFileName(this, videoFile) | ||
2059 | } | ||
2060 | |||
2061 | getTorrentDownloadUrl (videoFile: MVideoFile, baseUrlHttp: string) { | ||
2062 | return baseUrlHttp + STATIC_DOWNLOAD_PATHS.TORRENTS + getTorrentFileName(this, videoFile) | ||
2063 | } | ||
2064 | |||
2065 | getVideoFileUrl (videoFile: MVideoFile, baseUrlHttp: string) { | ||
2066 | return baseUrlHttp + STATIC_PATHS.WEBSEED + getVideoFilename(this, videoFile) | ||
2067 | } | ||
2068 | |||
2069 | getVideoFileMetadataUrl (videoFile: MVideoFile, baseUrlHttp: string) { | ||
2070 | const path = '/api/v1/videos/' | ||
2071 | |||
2072 | return this.isOwned() | ||
2073 | ? baseUrlHttp + path + this.uuid + '/metadata/' + videoFile.id | ||
2074 | : videoFile.metadataUrl | ||
2075 | } | ||
2076 | |||
2077 | getVideoRedundancyUrl (videoFile: MVideoFile, baseUrlHttp: string) { | ||
2078 | return baseUrlHttp + STATIC_PATHS.REDUNDANCY + getVideoFilename(this, videoFile) | ||
2079 | } | ||
2080 | |||
2081 | getVideoFileDownloadUrl (videoFile: MVideoFile, baseUrlHttp: string) { | ||
2082 | return baseUrlHttp + STATIC_DOWNLOAD_PATHS.VIDEOS + getVideoFilename(this, videoFile) | ||
2083 | } | ||
2084 | |||
2085 | getBandwidthBits (videoFile: MVideoFile) { | 2051 | getBandwidthBits (videoFile: MVideoFile) { |
2086 | return Math.ceil((videoFile.size * 8) / this.duration) | 2052 | return Math.ceil((videoFile.size * 8) / this.duration) |
2087 | } | 2053 | } |