Add ability to filter my imports by target URL
This commit is contained in:
parent
419b520ca4
commit
d511df2890
|
@ -30,6 +30,7 @@ import { AccountVideoRateModel } from '../../../models/account/account-video-rat
|
||||||
import { UserModel } from '../../../models/user/user'
|
import { UserModel } from '../../../models/user/user'
|
||||||
import { VideoModel } from '../../../models/video/video'
|
import { VideoModel } from '../../../models/video/video'
|
||||||
import { VideoImportModel } from '../../../models/video/video-import'
|
import { VideoImportModel } from '../../../models/video/video-import'
|
||||||
|
import { pick } from '@shared/core-utils'
|
||||||
|
|
||||||
const auditLogger = auditLoggerFactory('users')
|
const auditLogger = auditLoggerFactory('users')
|
||||||
|
|
||||||
|
@ -133,12 +134,11 @@ async function getUserVideos (req: express.Request, res: express.Response) {
|
||||||
|
|
||||||
async function getUserVideoImports (req: express.Request, res: express.Response) {
|
async function getUserVideoImports (req: express.Request, res: express.Response) {
|
||||||
const user = res.locals.oauth.token.User
|
const user = res.locals.oauth.token.User
|
||||||
const resultList = await VideoImportModel.listUserVideoImportsForApi(
|
const resultList = await VideoImportModel.listUserVideoImportsForApi({
|
||||||
user.id,
|
userId: user.id,
|
||||||
req.query.start as number,
|
|
||||||
req.query.count as number,
|
...pick(req.query, [ 'targetUrl', 'start', 'count', 'sort' ])
|
||||||
req.query.sort
|
})
|
||||||
)
|
|
||||||
|
|
||||||
return res.json(getFormattedObjects(resultList.data, resultList.total))
|
return res.json(getFormattedObjects(resultList.data, resultList.total))
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ import { generateVideoMiniature } from '../../thumbnail'
|
||||||
async function processVideoImport (job: Job) {
|
async function processVideoImport (job: Job) {
|
||||||
const payload = job.data as VideoImportPayload
|
const payload = job.data as VideoImportPayload
|
||||||
|
|
||||||
const videoImport = await getVideoImportOrDie(payload.videoImportId)
|
const videoImport = await getVideoImportOrDie(payload)
|
||||||
if (videoImport.state === VideoImportState.CANCELLED) {
|
if (videoImport.state === VideoImportState.CANCELLED) {
|
||||||
logger.info('Do not process import since it has been cancelled', { payload })
|
logger.info('Do not process import since it has been cancelled', { payload })
|
||||||
return
|
return
|
||||||
|
@ -89,10 +89,10 @@ async function processYoutubeDLImport (job: Job, videoImport: MVideoImportDefaul
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getVideoImportOrDie (videoImportId: number) {
|
async function getVideoImportOrDie (payload: VideoImportPayload) {
|
||||||
const videoImport = await VideoImportModel.loadAndPopulateVideo(videoImportId)
|
const videoImport = await VideoImportModel.loadAndPopulateVideo(payload.videoImportId)
|
||||||
if (!videoImport || !videoImport.Video) {
|
if (!videoImport || !videoImport.Video) {
|
||||||
throw new Error('Cannot import video %s: the video import or video linked to this import does not exist anymore.')
|
throw new Error(`Cannot import video ${payload.videoImportId}: the video import or video linked to this import does not exist anymore.`)
|
||||||
}
|
}
|
||||||
|
|
||||||
return videoImport
|
return videoImport
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { WhereOptions } from 'sequelize'
|
||||||
import {
|
import {
|
||||||
AfterUpdate,
|
AfterUpdate,
|
||||||
AllowNull,
|
AllowNull,
|
||||||
|
@ -125,7 +126,20 @@ export class VideoImportModel extends Model<Partial<AttributesOnly<VideoImportMo
|
||||||
return VideoImportModel.findByPk(id)
|
return VideoImportModel.findByPk(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
static listUserVideoImportsForApi (userId: number, start: number, count: number, sort: string) {
|
static listUserVideoImportsForApi (options: {
|
||||||
|
userId: number
|
||||||
|
start: number
|
||||||
|
count: number
|
||||||
|
sort: string
|
||||||
|
|
||||||
|
targetUrl?: string
|
||||||
|
}) {
|
||||||
|
const { userId, start, count, sort, targetUrl } = options
|
||||||
|
|
||||||
|
const where: WhereOptions = { userId }
|
||||||
|
|
||||||
|
if (targetUrl) where['targetUrl'] = targetUrl
|
||||||
|
|
||||||
const query = {
|
const query = {
|
||||||
distinct: true,
|
distinct: true,
|
||||||
include: [
|
include: [
|
||||||
|
@ -138,9 +152,7 @@ export class VideoImportModel extends Model<Partial<AttributesOnly<VideoImportMo
|
||||||
offset: start,
|
offset: start,
|
||||||
limit: count,
|
limit: count,
|
||||||
order: getSort(sort),
|
order: getSort(sort),
|
||||||
where: {
|
where
|
||||||
userId
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return VideoImportModel.findAndCountAll<MVideoImportDefault>(query)
|
return VideoImportModel.findAndCountAll<MVideoImportDefault>(query)
|
||||||
|
|
|
@ -219,6 +219,14 @@ describe('Test video imports', function () {
|
||||||
expect(videoImports[0].video.name).to.equal('你好 世界 720p.mp4')
|
expect(videoImports[0].video.name).to.equal('你好 世界 720p.mp4')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('Should filter my imports on target URL', async function () {
|
||||||
|
const { total, data: videoImports } = await servers[0].imports.getMyVideoImports({ targetUrl: FIXTURE_URLS.youtube })
|
||||||
|
expect(total).to.equal(1)
|
||||||
|
expect(videoImports).to.have.lengthOf(1)
|
||||||
|
|
||||||
|
expect(videoImports[0].targetUrl).to.equal(FIXTURE_URLS.youtube)
|
||||||
|
})
|
||||||
|
|
||||||
it('Should have the video listed on the two instances', async function () {
|
it('Should have the video listed on the two instances', async function () {
|
||||||
this.timeout(120_000)
|
this.timeout(120_000)
|
||||||
|
|
||||||
|
@ -459,6 +467,10 @@ describe('Test video imports', function () {
|
||||||
const { data } = await server.imports.getMyVideoImports()
|
const { data } = await server.imports.getMyVideoImports()
|
||||||
expect(data).to.have.lengthOf(0)
|
expect(data).to.have.lengthOf(0)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
after(async function () {
|
||||||
|
await cleanupTests([ server ])
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('Auto update', function () {
|
describe('Auto update', function () {
|
||||||
|
|
|
@ -136,9 +136,26 @@ describe('Test CLI wrapper', function () {
|
||||||
expect(videoDetails.channel.name).to.equal('user_channel')
|
expect(videoDetails.channel.name).to.equal('user_channel')
|
||||||
expect(videoDetails.support).to.equal('super support text')
|
expect(videoDetails.support).to.equal('super support text')
|
||||||
expect(videoDetails.nsfw).to.be.false
|
expect(videoDetails.nsfw).to.be.false
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Should not import again the same video', async function () {
|
||||||
|
if (areHttpImportTestsDisabled()) return
|
||||||
|
|
||||||
|
this.timeout(60000)
|
||||||
|
|
||||||
|
const params = `--target-url ${FIXTURE_URLS.youtube} --channel-name user_channel`
|
||||||
|
await cliCommand.execWithEnv(`${cmd} import ${params}`)
|
||||||
|
|
||||||
|
await waitJobs([ server ])
|
||||||
|
|
||||||
|
const { total, data } = await server.videos.list()
|
||||||
|
expect(total).to.equal(2)
|
||||||
|
|
||||||
|
const videos = data.filter(v => v.name === 'small video - youtube')
|
||||||
|
expect(videos).to.have.lengthOf(1)
|
||||||
|
|
||||||
// So we can reimport it
|
// So we can reimport it
|
||||||
await server.videos.remove({ token: userAccessToken, id: video.id })
|
await server.videos.remove({ token: userAccessToken, id: videos[0].id })
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should import and override some imported attributes', async function () {
|
it('Should import and override some imported attributes', async function () {
|
||||||
|
|
|
@ -56,18 +56,16 @@ export class ImportsCommand extends AbstractCommand {
|
||||||
|
|
||||||
getMyVideoImports (options: OverrideCommandOptions & {
|
getMyVideoImports (options: OverrideCommandOptions & {
|
||||||
sort?: string
|
sort?: string
|
||||||
|
targetUrl?: string
|
||||||
} = {}) {
|
} = {}) {
|
||||||
const { sort } = options
|
const { sort, targetUrl } = options
|
||||||
const path = '/api/v1/users/me/videos/imports'
|
const path = '/api/v1/users/me/videos/imports'
|
||||||
|
|
||||||
const query = {}
|
|
||||||
if (sort) query['sort'] = sort
|
|
||||||
|
|
||||||
return this.getRequestBody<ResultList<VideoImport>>({
|
return this.getRequestBody<ResultList<VideoImport>>({
|
||||||
...options,
|
...options,
|
||||||
|
|
||||||
path,
|
path,
|
||||||
query: { sort },
|
query: { sort, targetUrl },
|
||||||
implicitToken: true,
|
implicitToken: true,
|
||||||
defaultExpectedStatus: HttpStatusCode.OK_200
|
defaultExpectedStatus: HttpStatusCode.OK_200
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue