X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=support%2Fdoc%2Fapi%2Fopenapi.yaml;h=f90b7f575f1a8c7440c80040d1f2b0b2377def73;hb=a2be43f5700460d3afdc194abc788690b79e66cd;hp=afd310c0b8e2d2f3a097ad3a18a307ac297423fb;hpb=4e56f0fff12ab9840574e7a27277fc78b195b3e2;p=github%2FChocobozzz%2FPeerTube.git diff --git a/support/doc/api/openapi.yaml b/support/doc/api/openapi.yaml index afd310c0b..f90b7f575 100644 --- a/support/doc/api/openapi.yaml +++ b/support/doc/api/openapi.yaml @@ -1,7 +1,7 @@ openapi: 3.0.0 info: title: PeerTube - version: 4.0.0 + version: 5.1.0 contact: name: PeerTube Community url: https://joinpeertube.org @@ -145,7 +145,6 @@ info: | `/api/*` | | `/download/*` | | `/lazy-static/*` | - | `/live/segments-sha256/*` | | `/.well-known/webfinger` | In addition, all routes serving ActivityPub are CORS-enabled for all origins. @@ -254,6 +253,8 @@ tags: download it for you, saving you as much bandwidth and avoiding any instability or limitation your network might have. - name: Video Imports description: Operations dealing with listing, adding and removing video imports. + - name: Channels Sync + description: Operations dealing with synchronizing PeerTube user's channel with channels of other platforms - name: Video Captions description: Operations dealing with listing, adding and removing closed captions of a video. - name: Video Channels @@ -275,8 +276,8 @@ tags: description: Video transcoding related operations - name: Video stats description: Video statistics - - name: Feeds - description: Server syndication feeds + - name: Video Feeds + description: Server syndication feeds of videos - name: Search description: | The search helps to find _videos_ or _channels_ from within the instance and beyond. @@ -293,7 +294,17 @@ tags: PeerTube instances can mirror videos from one another, and help distribute some videos. For importing videos as your own, refer to [video imports](#operation/importVideo). + - name: Stats + description: | + Statistics + x-tagGroups: + - name: Static endpoints + tags: + - Static Video Files + - name: Feeds + tags: + - Video Feeds - name: Auth tags: - Register @@ -322,30 +333,348 @@ x-tagGroups: - Video Files - Video Transcoding - Live Videos - - Feeds + - Channels Sync - name: Search tags: - Search - - name: Custom pages - tags: - - Homepage - name: Moderation tags: - Abuses - Video Blocks - Account Blocks - Server Blocks - - name: Instance Configuration + - name: Instance tags: - Config + - Homepage - Instance Follows - Instance Redundancy - Plugins - - name: Jobs - tags: + - Stats + - Logs - Job paths: - '/accounts/{name}': + '/static/webseed/{filename}': + get: + tags: + - Static Video Files + summary: Get public WebTorrent video file + parameters: + - $ref: '#/components/parameters/staticFilename' + responses: + '200': + description: successful operation + '404': + description: not found + '/static/webseed/private/{filename}': + get: + tags: + - Static Video Files + summary: Get private WebTorrent video file + parameters: + - $ref: '#/components/parameters/staticFilename' + - $ref: '#/components/parameters/videoFileToken' + security: + - OAuth2: [] + responses: + '200': + description: successful operation + '403': + description: invalid auth + '404': + description: not found + + '/static/streaming-playlists/hls/{filename}': + get: + tags: + - Static Video Files + summary: Get public HLS video file + parameters: + - $ref: '#/components/parameters/staticFilename' + security: + - OAuth2: [] + responses: + '200': + description: successful operation + '403': + description: invalid auth + '404': + description: not found + '/static/streaming-playlists/hls/private/{filename}': + get: + tags: + - Static Video Files + summary: Get private HLS video file + parameters: + - $ref: '#/components/parameters/staticFilename' + - $ref: '#/components/parameters/videoFileToken' + - $ref: '#/components/parameters/reinjectVideoFileToken' + security: + - OAuth2: [] + responses: + '200': + description: successful operation + '403': + description: invalid auth + '404': + description: not found + + + '/feeds/video-comments.{format}': + get: + tags: + - Video Feeds + summary: List comments on videos + operationId: getSyndicatedComments + parameters: + - name: format + in: path + required: true + description: 'format expected (we focus on making `rss` the most featureful ; it serves [Media RSS](https://www.rssboard.org/media-rss))' + schema: + type: string + enum: + - xml + - rss + - rss2 + - atom + - atom1 + - json + - json1 + - name: videoId + in: query + description: 'limit listing to a specific video' + schema: + type: string + - name: accountId + in: query + description: 'limit listing to a specific account' + schema: + type: string + - name: accountName + in: query + description: 'limit listing to a specific account' + schema: + type: string + - name: videoChannelId + in: query + description: 'limit listing to a specific video channel' + schema: + type: string + - name: videoChannelName + in: query + description: 'limit listing to a specific video channel' + schema: + type: string + responses: + '204': + description: successful operation + headers: + Cache-Control: + schema: + type: string + default: 'max-age=900' # 15 min cache + content: + application/xml: + schema: + $ref: '#/components/schemas/VideoCommentsForXML' + examples: + nightly: + externalValue: https://peertube2.cpy.re/feeds/video-comments.xml?filter=local + application/rss+xml: + schema: + $ref: '#/components/schemas/VideoCommentsForXML' + examples: + nightly: + externalValue: https://peertube2.cpy.re/feeds/video-comments.rss?filter=local + text/xml: + schema: + $ref: '#/components/schemas/VideoCommentsForXML' + examples: + nightly: + externalValue: https://peertube2.cpy.re/feeds/video-comments.xml?filter=local + application/atom+xml: + schema: + $ref: '#/components/schemas/VideoCommentsForXML' + examples: + nightly: + externalValue: https://peertube2.cpy.re/feeds/video-comments.atom?filter=local + application/json: + schema: + type: object + examples: + nightly: + externalValue: https://peertube2.cpy.re/feeds/video-comments.json?filter=local + '400': + x-summary: field inconsistencies + description: > + Arises when: + - videoId filter is mixed with a channel filter + '404': + description: video, video channel or account not found + '406': + description: accept header unsupported + + '/feeds/videos.{format}': + get: + tags: + - Video Feeds + summary: List videos + operationId: getSyndicatedVideos + parameters: + - name: format + in: path + required: true + description: 'format expected (we focus on making `rss` the most featureful ; it serves [Media RSS](https://www.rssboard.org/media-rss))' + schema: + type: string + enum: + - xml + - rss + - rss2 + - atom + - atom1 + - json + - json1 + - name: accountId + in: query + description: 'limit listing to a specific account' + schema: + type: string + - name: accountName + in: query + description: 'limit listing to a specific account' + schema: + type: string + - name: videoChannelId + in: query + description: 'limit listing to a specific video channel' + schema: + type: string + - name: videoChannelName + in: query + description: 'limit listing to a specific video channel' + schema: + type: string + - $ref: '#/components/parameters/sort' + - $ref: '#/components/parameters/nsfw' + - $ref: '#/components/parameters/isLocal' + - $ref: '#/components/parameters/include' + - $ref: '#/components/parameters/privacyOneOf' + - $ref: '#/components/parameters/hasHLSFiles' + - $ref: '#/components/parameters/hasWebtorrentFiles' + responses: + '204': + description: successful operation + headers: + Cache-Control: + schema: + type: string + default: 'max-age=900' # 15 min cache + content: + application/xml: + schema: + $ref: '#/components/schemas/VideosForXML' + examples: + nightly: + externalValue: https://peertube2.cpy.re/feeds/videos.xml?filter=local + application/rss+xml: + schema: + $ref: '#/components/schemas/VideosForXML' + examples: + nightly: + externalValue: https://peertube2.cpy.re/feeds/videos.rss?filter=local + text/xml: + schema: + $ref: '#/components/schemas/VideosForXML' + examples: + nightly: + externalValue: https://peertube2.cpy.re/feeds/videos.xml?filter=local + application/atom+xml: + schema: + $ref: '#/components/schemas/VideosForXML' + examples: + nightly: + externalValue: https://peertube2.cpy.re/feeds/videos.atom?filter=local + application/json: + schema: + type: object + examples: + nightly: + externalValue: https://peertube2.cpy.re/feeds/videos.json?filter=local + '404': + description: video channel or account not found + '406': + description: accept header unsupported + + '/feeds/subscriptions.{format}': + get: + tags: + - Video Feeds + summary: List videos of subscriptions tied to a token + operationId: getSyndicatedSubscriptionVideos + parameters: + - name: format + in: path + required: true + description: 'format expected (we focus on making `rss` the most featureful ; it serves [Media RSS](https://www.rssboard.org/media-rss))' + schema: + type: string + enum: + - xml + - rss + - rss2 + - atom + - atom1 + - json + - json1 + - name: accountId + in: query + description: limit listing to a specific account + schema: + type: string + required: true + - name: token + in: query + description: private token allowing access + schema: + type: string + required: true + - $ref: '#/components/parameters/sort' + - $ref: '#/components/parameters/nsfw' + - $ref: '#/components/parameters/isLocal' + - $ref: '#/components/parameters/include' + - $ref: '#/components/parameters/privacyOneOf' + - $ref: '#/components/parameters/hasHLSFiles' + - $ref: '#/components/parameters/hasWebtorrentFiles' + responses: + '204': + description: successful operation + headers: + Cache-Control: + schema: + type: string + default: 'max-age=900' # 15 min cache + content: + application/xml: + schema: + $ref: '#/components/schemas/VideosForXML' + application/rss+xml: + schema: + $ref: '#/components/schemas/VideosForXML' + text/xml: + schema: + $ref: '#/components/schemas/VideosForXML' + application/atom+xml: + schema: + $ref: '#/components/schemas/VideosForXML' + application/json: + schema: + type: object + '406': + description: accept header unsupported + + '/api/v1/accounts/{name}': get: tags: - Accounts @@ -363,7 +692,7 @@ paths: '404': description: account not found - '/accounts/{name}/videos': + '/api/v1/accounts/{name}/videos': get: tags: - Accounts @@ -430,7 +759,7 @@ paths: print(json) - '/accounts/{name}/followers': + '/api/v1/accounts/{name}/followers': get: tags: - Accounts @@ -460,7 +789,7 @@ paths: items: $ref: '#/components/schemas/Follow' - /accounts: + /api/v1/accounts: get: tags: - Accounts @@ -480,7 +809,7 @@ paths: items: $ref: '#/components/schemas/Account' - /config: + /api/v1/config: get: tags: - Config @@ -497,7 +826,7 @@ paths: nightly: externalValue: https://peertube2.cpy.re/api/v1/config - /config/about: + /api/v1/config/about: get: summary: Get instance "About" information operationId: getAbout @@ -514,7 +843,7 @@ paths: nightly: externalValue: https://peertube2.cpy.re/api/v1/config/about - /config/custom: + /api/v1/config/custom: get: summary: Get instance runtime configuration operationId: getCustomConfig @@ -559,7 +888,7 @@ paths: '200': description: successful operation - /custom-pages/homepage/instance: + /api/v1/custom-pages/homepage/instance: get: summary: Get instance custom homepage tags: @@ -593,7 +922,7 @@ paths: '204': description: successful operation - /jobs/pause: + /api/v1/jobs/pause: post: summary: Pause job queue security: @@ -605,7 +934,7 @@ paths: '204': description: successful operation - /jobs/resume: + /api/v1/jobs/resume: post: summary: Resume job queue security: @@ -617,7 +946,7 @@ paths: '204': description: successful operation - /jobs/{state}: + /api/v1/jobs/{state}: get: summary: List instance jobs operationId: getJobs @@ -661,7 +990,7 @@ paths: items: $ref: '#/components/schemas/Job' - /server/followers: + /api/v1/server/followers: get: tags: - Instance Follows @@ -688,7 +1017,7 @@ paths: items: $ref: '#/components/schemas/Follow' - '/server/followers/{nameWithHost}': + '/api/v1/server/followers/{nameWithHost}': delete: summary: Remove or reject a follower to your server security: @@ -710,7 +1039,7 @@ paths: '404': description: follower not found - '/server/followers/{nameWithHost}/reject': + '/api/v1/server/followers/{nameWithHost}/reject': post: summary: Reject a pending follower to your server security: @@ -732,7 +1061,7 @@ paths: '404': description: follower not found - '/server/followers/{nameWithHost}/accept': + '/api/v1/server/followers/{nameWithHost}/accept': post: summary: Accept a pending follower to your server security: @@ -754,7 +1083,7 @@ paths: '404': description: follower not found - /server/following: + /api/v1/server/following: get: tags: - Instance Follows @@ -810,7 +1139,7 @@ paths: type: string uniqueItems: true - '/server/following/{hostOrHandle}': + '/api/v1/server/following/{hostOrHandle}': delete: summary: Unfollow an actor (PeerTube instance, channel or account) security: @@ -831,7 +1160,7 @@ paths: '404': description: host or handle not found - /users: + /api/v1/users: post: summary: Create a user operationId: addUser @@ -898,7 +1227,7 @@ paths: items: $ref: '#/components/schemas/User' - '/users/{id}': + '/api/v1/users/{id}': parameters: - $ref: '#/components/parameters/id' delete: @@ -954,7 +1283,7 @@ paths: $ref: '#/components/schemas/UpdateUser' required: true - /oauth-clients/local: + /api/v1/oauth-clients/local: get: summary: Login prerequisite description: You need to retrieve a client id and secret before [logging in](#operation/getOAuthToken). @@ -982,7 +1311,7 @@ paths: ## AUTH curl -s "$API/oauth-clients/local" - /users/token: + /api/v1/users/token: post: summary: Login operationId: getOAuthToken @@ -1059,7 +1388,7 @@ paths: --data password="$PASSWORD" \ | jq -r ".access_token" - /users/revoke-token: + /api/v1/users/revoke-token: post: summary: Logout description: Revokes your access token and its associated refresh token, destroying your current session. @@ -1072,33 +1401,148 @@ paths: '200': description: successful operation - /users/register: + /api/v1/users/ask-send-verify-email: post: - summary: Register a user - operationId: registerUser + summary: Resend user verification link + operationId: resendEmailToVerifyUser + tags: + - Users + - Register + requestBody: + content: + application/json: + schema: + type: object + properties: + email: + type: string + description: User email + responses: + '204': + description: successful operation + + /api/v1/users/registrations/ask-send-verify-email: + post: + summary: Resend verification link to registration email + operationId: resendEmailToVerifyRegistration + tags: + - Register + requestBody: + content: + application/json: + schema: + type: object + properties: + email: + type: string + description: Registration email + responses: + '204': + description: successful operation + + /api/v1/users/{id}/verify-email: + post: + summary: Verify a user + operationId: verifyUser + description: | + Following a user registration, the new user will receive an email asking to click a link + containing a secret. + This endpoint can also be used to verify a new email set in the user account. tags: - Users - Register + parameters: + - $ref: '#/components/parameters/id' + requestBody: + content: + application/json: + schema: + type: object + properties: + verificationString: + type: string + format: url + isPendingEmail: + type: boolean + required: + - verificationString + responses: + '204': + description: successful operation + '403': + description: invalid verification string + '404': + description: user not found + + /api/v1/users/registrations/{registrationId}/verify-email: + post: + summary: Verify a registration email + operationId: verifyRegistrationEmail + description: | + Following a user registration request, the user will receive an email asking to click a link + containing a secret. + tags: + - Register + parameters: + - $ref: '#/components/parameters/registrationId' + requestBody: + content: + application/json: + schema: + type: object + properties: + verificationString: + type: string + format: url + required: + - verificationString responses: '204': description: successful operation + '403': + description: invalid verification string + '404': + description: registration not found + + /api/v1/users/{id}/two-factor/request: + post: + summary: Request two factor auth + operationId: requestTwoFactor + description: Request two factor authentication for a user + tags: + - Users + parameters: + - $ref: '#/components/parameters/id' requestBody: content: application/json: schema: - $ref: '#/components/schemas/RegisterUser' - required: true + type: object + properties: + currentPassword: + type: string + description: Password of the currently authenticated user + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/RequestTwoFactorResponse' + '403': + description: invalid password + '404': + description: user not found - /users/{id}/verify-email: + /api/v1/users/{id}/two-factor/confirm-request: post: - summary: Verify a user - operationId: verifyUser - description: | - Following a user registration, the new user will receive an email asking to click a link - containing a secret. + summary: Confirm two factor auth + operationId: confirmTwoFactorRequest + description: Confirm a two factor authentication request tags: - Users - - Register parameters: - $ref: '#/components/parameters/id' requestBody: @@ -1107,33 +1551,50 @@ paths: schema: type: object properties: - verificationString: + requestToken: type: string - format: url - isPendingEmail: - type: boolean + description: Token to identify the two factor request + otpToken: + type: string + description: OTP token generated by the app required: - - verificationString + - requestToken + - otpToken responses: '204': description: successful operation '403': - description: invalid verification string + description: invalid request token or OTP token '404': description: user not found - /users/ask-send-verify-email: + /api/v1/users/{id}/two-factor/disable: post: - summary: Resend user verification link - operationId: resendEmailToVerifyUser + summary: Disable two factor auth + operationId: disableTwoFactor + description: Disable two factor authentication of a user tags: - Users - - Register + parameters: + - $ref: '#/components/parameters/id' + requestBody: + content: + application/json: + schema: + type: object + properties: + currentPassword: + type: string + description: Password of the currently authenticated user responses: '204': description: successful operation + '403': + description: invalid password + '404': + description: user not found - /users/me: + /api/v1/users/me: get: summary: Get my user information operationId: getUserInfo @@ -1169,7 +1630,7 @@ paths: $ref: '#/components/schemas/UpdateMe' required: true - /users/me/videos/imports: + /api/v1/users/me/videos/imports: get: summary: Get video imports of my user security: @@ -1182,6 +1643,27 @@ paths: - $ref: '#/components/parameters/start' - $ref: '#/components/parameters/count' - $ref: '#/components/parameters/sort' + - + name: targetUrl + in: query + required: false + description: Filter on import target URL + schema: + type: string + - + name: videoChannelSyncId + in: query + required: false + description: Filter on imports created by a specific channel synchronization + schema: + type: number + - + name: search + in: query + required: false + description: Search in video names + schema: + type: string responses: '200': description: successful operation @@ -1190,7 +1672,7 @@ paths: schema: $ref: '#/components/schemas/VideoImportsList' - /users/me/video-quota-used: + /api/v1/users/me/video-quota-used: get: summary: Get my user used quota security: @@ -1215,7 +1697,7 @@ paths: description: The user video quota used today in bytes example: 1681014151 - '/users/me/videos/{videoId}/rating': + '/api/v1/users/me/videos/{videoId}/rating': get: summary: Get rate of my user for a video security: @@ -1238,7 +1720,7 @@ paths: schema: $ref: '#/components/schemas/GetMeVideoRating' - /users/me/videos: + /api/v1/users/me/videos: get: summary: Get videos of my user security: @@ -1259,7 +1741,7 @@ paths: schema: $ref: '#/components/schemas/VideoListResponse' - /users/me/subscriptions: + /api/v1/users/me/subscriptions: get: summary: Get my user subscriptions security: @@ -1305,7 +1787,7 @@ paths: '200': description: successful operation - /users/me/subscriptions/exist: + /api/v1/users/me/subscriptions/exist: get: summary: Get if subscriptions exist for my user security: @@ -1323,7 +1805,7 @@ paths: schema: type: object - /users/me/subscriptions/videos: + /api/v1/users/me/subscriptions/videos: get: summary: List videos of subscriptions of my user security: @@ -1357,7 +1839,7 @@ paths: schema: $ref: '#/components/schemas/VideoListResponse' - '/users/me/subscriptions/{subscriptionHandle}': + '/api/v1/users/me/subscriptions/{subscriptionHandle}': get: summary: Get subscription of my user security: @@ -1387,7 +1869,7 @@ paths: '200': description: successful operation - /users/me/notifications: + /api/v1/users/me/notifications: get: summary: List my notifications security: @@ -1411,7 +1893,7 @@ paths: schema: $ref: '#/components/schemas/NotificationListResponse' - /users/me/notifications/read: + /api/v1/users/me/notifications/read: post: summary: Mark notifications as read by their id security: @@ -1435,7 +1917,7 @@ paths: '204': description: successful operation - /users/me/notifications/read-all: + /api/v1/users/me/notifications/read-all: post: summary: Mark all my notification as read security: @@ -1446,7 +1928,7 @@ paths: '204': description: successful operation - /users/me/notification-settings: + /api/v1/users/me/notification-settings: put: summary: Update my notification settings security: @@ -1487,7 +1969,7 @@ paths: '204': description: successful operation - /users/me/history/videos: + /api/v1/users/me/history/videos: get: summary: List watched videos history security: @@ -1506,7 +1988,7 @@ paths: schema: $ref: '#/components/schemas/VideoListResponse' - /users/me/history/videos/{videoId}: + /api/v1/users/me/history/videos/{videoId}: delete: summary: Delete history element security: @@ -1523,7 +2005,7 @@ paths: '204': description: successful operation - /users/me/history/videos/remove: + /api/v1/users/me/history/videos/remove: post: summary: Clear video history security: @@ -1544,7 +2026,7 @@ paths: '204': description: successful operation - /users/me/avatar/pick: + /api/v1/users/me/avatar/pick: post: summary: Update my user avatar security: @@ -1585,7 +2067,7 @@ paths: avatarfile: contentType: image/png, image/jpeg - /users/me/avatar: + /api/v1/users/me/avatar: delete: summary: Delete my avatar security: @@ -1596,7 +2078,147 @@ paths: '204': description: successful operation - /videos/ownership: + /api/v1/users/register: + post: + summary: Register a user + operationId: registerUser + description: Signup has to be enabled and signup approval is not required + tags: + - Register + responses: + '204': + description: successful operation + '400': + description: request error + '403': + description: user registration is not enabled, user limit is reached, registration is not allowed for the ip, requires approval or blocked by a plugin + '409': + description: 'a user with this username, channel name or email already exists' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RegisterUser' + required: true + + /api/v1/users/registrations/request: + post: + summary: Request registration + description: Signup has to be enabled and require approval on the instance + operationId: requestRegistration + tags: + - Register + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/UserRegistration' + '400': + description: request error or signup approval is not enabled on the instance + '403': + description: user registration is not enabled, user limit is reached, registration is not allowed for the ip or blocked by a plugin + '409': + description: 'a user or registration with this username, channel name or email already exists' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserRegistrationRequest' + + /api/v1/users/registrations/{registrationId}/accept: + post: + security: + - OAuth2: + - admin + - moderator + summary: Accept registration + operationId: acceptRegistration + tags: + - Register + parameters: + - $ref: '#/components/parameters/registrationId' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserRegistrationAcceptOrReject' + responses: + '204': + description: successful operation + + /api/v1/users/registrations/{registrationId}/reject: + post: + security: + - OAuth2: + - admin + - moderator + summary: Reject registration + operationId: rejectRegistration + tags: + - Register + parameters: + - $ref: '#/components/parameters/registrationId' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserRegistrationAcceptOrReject' + responses: + '204': + description: successful operation + + /api/v1/users/registrations/{registrationId}: + delete: + security: + - OAuth2: + - admin + - moderator + summary: Delete registration + description: 'Delete the registration entry. It will not remove the user associated with this registration (if any)' + operationId: deleteRegistration + tags: + - Register + parameters: + - $ref: '#/components/parameters/registrationId' + responses: + '204': + description: successful operation + + /api/v1/users/registrations: + get: + security: + - OAuth2: + - admin + - moderator + summary: List registrations + operationId: listRegistrations + tags: + - Register + parameters: + - $ref: '#/components/parameters/start' + - $ref: '#/components/parameters/count' + - name: search + in: query + required: false + schema: + type: string + - name: sort + in: query + required: false + schema: + type: string + enum: + - -createdAt + - createdAt + - state + - -state + responses: + '204': + description: successful operation + + /api/v1/videos/ownership: get: summary: List video ownership changes tags: @@ -1607,7 +2229,7 @@ paths: '200': description: successful operation - '/videos/ownership/{id}/accept': + '/api/v1/videos/ownership/{id}/accept': post: summary: Accept ownership change request tags: @@ -1624,7 +2246,7 @@ paths: '404': description: video ownership change not found - '/videos/ownership/{id}/refuse': + '/api/v1/videos/ownership/{id}/refuse': post: summary: Refuse ownership change request tags: @@ -1641,7 +2263,7 @@ paths: '404': description: video ownership change not found - '/videos/{id}/give-ownership': + '/api/v1/videos/{id}/give-ownership': post: summary: Request ownership change tags: @@ -1669,7 +2291,55 @@ paths: '404': description: video not found - /videos: + '/api/v1/videos/{id}/token': + post: + summary: Request video token + operationId: requestVideoToken + description: Request special tokens that expire quickly to use them in some context (like accessing private static files) + tags: + - Video + security: + - OAuth2: [] + parameters: + - $ref: '#/components/parameters/idOrUUID' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/VideoTokenResponse' + '400': + description: incorrect parameters + '404': + description: video not found + + /api/v1/videos/{id}/studio/edit: + post: + summary: Create a studio task + tags: + - Video Transcoding + - Video + description: Create a task to edit a video (cut, add intro/outro etc) + security: + - OAuth2: [] + parameters: + - $ref: '#/components/parameters/idOrUUID' + requestBody: + required: true + content: + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VideoStudioCreateTask' + responses: + '204': + description: successful operation + '400': + description: incorrect parameters + '404': + description: video not found + + /api/v1/videos: get: summary: List videos operationId: getVideos @@ -1700,7 +2370,7 @@ paths: schema: $ref: '#/components/schemas/VideoListResponse' - /videos/categories: + /api/v1/videos/categories: get: summary: List available video categories operationId: getCategories @@ -1719,7 +2389,7 @@ paths: nightly: externalValue: https://peertube2.cpy.re/api/v1/videos/categories - /videos/licences: + /api/v1/videos/licences: get: summary: List available video licences operationId: getLicences @@ -1738,7 +2408,7 @@ paths: nightly: externalValue: https://peertube2.cpy.re/api/v1/videos/licences - /videos/languages: + /api/v1/videos/languages: get: summary: List available video languages operationId: getLanguages @@ -1757,7 +2427,7 @@ paths: nightly: externalValue: https://peertube2.cpy.re/api/v1/videos/languages - /videos/privacies: + /api/v1/videos/privacies: get: summary: List available video privacy policies operationId: getPrivacyPolicies @@ -1776,7 +2446,7 @@ paths: nightly: externalValue: https://peertube2.cpy.re/api/v1/videos/privacies - '/videos/{id}': + '/api/v1/videos/{id}': put: summary: Update a video operationId: putVideo @@ -1882,7 +2552,7 @@ paths: '204': description: successful operation - '/videos/{id}/description': + '/api/v1/videos/{id}/description': get: summary: Get complete video description operationId: getVideoDesc @@ -1903,7 +2573,7 @@ paths: example: | **[Want to help to translate this video?](https://weblate.framasoft.org/projects/what-is-peertube-video/)**\r\n\r\n**Take back the control of your videos! [#JoinPeertube](https://joinpeertube.org)** - '/videos/{id}/source': + '/api/v1/videos/{id}/source': post: summary: Get video source file metadata operationId: getVideoSource @@ -1919,7 +2589,7 @@ paths: schema: $ref: '#/components/schemas/VideoSource' - '/videos/{id}/views': + '/api/v1/videos/{id}/views': post: summary: Notify user is watching a video description: Call this endpoint regularly (every 5-10 seconds for example) to notify the server the user is watching the video. After a while, PeerTube will increase video's viewers counter. If the user is authenticated, PeerTube will also store the current player time. @@ -1938,7 +2608,7 @@ paths: '204': description: successful operation - '/videos/{id}/watching': + '/api/v1/videos/{id}/watching': put: summary: Set watching progress of a video deprecated: true @@ -1959,7 +2629,7 @@ paths: '204': description: successful operation - '/videos/{id}/stats/overall': + '/api/v1/videos/{id}/stats/overall': get: summary: Get overall stats of a video tags: @@ -1988,7 +2658,7 @@ paths: schema: $ref: '#/components/schemas/VideoStatsOverall' - '/videos/{id}/stats/retention': + '/api/v1/videos/{id}/stats/retention': get: summary: Get retention stats of a video tags: @@ -2005,7 +2675,7 @@ paths: schema: $ref: '#/components/schemas/VideoStatsRetention' - '/videos/{id}/stats/timeseries/{metric}': + '/api/v1/videos/{id}/stats/timeseries/{metric}': get: summary: Get timeserie stats of a video tags: @@ -2044,7 +2714,7 @@ paths: schema: $ref: '#/components/schemas/VideoStatsTimeserie' - /videos/upload: + /api/v1/videos/upload: post: summary: Upload a video description: Uses a single request to upload a video. @@ -2122,7 +2792,7 @@ paths: --form channelId=$CHANNEL_ID \ --form name="$NAME" - /videos/upload-resumable: + /api/v1/videos/upload-resumable: post: summary: Initialize the resumable upload of a video description: Uses [a resumable protocol](https://github.com/kukhariev/node-uploadx/blob/master/proto.md) to initialize the upload of a video @@ -2296,7 +2966,7 @@ paths: '404': description: upload not found - /videos/imports: + /api/v1/videos/imports: post: summary: Import a video description: Import a torrent or magnetURI or HTTP resource (if enabled by the instance administrator) @@ -2332,7 +3002,7 @@ paths: '409': description: HTTP or Torrent/magnetURI import not enabled - /videos/imports/{id}/cancel: + /api/v1/videos/imports/{id}/cancel: post: summary: Cancel video import description: Cancel a pending video import @@ -2346,7 +3016,7 @@ paths: '204': description: successful operation - /videos/imports/{id}: + /api/v1/videos/imports/{id}: delete: summary: Delete video import description: Delete ended video import @@ -2360,7 +3030,7 @@ paths: '204': description: successful operation - /videos/live: + /api/v1/videos/live: post: summary: Create a live operationId: addLive @@ -2462,7 +3132,7 @@ paths: previewfile: contentType: image/jpeg - /videos/live/{id}: + /api/v1/videos/live/{id}: get: summary: Get information about a live operationId: getLiveId @@ -2502,7 +3172,7 @@ paths: description: bad parameters or trying to update a live that has already started '403': description: trying to save replay of the live but saving replay is not enabled on the instance - /videos/live/{id}/sessions: + /api/v1/videos/live/{id}/sessions: get: summary: List live sessions description: List all sessions created in a particular live @@ -2527,7 +3197,7 @@ paths: type: array items: $ref: '#/components/schemas/LiveVideoSessionResponse' - /videos/{id}/live-session: + /api/v1/videos/{id}/live-session: get: summary: Get live session of a replay description: If the video is a replay of a live, you can find the associated live session using this endpoint @@ -2545,7 +3215,7 @@ paths: schema: $ref: '#/components/schemas/LiveVideoSessionResponse' - /users/me/abuses: + /api/v1/users/me/abuses: get: summary: List my abuses operationId: getMyAbuses @@ -2583,7 +3253,7 @@ paths: items: $ref: '#/components/schemas/Abuse' - /abuses: + /api/v1/abuses: get: summary: List abuses operationId: getAbuses @@ -2736,7 +3406,7 @@ paths: '400': description: incorrect request parameters - '/abuses/{abuseId}': + '/api/v1/abuses/{abuseId}': put: summary: Update an abuse security: @@ -2781,7 +3451,7 @@ paths: '404': description: block not found - '/abuses/{abuseId}/messages': + '/api/v1/abuses/{abuseId}/messages': get: summary: List messages of an abuse security: @@ -2833,7 +3503,7 @@ paths: '400': description: incorrect request parameters - '/abuses/{abuseId}/messages/{abuseMessageId}': + '/api/v1/abuses/{abuseId}/messages/{abuseMessageId}': delete: summary: Delete an abuse message security: @@ -2847,7 +3517,7 @@ paths: '204': description: successful operation - '/videos/{id}/blacklist': + '/api/v1/videos/{id}/blacklist': post: summary: Block a video operationId: addVideoBlock @@ -2879,7 +3549,7 @@ paths: '404': description: block not found - /videos/blacklist: + /api/v1/videos/blacklist: get: tags: - Video Blocks @@ -2927,7 +3597,7 @@ paths: items: $ref: '#/components/schemas/VideoBlacklist' - /videos/{id}/captions: + /api/v1/videos/{id}/captions: get: summary: List captions of a video operationId: getVideoCaptions @@ -2951,7 +3621,7 @@ paths: items: $ref: '#/components/schemas/VideoCaption' - /videos/{id}/captions/{captionLanguage}: + /api/v1/videos/{id}/captions/{captionLanguage}: put: summary: Add or replace a video caption operationId: addVideoCaption @@ -2998,7 +3668,7 @@ paths: '404': description: video or language or caption for that language not found - /video-channels: + /api/v1/video-channels: get: summary: List video channels operationId: getVideoChannels @@ -3023,7 +3693,7 @@ paths: tags: - Video Channels responses: - '204': + '200': description: successful operation content: application/json: @@ -3041,7 +3711,7 @@ paths: schema: $ref: '#/components/schemas/VideoChannelCreate' - '/video-channels/{channelHandle}': + '/api/v1/video-channels/{channelHandle}': get: summary: Get a video channel operationId: getVideoChannel @@ -3086,7 +3756,7 @@ paths: '204': description: successful operation - '/video-channels/{channelHandle}/videos': + '/api/v1/video-channels/{channelHandle}/videos': get: summary: List videos of a video channel operationId: getVideoChannelVideos @@ -3119,7 +3789,7 @@ paths: schema: $ref: '#/components/schemas/VideoListResponse' - '/video-channels/{channelHandle}/followers': + '/api/v1/video-channels/{channelHandle}/followers': get: tags: - Video Channels @@ -3149,7 +3819,7 @@ paths: items: $ref: '#/components/schemas/Follow' - '/video-channels/{channelHandle}/avatar/pick': + '/api/v1/video-channels/{channelHandle}/avatar/pick': post: summary: Update channel avatar security: @@ -3192,7 +3862,7 @@ paths: avatarfile: contentType: image/png, image/jpeg - '/video-channels/{channelHandle}/avatar': + '/api/v1/video-channels/{channelHandle}/avatar': delete: summary: Delete channel avatar security: @@ -3205,7 +3875,7 @@ paths: '204': description: successful operation - '/video-channels/{channelHandle}/banner/pick': + '/api/v1/video-channels/{channelHandle}/banner/pick': post: summary: Update channel banner security: @@ -3248,20 +3918,93 @@ paths: bannerfile: contentType: image/png, image/jpeg - '/video-channels/{channelHandle}/banner': - delete: - summary: Delete channel banner + '/api/v1/video-channels/{channelHandle}/banner': + delete: + summary: Delete channel banner + security: + - OAuth2: [] + tags: + - Video Channels + parameters: + - $ref: '#/components/parameters/channelHandle' + responses: + '204': + description: successful operation + + '/api/v1/video-channels/{channelHandle}/import-videos': + post: + summary: Import videos in channel + description: Import a remote channel/playlist videos into a channel + security: + - OAuth2: [] + tags: + - Video Channels + - Channels Sync + parameters: + - $ref: '#/components/parameters/channelHandle' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ImportVideosInChannelCreate' + responses: + '204': + description: successful operation + + '/api/v1/video-channel-syncs': + post: + summary: Create a synchronization for a video channel + operationId: addVideoChannelSync + security: + - OAuth2: [] + tags: + - Channels Sync + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VideoChannelSyncCreate' + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + properties: + videoChannelSync: + $ref: "#/components/schemas/VideoChannelSync" + + '/api/v1/video-channel-syncs/{channelSyncId}': + delete: + summary: Delete a video channel synchronization + operationId: delVideoChannelSync + security: + - OAuth2: [] + tags: + - Channels Sync + parameters: + - $ref: '#/components/parameters/channelSyncId' + responses: + '204': + description: successful operation + + '/api/v1/video-channel-syncs/{channelSyncId}/sync': + post: + summary: Triggers the channel synchronization job, fetching all the videos from the remote channel + operationId: triggerVideoChannelSync security: - OAuth2: [] tags: - - Video Channels + - Channels Sync parameters: - - $ref: '#/components/parameters/channelHandle' + - $ref: '#/components/parameters/channelSyncId' responses: '204': description: successful operation - /video-playlists/privacies: + + /api/v1/video-playlists/privacies: get: summary: List available playlist privacy policies operationId: getPlaylistPrivacyPolicies @@ -3280,7 +4023,7 @@ paths: nightly: externalValue: https://peertube2.cpy.re/api/v1/video-playlists/privacies - /video-playlists: + /api/v1/video-playlists: get: summary: List video playlists operationId: getPlaylists @@ -3362,7 +4105,7 @@ paths: thumbnailfile: contentType: image/jpeg - /video-playlists/{playlistId}: + /api/v1/video-playlists/{playlistId}: get: summary: Get a video playlist tags: @@ -3427,7 +4170,7 @@ paths: '204': description: successful operation - /video-playlists/{playlistId}/videos: + /api/v1/video-playlists/{playlistId}/videos: get: summary: 'List videos of a playlist' operationId: getVideoPlaylistVideos @@ -3491,7 +4234,7 @@ paths: required: - videoId - /video-playlists/{playlistId}/videos/reorder: + /api/v1/video-playlists/{playlistId}/videos/reorder: post: summary: 'Reorder a playlist' operationId: reorderVideoPlaylist @@ -3526,7 +4269,7 @@ paths: - startPosition - insertAfterPosition - /video-playlists/{playlistId}/videos/{playlistElementId}: + /api/v1/video-playlists/{playlistId}/videos/{playlistElementId}: put: summary: Update a playlist element operationId: putVideoPlaylistVideo @@ -3568,7 +4311,7 @@ paths: '204': description: successful operation - '/users/me/video-playlists/videos-exist': + '/api/v1/users/me/video-playlists/videos-exist': get: summary: Check video exists in my playlists security: @@ -3608,7 +4351,7 @@ paths: type: integer format: seconds - '/accounts/{name}/video-channels': + '/api/v1/accounts/{name}/video-channels': get: summary: List video channels of an account tags: @@ -3632,7 +4375,27 @@ paths: schema: $ref: '#/components/schemas/VideoChannelList' - '/accounts/{name}/ratings': + '/api/v1/accounts/{name}/video-channel-syncs': + get: + summary: List the synchronizations of video channels of an account + tags: + - Video Channels + - Channels Sync + - Accounts + parameters: + - $ref: '#/components/parameters/name' + - $ref: '#/components/parameters/start' + - $ref: '#/components/parameters/count' + - $ref: '#/components/parameters/sort' + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/VideoChannelSyncList' + + '/api/v1/accounts/{name}/ratings': get: summary: List ratings of an account security: @@ -3663,7 +4426,7 @@ paths: items: $ref: '#/components/schemas/VideoRating' - '/videos/{id}/comment-threads': + '/api/v1/videos/{id}/comment-threads': get: summary: List threads of a video tags: @@ -3711,7 +4474,7 @@ paths: required: - text - '/videos/{id}/comment-threads/{threadId}': + '/api/v1/videos/{id}/comment-threads/{threadId}': get: summary: Get a thread tags: @@ -3727,7 +4490,7 @@ paths: schema: $ref: '#/components/schemas/VideoCommentThreadTree' - '/videos/{id}/comments/{commentId}': + '/api/v1/videos/{id}/comments/{commentId}': post: summary: Reply to a thread of a video security: @@ -3778,7 +4541,7 @@ paths: '409': description: comment is already deleted - '/videos/{id}/rate': + '/api/v1/videos/{id}/rate': put: summary: Like/dislike a video security: @@ -3806,7 +4569,7 @@ paths: '404': description: video does not exist - '/videos/{id}/hls': + '/api/v1/videos/{id}/hls': delete: summary: Delete video HLS files security: @@ -3822,7 +4585,7 @@ paths: description: successful operation '404': description: video does not exist - '/videos/{id}/webtorrent': + '/api/v1/videos/{id}/webtorrent': delete: summary: Delete video WebTorrent files security: @@ -3839,7 +4602,7 @@ paths: '404': description: video does not exist - '/videos/{id}/transcoding': + '/api/v1/videos/{id}/transcoding': post: summary: Create a transcoding job security: @@ -3869,7 +4632,7 @@ paths: '404': description: video does not exist - /search/videos: + /api/v1/search/videos: get: tags: - Search @@ -3896,6 +4659,7 @@ paths: - $ref: '#/components/parameters/isLocal' - $ref: '#/components/parameters/include' - $ref: '#/components/parameters/privacyOneOf' + - $ref: '#/components/parameters/uuids' - $ref: '#/components/parameters/hasHLSFiles' - $ref: '#/components/parameters/hasWebtorrentFiles' - $ref: '#/components/parameters/skipCount' @@ -3950,7 +4714,7 @@ paths: '500': description: search index unavailable - /search/video-channels: + /api/v1/search/video-channels: get: tags: - Search @@ -3983,7 +4747,7 @@ paths: '500': description: search index unavailable - /search/video-playlists: + /api/v1/search/video-playlists: get: tags: - Search @@ -4024,7 +4788,7 @@ paths: '500': description: search index unavailable - /blocklist/status: + /api/v1/blocklist/status: get: tags: - Account Blocks @@ -4057,7 +4821,7 @@ paths: schema: $ref: '#/components/schemas/BlockStatus' - /server/blocklist/accounts: + /api/v1/server/blocklist/accounts: get: tags: - Account Blocks @@ -4097,7 +4861,7 @@ paths: '409': description: self-blocking forbidden - '/server/blocklist/accounts/{accountName}': + '/api/v1/server/blocklist/accounts/{accountName}': delete: tags: - Account Blocks @@ -4118,7 +4882,7 @@ paths: '404': description: account or account block does not exist - /server/blocklist/servers: + /api/v1/server/blocklist/servers: get: tags: - Server Blocks @@ -4158,7 +4922,7 @@ paths: '409': description: self-blocking forbidden - '/server/blocklist/servers/{host}': + '/api/v1/server/blocklist/servers/{host}': delete: tags: - Server Blocks @@ -4180,376 +4944,189 @@ paths: '404': description: account block does not exist - /server/redundancy/{host}: + /api/v1/server/redundancy/{host}: put: tags: - Instance Redundancy summary: Update a server redundancy policy security: - OAuth2: - - admin - parameters: - - name: host - in: path - required: true - description: server domain to mirror - schema: - type: string - format: hostname - requestBody: - content: - application/json: - schema: - type: object - properties: - redundancyAllowed: - type: boolean - description: allow mirroring of the host's local videos - required: - - redundancyAllowed - responses: - '204': - description: successful operation - '404': - description: server is not already known - - /server/redundancy/videos: - get: - tags: - - Video Mirroring - summary: List videos being mirrored - operationId: getMirroredVideos - security: - - OAuth2: - - admin - parameters: - - name: target - in: query - required: true - description: direction of the mirror - schema: - type: string - enum: - - my-videos - - remote-videos - - $ref: '#/components/parameters/start' - - $ref: '#/components/parameters/count' - - $ref: '#/components/parameters/videoRedundanciesSort' - responses: - '200': - description: successful operation - content: - application/json: - schema: - type: array - items: - $ref: '#/components/schemas/VideoRedundancy' - post: - tags: - - Video Mirroring - summary: Mirror a video - operationId: putMirroredVideo - security: - - OAuth2: - - admin - requestBody: - content: - application/json: - schema: - type: object - properties: - videoId: - $ref: '#/components/schemas/Video/properties/id' - required: - - videoId - responses: - '204': - description: successful operation - '400': - description: cannot mirror a local video - '404': - description: video does not exist - '409': - description: video is already mirrored - - /server/redundancy/videos/{redundancyId}: - delete: - tags: - - Video Mirroring - summary: Delete a mirror done on a video - operationId: delMirroredVideo - security: - - OAuth2: - - admin - parameters: - - name: redundancyId - in: path - required: true - description: id of an existing redundancy on a video - schema: - type: string - responses: - '204': - description: successful operation - '404': - description: video redundancy not found - - '/feeds/video-comments.{format}': - get: - tags: - - Feeds - summary: List comments on videos - operationId: getSyndicatedComments - parameters: - - name: format - in: path - required: true - description: 'format expected (we focus on making `rss` the most featureful ; it serves [Media RSS](https://www.rssboard.org/media-rss))' - schema: - type: string - enum: - - xml - - rss - - rss2 - - atom - - atom1 - - json - - json1 - - name: videoId - in: query - description: 'limit listing to a specific video' - schema: - type: string - - name: accountId - in: query - description: 'limit listing to a specific account' - schema: - type: string - - name: accountName - in: query - description: 'limit listing to a specific account' - schema: - type: string - - name: videoChannelId - in: query - description: 'limit listing to a specific video channel' - schema: - type: string - - name: videoChannelName - in: query - description: 'limit listing to a specific video channel' - schema: - type: string - responses: - '204': - description: successful operation - headers: - Cache-Control: - schema: - type: string - default: 'max-age=900' # 15 min cache - content: - application/xml: - schema: - $ref: '#/components/schemas/VideoCommentsForXML' - examples: - nightly: - externalValue: https://peertube2.cpy.re/feeds/video-comments.xml?filter=local - application/rss+xml: - schema: - $ref: '#/components/schemas/VideoCommentsForXML' - examples: - nightly: - externalValue: https://peertube2.cpy.re/feeds/video-comments.rss?filter=local - text/xml: - schema: - $ref: '#/components/schemas/VideoCommentsForXML' - examples: - nightly: - externalValue: https://peertube2.cpy.re/feeds/video-comments.xml?filter=local - application/atom+xml: - schema: - $ref: '#/components/schemas/VideoCommentsForXML' - examples: - nightly: - externalValue: https://peertube2.cpy.re/feeds/video-comments.atom?filter=local - application/json: - schema: - type: object - examples: - nightly: - externalValue: https://peertube2.cpy.re/feeds/video-comments.json?filter=local - '400': - x-summary: field inconsistencies - description: > - Arises when: - - videoId filter is mixed with a channel filter - '404': - description: video, video channel or account not found - '406': - description: accept header unsupported - - '/feeds/videos.{format}': - get: - tags: - - Feeds - summary: List videos - operationId: getSyndicatedVideos - parameters: - - name: format - in: path - required: true - description: 'format expected (we focus on making `rss` the most featureful ; it serves [Media RSS](https://www.rssboard.org/media-rss))' - schema: - type: string - enum: - - xml - - rss - - rss2 - - atom - - atom1 - - json - - json1 - - name: accountId - in: query - description: 'limit listing to a specific account' - schema: - type: string - - name: accountName - in: query - description: 'limit listing to a specific account' - schema: - type: string - - name: videoChannelId - in: query - description: 'limit listing to a specific video channel' + - admin + parameters: + - name: host + in: path + required: true + description: server domain to mirror schema: type: string - - name: videoChannelName + format: hostname + requestBody: + content: + application/json: + schema: + type: object + properties: + redundancyAllowed: + type: boolean + description: allow mirroring of the host's local videos + required: + - redundancyAllowed + responses: + '204': + description: successful operation + '404': + description: server is not already known + + /api/v1/server/redundancy/videos: + get: + tags: + - Video Mirroring + summary: List videos being mirrored + operationId: getMirroredVideos + security: + - OAuth2: + - admin + parameters: + - name: target in: query - description: 'limit listing to a specific video channel' + required: true + description: direction of the mirror schema: type: string - - $ref: '#/components/parameters/sort' - - $ref: '#/components/parameters/nsfw' - - $ref: '#/components/parameters/isLocal' - - $ref: '#/components/parameters/include' - - $ref: '#/components/parameters/privacyOneOf' - - $ref: '#/components/parameters/hasHLSFiles' - - $ref: '#/components/parameters/hasWebtorrentFiles' + enum: + - my-videos + - remote-videos + - $ref: '#/components/parameters/start' + - $ref: '#/components/parameters/count' + - $ref: '#/components/parameters/videoRedundanciesSort' responses: - '204': + '200': description: successful operation - headers: - Cache-Control: - schema: - type: string - default: 'max-age=900' # 15 min cache content: - application/xml: - schema: - $ref: '#/components/schemas/VideosForXML' - examples: - nightly: - externalValue: https://peertube2.cpy.re/feeds/videos.xml?filter=local - application/rss+xml: - schema: - $ref: '#/components/schemas/VideosForXML' - examples: - nightly: - externalValue: https://peertube2.cpy.re/feeds/videos.rss?filter=local - text/xml: - schema: - $ref: '#/components/schemas/VideosForXML' - examples: - nightly: - externalValue: https://peertube2.cpy.re/feeds/videos.xml?filter=local - application/atom+xml: - schema: - $ref: '#/components/schemas/VideosForXML' - examples: - nightly: - externalValue: https://peertube2.cpy.re/feeds/videos.atom?filter=local application/json: schema: - type: object - examples: - nightly: - externalValue: https://peertube2.cpy.re/feeds/videos.json?filter=local + type: array + items: + $ref: '#/components/schemas/VideoRedundancy' + post: + tags: + - Video Mirroring + summary: Mirror a video + operationId: putMirroredVideo + security: + - OAuth2: + - admin + requestBody: + content: + application/json: + schema: + type: object + properties: + videoId: + $ref: '#/components/schemas/Video/properties/id' + required: + - videoId + responses: + '204': + description: successful operation + '400': + description: cannot mirror a local video '404': - description: video channel or account not found - '406': - description: accept header unsupported + description: video does not exist + '409': + description: video is already mirrored - '/feeds/subscriptions.{format}': - get: + /api/v1/server/redundancy/videos/{redundancyId}: + delete: tags: - - Feeds - - Account - summary: List videos of subscriptions tied to a token - operationId: getSyndicatedSubscriptionVideos + - Video Mirroring + summary: Delete a mirror done on a video + operationId: delMirroredVideo + security: + - OAuth2: + - admin parameters: - - name: format + - name: redundancyId in: path required: true - description: 'format expected (we focus on making `rss` the most featureful ; it serves [Media RSS](https://www.rssboard.org/media-rss))' - schema: - type: string - enum: - - xml - - rss - - rss2 - - atom - - atom1 - - json - - json1 - - name: accountId - in: query - description: limit listing to a specific account - schema: - type: string - required: true - - name: token - in: query - description: private token allowing access + description: id of an existing redundancy on a video schema: type: string - required: true - - $ref: '#/components/parameters/sort' - - $ref: '#/components/parameters/nsfw' - - $ref: '#/components/parameters/isLocal' - - $ref: '#/components/parameters/include' - - $ref: '#/components/parameters/privacyOneOf' - - $ref: '#/components/parameters/hasHLSFiles' - - $ref: '#/components/parameters/hasWebtorrentFiles' responses: '204': description: successful operation - headers: - Cache-Control: - schema: - type: string - default: 'max-age=900' # 15 min cache + '404': + description: video redundancy not found + + /api/v1/server/stats: + get: + tags: + - Stats + summary: Get instance stats + description: Get instance public statistics. This endpoint is cached. + operationId: getInstanceStats + responses: + '200': + description: successful operation content: - application/xml: - schema: - $ref: '#/components/schemas/VideosForXML' - application/rss+xml: - schema: - $ref: '#/components/schemas/VideosForXML' - text/xml: + application/json: schema: - $ref: '#/components/schemas/VideosForXML' - application/atom+xml: + $ref: '#/components/schemas/ServerStats' + + /api/v1/server/logs/client: + post: + tags: + - Logs + summary: Send client log + operationId: sendClientLog + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/SendClientLog' + responses: + '204': + description: successful operation + + /api/v1/server/logs: + get: + tags: + - Logs + summary: Get instance logs + operationId: getInstanceLogs + security: + - OAuth2: + - admin + responses: + '200': + description: successful operation + content: + application/json: schema: - $ref: '#/components/schemas/VideosForXML' + type: array + items: + type: string + + /api/v1/server/audit-logs: + get: + tags: + - Logs + summary: Get instance audit logs + operationId: getInstanceAuditLogs + security: + - OAuth2: + - admin + responses: + '200': + description: successful operation + content: application/json: schema: - type: object - '406': - description: accept header unsupported + type: array + items: + type: string - /plugins: + /api/v1/plugins: get: tags: - Plugins @@ -4578,7 +5155,7 @@ paths: schema: $ref: '#/components/schemas/PluginResponse' - /plugins/available: + /api/v1/plugins/available: get: tags: - Plugins @@ -4613,7 +5190,7 @@ paths: '503': description: plugin index unavailable - /plugins/install: + /api/v1/plugins/install: post: tags: - Plugins @@ -4648,7 +5225,7 @@ paths: '400': description: should have either `npmName` or `path` set - /plugins/update: + /api/v1/plugins/update: post: tags: - Plugins @@ -4685,7 +5262,7 @@ paths: '404': description: existing plugin not found - /plugins/uninstall: + /api/v1/plugins/uninstall: post: tags: - Plugins @@ -4712,7 +5289,7 @@ paths: '404': description: existing plugin not found - /plugins/{npmName}: + /api/v1/plugins/{npmName}: get: tags: - Plugins @@ -4733,7 +5310,7 @@ paths: '404': description: plugin not found - /plugins/{npmName}/settings: + /api/v1/plugins/{npmName}/settings: put: tags: - Plugins @@ -4758,7 +5335,7 @@ paths: '404': description: plugin not found - /plugins/{npmName}/public-settings: + /api/v1/plugins/{npmName}/public-settings: get: tags: - Plugins @@ -4776,7 +5353,7 @@ paths: '404': description: plugin not found - /plugins/{npmName}/registered-settings: + /api/v1/plugins/{npmName}/registered-settings: get: tags: - Plugins @@ -4797,12 +5374,27 @@ paths: '404': description: plugin not found + /api/v1/metrics/playback: + post: + summary: Create playback metrics + description: These metrics are exposed by OpenTelemetry metrics exporter if enabled. + tags: + - Stats + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PlaybackMetricCreate' + responses: + '204': + description: successful operation + servers: - - url: 'https://peertube2.cpy.re/api/v1' + - url: 'https://peertube2.cpy.re' description: Live Test Server (live data - latest nightly version) - - url: 'https://peertube3.cpy.re/api/v1' + - url: 'https://peertube3.cpy.re' description: Live Test Server (live data - latest RC version) - - url: 'https://peertube.cpy.re/api/v1' + - url: 'https://peertube.cpy.re' description: Live Test Server (live data - stable version) components: parameters: @@ -4978,6 +5570,7 @@ components: type: string enum: - createdAt + name: name: name in: path @@ -4993,6 +5586,13 @@ components: description: Entity id schema: $ref: '#/components/schemas/id' + registrationId: + name: registrationId + in: path + required: true + description: Registration ID + schema: + $ref: '#/components/schemas/id' idOrUUID: name: id in: path @@ -5046,6 +5646,13 @@ components: schema: type: string example: my_username | my_username@example.com + channelSyncId: + name: channelSyncId + in: path + required: true + description: Channel Sync id + schema: + $ref: '#/components/schemas/Abuse/properties/id' subscriptionHandle: name: subscriptionHandle in: path @@ -5190,6 +5797,14 @@ components: schema: $ref: '#/components/schemas/VideoPrivacySet' description: '**PeerTube >= 4.0** Display only videos in this specific privacy/privacies' + uuids: + name: uuids + in: query + required: false + schema: + items: + type: string + description: 'Find videos with specific UUIDs' include: name: include in: query @@ -5252,6 +5867,7 @@ components: - activitypub-refresher - video-redundancy - video-live-ending + - video-channel-import followState: name: state in: query @@ -5271,6 +5887,28 @@ components: - Group - Service - Organization + staticFilename: + name: filename + in: path + required: true + description: Filename + schema: + type: string + videoFileToken: + name: videoFileToken + in: query + required: false + description: Video file token [generated](#operation/requestVideoToken) by PeerTube so you don't need to provide an OAuth token in the request header. + schema: + type: string + reinjectVideoFileToken: + name: reinjectVideoFileToken + in: query + required: false + description: Ask the server to reinject videoFileToken in URLs in m3u8 playlist + schema: + type: boolean + securitySchemes: OAuth2: description: | @@ -5595,6 +6233,8 @@ components: VideoFile: readOnly: true properties: + id: + $ref: '#/components/schemas/id' magnetUri: type: string format: uri @@ -6400,6 +7040,11 @@ components: properties: enabled: type: boolean + videoChannelSynchronization: + type: object + properties: + enabled: + type: boolean autoBlacklist: type: object properties: @@ -6503,6 +7148,96 @@ components: enabled: type: boolean + SendClientLog: + properties: + message: + type: string + url: + type: string + description: URL of the current user page + level: + enum: + - error + - warn + stackTrace: + type: string + description: Stack trace of the error if there is one + userAgent: + type: string + description: User agent of the web browser that sends the message + meta: + type: string + description: Additional information regarding this log + required: + - message + - url + - level + + ServerStats: + properties: + totalUsers: + type: number + totalDailyActiveUsers: + type: number + totalWeeklyActiveUsers: + type: number + totalMonthlyActiveUsers: + type: number + totalLocalVideos: + type: number + totalLocalVideoViews: + type: number + description: Total video views made on the instance + totalLocalVideoComments: + type: number + description: Total comments made by local users + totalLocalVideoFilesSize: + type: number + totalVideos: + type: number + totalVideoComments: + type: number + totalLocalVideoChannels: + type: number + totalLocalDailyActiveVideoChannels: + type: number + totalLocalWeeklyActiveVideoChannels: + type: number + totalLocalMonthlyActiveVideoChannels: + type: number + totalLocalPlaylists: + type: number + totalInstanceFollowers: + type: number + totalInstanceFollowing: + type: number + videosRedundancy: + type: array + items: + type: object + properties: + strategy: + type: string + totalSize: + type: number + totalUsed: + type: number + totalVideoFiles: + type: number + totalVideos: + type: number + totalActivityPubMessagesProcessed: + type: number + totalActivityPubMessagesSuccesses: + type: number + totalActivityPubMessagesErrors: + type: number + + activityPubMessagesProcessedPerSecond: + type: number + totalActivityPubMessagesWaiting: + type: number + ServerConfigAbout: properties: instance: @@ -6674,6 +7409,11 @@ components: properties: enabled: type: boolean + video_channel_synchronization: + type: object + properties: + enabled: + type: boolean autoBlacklist: type: object properties: @@ -6766,6 +7506,7 @@ components: - videos-views-stats - activitypub-refresher - video-redundancy + - video-channel-import data: type: object additionalProperties: true @@ -6921,6 +7662,16 @@ components: properties: comment: $ref: '#/components/schemas/VideoComment' + VideoTokenResponse: + properties: + files: + type: object + properties: + token: + type: string + expires: + type: string + format: date-time VideoListResponse: properties: total: @@ -6976,13 +7727,16 @@ components: nsfwPolicy: $ref: '#/components/schemas/NSFWPolicy' role: - $ref: '#/components/schemas/UserRole' - roleLabel: - type: string - enum: - - User - - Moderator - - Administrator + type: object + properties: + id: + $ref: '#/components/schemas/UserRole' + label: + type: string + enum: + - User + - Moderator + - Administrator theme: type: string description: Theme enabled by this user @@ -7159,6 +7913,7 @@ components: required: - video - rating + RegisterUser: properties: username: @@ -7189,6 +7944,77 @@ components: - password - email + UserRegistrationRequest: + allOf: + - $ref: '#/components/schemas/RegisterUser' + - type: object + properties: + registrationReason: + type: string + description: reason for the user to register on the instance + required: + - registrationReason + + UserRegistrationAcceptOrReject: + type: object + properties: + moderationResponse: + type: string + description: Moderation response to send to the user + preventEmailDelivery: + type: boolean + description: Set it to true if you don't want PeerTube to send an email to the user + required: + - moderationResponse + + UserRegistration: + properties: + id: + $ref: '#/components/schemas/id' + state: + type: object + properties: + id: + type: integer + enum: + - 1 + - 2 + - 3 + description: 'The registration state (Pending = `1`, Rejected = `2`, Accepted = `3`)' + label: + type: string + registrationReason: + type: string + moderationResponse: + type: string + nullable: true + username: + type: string + email: + type: string + format: email + emailVerified: + type: boolean + accountDisplayName: + type: string + channelHandle: + type: string + channelDisplayName: + type: string + createdAt: + type: string + format: date-time + updatedAt: + type: string + format: date-time + user: + type: object + nullable: true + description: If the registration has been accepted, this is a partial user object created by the registration + properties: + id: + $ref: '#/components/schemas/id' + OAuthClient: properties: client_id: @@ -7286,6 +8112,7 @@ components: type: integer uuid: $ref: '#/components/schemas/UUIDv4' + VideoChannelCreate: allOf: - $ref: '#/components/schemas/VideoChannel' @@ -7316,6 +8143,63 @@ components: - $ref: '#/components/schemas/VideoChannel' - $ref: '#/components/schemas/Actor' + ImportVideosInChannelCreate: + type: object + properties: + externalChannelUrl: + type: string + example: https://youtube.com/c/UC_myfancychannel + videoChannelSyncId: + type: integer + description: If part of a channel sync process, specify its id to assign video imports to this channel synchronization + required: + - 'externalChannelUrl' + + VideoChannelSync: + type: object + properties: + id: + $ref: '#/components/schemas/id' + state: + type: object + properties: + id: + type: integer + example: 2 + label: + type: string + example: PROCESSING + externalChannelUrl: + type: string + example: 'https://youtube.com/c/UC_myfancychannel' + createdAt: + type: string + format: date-time + lastSyncAt: + type: string + format: date-time + nullable: true + channel: + $ref: '#/components/schemas/VideoChannel' + VideoChannelSyncList: + type: object + properties: + total: + type: integer + example: 1 + data: + type: array + items: + allOf: + - $ref: '#/components/schemas/VideoChannelSync' + VideoChannelSyncCreate: + type: object + properties: + externalChannelUrl: + type: string + example: https://youtube.com/c/UC_myfancychannel + videoChannelId: + $ref: '#/components/schemas/id' MRSSPeerLink: type: object xml: @@ -7505,17 +8389,13 @@ components: NotificationSettingValue: type: integer description: > - Notification type + Notification type. One of the following values, or a sum of multiple values: - `0` NONE - `1` WEB - `2` EMAIL - enum: - - 0 - - 1 - - 2 Notification: properties: id: @@ -7751,45 +8631,164 @@ components: description: User can select live latency mode if enabled by the instance $ref: '#/components/schemas/LiveVideoLatencyMode' - LiveVideoSessionResponse: - properties: - id: - type: integer - startDate: - type: string - format: date-time - description: Start date of the live session - endDate: - type: string - format: date-time - nullable: true - description: End date of the live session - error: - type: integer - enum: - - 1 - - 2 - - 3 - - 4 - - 5 - nullable: true - description: > - Error type if an error occurred during the live session: - - `1`: Bad socket health (transcoding is too slow) - - `2`: Max duration exceeded - - `3`: Quota exceeded - - `4`: Quota FFmpeg error - - `5`: Video has been blacklisted during the live - replayVideo: + RequestTwoFactorResponse: + properties: + otpRequest: + type: object + properties: + requestToken: + type: string + description: The token to send to confirm this request + secret: + type: string + description: The OTP secret + uri: + type: string + description: The OTP URI + + VideoStudioCreateTask: + type: array + items: + anyOf: + - + title: cut type: object - description: Video replay information properties: - id: - type: number - uuid: - $ref: '#/components/schemas/UUIDv4' - shortUUID: - $ref: '#/components/schemas/shortUUID' + name: + type: string + enum: + - 'cut' + options: + type: object + properties: + start: + type: integer + end: + type: integer + - + title: add-intro + type: object + properties: + name: + type: string + enum: + - 'add-intro' + options: + type: object + properties: + file: + type: string + format: binary + - + title: add-outro + type: object + properties: + name: + type: string + enum: + - 'add-outro' + options: + type: object + properties: + file: + type: string + format: binary + - + title: add-watermark + type: object + properties: + name: + type: string + enum: + - 'add-watermark' + options: + type: object + properties: + file: + type: string + format: binary + + LiveVideoSessionResponse: + properties: + id: + type: integer + startDate: + type: string + format: date-time + description: Start date of the live session + endDate: + type: string + format: date-time + nullable: true + description: End date of the live session + error: + type: integer + enum: + - 1 + - 2 + - 3 + - 4 + - 5 + nullable: true + description: > + Error type if an error occurred during the live session: + - `1`: Bad socket health (transcoding is too slow) + - `2`: Max duration exceeded + - `3`: Quota exceeded + - `4`: Quota FFmpeg error + - `5`: Video has been blacklisted during the live + replayVideo: + type: object + description: Video replay information + properties: + id: + type: number + uuid: + $ref: '#/components/schemas/UUIDv4' + shortUUID: + $ref: '#/components/schemas/shortUUID' + + PlaybackMetricCreate: + properties: + playerMode: + type: string + enum: + - 'p2p-media-loader' + - 'webtorrent' + resolution: + type: number + description: Current player video resolution + fps: + type: number + description: Current player video fps + resolutionChanges: + type: number + description: How many resolution changes occured since the last metric creation + errors: + type: number + description: How many errors occured since the last metric creation + downloadedBytesP2P: + type: number + description: How many bytes were downloaded with P2P since the last metric creation + downloadedBytesHTTP: + type: number + description: How many bytes were downloaded with HTTP since the last metric creation + uploadedBytesP2P: + type: number + description: How many bytes were uploaded with P2P since the last metric creation + videoId: + oneOf: + - $ref: '#/components/schemas/id' + - $ref: '#/components/schemas/UUIDv4' + - $ref: '#/components/schemas/shortUUID' + required: + - playerMode + - resolutionChanges + - errors + - downloadedBytesP2P + - downloadedBytesHTTP + - uploadedBytesP2P + - videoId callbacks: searchIndex: