aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md2
-rw-r--r--server/controllers/api/accounts.ts168
-rw-r--r--server/controllers/api/video-channel.ts173
-rw-r--r--server/middlewares/validators/video-channels.ts25
-rw-r--r--server/tests/api/check-params/video-channels.ts58
-rw-r--r--server/tests/api/videos/video-channels.ts10
-rw-r--r--server/tests/api/videos/video-nsfw.ts4
-rw-r--r--server/tests/utils/videos/video-channels.ts14
-rw-r--r--server/tests/utils/videos/videos.ts3
-rw-r--r--support/doc/api/html/index.html901
-rw-r--r--support/doc/api/openapi.yaml69
11 files changed, 588 insertions, 839 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ac3f61735..4a327737d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,7 +6,7 @@
6 6
7 * Hide by default NSFW videos. Update the `instance.default_nsfw_policy` configuration to `blur` to keep the old behaviour 7 * Hide by default NSFW videos. Update the `instance.default_nsfw_policy` configuration to `blur` to keep the old behaviour
8 * Move video channels routes: 8 * Move video channels routes:
9 * `/videos/channels` routes to `/accounts/{accountId}/video-channels` 9 * `/videos/channels` routes to `/video-channels`
10 * `/videos/accounts/{accountId}/channels` route to `/accounts/{accountId}/video-channels` 10 * `/videos/accounts/{accountId}/channels` route to `/accounts/{accountId}/video-channels`
11 * PeerTube now listen on 127.0.0.1 by default 11 * PeerTube now listen on 127.0.0.1 by default
12 * Use ISO 639 for language (*en*, *es*, *fr*...) 12 * Use ISO 639 for language (*en*, *es*, *fr*...)
diff --git a/server/controllers/api/accounts.ts b/server/controllers/api/accounts.ts
index 85987c912..ccae0436b 100644
--- a/server/controllers/api/accounts.ts
+++ b/server/controllers/api/accounts.ts
@@ -1,30 +1,18 @@
1import * as express from 'express' 1import * as express from 'express'
2import { getFormattedObjects, resetSequelizeInstance } from '../../helpers/utils' 2import { getFormattedObjects } from '../../helpers/utils'
3import { 3import {
4 asyncMiddleware, 4 asyncMiddleware,
5 authenticate,
6 listVideoAccountChannelsValidator, 5 listVideoAccountChannelsValidator,
7 optionalAuthenticate, 6 optionalAuthenticate,
8 paginationValidator, 7 paginationValidator,
9 setDefaultPagination, 8 setDefaultPagination,
10 setDefaultSort, 9 setDefaultSort
11 videoChannelsAddValidator,
12 videoChannelsGetValidator,
13 videoChannelsRemoveValidator,
14 videoChannelsUpdateValidator
15} from '../../middlewares' 10} from '../../middlewares'
16import { accountsGetValidator, accountsSortValidator, videosSortValidator } from '../../middlewares/validators' 11import { accountsGetValidator, accountsSortValidator, videosSortValidator } from '../../middlewares/validators'
17import { AccountModel } from '../../models/account/account' 12import { AccountModel } from '../../models/account/account'
18import { VideoModel } from '../../models/video/video' 13import { VideoModel } from '../../models/video/video'
19import { isNSFWHidden } from '../../helpers/express-utils' 14import { isNSFWHidden } from '../../helpers/express-utils'
20import { VideoChannelModel } from '../../models/video/video-channel' 15import { VideoChannelModel } from '../../models/video/video-channel'
21import { VideoChannelCreate, VideoChannelUpdate } from '../../../shared'
22import { sendUpdateActor } from '../../lib/activitypub/send'
23import { createVideoChannel } from '../../lib/video-channel'
24import { setAsyncActorKeys } from '../../lib/activitypub'
25import { sequelizeTypescript } from '../../initializers'
26import { logger } from '../../helpers/logger'
27import { retryTransactionWrapper } from '../../helpers/database-utils'
28 16
29const accountsRouter = express.Router() 17const accountsRouter = express.Router()
30 18
@@ -56,39 +44,6 @@ accountsRouter.get('/:accountId/video-channels',
56 asyncMiddleware(listVideoAccountChannels) 44 asyncMiddleware(listVideoAccountChannels)
57) 45)
58 46
59accountsRouter.post('/:accountId/video-channels',
60 authenticate,
61 videoChannelsAddValidator,
62 asyncMiddleware(addVideoChannelRetryWrapper)
63)
64
65accountsRouter.put('/:accountId/video-channels/:id',
66 authenticate,
67 asyncMiddleware(videoChannelsUpdateValidator),
68 updateVideoChannelRetryWrapper
69)
70
71accountsRouter.delete('/:accountId/video-channels/:id',
72 authenticate,
73 asyncMiddleware(videoChannelsRemoveValidator),
74 asyncMiddleware(removeVideoChannelRetryWrapper)
75)
76
77accountsRouter.get('/:accountId/video-channels/:id',
78 asyncMiddleware(videoChannelsGetValidator),
79 asyncMiddleware(getVideoChannel)
80)
81
82accountsRouter.get('/:accountId/video-channels/:id/videos',
83 asyncMiddleware(videoChannelsGetValidator),
84 paginationValidator,
85 videosSortValidator,
86 setDefaultSort,
87 setDefaultPagination,
88 optionalAuthenticate,
89 asyncMiddleware(listVideoChannelVideos)
90)
91
92// --------------------------------------------------------------------------- 47// ---------------------------------------------------------------------------
93 48
94export { 49export {
@@ -115,125 +70,6 @@ async function listVideoAccountChannels (req: express.Request, res: express.Resp
115 return res.json(getFormattedObjects(resultList.data, resultList.total)) 70 return res.json(getFormattedObjects(resultList.data, resultList.total))
116} 71}
117 72
118// Wrapper to video channel add that retry the async function if there is a database error
119// We need this because we run the transaction in SERIALIZABLE isolation that can fail
120async function addVideoChannelRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) {
121 const options = {
122 arguments: [ req, res ],
123 errorMessage: 'Cannot insert the video video channel with many retries.'
124 }
125
126 const videoChannel = await retryTransactionWrapper(addVideoChannel, options)
127 return res.json({
128 videoChannel: {
129 id: videoChannel.id,
130 uuid: videoChannel.Actor.uuid
131 }
132 }).end()
133}
134
135async function addVideoChannel (req: express.Request, res: express.Response) {
136 const videoChannelInfo: VideoChannelCreate = req.body
137 const account: AccountModel = res.locals.oauth.token.User.Account
138
139 const videoChannelCreated: VideoChannelModel = await sequelizeTypescript.transaction(async t => {
140 return createVideoChannel(videoChannelInfo, account, t)
141 })
142
143 setAsyncActorKeys(videoChannelCreated.Actor)
144 .catch(err => logger.error('Cannot set async actor keys for account %s.', videoChannelCreated.Actor.uuid, { err }))
145
146 logger.info('Video channel with uuid %s created.', videoChannelCreated.Actor.uuid)
147
148 return videoChannelCreated
149}
150
151async function updateVideoChannelRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) {
152 const options = {
153 arguments: [ req, res ],
154 errorMessage: 'Cannot update the video with many retries.'
155 }
156
157 await retryTransactionWrapper(updateVideoChannel, options)
158
159 return res.type('json').status(204).end()
160}
161
162async function updateVideoChannel (req: express.Request, res: express.Response) {
163 const videoChannelInstance = res.locals.videoChannel as VideoChannelModel
164 const videoChannelFieldsSave = videoChannelInstance.toJSON()
165 const videoChannelInfoToUpdate = req.body as VideoChannelUpdate
166
167 try {
168 await sequelizeTypescript.transaction(async t => {
169 const sequelizeOptions = {
170 transaction: t
171 }
172
173 if (videoChannelInfoToUpdate.name !== undefined) videoChannelInstance.set('name', videoChannelInfoToUpdate.name)
174 if (videoChannelInfoToUpdate.description !== undefined) videoChannelInstance.set('description', videoChannelInfoToUpdate.description)
175 if (videoChannelInfoToUpdate.support !== undefined) videoChannelInstance.set('support', videoChannelInfoToUpdate.support)
176
177 const videoChannelInstanceUpdated = await videoChannelInstance.save(sequelizeOptions)
178 await sendUpdateActor(videoChannelInstanceUpdated, t)
179 })
180
181 logger.info('Video channel with name %s and uuid %s updated.', videoChannelInstance.name, videoChannelInstance.Actor.uuid)
182 } catch (err) {
183 logger.debug('Cannot update the video channel.', { err })
184
185 // Force fields we want to update
186 // If the transaction is retried, sequelize will think the object has not changed
187 // So it will skip the SQL request, even if the last one was ROLLBACKed!
188 resetSequelizeInstance(videoChannelInstance, videoChannelFieldsSave)
189
190 throw err
191 }
192}
193
194async function removeVideoChannelRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) {
195 const options = {
196 arguments: [ req, res ],
197 errorMessage: 'Cannot remove the video channel with many retries.'
198 }
199
200 await retryTransactionWrapper(removeVideoChannel, options)
201
202 return res.type('json').status(204).end()
203}
204
205async function removeVideoChannel (req: express.Request, res: express.Response) {
206 const videoChannelInstance: VideoChannelModel = res.locals.videoChannel
207
208 return sequelizeTypescript.transaction(async t => {
209 await videoChannelInstance.destroy({ transaction: t })
210
211 logger.info('Video channel with name %s and uuid %s deleted.', videoChannelInstance.name, videoChannelInstance.Actor.uuid)
212 })
213
214}
215
216async function getVideoChannel (req: express.Request, res: express.Response, next: express.NextFunction) {
217 const videoChannelWithVideos = await VideoChannelModel.loadAndPopulateAccountAndVideos(res.locals.videoChannel.id)
218
219 return res.json(videoChannelWithVideos.toFormattedJSON())
220}
221
222async function listVideoChannelVideos (req: express.Request, res: express.Response, next: express.NextFunction) {
223 const videoChannelInstance: VideoChannelModel = res.locals.videoChannel
224
225 const resultList = await VideoModel.listForApi({
226 start: req.query.start,
227 count: req.query.count,
228 sort: req.query.sort,
229 hideNSFW: isNSFWHidden(res),
230 withFiles: false,
231 videoChannelId: videoChannelInstance.id
232 })
233
234 return res.json(getFormattedObjects(resultList.data, resultList.total))
235}
236
237async function listAccountVideos (req: express.Request, res: express.Response, next: express.NextFunction) { 73async function listAccountVideos (req: express.Request, res: express.Response, next: express.NextFunction) {
238 const account: AccountModel = res.locals.account 74 const account: AccountModel = res.locals.account
239 75
diff --git a/server/controllers/api/video-channel.ts b/server/controllers/api/video-channel.ts
index d57273747..6241aaa5c 100644
--- a/server/controllers/api/video-channel.ts
+++ b/server/controllers/api/video-channel.ts
@@ -1,13 +1,30 @@
1import * as express from 'express' 1import * as express from 'express'
2import { getFormattedObjects } from '../../helpers/utils' 2import { getFormattedObjects, resetSequelizeInstance } from '../../helpers/utils'
3import { 3import {
4 asyncMiddleware, 4 asyncMiddleware,
5 authenticate,
6 optionalAuthenticate,
5 paginationValidator, 7 paginationValidator,
6 setDefaultPagination, 8 setDefaultPagination,
7 setDefaultSort, 9 setDefaultSort,
8 videoChannelsSortValidator 10 videoChannelsAddValidator,
11 videoChannelsGetValidator,
12 videoChannelsRemoveValidator,
13 videoChannelsSortValidator,
14 videoChannelsUpdateValidator
9} from '../../middlewares' 15} from '../../middlewares'
10import { VideoChannelModel } from '../../models/video/video-channel' 16import { VideoChannelModel } from '../../models/video/video-channel'
17import { videosSortValidator } from '../../middlewares/validators'
18import { sendUpdateActor } from '../../lib/activitypub/send'
19import { VideoChannelCreate, VideoChannelUpdate } from '../../../shared'
20import { createVideoChannel } from '../../lib/video-channel'
21import { isNSFWHidden } from '../../helpers/express-utils'
22import { setAsyncActorKeys } from '../../lib/activitypub'
23import { retryTransactionWrapper } from '../../helpers/database-utils'
24import { AccountModel } from '../../models/account/account'
25import { sequelizeTypescript } from '../../initializers'
26import { logger } from '../../helpers/logger'
27import { VideoModel } from '../../models/video/video'
11 28
12const videoChannelRouter = express.Router() 29const videoChannelRouter = express.Router()
13 30
@@ -19,6 +36,39 @@ videoChannelRouter.get('/',
19 asyncMiddleware(listVideoChannels) 36 asyncMiddleware(listVideoChannels)
20) 37)
21 38
39videoChannelRouter.post('/',
40 authenticate,
41 videoChannelsAddValidator,
42 asyncMiddleware(addVideoChannelRetryWrapper)
43)
44
45videoChannelRouter.put('/:id',
46 authenticate,
47 asyncMiddleware(videoChannelsUpdateValidator),
48 updateVideoChannelRetryWrapper
49)
50
51videoChannelRouter.delete('/:id',
52 authenticate,
53 asyncMiddleware(videoChannelsRemoveValidator),
54 asyncMiddleware(removeVideoChannelRetryWrapper)
55)
56
57videoChannelRouter.get('/:id',
58 asyncMiddleware(videoChannelsGetValidator),
59 asyncMiddleware(getVideoChannel)
60)
61
62videoChannelRouter.get('/:id/videos',
63 asyncMiddleware(videoChannelsGetValidator),
64 paginationValidator,
65 videosSortValidator,
66 setDefaultSort,
67 setDefaultPagination,
68 optionalAuthenticate,
69 asyncMiddleware(listVideoChannelVideos)
70)
71
22// --------------------------------------------------------------------------- 72// ---------------------------------------------------------------------------
23 73
24export { 74export {
@@ -32,3 +82,122 @@ async function listVideoChannels (req: express.Request, res: express.Response, n
32 82
33 return res.json(getFormattedObjects(resultList.data, resultList.total)) 83 return res.json(getFormattedObjects(resultList.data, resultList.total))
34} 84}
85
86// Wrapper to video channel add that retry the async function if there is a database error
87// We need this because we run the transaction in SERIALIZABLE isolation that can fail
88async function addVideoChannelRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) {
89 const options = {
90 arguments: [ req, res ],
91 errorMessage: 'Cannot insert the video video channel with many retries.'
92 }
93
94 const videoChannel = await retryTransactionWrapper(addVideoChannel, options)
95 return res.json({
96 videoChannel: {
97 id: videoChannel.id,
98 uuid: videoChannel.Actor.uuid
99 }
100 }).end()
101}
102
103async function addVideoChannel (req: express.Request, res: express.Response) {
104 const videoChannelInfo: VideoChannelCreate = req.body
105 const account: AccountModel = res.locals.oauth.token.User.Account
106
107 const videoChannelCreated: VideoChannelModel = await sequelizeTypescript.transaction(async t => {
108 return createVideoChannel(videoChannelInfo, account, t)
109 })
110
111 setAsyncActorKeys(videoChannelCreated.Actor)
112 .catch(err => logger.error('Cannot set async actor keys for account %s.', videoChannelCreated.Actor.uuid, { err }))
113
114 logger.info('Video channel with uuid %s created.', videoChannelCreated.Actor.uuid)
115
116 return videoChannelCreated
117}
118
119async function updateVideoChannelRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) {
120 const options = {
121 arguments: [ req, res ],
122 errorMessage: 'Cannot update the video with many retries.'
123 }
124
125 await retryTransactionWrapper(updateVideoChannel, options)
126
127 return res.type('json').status(204).end()
128}
129
130async function updateVideoChannel (req: express.Request, res: express.Response) {
131 const videoChannelInstance = res.locals.videoChannel as VideoChannelModel
132 const videoChannelFieldsSave = videoChannelInstance.toJSON()
133 const videoChannelInfoToUpdate = req.body as VideoChannelUpdate
134
135 try {
136 await sequelizeTypescript.transaction(async t => {
137 const sequelizeOptions = {
138 transaction: t
139 }
140
141 if (videoChannelInfoToUpdate.name !== undefined) videoChannelInstance.set('name', videoChannelInfoToUpdate.name)
142 if (videoChannelInfoToUpdate.description !== undefined) videoChannelInstance.set('description', videoChannelInfoToUpdate.description)
143 if (videoChannelInfoToUpdate.support !== undefined) videoChannelInstance.set('support', videoChannelInfoToUpdate.support)
144
145 const videoChannelInstanceUpdated = await videoChannelInstance.save(sequelizeOptions)
146 await sendUpdateActor(videoChannelInstanceUpdated, t)
147 })
148
149 logger.info('Video channel with name %s and uuid %s updated.', videoChannelInstance.name, videoChannelInstance.Actor.uuid)
150 } catch (err) {
151 logger.debug('Cannot update the video channel.', { err })
152
153 // Force fields we want to update
154 // If the transaction is retried, sequelize will think the object has not changed
155 // So it will skip the SQL request, even if the last one was ROLLBACKed!
156 resetSequelizeInstance(videoChannelInstance, videoChannelFieldsSave)
157
158 throw err
159 }
160}
161
162async function removeVideoChannelRetryWrapper (req: express.Request, res: express.Response, next: express.NextFunction) {
163 const options = {
164 arguments: [ req, res ],
165 errorMessage: 'Cannot remove the video channel with many retries.'
166 }
167
168 await retryTransactionWrapper(removeVideoChannel, options)
169
170 return res.type('json').status(204).end()
171}
172
173async function removeVideoChannel (req: express.Request, res: express.Response) {
174 const videoChannelInstance: VideoChannelModel = res.locals.videoChannel
175
176 return sequelizeTypescript.transaction(async t => {
177 await videoChannelInstance.destroy({ transaction: t })
178
179 logger.info('Video channel with name %s and uuid %s deleted.', videoChannelInstance.name, videoChannelInstance.Actor.uuid)
180 })
181
182}
183
184async function getVideoChannel (req: express.Request, res: express.Response, next: express.NextFunction) {
185 const videoChannelWithVideos = await VideoChannelModel.loadAndPopulateAccountAndVideos(res.locals.videoChannel.id)
186
187 return res.json(videoChannelWithVideos.toFormattedJSON())
188}
189
190async function listVideoChannelVideos (req: express.Request, res: express.Response, next: express.NextFunction) {
191 const videoChannelInstance: VideoChannelModel = res.locals.videoChannel
192
193 const resultList = await VideoModel.listForApi({
194 start: req.query.start,
195 count: req.query.count,
196 sort: req.query.sort,
197 hideNSFW: isNSFWHidden(res),
198 withFiles: false,
199 videoChannelId: videoChannelInstance.id
200 })
201
202 return res.json(getFormattedObjects(resultList.data, resultList.total))
203}
diff --git a/server/middlewares/validators/video-channels.ts b/server/middlewares/validators/video-channels.ts
index 9e6f459cf..a70f196df 100644
--- a/server/middlewares/validators/video-channels.ts
+++ b/server/middlewares/validators/video-channels.ts
@@ -27,7 +27,6 @@ const listVideoAccountChannelsValidator = [
27] 27]
28 28
29const videoChannelsAddValidator = [ 29const videoChannelsAddValidator = [
30 param('accountId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid account id'),
31 body('name').custom(isVideoChannelNameValid).withMessage('Should have a valid name'), 30 body('name').custom(isVideoChannelNameValid).withMessage('Should have a valid name'),
32 body('description').optional().custom(isVideoChannelDescriptionValid).withMessage('Should have a valid description'), 31 body('description').optional().custom(isVideoChannelDescriptionValid).withMessage('Should have a valid description'),
33 body('support').optional().custom(isVideoChannelSupportValid).withMessage('Should have a valid support text'), 32 body('support').optional().custom(isVideoChannelSupportValid).withMessage('Should have a valid support text'),
@@ -43,7 +42,6 @@ const videoChannelsAddValidator = [
43 42
44const videoChannelsUpdateValidator = [ 43const videoChannelsUpdateValidator = [
45 param('id').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'), 44 param('id').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'),
46 param('accountId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid account id'),
47 body('name').optional().custom(isVideoChannelNameValid).withMessage('Should have a valid name'), 45 body('name').optional().custom(isVideoChannelNameValid).withMessage('Should have a valid name'),
48 body('description').optional().custom(isVideoChannelDescriptionValid).withMessage('Should have a valid description'), 46 body('description').optional().custom(isVideoChannelDescriptionValid).withMessage('Should have a valid description'),
49 body('support').optional().custom(isVideoChannelSupportValid).withMessage('Should have a valid support text'), 47 body('support').optional().custom(isVideoChannelSupportValid).withMessage('Should have a valid support text'),
@@ -52,9 +50,7 @@ const videoChannelsUpdateValidator = [
52 logger.debug('Checking videoChannelsUpdate parameters', { parameters: req.body }) 50 logger.debug('Checking videoChannelsUpdate parameters', { parameters: req.body })
53 51
54 if (areValidationErrors(req, res)) return 52 if (areValidationErrors(req, res)) return
55 if (!await isAccountIdExist(req.params.accountId, res)) return
56 if (!await isVideoChannelExist(req.params.id, res)) return 53 if (!await isVideoChannelExist(req.params.id, res)) return
57 if (!checkAccountOwnsVideoChannel(res.locals.account, res.locals.videoChannel, res)) return
58 54
59 // We need to make additional checks 55 // We need to make additional checks
60 if (res.locals.videoChannel.Actor.isOwned() === false) { 56 if (res.locals.videoChannel.Actor.isOwned() === false) {
@@ -75,17 +71,13 @@ const videoChannelsUpdateValidator = [
75 71
76const videoChannelsRemoveValidator = [ 72const videoChannelsRemoveValidator = [
77 param('id').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'), 73 param('id').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'),
78 param('accountId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid account id'),
79 74
80 async (req: express.Request, res: express.Response, next: express.NextFunction) => { 75 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
81 logger.debug('Checking videoChannelsRemove parameters', { parameters: req.params }) 76 logger.debug('Checking videoChannelsRemove parameters', { parameters: req.params })
82 77
83 if (areValidationErrors(req, res)) return 78 if (areValidationErrors(req, res)) return
84 if (!await isAccountIdExist(req.params.accountId, res)) return
85 if (!await isVideoChannelExist(req.params.id, res)) return 79 if (!await isVideoChannelExist(req.params.id, res)) return
86 80
87 if (!checkAccountOwnsVideoChannel(res.locals.account, res.locals.videoChannel, res)) return
88 // Check if the user who did the request is able to delete the video
89 if (!checkUserCanDeleteVideoChannel(res.locals.oauth.token.User, res.locals.videoChannel, res)) return 81 if (!checkUserCanDeleteVideoChannel(res.locals.oauth.token.User, res.locals.videoChannel, res)) return
90 if (!await checkVideoChannelIsNotTheLastOne(res)) return 82 if (!await checkVideoChannelIsNotTheLastOne(res)) return
91 83
@@ -95,19 +87,14 @@ const videoChannelsRemoveValidator = [
95 87
96const videoChannelsGetValidator = [ 88const videoChannelsGetValidator = [
97 param('id').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'), 89 param('id').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid id'),
98 param('accountId').optional().custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid account id'),
99 90
100 async (req: express.Request, res: express.Response, next: express.NextFunction) => { 91 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
101 logger.debug('Checking videoChannelsGet parameters', { parameters: req.params }) 92 logger.debug('Checking videoChannelsGet parameters', { parameters: req.params })
102 93
103 if (areValidationErrors(req, res)) return 94 if (areValidationErrors(req, res)) return
104 95
105 // On some routes, accountId is optional (for example in the ActivityPub route)
106 if (req.params.accountId && !await isAccountIdExist(req.params.accountId, res)) return
107 if (!await isVideoChannelExist(req.params.id, res)) return 96 if (!await isVideoChannelExist(req.params.id, res)) return
108 97
109 if (res.locals.account && !checkAccountOwnsVideoChannel(res.locals.account, res.locals.videoChannel, res)) return
110
111 return next() 98 return next()
112 } 99 }
113] 100]
@@ -160,15 +147,3 @@ async function checkVideoChannelIsNotTheLastOne (res: express.Response) {
160 147
161 return true 148 return true
162} 149}
163
164function checkAccountOwnsVideoChannel (account: AccountModel, videoChannel: VideoChannelModel, res: express.Response) {
165 if (videoChannel.Account.id !== account.id) {
166 res.status(400)
167 .json({ error: 'This account does not own this video channel' })
168 .end()
169
170 return false
171 }
172
173 return true
174}
diff --git a/server/tests/api/check-params/video-channels.ts b/server/tests/api/check-params/video-channels.ts
index 25b2dc9b9..7cda879ed 100644
--- a/server/tests/api/check-params/video-channels.ts
+++ b/server/tests/api/check-params/video-channels.ts
@@ -27,10 +27,8 @@ const expect = chai.expect
27 27
28describe('Test videos API validator', function () { 28describe('Test videos API validator', function () {
29 const videoChannelPath = '/api/v1/video-channels' 29 const videoChannelPath = '/api/v1/video-channels'
30 const accountPath = '/api/v1/accounts/'
31 let server: ServerInfo 30 let server: ServerInfo
32 let accessTokenUser: string 31 let accessTokenUser: string
33 let accountUUID: string
34 let videoChannelUUID: string 32 let videoChannelUUID: string
35 33
36 // --------------------------------------------------------------- 34 // ---------------------------------------------------------------
@@ -57,7 +55,6 @@ describe('Test videos API validator', function () {
57 { 55 {
58 const res = await getMyUserInformation(server.url, server.accessToken) 56 const res = await getMyUserInformation(server.url, server.accessToken)
59 const user: User = res.body 57 const user: User = res.body
60 accountUUID = user.account.uuid
61 videoChannelUUID = user.videoChannels[0].uuid 58 videoChannelUUID = user.videoChannels[0].uuid
62 } 59 }
63 }) 60 })
@@ -92,45 +89,46 @@ describe('Test videos API validator', function () {
92 description: 'super description', 89 description: 'super description',
93 support: 'super support text' 90 support: 'super support text'
94 } 91 }
95 let path: string
96
97 before(async function () {
98 path = accountPath + accountUUID + '/video-channels'
99 })
100 92
101 it('Should fail with a non authenticated user', async function () { 93 it('Should fail with a non authenticated user', async function () {
102 await makePostBodyRequest({ url: server.url, path, token: 'none', fields: baseCorrectParams, statusCodeExpected: 401 }) 94 await makePostBodyRequest({
95 url: server.url,
96 path: videoChannelPath,
97 token: 'none',
98 fields: baseCorrectParams,
99 statusCodeExpected: 401
100 })
103 }) 101 })
104 102
105 it('Should fail with nothing', async function () { 103 it('Should fail with nothing', async function () {
106 const fields = {} 104 const fields = {}
107 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 105 await makePostBodyRequest({ url: server.url, path: videoChannelPath, token: server.accessToken, fields })
108 }) 106 })
109 107
110 it('Should fail without name', async function () { 108 it('Should fail without name', async function () {
111 const fields = omit(baseCorrectParams, 'name') 109 const fields = omit(baseCorrectParams, 'name')
112 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 110 await makePostBodyRequest({ url: server.url, path: videoChannelPath, token: server.accessToken, fields })
113 }) 111 })
114 112
115 it('Should fail with a long name', async function () { 113 it('Should fail with a long name', async function () {
116 const fields = immutableAssign(baseCorrectParams, { name: 'super'.repeat(25) }) 114 const fields = immutableAssign(baseCorrectParams, { name: 'super'.repeat(25) })
117 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 115 await makePostBodyRequest({ url: server.url, path: videoChannelPath, token: server.accessToken, fields })
118 }) 116 })
119 117
120 it('Should fail with a long description', async function () { 118 it('Should fail with a long description', async function () {
121 const fields = immutableAssign(baseCorrectParams, { description: 'super'.repeat(60) }) 119 const fields = immutableAssign(baseCorrectParams, { description: 'super'.repeat(60) })
122 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 120 await makePostBodyRequest({ url: server.url, path: videoChannelPath, token: server.accessToken, fields })
123 }) 121 })
124 122
125 it('Should fail with a long support text', async function () { 123 it('Should fail with a long support text', async function () {
126 const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(70) }) 124 const fields = immutableAssign(baseCorrectParams, { support: 'super'.repeat(70) })
127 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 125 await makePostBodyRequest({ url: server.url, path: videoChannelPath, token: server.accessToken, fields })
128 }) 126 })
129 127
130 it('Should succeed with the correct parameters', async function () { 128 it('Should succeed with the correct parameters', async function () {
131 await makePostBodyRequest({ 129 await makePostBodyRequest({
132 url: server.url, 130 url: server.url,
133 path, 131 path: videoChannelPath,
134 token: server.accessToken, 132 token: server.accessToken,
135 fields: baseCorrectParams, 133 fields: baseCorrectParams,
136 statusCodeExpected: 200 134 statusCodeExpected: 200
@@ -146,7 +144,7 @@ describe('Test videos API validator', function () {
146 let path: string 144 let path: string
147 145
148 before(async function () { 146 before(async function () {
149 path = accountPath + accountUUID + '/video-channels/' + videoChannelUUID 147 path = videoChannelPath + '/' + videoChannelUUID
150 }) 148 })
151 149
152 it('Should fail with a non authenticated user', async function () { 150 it('Should fail with a non authenticated user', async function () {
@@ -196,16 +194,10 @@ describe('Test videos API validator', function () {
196 }) 194 })
197 195
198 describe('When getting a video channel', function () { 196 describe('When getting a video channel', function () {
199 let basePath: string
200
201 before(async function () {
202 basePath = accountPath + accountUUID + '/video-channels'
203 })
204
205 it('Should return the list of the video channels with nothing', async function () { 197 it('Should return the list of the video channels with nothing', async function () {
206 const res = await makeGetRequest({ 198 const res = await makeGetRequest({
207 url: server.url, 199 url: server.url,
208 path: basePath, 200 path: videoChannelPath,
209 statusCodeExpected: 200 201 statusCodeExpected: 200
210 }) 202 })
211 203
@@ -215,7 +207,7 @@ describe('Test videos API validator', function () {
215 it('Should fail without a correct uuid', async function () { 207 it('Should fail without a correct uuid', async function () {
216 await makeGetRequest({ 208 await makeGetRequest({
217 url: server.url, 209 url: server.url,
218 path: basePath + '/coucou', 210 path: videoChannelPath + '/coucou',
219 statusCodeExpected: 400 211 statusCodeExpected: 400
220 }) 212 })
221 }) 213 })
@@ -223,7 +215,7 @@ describe('Test videos API validator', function () {
223 it('Should return 404 with an incorrect video channel', async function () { 215 it('Should return 404 with an incorrect video channel', async function () {
224 await makeGetRequest({ 216 await makeGetRequest({
225 url: server.url, 217 url: server.url,
226 path: basePath + '/4da6fde3-88f7-4d16-b119-108df5630b06', 218 path: videoChannelPath + '/4da6fde3-88f7-4d16-b119-108df5630b06',
227 statusCodeExpected: 404 219 statusCodeExpected: 404
228 }) 220 })
229 }) 221 })
@@ -231,7 +223,7 @@ describe('Test videos API validator', function () {
231 it('Should succeed with the correct parameters', async function () { 223 it('Should succeed with the correct parameters', async function () {
232 await makeGetRequest({ 224 await makeGetRequest({
233 url: server.url, 225 url: server.url,
234 path: basePath + '/' + videoChannelUUID, 226 path: videoChannelPath + '/' + videoChannelUUID,
235 statusCodeExpected: 200 227 statusCodeExpected: 200
236 }) 228 })
237 }) 229 })
@@ -239,30 +231,26 @@ describe('Test videos API validator', function () {
239 231
240 describe('When deleting a video channel', function () { 232 describe('When deleting a video channel', function () {
241 it('Should fail with a non authenticated user', async function () { 233 it('Should fail with a non authenticated user', async function () {
242 await deleteVideoChannel(server.url, 'coucou', accountUUID, videoChannelUUID, 401) 234 await deleteVideoChannel(server.url, 'coucou', videoChannelUUID, 401)
243 }) 235 })
244 236
245 it('Should fail with another authenticated user', async function () { 237 it('Should fail with another authenticated user', async function () {
246 await deleteVideoChannel(server.url, accessTokenUser, accountUUID, videoChannelUUID, 403) 238 await deleteVideoChannel(server.url, accessTokenUser, videoChannelUUID, 403)
247 })
248
249 it('Should fail with an unknown account id', async function () {
250 await deleteVideoChannel(server.url, server.accessToken, 454554,videoChannelUUID, 404)
251 }) 239 })
252 240
253 it('Should fail with an unknown video channel id', async function () { 241 it('Should fail with an unknown video channel id', async function () {
254 await deleteVideoChannel(server.url, server.accessToken, accountUUID,454554, 404) 242 await deleteVideoChannel(server.url, server.accessToken,454554, 404)
255 }) 243 })
256 244
257 it('Should succeed with the correct parameters', async function () { 245 it('Should succeed with the correct parameters', async function () {
258 await deleteVideoChannel(server.url, server.accessToken, accountUUID, videoChannelUUID) 246 await deleteVideoChannel(server.url, server.accessToken, videoChannelUUID)
259 }) 247 })
260 248
261 it('Should fail to delete the last user video channel', async function () { 249 it('Should fail to delete the last user video channel', async function () {
262 const res = await getVideoChannelsList(server.url, 0, 1) 250 const res = await getVideoChannelsList(server.url, 0, 1)
263 const lastVideoChannelUUID = res.body.data[0].uuid 251 const lastVideoChannelUUID = res.body.data[0].uuid
264 252
265 await deleteVideoChannel(server.url, server.accessToken, accountUUID, lastVideoChannelUUID, 409) 253 await deleteVideoChannel(server.url, server.accessToken, lastVideoChannelUUID, 409)
266 }) 254 })
267 }) 255 })
268 256
diff --git a/server/tests/api/videos/video-channels.ts b/server/tests/api/videos/video-channels.ts
index 04e7b8c6a..d24b8ab0b 100644
--- a/server/tests/api/videos/video-channels.ts
+++ b/server/tests/api/videos/video-channels.ts
@@ -63,7 +63,7 @@ describe('Test video channels', function () {
63 description: 'super video channel description', 63 description: 'super video channel description',
64 support: 'super video channel support text' 64 support: 'super video channel support text'
65 } 65 }
66 const res = await addVideoChannel(servers[0].url, servers[0].accessToken, accountUUID, videoChannel) 66 const res = await addVideoChannel(servers[0].url, servers[0].accessToken, videoChannel)
67 videoChannelId = res.body.videoChannel.id 67 videoChannelId = res.body.videoChannel.id
68 videoChannelUUID = res.body.videoChannel.uuid 68 videoChannelUUID = res.body.videoChannel.uuid
69 69
@@ -130,7 +130,7 @@ describe('Test video channels', function () {
130 support: 'video channel support text updated' 130 support: 'video channel support text updated'
131 } 131 }
132 132
133 await updateVideoChannel(servers[0].url, servers[0].accessToken, accountUUID, videoChannelId, videoChannelAttributes) 133 await updateVideoChannel(servers[0].url, servers[0].accessToken, videoChannelId, videoChannelAttributes)
134 134
135 await wait(3000) 135 await wait(3000)
136 }) 136 })
@@ -149,7 +149,7 @@ describe('Test video channels', function () {
149 }) 149 })
150 150
151 it('Should get video channel', async function () { 151 it('Should get video channel', async function () {
152 const res = await getVideoChannel(servers[0].url, accountUUID, videoChannelId) 152 const res = await getVideoChannel(servers[0].url, videoChannelId)
153 153
154 const videoChannel = res.body 154 const videoChannel = res.body
155 expect(videoChannel.displayName).to.equal('video channel updated') 155 expect(videoChannel.displayName).to.equal('video channel updated')
@@ -161,7 +161,7 @@ describe('Test video channels', function () {
161 this.timeout(10000) 161 this.timeout(10000)
162 162
163 for (const server of servers) { 163 for (const server of servers) {
164 const res = await getVideoChannelVideos(server.url, server.accessToken, accountUUID, videoChannelUUID, 0, 5) 164 const res = await getVideoChannelVideos(server.url, server.accessToken, videoChannelUUID, 0, 5)
165 expect(res.body.total).to.equal(1) 165 expect(res.body.total).to.equal(1)
166 expect(res.body.data).to.be.an('array') 166 expect(res.body.data).to.be.an('array')
167 expect(res.body.data).to.have.lengthOf(1) 167 expect(res.body.data).to.have.lengthOf(1)
@@ -170,7 +170,7 @@ describe('Test video channels', function () {
170 }) 170 })
171 171
172 it('Should delete video channel', async function () { 172 it('Should delete video channel', async function () {
173 await deleteVideoChannel(servers[0].url, servers[0].accessToken, accountUUID, videoChannelId) 173 await deleteVideoChannel(servers[0].url, servers[0].accessToken, videoChannelId)
174 }) 174 })
175 175
176 it('Should have video channel deleted', async function () { 176 it('Should have video channel deleted', async function () {
diff --git a/server/tests/api/videos/video-nsfw.ts b/server/tests/api/videos/video-nsfw.ts
index 8901f38f9..b8c85f45b 100644
--- a/server/tests/api/videos/video-nsfw.ts
+++ b/server/tests/api/videos/video-nsfw.ts
@@ -39,7 +39,7 @@ describe('Test video NSFW policy', function () {
39 getVideosListWithToken(server.url, token), 39 getVideosListWithToken(server.url, token),
40 searchVideoWithToken(server.url, 'n', token), 40 searchVideoWithToken(server.url, 'n', token),
41 getAccountVideos(server.url, token, accountUUID, 0, 5), 41 getAccountVideos(server.url, token, accountUUID, 0, 5),
42 getVideoChannelVideos(server.url, token, accountUUID, videoChannelUUID, 0, 5) 42 getVideoChannelVideos(server.url, token, videoChannelUUID, 0, 5)
43 ]) 43 ])
44 } 44 }
45 45
@@ -47,7 +47,7 @@ describe('Test video NSFW policy', function () {
47 getVideosList(server.url), 47 getVideosList(server.url),
48 searchVideo(server.url, 'n'), 48 searchVideo(server.url, 'n'),
49 getAccountVideos(server.url, undefined, accountUUID, 0, 5), 49 getAccountVideos(server.url, undefined, accountUUID, 0, 5),
50 getVideoChannelVideos(server.url, undefined, accountUUID, videoChannelUUID, 0, 5) 50 getVideoChannelVideos(server.url, undefined, videoChannelUUID, 0, 5)
51 ]) 51 ])
52 }) 52 })
53 } 53 }
diff --git a/server/tests/utils/videos/video-channels.ts b/server/tests/utils/videos/video-channels.ts
index 0b4fa89b7..978e21b19 100644
--- a/server/tests/utils/videos/video-channels.ts
+++ b/server/tests/utils/videos/video-channels.ts
@@ -34,11 +34,10 @@ function getAccountVideoChannelsList (url: string, accountId: number | string, s
34function addVideoChannel ( 34function addVideoChannel (
35 url: string, 35 url: string,
36 token: string, 36 token: string,
37 accountId: number | string,
38 videoChannelAttributesArg: VideoChannelAttributes, 37 videoChannelAttributesArg: VideoChannelAttributes,
39 expectedStatus = 200 38 expectedStatus = 200
40) { 39) {
41 const path = '/api/v1/accounts/' + accountId + '/video-channels/' 40 const path = '/api/v1/video-channels/'
42 41
43 // Default attributes 42 // Default attributes
44 let attributes = { 43 let attributes = {
@@ -59,13 +58,12 @@ function addVideoChannel (
59function updateVideoChannel ( 58function updateVideoChannel (
60 url: string, 59 url: string,
61 token: string, 60 token: string,
62 accountId: number | string,
63 channelId: number | string, 61 channelId: number | string,
64 attributes: VideoChannelAttributes, 62 attributes: VideoChannelAttributes,
65 expectedStatus = 204 63 expectedStatus = 204
66) { 64) {
67 const body = {} 65 const body = {}
68 const path = '/api/v1/accounts/' + accountId + '/video-channels/' + channelId 66 const path = '/api/v1/video-channels/' + channelId
69 67
70 if (attributes.name) body['name'] = attributes.name 68 if (attributes.name) body['name'] = attributes.name
71 if (attributes.description) body['description'] = attributes.description 69 if (attributes.description) body['description'] = attributes.description
@@ -79,8 +77,8 @@ function updateVideoChannel (
79 .expect(expectedStatus) 77 .expect(expectedStatus)
80} 78}
81 79
82function deleteVideoChannel (url: string, token: string, accountId: number | string, channelId: number | string, expectedStatus = 204) { 80function deleteVideoChannel (url: string, token: string, channelId: number | string, expectedStatus = 204) {
83 const path = '/api/v1/accounts/' + accountId + '/video-channels/' + channelId 81 const path = '/api/v1/video-channels/' + channelId
84 82
85 return request(url) 83 return request(url)
86 .delete(path) 84 .delete(path)
@@ -89,8 +87,8 @@ function deleteVideoChannel (url: string, token: string, accountId: number | str
89 .expect(expectedStatus) 87 .expect(expectedStatus)
90} 88}
91 89
92function getVideoChannel (url: string, accountId: number | string, channelId: number | string) { 90function getVideoChannel (url: string, channelId: number | string) {
93 const path = '/api/v1/accounts/' + accountId + '/video-channels/' + channelId 91 const path = '/api/v1/video-channels/' + channelId
94 92
95 return request(url) 93 return request(url)
96 .get(path) 94 .get(path)
diff --git a/server/tests/utils/videos/videos.ts b/server/tests/utils/videos/videos.ts
index d1d8c07df..870dfd21f 100644
--- a/server/tests/utils/videos/videos.ts
+++ b/server/tests/utils/videos/videos.ts
@@ -186,13 +186,12 @@ function getAccountVideos (url: string, accessToken: string, accountId: number |
186function getVideoChannelVideos ( 186function getVideoChannelVideos (
187 url: string, 187 url: string,
188 accessToken: string, 188 accessToken: string,
189 accountId: number | string,
190 videoChannelId: number | string, 189 videoChannelId: number | string,
191 start: number, 190 start: number,
192 count: number, 191 count: number,
193 sort?: string 192 sort?: string
194) { 193) {
195 const path = '/api/v1/accounts/' + accountId + '/video-channels/' + videoChannelId + '/videos' 194 const path = '/api/v1/video-channels/' + videoChannelId + '/videos'
196 195
197 return makeGetRequest({ 196 return makeGetRequest({
198 url, 197 url,
diff --git a/support/doc/api/html/index.html b/support/doc/api/html/index.html
index 23162c307..d41fc3913 100644
--- a/support/doc/api/html/index.html
+++ b/support/doc/api/html/index.html
@@ -28,6 +28,9 @@
28 <a href="#operation--accounts--id--get"> GET /accounts/{id} </a> 28 <a href="#operation--accounts--id--get"> GET /accounts/{id} </a>
29 </li> 29 </li>
30 <li> 30 <li>
31 <a href="#operation--accounts--id--videos-get"> GET /accounts/{id}/videos </a>
32 </li>
33 <li>
31 <a href="#operation--accounts-get"> GET /accounts </a> 34 <a href="#operation--accounts-get"> GET /accounts </a>
32 </li> 35 </li>
33 </ul> 36 </ul>
@@ -187,19 +190,22 @@
187 <a href="#operation--video-channels-get"> GET /video-channels </a> 190 <a href="#operation--video-channels-get"> GET /video-channels </a>
188 </li> 191 </li>
189 <li> 192 <li>
190 <a href="#operation--accounts--accountId--video-channels-get"> GET /accounts/{accountId}/video-channels </a> 193 <a href="#operation--video-channels-post"> POST /video-channels </a>
191 </li> 194 </li>
192 <li> 195 <li>
193 <a href="#operation--accounts--accountId--video-channels-post"> POST /accounts/{accountId}/video-channels </a> 196 <a href="#operation--video-channels--id--get"> GET /video-channels/{id} </a>
194 </li> 197 </li>
195 <li> 198 <li>
196 <a href="#operation--account--accountId--video-channels--id--get"> GET /account/{accountId}/video-channels/{id} </a> 199 <a href="#operation--video-channels--id--put"> PUT /video-channels/{id} </a>
197 </li> 200 </li>
198 <li> 201 <li>
199 <a href="#operation--account--accountId--video-channels--id--put"> PUT /account/{accountId}/video-channels/{id} </a> 202 <a href="#operation--video-channels--id--delete"> DELETE /video-channels/{id} </a>
200 </li> 203 </li>
201 <li> 204 <li>
202 <a href="#operation--account--accountId--video-channels--id--delete"> DELETE /account/{accountId}/video-channels/{id} </a> 205 <a href="#operation--video-channels--id--videos-get"> GET /video-channels/{id}/videos </a>
206 </li>
207 <li>
208 <a href="#operation--accounts--accountId--video-channels-get"> GET /accounts/{accountId}/video-channels </a>
203 </li> 209 </li>
204 </ul> 210 </ul>
205 </section> 211 </section>
@@ -452,6 +458,117 @@
452 </div> 458 </div>
453 </div> 459 </div>
454 </div> 460 </div>
461 <div id="operation--accounts--id--videos-get" class="operation panel" data-traverse-target="operation--accounts--id--videos-get">
462 <!-- <section class="operation-tags row"> -->
463 <!-- <div class="doc-copy"> -->
464 <div class="operation-tags">
465 <a class="label" href="#tag-Accounts">Accounts</a>
466 <!---->
467 </div>
468 <!-- </div> -->
469 <!-- </section> -->
470 <h2 class="operation-title">
471 <span class="operation-name">
472 <span class="operation-name">GET</span>
473 <span class="operation-path">/accounts/{id}/videos</span>
474 </span>
475 </h2>
476 <div class="doc-row">
477 <div class="doc-copy">
478 <section class="swagger-request-params">
479 <div class="prop-row prop-group">
480 <div class="prop-name">
481 <div class="prop-title">id</div>
482 <span class="json-property-required"></span>
483 <div class="prop-subtitle"> in path </div>
484 <div class="prop-subtitle">
485 <span class="json-property-type">string</span>
486 <span class="json-property-range" title="Value limits"></span>
487 </div>
488 </div>
489 <div class="prop-value">
490 <p>The id of the account</p>
491 </div>
492 </div>
493 </section>
494 </div>
495 <div class="doc-examples"></div>
496 </div>
497 <div class="doc-row">
498 <div class="doc-copy">
499 <section class="swagger-responses">
500 <div class="prop-row prop-group">
501 <div class="prop-name">
502 <div class="prop-title">200 OK</div>
503 <div class="prop-ref">
504 <span class="">
505 <a class="json-schema-ref" href="#/definitions/Video">Video</a>
506 </span>
507 </div>
508 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
509 </div>
510 <div class="prop-value">
511 <p>successful operation</p>
512 </div>
513 </div>
514 </section>
515 </div>
516 <div class="doc-examples">
517 <h5>Response Content-Types:
518 <span>application/json</span>
519 </h5>
520 <section>
521 <h5>Response Example
522 <span>(200 OK)</span>
523 </h5>
524 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
525 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
526 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
527 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
528 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
529 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
530 <span class="hljs-attr">&quot;category&quot;</span>: {
531 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
532 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
533 },
534 <span class="hljs-attr">&quot;licence&quot;</span>: {
535 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
536 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
537 },
538 <span class="hljs-attr">&quot;language&quot;</span>: {
539 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
540 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
541 },
542 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
543 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
544 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
545 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
546 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
547 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
548 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
549 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
550 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
551 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
552 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
553 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
554 <span class="hljs-attr">&quot;account&quot;</span>: {
555 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
556 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
557 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
558 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
559 <span class="hljs-attr">&quot;avatar&quot;</span>: {
560 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
561 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
562 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
563 }
564 }
565}
566</code></pre>
567 <!-- </div> -->
568 </section>
569 </div>
570 </div>
571 </div>
455 <div id="operation--accounts-get" class="operation panel" data-traverse-target="operation--accounts-get"> 572 <div id="operation--accounts-get" class="operation panel" data-traverse-target="operation--accounts-get">
456 <!-- <section class="operation-tags row"> --> 573 <!-- <section class="operation-tags row"> -->
457 <!-- <div class="doc-copy"> --> 574 <!-- <div class="doc-copy"> -->
@@ -1596,54 +1713,10 @@
1596 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 1713 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1597 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 1714 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1598 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>, 1715 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
1599 <span class="hljs-attr">&quot;owner&quot;</span>: { 1716 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
1600 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 1717 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1601 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span> 1718 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1602 }, 1719 }
1603 <span class="hljs-attr">&quot;videos&quot;</span>: [
1604 {
1605 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1606 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1607 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1608 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1609 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1610 <span class="hljs-attr">&quot;category&quot;</span>: {
1611 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1612 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1613 },
1614 <span class="hljs-attr">&quot;licence&quot;</span>: {
1615 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1616 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1617 },
1618 <span class="hljs-attr">&quot;language&quot;</span>: {
1619 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1620 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1621 },
1622 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1623 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1624 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1625 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
1626 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1627 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1628 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1629 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1630 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1631 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1632 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1633 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
1634 <span class="hljs-attr">&quot;account&quot;</span>: {
1635 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1636 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1637 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1638 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1639 <span class="hljs-attr">&quot;avatar&quot;</span>: {
1640 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1641 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1642 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1643 }
1644 }
1645 }
1646 ]
1647 } 1720 }
1648 ] 1721 ]
1649 } 1722 }
@@ -1848,54 +1921,10 @@
1848 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 1921 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1849 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 1922 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1850 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>, 1923 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
1851 <span class="hljs-attr">&quot;owner&quot;</span>: { 1924 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
1852 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 1925 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1853 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span> 1926 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1854 }, 1927 }
1855 <span class="hljs-attr">&quot;videos&quot;</span>: [
1856 {
1857 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1858 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1859 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1860 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1861 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1862 <span class="hljs-attr">&quot;category&quot;</span>: {
1863 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1864 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1865 },
1866 <span class="hljs-attr">&quot;licence&quot;</span>: {
1867 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1868 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1869 },
1870 <span class="hljs-attr">&quot;language&quot;</span>: {
1871 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1872 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1873 },
1874 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1875 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1876 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1877 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
1878 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1879 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1880 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1881 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1882 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1883 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1884 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
1885 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
1886 <span class="hljs-attr">&quot;account&quot;</span>: {
1887 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1888 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1889 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1890 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1891 <span class="hljs-attr">&quot;avatar&quot;</span>: {
1892 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1893 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
1894 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
1895 }
1896 }
1897 }
1898 ]
1899 } 1928 }
1900 ] 1929 ]
1901} 1930}
@@ -2125,54 +2154,10 @@
2125 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 2154 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2126 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 2155 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2127 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>, 2156 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
2128 <span class="hljs-attr">&quot;owner&quot;</span>: { 2157 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
2129 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 2158 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2130 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span> 2159 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2131 }, 2160 }
2132 <span class="hljs-attr">&quot;videos&quot;</span>: [
2133 {
2134 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2135 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2136 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2137 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2138 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2139 <span class="hljs-attr">&quot;category&quot;</span>: {
2140 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2141 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2142 },
2143 <span class="hljs-attr">&quot;licence&quot;</span>: {
2144 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2145 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2146 },
2147 <span class="hljs-attr">&quot;language&quot;</span>: {
2148 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2149 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2150 },
2151 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2152 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2153 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2154 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
2155 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2156 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2157 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2158 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2159 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2160 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2161 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
2162 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
2163 <span class="hljs-attr">&quot;account&quot;</span>: {
2164 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2165 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2166 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2167 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2168 <span class="hljs-attr">&quot;avatar&quot;</span>: {
2169 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2170 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
2171 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
2172 }
2173 }
2174 }
2175 ]
2176 } 2161 }
2177 ] 2162 ]
2178 } 2163 }
@@ -4867,189 +4852,10 @@
4867 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 4852 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4868 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 4853 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4869 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>, 4854 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
4870 <span class="hljs-attr">&quot;owner&quot;</span>: { 4855 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
4871 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 4856 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4872 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
4873 },
4874 <span class="hljs-attr">&quot;videos&quot;</span>: [
4875 {
4876 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4877 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4878 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4879 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4880 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4881 <span class="hljs-attr">&quot;category&quot;</span>: {
4882 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4883 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
4884 },
4885 <span class="hljs-attr">&quot;licence&quot;</span>: {
4886 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4887 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
4888 },
4889 <span class="hljs-attr">&quot;language&quot;</span>: {
4890 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4891 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
4892 },
4893 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4894 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4895 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4896 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
4897 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4898 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4899 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4900 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4901 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4902 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4903 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
4904 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
4905 <span class="hljs-attr">&quot;account&quot;</span>: {
4906 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4907 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4908 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4909 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4910 <span class="hljs-attr">&quot;avatar&quot;</span>: {
4911 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4912 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
4913 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
4914 }
4915 }
4916 }
4917 ]
4918 }
4919]
4920</code></pre>
4921 <!-- </div> -->
4922 </section>
4923 </div>
4924 </div>
4925 </div>
4926 <div id="operation--accounts--accountId--video-channels-get" class="operation panel" data-traverse-target="operation--accounts--accountId--video-channels-get">
4927 <!-- <section class="operation-tags row"> -->
4928 <!-- <div class="doc-copy"> -->
4929 <div class="operation-tags">
4930 <a class="label" href="#tag-VideoChannel">VideoChannel</a>
4931 <!---->
4932 </div>
4933 <!-- </div> -->
4934 <!-- </section> -->
4935 <h2 class="operation-title">
4936 <span class="operation-name">
4937 <span class="operation-name">GET</span>
4938 <span class="operation-path">/accounts/{accountId}/video-channels</span>
4939 </span>
4940 </h2>
4941 <div class="doc-row">
4942 <div class="doc-copy">
4943 <section class="swagger-request-params">
4944 <div class="prop-row prop-group">
4945 <div class="prop-name">
4946 <div class="prop-title">accountId</div>
4947 <span class="json-property-required"></span>
4948 <div class="prop-subtitle"> in path </div>
4949 <div class="prop-subtitle">
4950 <span class="json-property-type">string</span>
4951 <span class="json-property-range" title="Value limits"></span>
4952 </div>
4953 </div>
4954 <div class="prop-value">
4955 <p>The account id </p>
4956 </div>
4957 </div>
4958 </section>
4959 </div>
4960 <div class="doc-examples"></div>
4961 </div>
4962 <div class="doc-row">
4963 <div class="doc-copy">
4964 <section class="swagger-responses">
4965 <div class="prop-row prop-group">
4966 <div class="prop-name">
4967 <div class="prop-title">200 OK</div>
4968 <div class="prop-ref">
4969 <span class="json-schema-ref-array">
4970 <a class="json-schema-ref" href="#/definitions/VideoChannel">VideoChannel</a>
4971 </span>
4972 </div>
4973 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
4974 </div>
4975 <div class="prop-value">
4976 <p>successful operation</p>
4977 </div>
4978 </div>
4979 <div class="prop-row prop-inner">
4980 <div class="prop-name">type</div>
4981 <div class="prop-value">
4982 <span class="json-property-type">
4983 <span class="json-schema-ref-array">
4984 <a class="json-schema-ref" href="#/definitions/VideoChannel">VideoChannel</a>
4985 </span>
4986 </span>
4987 <span class="json-property-range" title="Value limits"></span>
4988 </div>
4989 </div>
4990 </section>
4991 </div>
4992 <div class="doc-examples">
4993 <h5>Response Content-Types:
4994 <span>application/json</span>
4995 </h5>
4996 <section>
4997 <h5>Response Example
4998 <span>(200 OK)</span>
4999 </h5>
5000 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
5001 {
5002 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5003 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5004 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
5005 <span class="hljs-attr">&quot;owner&quot;</span>: {
5006 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5007 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span> 4857 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5008 }, 4858 }
5009 <span class="hljs-attr">&quot;videos&quot;</span>: [
5010 {
5011 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5012 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5013 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5014 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5015 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5016 <span class="hljs-attr">&quot;category&quot;</span>: {
5017 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5018 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5019 },
5020 <span class="hljs-attr">&quot;licence&quot;</span>: {
5021 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5022 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5023 },
5024 <span class="hljs-attr">&quot;language&quot;</span>: {
5025 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5026 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5027 },
5028 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5029 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5030 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5031 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
5032 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5033 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5034 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5035 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5036 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5037 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5038 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5039 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
5040 <span class="hljs-attr">&quot;account&quot;</span>: {
5041 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5042 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5043 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5044 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5045 <span class="hljs-attr">&quot;avatar&quot;</span>: {
5046 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5047 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5048 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5049 }
5050 }
5051 }
5052 ]
5053 } 4859 }
5054] 4860]
5055</code></pre> 4861</code></pre>
@@ -5058,7 +4864,7 @@
5058 </div> 4864 </div>
5059 </div> 4865 </div>
5060 </div> 4866 </div>
5061 <div id="operation--accounts--accountId--video-channels-post" class="operation panel" data-traverse-target="operation--accounts--accountId--video-channels-post"> 4867 <div id="operation--video-channels-post" class="operation panel" data-traverse-target="operation--video-channels-post">
5062 <!-- <section class="operation-tags row"> --> 4868 <!-- <section class="operation-tags row"> -->
5063 <!-- <div class="doc-copy"> --> 4869 <!-- <div class="doc-copy"> -->
5064 <div class="operation-tags"> 4870 <div class="operation-tags">
@@ -5070,7 +4876,7 @@
5070 <h2 class="operation-title"> 4876 <h2 class="operation-title">
5071 <span class="operation-name"> 4877 <span class="operation-name">
5072 <span class="operation-name">POST</span> 4878 <span class="operation-name">POST</span>
5073 <span class="operation-path">/accounts/{accountId}/video-channels</span> 4879 <span class="operation-path">/video-channels</span>
5074 </span> 4880 </span>
5075 </h2> 4881 </h2>
5076 <div class="doc-row"> 4882 <div class="doc-row">
@@ -5091,22 +4897,6 @@
5091 </div> 4897 </div>
5092 </div> 4898 </div>
5093 </section> 4899 </section>
5094 <section class="swagger-request-params">
5095 <div class="prop-row prop-group">
5096 <div class="prop-name">
5097 <div class="prop-title">accountId</div>
5098 <span class="json-property-required"></span>
5099 <div class="prop-subtitle"> in path </div>
5100 <div class="prop-subtitle">
5101 <span class="json-property-type">string</span>
5102 <span class="json-property-range" title="Value limits"></span>
5103 </div>
5104 </div>
5105 <div class="prop-value">
5106 <p>The account id </p>
5107 </div>
5108 </div>
5109 </section>
5110 </div> 4900 </div>
5111 <div class="doc-examples"> 4901 <div class="doc-examples">
5112 <section> 4902 <section>
@@ -5165,7 +4955,7 @@
5165 </div> 4955 </div>
5166 </div> 4956 </div>
5167 </div> 4957 </div>
5168 <div id="operation--account--accountId--video-channels--id--get" class="operation panel" data-traverse-target="operation--account--accountId--video-channels--id--get"> 4958 <div id="operation--video-channels--id--get" class="operation panel" data-traverse-target="operation--video-channels--id--get">
5169 <!-- <section class="operation-tags row"> --> 4959 <!-- <section class="operation-tags row"> -->
5170 <!-- <div class="doc-copy"> --> 4960 <!-- <div class="doc-copy"> -->
5171 <div class="operation-tags"> 4961 <div class="operation-tags">
@@ -5177,7 +4967,7 @@
5177 <h2 class="operation-title"> 4967 <h2 class="operation-title">
5178 <span class="operation-name"> 4968 <span class="operation-name">
5179 <span class="operation-name">GET</span> 4969 <span class="operation-name">GET</span>
5180 <span class="operation-path">/account/{accountId}/video-channels/{id}</span> 4970 <span class="operation-path">/video-channels/{id}</span>
5181 </span> 4971 </span>
5182 </h2> 4972 </h2>
5183 <div class="doc-row"> 4973 <div class="doc-row">
@@ -5185,20 +4975,6 @@
5185 <section class="swagger-request-params"> 4975 <section class="swagger-request-params">
5186 <div class="prop-row prop-group"> 4976 <div class="prop-row prop-group">
5187 <div class="prop-name"> 4977 <div class="prop-name">
5188 <div class="prop-title">accountId</div>
5189 <span class="json-property-required"></span>
5190 <div class="prop-subtitle"> in path </div>
5191 <div class="prop-subtitle">
5192 <span class="json-property-type">string</span>
5193 <span class="json-property-range" title="Value limits"></span>
5194 </div>
5195 </div>
5196 <div class="prop-value">
5197 <p>The account id </p>
5198 </div>
5199 </div>
5200 <div class="prop-row prop-group">
5201 <div class="prop-name">
5202 <div class="prop-title">id</div> 4978 <div class="prop-title">id</div>
5203 <span class="json-property-required"></span> 4979 <span class="json-property-required"></span>
5204 <div class="prop-subtitle"> in path </div> 4980 <div class="prop-subtitle"> in path </div>
@@ -5246,54 +5022,10 @@
5246 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 5022 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5247 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 5023 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5248 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>, 5024 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
5249 <span class="hljs-attr">&quot;owner&quot;</span>: { 5025 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
5250 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 5026 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5251 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span> 5027 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5252 }, 5028 }
5253 <span class="hljs-attr">&quot;videos&quot;</span>: [
5254 {
5255 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5256 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5257 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5258 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5259 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5260 <span class="hljs-attr">&quot;category&quot;</span>: {
5261 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5262 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5263 },
5264 <span class="hljs-attr">&quot;licence&quot;</span>: {
5265 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5266 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5267 },
5268 <span class="hljs-attr">&quot;language&quot;</span>: {
5269 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5270 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5271 },
5272 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5273 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5274 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5275 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
5276 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5277 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5278 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5279 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5280 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5281 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5282 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5283 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
5284 <span class="hljs-attr">&quot;account&quot;</span>: {
5285 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5286 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5287 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5288 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5289 <span class="hljs-attr">&quot;avatar&quot;</span>: {
5290 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5291 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5292 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5293 }
5294 }
5295 }
5296 ]
5297} 5029}
5298</code></pre> 5030</code></pre>
5299 <!-- </div> --> 5031 <!-- </div> -->
@@ -5301,7 +5033,7 @@
5301 </div> 5033 </div>
5302 </div> 5034 </div>
5303 </div> 5035 </div>
5304 <div id="operation--account--accountId--video-channels--id--put" class="operation panel" data-traverse-target="operation--account--accountId--video-channels--id--put"> 5036 <div id="operation--video-channels--id--put" class="operation panel" data-traverse-target="operation--video-channels--id--put">
5305 <!-- <section class="operation-tags row"> --> 5037 <!-- <section class="operation-tags row"> -->
5306 <!-- <div class="doc-copy"> --> 5038 <!-- <div class="doc-copy"> -->
5307 <div class="operation-tags"> 5039 <div class="operation-tags">
@@ -5313,7 +5045,7 @@
5313 <h2 class="operation-title"> 5045 <h2 class="operation-title">
5314 <span class="operation-name"> 5046 <span class="operation-name">
5315 <span class="operation-name">PUT</span> 5047 <span class="operation-name">PUT</span>
5316 <span class="operation-path">/account/{accountId}/video-channels/{id}</span> 5048 <span class="operation-path">/video-channels/{id}</span>
5317 </span> 5049 </span>
5318 </h2> 5050 </h2>
5319 <div class="doc-row"> 5051 <div class="doc-row">
@@ -5337,20 +5069,6 @@
5337 <section class="swagger-request-params"> 5069 <section class="swagger-request-params">
5338 <div class="prop-row prop-group"> 5070 <div class="prop-row prop-group">
5339 <div class="prop-name"> 5071 <div class="prop-name">
5340 <div class="prop-title">accountId</div>
5341 <span class="json-property-required"></span>
5342 <div class="prop-subtitle"> in path </div>
5343 <div class="prop-subtitle">
5344 <span class="json-property-type">string</span>
5345 <span class="json-property-range" title="Value limits"></span>
5346 </div>
5347 </div>
5348 <div class="prop-value">
5349 <p>The account id </p>
5350 </div>
5351 </div>
5352 <div class="prop-row prop-group">
5353 <div class="prop-name">
5354 <div class="prop-title">id</div> 5072 <div class="prop-title">id</div>
5355 <span class="json-property-required"></span> 5073 <span class="json-property-required"></span>
5356 <div class="prop-subtitle"> in path </div> 5074 <div class="prop-subtitle"> in path </div>
@@ -5422,7 +5140,7 @@
5422 </div> 5140 </div>
5423 </div> 5141 </div>
5424 </div> 5142 </div>
5425 <div id="operation--account--accountId--video-channels--id--delete" class="operation panel" data-traverse-target="operation--account--accountId--video-channels--id--delete"> 5143 <div id="operation--video-channels--id--delete" class="operation panel" data-traverse-target="operation--video-channels--id--delete">
5426 <!-- <section class="operation-tags row"> --> 5144 <!-- <section class="operation-tags row"> -->
5427 <!-- <div class="doc-copy"> --> 5145 <!-- <div class="doc-copy"> -->
5428 <div class="operation-tags"> 5146 <div class="operation-tags">
@@ -5434,7 +5152,7 @@
5434 <h2 class="operation-title"> 5152 <h2 class="operation-title">
5435 <span class="operation-name"> 5153 <span class="operation-name">
5436 <span class="operation-name">DELETE</span> 5154 <span class="operation-name">DELETE</span>
5437 <span class="operation-path">/account/{accountId}/video-channels/{id}</span> 5155 <span class="operation-path">/video-channels/{id}</span>
5438 </span> 5156 </span>
5439 </h2> 5157 </h2>
5440 <div class="doc-row"> 5158 <div class="doc-row">
@@ -5442,20 +5160,6 @@
5442 <section class="swagger-request-params"> 5160 <section class="swagger-request-params">
5443 <div class="prop-row prop-group"> 5161 <div class="prop-row prop-group">
5444 <div class="prop-name"> 5162 <div class="prop-name">
5445 <div class="prop-title">accountId</div>
5446 <span class="json-property-required"></span>
5447 <div class="prop-subtitle"> in path </div>
5448 <div class="prop-subtitle">
5449 <span class="json-property-type">string</span>
5450 <span class="json-property-range" title="Value limits"></span>
5451 </div>
5452 </div>
5453 <div class="prop-value">
5454 <p>The account id </p>
5455 </div>
5456 </div>
5457 <div class="prop-row prop-group">
5458 <div class="prop-name">
5459 <div class="prop-title">id</div> 5163 <div class="prop-title">id</div>
5460 <span class="json-property-required"></span> 5164 <span class="json-property-required"></span>
5461 <div class="prop-subtitle"> in path </div> 5165 <div class="prop-subtitle"> in path </div>
@@ -5514,6 +5218,208 @@
5514 </div> 5218 </div>
5515 </div> 5219 </div>
5516 </div> 5220 </div>
5221 <div id="operation--video-channels--id--videos-get" class="operation panel" data-traverse-target="operation--video-channels--id--videos-get">
5222 <!-- <section class="operation-tags row"> -->
5223 <!-- <div class="doc-copy"> -->
5224 <div class="operation-tags">
5225 <a class="label" href="#tag-VideoChannel">VideoChannel</a>
5226 <!---->
5227 </div>
5228 <!-- </div> -->
5229 <!-- </section> -->
5230 <h2 class="operation-title">
5231 <span class="operation-name">
5232 <span class="operation-name">GET</span>
5233 <span class="operation-path">/video-channels/{id}/videos</span>
5234 </span>
5235 </h2>
5236 <div class="doc-row">
5237 <div class="doc-copy">
5238 <section class="swagger-request-params">
5239 <div class="prop-row prop-group">
5240 <div class="prop-name">
5241 <div class="prop-title">id</div>
5242 <span class="json-property-required"></span>
5243 <div class="prop-subtitle"> in path </div>
5244 <div class="prop-subtitle">
5245 <span class="json-property-type">string</span>
5246 <span class="json-property-range" title="Value limits"></span>
5247 </div>
5248 </div>
5249 <div class="prop-value">
5250 <p>The video channel id </p>
5251 </div>
5252 </div>
5253 </section>
5254 </div>
5255 <div class="doc-examples"></div>
5256 </div>
5257 <div class="doc-row">
5258 <div class="doc-copy">
5259 <section class="swagger-responses">
5260 <div class="prop-row prop-group">
5261 <div class="prop-name">
5262 <div class="prop-title">200 OK</div>
5263 <div class="prop-ref">
5264 <span class="">
5265 <a class="json-schema-ref" href="#/definitions/Video">Video</a>
5266 </span>
5267 </div>
5268 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
5269 </div>
5270 <div class="prop-value">
5271 <p>successful operation</p>
5272 </div>
5273 </div>
5274 </section>
5275 </div>
5276 <div class="doc-examples">
5277 <h5>Response Content-Types:
5278 <span>application/json</span>
5279 </h5>
5280 <section>
5281 <h5>Response Example
5282 <span>(200 OK)</span>
5283 </h5>
5284 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">{
5285 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5286 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5287 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5288 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5289 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5290 <span class="hljs-attr">&quot;category&quot;</span>: {
5291 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5292 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5293 },
5294 <span class="hljs-attr">&quot;licence&quot;</span>: {
5295 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5296 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5297 },
5298 <span class="hljs-attr">&quot;language&quot;</span>: {
5299 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5300 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5301 },
5302 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5303 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5304 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5305 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
5306 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5307 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5308 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5309 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5310 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5311 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5312 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5313 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
5314 <span class="hljs-attr">&quot;account&quot;</span>: {
5315 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5316 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5317 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5318 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5319 <span class="hljs-attr">&quot;avatar&quot;</span>: {
5320 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5321 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5322 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5323 }
5324 }
5325}
5326</code></pre>
5327 <!-- </div> -->
5328 </section>
5329 </div>
5330 </div>
5331 </div>
5332 <div id="operation--accounts--accountId--video-channels-get" class="operation panel" data-traverse-target="operation--accounts--accountId--video-channels-get">
5333 <!-- <section class="operation-tags row"> -->
5334 <!-- <div class="doc-copy"> -->
5335 <div class="operation-tags">
5336 <a class="label" href="#tag-VideoChannel">VideoChannel</a>
5337 <!---->
5338 </div>
5339 <!-- </div> -->
5340 <!-- </section> -->
5341 <h2 class="operation-title">
5342 <span class="operation-name">
5343 <span class="operation-name">GET</span>
5344 <span class="operation-path">/accounts/{accountId}/video-channels</span>
5345 </span>
5346 </h2>
5347 <div class="doc-row">
5348 <div class="doc-copy">
5349 <section class="swagger-request-params">
5350 <div class="prop-row prop-group">
5351 <div class="prop-name">
5352 <div class="prop-title">accountId</div>
5353 <span class="json-property-required"></span>
5354 <div class="prop-subtitle"> in path </div>
5355 <div class="prop-subtitle">
5356 <span class="json-property-type">string</span>
5357 <span class="json-property-range" title="Value limits"></span>
5358 </div>
5359 </div>
5360 <div class="prop-value">
5361 <p>The account id </p>
5362 </div>
5363 </div>
5364 </section>
5365 </div>
5366 <div class="doc-examples"></div>
5367 </div>
5368 <div class="doc-row">
5369 <div class="doc-copy">
5370 <section class="swagger-responses">
5371 <div class="prop-row prop-group">
5372 <div class="prop-name">
5373 <div class="prop-title">200 OK</div>
5374 <div class="prop-ref">
5375 <span class="json-schema-ref-array">
5376 <a class="json-schema-ref" href="#/definitions/VideoChannel">VideoChannel</a>
5377 </span>
5378 </div>
5379 <!-- <span class="swagger-global"></span> <span class="json-schema-reference"><a href=""></a></span> -->
5380 </div>
5381 <div class="prop-value">
5382 <p>successful operation</p>
5383 </div>
5384 </div>
5385 <div class="prop-row prop-inner">
5386 <div class="prop-name">type</div>
5387 <div class="prop-value">
5388 <span class="json-property-type">
5389 <span class="json-schema-ref-array">
5390 <a class="json-schema-ref" href="#/definitions/VideoChannel">VideoChannel</a>
5391 </span>
5392 </span>
5393 <span class="json-property-range" title="Value limits"></span>
5394 </div>
5395 </div>
5396 </section>
5397 </div>
5398 <div class="doc-examples">
5399 <h5>Response Content-Types:
5400 <span>application/json</span>
5401 </h5>
5402 <section>
5403 <h5>Response Example
5404 <span>(200 OK)</span>
5405 </h5>
5406 <!-- <div class="hljs"> --><pre><code class="hljs lang-json">[
5407 {
5408 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5409 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
5410 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
5411 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
5412 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
5413 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
5414 }
5415 }
5416]
5417</code></pre>
5418 <!-- </div> -->
5419 </section>
5420 </div>
5421 </div>
5422 </div>
5517 <h1 id="tag-VideoComment" class="swagger-summary-tag" data-traverse-target="tag-VideoComment">VideoComment</h1> 5423 <h1 id="tag-VideoComment" class="swagger-summary-tag" data-traverse-target="tag-VideoComment">VideoComment</h1>
5518 <div id="operation--videos--videoId--comment-threads-get" class="operation panel" data-traverse-target="operation--videos--videoId--comment-threads-get"> 5424 <div id="operation--videos--videoId--comment-threads-get" class="operation panel" data-traverse-target="operation--videos--videoId--comment-threads-get">
5519 <!-- <section class="operation-tags row"> --> 5425 <!-- <section class="operation-tags row"> -->
@@ -6760,20 +6666,11 @@
6760 <span class="json-property-type">boolean</span> 6666 <span class="json-property-type">boolean</span>
6761 <span class="json-property-range" title="Value limits"></span> 6667 <span class="json-property-range" title="Value limits"></span>
6762 </dt> 6668 </dt>
6763 <dt data-property-name="owner"> 6669 <dt data-property-name="ownerAccount">
6764 <span class="json-property-name">owner:</span> 6670 <span class="json-property-name">ownerAccount:</span>
6765 <span class="json-property-type">object</span> 6671 <span class="json-property-type">object</span>
6766 <span class="json-property-range" title="Value limits"></span> 6672 <span class="json-property-range" title="Value limits"></span>
6767 </dt> 6673 </dt>
6768 <dt data-property-name="videos">
6769 <span class="json-property-name">videos:</span>
6770 <span class="json-property-type">
6771 <span class="json-schema-ref-array">
6772 <a class="json-schema-ref" href="#/definitions/Video">Video</a>
6773 </span>
6774 </span>
6775 <span class="json-property-range" title="Value limits"></span>
6776 </dt>
6777 </dl> 6674 </dl>
6778 </section> 6675 </section>
6779 </div> 6676 </div>
@@ -6784,54 +6681,10 @@
6784 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 6681 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6785 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 6682 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6786 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>, 6683 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
6787 <span class="hljs-attr">&quot;owner&quot;</span>: { 6684 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
6788 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 6685 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6789 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span> 6686 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6790 }, 6687 }
6791 <span class="hljs-attr">&quot;videos&quot;</span>: [
6792 {
6793 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6794 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6795 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6796 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6797 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6798 <span class="hljs-attr">&quot;category&quot;</span>: {
6799 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6800 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6801 },
6802 <span class="hljs-attr">&quot;licence&quot;</span>: {
6803 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6804 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6805 },
6806 <span class="hljs-attr">&quot;language&quot;</span>: {
6807 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6808 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6809 },
6810 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6811 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6812 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6813 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
6814 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6815 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6816 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6817 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6818 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6819 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6820 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
6821 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
6822 <span class="hljs-attr">&quot;account&quot;</span>: {
6823 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6824 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6825 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6826 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6827 <span class="hljs-attr">&quot;avatar&quot;</span>: {
6828 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6829 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
6830 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
6831 }
6832 }
6833 }
6834 ]
6835} 6688}
6836</code></pre> 6689</code></pre>
6837 <!-- </div> --> 6690 <!-- </div> -->
@@ -7394,54 +7247,10 @@
7394 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 7247 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7395 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 7248 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7396 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>, 7249 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
7397 <span class="hljs-attr">&quot;owner&quot;</span>: { 7250 <span class="hljs-attr">&quot;ownerAccount&quot;</span>: {
7398 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>, 7251 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7399 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span> 7252 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7400 }, 7253 }
7401 <span class="hljs-attr">&quot;videos&quot;</span>: [
7402 {
7403 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7404 <span class="hljs-attr">&quot;uuid&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7405 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7406 <span class="hljs-attr">&quot;publishedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7407 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7408 <span class="hljs-attr">&quot;category&quot;</span>: {
7409 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7410 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7411 },
7412 <span class="hljs-attr">&quot;licence&quot;</span>: {
7413 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7414 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7415 },
7416 <span class="hljs-attr">&quot;language&quot;</span>: {
7417 <span class="hljs-attr">&quot;id&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7418 <span class="hljs-attr">&quot;label&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7419 },
7420 <span class="hljs-attr">&quot;privacy&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7421 <span class="hljs-attr">&quot;description&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7422 <span class="hljs-attr">&quot;duration&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7423 <span class="hljs-attr">&quot;isLocal&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
7424 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7425 <span class="hljs-attr">&quot;thumbnailPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7426 <span class="hljs-attr">&quot;previewPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7427 <span class="hljs-attr">&quot;embedPath&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7428 <span class="hljs-attr">&quot;views&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7429 <span class="hljs-attr">&quot;likes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7430 <span class="hljs-attr">&quot;dislikes&quot;</span>: <span class="hljs-string">&quot;number&quot;</span>,
7431 <span class="hljs-attr">&quot;nsfw&quot;</span>: <span class="hljs-string">&quot;boolean&quot;</span>,
7432 <span class="hljs-attr">&quot;account&quot;</span>: {
7433 <span class="hljs-attr">&quot;name&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7434 <span class="hljs-attr">&quot;displayName&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7435 <span class="hljs-attr">&quot;url&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7436 <span class="hljs-attr">&quot;host&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7437 <span class="hljs-attr">&quot;avatar&quot;</span>: {
7438 <span class="hljs-attr">&quot;path&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7439 <span class="hljs-attr">&quot;createdAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>,
7440 <span class="hljs-attr">&quot;updatedAt&quot;</span>: <span class="hljs-string">&quot;string&quot;</span>
7441 }
7442 }
7443 }
7444 ]
7445 } 7254 }
7446 ] 7255 ]
7447} 7256}
diff --git a/support/doc/api/openapi.yaml b/support/doc/api/openapi.yaml
index 56941031b..46b73145a 100644
--- a/support/doc/api/openapi.yaml
+++ b/support/doc/api/openapi.yaml
@@ -1017,27 +1017,6 @@ paths:
1017 type: array 1017 type: array
1018 items: 1018 items:
1019 $ref: '#/definitions/VideoChannel' 1019 $ref: '#/definitions/VideoChannel'
1020 /accounts/{accountId}/video-channels:
1021 get:
1022 tags:
1023 - VideoChannel
1024 consumes:
1025 - application/json
1026 produces:
1027 - application/json
1028 parameters:
1029 - name: accountId
1030 in: path
1031 required: true
1032 type: string
1033 description: 'The account id '
1034 responses:
1035 '200':
1036 description: successful operation
1037 schema:
1038 type: array
1039 items:
1040 $ref: '#/definitions/VideoChannel'
1041 post: 1020 post:
1042 security: 1021 security:
1043 - OAuth2: [ ] 1022 - OAuth2: [ ]
@@ -1048,11 +1027,6 @@ paths:
1048 produces: 1027 produces:
1049 - application/json 1028 - application/json
1050 parameters: 1029 parameters:
1051 - name: accountId
1052 in: path
1053 required: true
1054 type: string
1055 description: 'The account id '
1056 - in: body 1030 - in: body
1057 name: body 1031 name: body
1058 schema: 1032 schema:
@@ -1060,7 +1034,7 @@ paths:
1060 responses: 1034 responses:
1061 '204': 1035 '204':
1062 description: successful operation 1036 description: successful operation
1063 "/account/{accountId}/video-channels/{id}": 1037 "/video-channels/{id}":
1064 get: 1038 get:
1065 tags: 1039 tags:
1066 - VideoChannel 1040 - VideoChannel
@@ -1069,11 +1043,6 @@ paths:
1069 produces: 1043 produces:
1070 - application/json 1044 - application/json
1071 parameters: 1045 parameters:
1072 - name: accountId
1073 in: path
1074 required: true
1075 type: string
1076 description: 'The account id '
1077 - name: id 1046 - name: id
1078 in: path 1047 in: path
1079 required: true 1048 required: true
@@ -1094,11 +1063,6 @@ paths:
1094 produces: 1063 produces:
1095 - application/json 1064 - application/json
1096 parameters: 1065 parameters:
1097 - name: accountId
1098 in: path
1099 required: true
1100 type: string
1101 description: 'The account id '
1102 - name: id 1066 - name: id
1103 in: path 1067 in: path
1104 required: true 1068 required: true
@@ -1121,20 +1085,34 @@ paths:
1121 produces: 1085 produces:
1122 - application/json 1086 - application/json
1123 parameters: 1087 parameters:
1124 - name: accountId 1088 - name: id
1125 in: path 1089 in: path
1126 required: true 1090 required: true
1127 type: string 1091 type: string
1128 description: 'The account id ' 1092 description: 'The video channel id '
1093 responses:
1094 '204':
1095 description: successful operation
1096 "/video-channels/{id}/videos":
1097 get:
1098 tags:
1099 - VideoChannel
1100 consumes:
1101 - application/json
1102 produces:
1103 - application/json
1104 parameters:
1129 - name: id 1105 - name: id
1130 in: path 1106 in: path
1131 required: true 1107 required: true
1132 type: string 1108 type: string
1133 description: 'The video channel id ' 1109 description: 'The video channel id '
1134 responses: 1110 responses:
1135 '204': 1111 '200':
1136 description: successful operation 1112 description: successful operation
1137 "/account/{accountId}/video-channels/{id}/videos": 1113 schema:
1114 $ref: '#/definitions/Video'
1115 /accounts/{accountId}/video-channels:
1138 get: 1116 get:
1139 tags: 1117 tags:
1140 - VideoChannel 1118 - VideoChannel
@@ -1148,16 +1126,13 @@ paths:
1148 required: true 1126 required: true
1149 type: string 1127 type: string
1150 description: 'The account id ' 1128 description: 'The account id '
1151 - name: id
1152 in: path
1153 required: true
1154 type: string
1155 description: 'The video channel id '
1156 responses: 1129 responses:
1157 '200': 1130 '200':
1158 description: successful operation 1131 description: successful operation
1159 schema: 1132 schema:
1160 $ref: '#/definitions/Video' 1133 type: array
1134 items:
1135 $ref: '#/definitions/VideoChannel'
1161 "/videos/{videoId}/comment-threads": 1136 "/videos/{videoId}/comment-threads":
1162 get: 1137 get:
1163 tags: 1138 tags: