Fix filters on playlists
This commit is contained in:
parent
918ba713e4
commit
16ccb43767
5 changed files with 126 additions and 11 deletions
|
@ -139,7 +139,7 @@ async function listVideoPlaylists (req: express.Request, res: express.Response)
|
|||
start: req.query.start,
|
||||
count: req.query.count,
|
||||
sort: req.query.sort,
|
||||
type: req.query.type
|
||||
type: req.query.playlistType
|
||||
})
|
||||
|
||||
return res.json(getFormattedObjects(resultList.data, resultList.total))
|
||||
|
|
|
@ -142,7 +142,7 @@ const videoPlaylistsGetValidator = (fetchType: VideoPlaylistFetchType) => {
|
|||
|
||||
const videoPlaylist = res.locals.videoPlaylistFull || res.locals.videoPlaylistSummary
|
||||
|
||||
// Video is unlisted, check we used the uuid to fetch it
|
||||
// Playlist is unlisted, check we used the uuid to fetch it
|
||||
if (videoPlaylist.privacy === VideoPlaylistPrivacy.UNLISTED) {
|
||||
if (isUUIDValid(req.params.playlistId)) return next()
|
||||
|
||||
|
|
|
@ -114,7 +114,7 @@ describe('Test video playlists', function () {
|
|||
await waitJobs(servers)
|
||||
})
|
||||
|
||||
describe('Get default playlists', function () {
|
||||
describe('Check playlists filters and privacies', function () {
|
||||
|
||||
it('Should list video playlist privacies', async function () {
|
||||
const privacies = await commands[0].getPrivacies()
|
||||
|
@ -123,9 +123,21 @@ describe('Test video playlists', function () {
|
|||
expect(privacies[3]).to.equal('Private')
|
||||
})
|
||||
|
||||
it('Should list watch later playlist', async function () {
|
||||
it('Should filter on playlist type', async function () {
|
||||
this.timeout(30000)
|
||||
|
||||
const token = servers[0].accessToken
|
||||
|
||||
await commands[0].create({
|
||||
attributes: {
|
||||
displayName: 'my super playlist',
|
||||
privacy: VideoPlaylistPrivacy.PUBLIC,
|
||||
description: 'my super description',
|
||||
thumbnailfile: 'thumbnail.jpg',
|
||||
videoChannelId: servers[0].store.channel.id
|
||||
}
|
||||
})
|
||||
|
||||
{
|
||||
const body = await commands[0].listByAccount({ token, handle: 'root', playlistType: VideoPlaylistType.WATCH_LATER })
|
||||
|
||||
|
@ -136,13 +148,51 @@ describe('Test video playlists', function () {
|
|||
expect(playlist.displayName).to.equal('Watch later')
|
||||
expect(playlist.type.id).to.equal(VideoPlaylistType.WATCH_LATER)
|
||||
expect(playlist.type.label).to.equal('Watch later')
|
||||
expect(playlist.privacy.id).to.equal(VideoPlaylistPrivacy.PRIVATE)
|
||||
}
|
||||
|
||||
{
|
||||
const body = await commands[0].listByAccount({ token, handle: 'root', playlistType: VideoPlaylistType.REGULAR })
|
||||
const bodyList = await commands[0].list({ playlistType: VideoPlaylistType.WATCH_LATER })
|
||||
const bodyChannel = await commands[0].listByChannel({ handle: 'root_channel', playlistType: VideoPlaylistType.WATCH_LATER })
|
||||
|
||||
expect(body.total).to.equal(0)
|
||||
expect(body.data).to.have.lengthOf(0)
|
||||
for (const body of [ bodyList, bodyChannel ]) {
|
||||
expect(body.total).to.equal(0)
|
||||
expect(body.data).to.have.lengthOf(0)
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
const bodyList = await commands[0].list({ playlistType: VideoPlaylistType.REGULAR })
|
||||
const bodyChannel = await commands[0].listByChannel({ handle: 'root_channel', playlistType: VideoPlaylistType.REGULAR })
|
||||
|
||||
let playlist: VideoPlaylist = null
|
||||
for (const body of [ bodyList, bodyChannel ]) {
|
||||
|
||||
expect(body.total).to.equal(1)
|
||||
expect(body.data).to.have.lengthOf(1)
|
||||
|
||||
playlist = body.data[0]
|
||||
expect(playlist.displayName).to.equal('my super playlist')
|
||||
expect(playlist.privacy.id).to.equal(VideoPlaylistPrivacy.PUBLIC)
|
||||
expect(playlist.type.id).to.equal(VideoPlaylistType.REGULAR)
|
||||
}
|
||||
|
||||
await commands[0].update({
|
||||
playlistId: playlist.id,
|
||||
attributes: {
|
||||
privacy: VideoPlaylistPrivacy.PRIVATE
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
{
|
||||
const bodyList = await commands[0].list({ playlistType: VideoPlaylistType.REGULAR })
|
||||
const bodyChannel = await commands[0].listByChannel({ handle: 'root_channel', playlistType: VideoPlaylistType.REGULAR })
|
||||
|
||||
for (const body of [ bodyList, bodyChannel ]) {
|
||||
expect(body.total).to.equal(0)
|
||||
expect(body.data).to.have.lengthOf(0)
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
|
|
|
@ -24,9 +24,10 @@ export class PlaylistsCommand extends AbstractCommand {
|
|||
start?: number
|
||||
count?: number
|
||||
sort?: string
|
||||
playlistType?: VideoPlaylistType
|
||||
}) {
|
||||
const path = '/api/v1/video-playlists'
|
||||
const query = pick(options, [ 'start', 'count', 'sort' ])
|
||||
const query = pick(options, [ 'start', 'count', 'sort', 'playlistType' ])
|
||||
|
||||
return this.getRequestBody<ResultList<VideoPlaylist>>({
|
||||
...options,
|
||||
|
@ -43,9 +44,10 @@ export class PlaylistsCommand extends AbstractCommand {
|
|||
start?: number
|
||||
count?: number
|
||||
sort?: string
|
||||
playlistType?: VideoPlaylistType
|
||||
}) {
|
||||
const path = '/api/v1/video-channels/' + options.handle + '/video-playlists'
|
||||
const query = pick(options, [ 'start', 'count', 'sort' ])
|
||||
const query = pick(options, [ 'start', 'count', 'sort', 'playlistType' ])
|
||||
|
||||
return this.getRequestBody<ResultList<VideoPlaylist>>({
|
||||
...options,
|
||||
|
|
|
@ -3801,6 +3801,34 @@ paths:
|
|||
schema:
|
||||
$ref: '#/components/schemas/VideoListResponse'
|
||||
|
||||
'/api/v1/video-channels/{channelHandle}/video-playlists':
|
||||
get:
|
||||
summary: List playlists of a channel
|
||||
tags:
|
||||
- Video Playlists
|
||||
- Video Channels
|
||||
parameters:
|
||||
- $ref: '#/components/parameters/channelHandle'
|
||||
- $ref: '#/components/parameters/start'
|
||||
- $ref: '#/components/parameters/count'
|
||||
- $ref: '#/components/parameters/sort'
|
||||
- $ref: '#/components/parameters/videoPlaylistType'
|
||||
responses:
|
||||
'200':
|
||||
description: successful operation
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
total:
|
||||
type: integer
|
||||
example: 1
|
||||
data:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/components/schemas/VideoPlaylist'
|
||||
|
||||
'/api/v1/video-channels/{channelHandle}/followers':
|
||||
get:
|
||||
tags:
|
||||
|
@ -4045,6 +4073,7 @@ paths:
|
|||
- $ref: '#/components/parameters/start'
|
||||
- $ref: '#/components/parameters/count'
|
||||
- $ref: '#/components/parameters/sort'
|
||||
- $ref: '#/components/parameters/videoPlaylistType'
|
||||
responses:
|
||||
'200':
|
||||
description: successful operation
|
||||
|
@ -4361,7 +4390,35 @@ paths:
|
|||
format: seconds
|
||||
stopTimestamp:
|
||||
type: integer
|
||||
format: seconds
|
||||
|
||||
'/api/v1/accounts/{name}/video-playlists':
|
||||
get:
|
||||
summary: List playlists of an account
|
||||
tags:
|
||||
- Video Playlists
|
||||
- Accounts
|
||||
parameters:
|
||||
- $ref: '#/components/parameters/name'
|
||||
- $ref: '#/components/parameters/start'
|
||||
- $ref: '#/components/parameters/count'
|
||||
- $ref: '#/components/parameters/sort'
|
||||
- $ref: '#/components/parameters/search'
|
||||
- $ref: '#/components/parameters/videoPlaylistType'
|
||||
responses:
|
||||
'200':
|
||||
description: successful operation
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
type: object
|
||||
properties:
|
||||
total:
|
||||
type: integer
|
||||
example: 1
|
||||
data:
|
||||
type: array
|
||||
items:
|
||||
$ref: '#/components/schemas/VideoPlaylist'
|
||||
|
||||
'/api/v1/accounts/{name}/video-channels':
|
||||
get:
|
||||
|
@ -5920,7 +5977,13 @@ components:
|
|||
description: Ask the server to reinject videoFileToken in URLs in m3u8 playlist
|
||||
schema:
|
||||
type: boolean
|
||||
|
||||
videoPlaylistType:
|
||||
name: playlistType
|
||||
in: query
|
||||
required: false
|
||||
schema:
|
||||
$ref: '#/components/schemas/VideoPlaylistTypeSet'
|
||||
|
||||
securitySchemes:
|
||||
OAuth2:
|
||||
description: |
|
||||
|
|
Loading…
Reference in a new issue