import { VideoChannelModel } from '../../models/video/video-channel'
import { videoPlaylistsSortValidator } from '../../middlewares/validators'
import { buildNSFWFilter, createReqFiles, isUserAbleToSearchRemoteURI } from '../../helpers/express-utils'
-import { CONFIG, MIMETYPES, sequelizeTypescript, THUMBNAILS_SIZE } from '../../initializers'
+import { CONFIG, MIMETYPES, sequelizeTypescript, THUMBNAILS_SIZE, VIDEO_PLAYLIST_PRIVACIES } from '../../initializers'
import { logger } from '../../helpers/logger'
import { resetSequelizeInstance } from '../../helpers/database-utils'
import { VideoPlaylistModel } from '../../models/video/video-playlist'
const videoPlaylistRouter = express.Router()
+videoPlaylistRouter.get('/privacies', listVideoPlaylistPrivacies)
+
videoPlaylistRouter.get('/',
paginationValidator,
videoPlaylistsSortValidator,
// ---------------------------------------------------------------------------
+function listVideoPlaylistPrivacies (req: express.Request, res: express.Response) {
+ res.json(VIDEO_PLAYLIST_PRIVACIES)
+}
+
async function listVideoPlaylists (req: express.Request, res: express.Response) {
const serverActor = await getServerActor()
const resultList = await VideoPlaylistModel.listForApi({
videoPlaylist.url = getVideoPlaylistActivityPubUrl(videoPlaylist) // We use the UUID, so set the URL after building the object
- if (videoPlaylistInfo.videoChannelId !== undefined) {
+ if (videoPlaylistInfo.videoChannelId) {
const videoChannel = res.locals.videoChannel as VideoChannelModel
videoPlaylist.videoChannelId = videoChannel.id
--- /dev/null
+import * as Sequelize from 'sequelize'
+import { CONFIG } from '../constants'
+import { VideoPlaylistPrivacy, VideoPlaylistType } from '../../../shared/models/videos'
+import * as uuidv4 from 'uuid/v4'
+
+async function up (utils: {
+ transaction: Sequelize.Transaction,
+ queryInterface: Sequelize.QueryInterface,
+ sequelize: Sequelize.Sequelize
+}): Promise<void> {
+ const transaction = utils.transaction
+
+ {
+ const query = `
+CREATE TABLE IF NOT EXISTS "videoPlaylist"
+(
+ "id" SERIAL,
+ "name" VARCHAR(255) NOT NULL,
+ "description" VARCHAR(255),
+ "privacy" INTEGER NOT NULL,
+ "url" VARCHAR(2000) NOT NULL,
+ "uuid" UUID NOT NULL,
+ "type" INTEGER NOT NULL DEFAULT 1,
+ "ownerAccountId" INTEGER NOT NULL REFERENCES "account" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+ "videoChannelId" INTEGER REFERENCES "videoChannel" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+ "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL,
+ "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL,
+ PRIMARY KEY ("id")
+);`
+ await utils.sequelize.query(query, { transaction })
+ }
+
+ {
+ const query = `
+CREATE TABLE IF NOT EXISTS "videoPlaylistElement"
+(
+ "id" SERIAL,
+ "url" VARCHAR(2000) NOT NULL,
+ "position" INTEGER NOT NULL DEFAULT 1,
+ "startTimestamp" INTEGER,
+ "stopTimestamp" INTEGER,
+ "videoPlaylistId" INTEGER NOT NULL REFERENCES "videoPlaylist" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+ "videoId" INTEGER NOT NULL REFERENCES "video" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
+ "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL,
+ "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL,
+ PRIMARY KEY ("id")
+);`
+
+ await utils.sequelize.query(query, { transaction })
+ }
+
+ {
+ const userQuery = 'SELECT "username" FROM "user";'
+ const userResult = await utils.sequelize.query(userQuery, { transaction, type: Sequelize.QueryTypes.SELECT })
+ const usernames = userResult.map(r => r.username)
+
+ for (const username of usernames) {
+ const uuid = uuidv4()
+
+ const baseUrl = CONFIG.WEBSERVER.URL + '/video-playlists/' + uuid
+ const query = `
+ INSERT INTO "videoPlaylist" ("url", "uuid", "name", "privacy", "type", "ownerAccountId", "createdAt", "updatedAt")
+ SELECT '${baseUrl}' AS "url",
+ '${uuid}' AS "uuid",
+ 'Watch later' AS "name",
+ ${VideoPlaylistPrivacy.PRIVATE} AS "privacy",
+ ${VideoPlaylistType.WATCH_LATER} AS "type",
+ "account"."id" AS "ownerAccountId",
+ NOW() as "createdAt",
+ NOW() as "updatedAt"
+ FROM "user" INNER JOIN "account" ON "user"."id" = "account"."userId"
+ WHERE "user"."username" = '${username}'`
+
+ await utils.sequelize.query(query, { transaction })
+ }
+ }
+}
+
+function down (options) {
+ throw new Error('Not implemented.')
+}
+
+export {
+ up,
+ down
+}
getPlaylistVideos,
getVideoChannelPlaylistsList,
getVideoPlaylist,
+ getVideoPlaylistPrivacies,
getVideoPlaylistsList,
getVideoPlaylistWithToken,
killallServers,
await waitJobs(servers)
})
+ it('Should list video playlist privacies', async function () {
+ const res = await getVideoPlaylistPrivacies(servers[0].url)
+
+ const privacies = res.body
+ expect(Object.keys(privacies)).to.have.length.at.least(3)
+
+ expect(privacies[3]).to.equal('Private')
+ })
+
it('Should list watch later playlist', async function () {
const url = servers[ 0 ].url
const accessToken = servers[ 0 ].accessToken