diff --git a/docs/api.md b/docs/api.md index b63c9216..ca484f2d 100644 --- a/docs/api.md +++ b/docs/api.md @@ -37,12 +37,13 @@ Content-Type: application/json ### response body variables | key | type | variables | |:-------------|:---------|:------------------------------------------------------------| -| `status` | `string` | `error / redirect / stream / success / rate-limit / picker` | -| `text` | `string` | various text, mostly used for errors | -| `url` | `string` | direct link to a file or a link to cobalt's live render | -| `pickerType` | `string` | `various / images` | -| `picker` | `array` | array of picker items | -| `audio` | `string` | direct link to a file or a link to cobalt's live render | +| `status` | `string` | `error / redirect / stream / success / rate-limit / picker` | +| `text` | `string` | various text, mostly used for errors | +| `url` | `string` | direct link to a file or a link to cobalt's live render | +| `pickerType` | `string` | `various / images` | +| `picker` | `array` | array of picker items | +| `audio` | `string` | direct link to a file or a link to cobalt's live render | +| `mediaMetadata` | `object` | Supported only on YouTube and Twitter videos. Object, that contains values `duration` (duration of the video in seconds), `likes` and `views` | ### picker item variables item type: `object` diff --git a/src/modules/processing/matchActionDecider.js b/src/modules/processing/matchActionDecider.js index 74f0f8c7..2f6c7c8a 100644 --- a/src/modules/processing/matchActionDecider.js +++ b/src/modules/processing/matchActionDecider.js @@ -14,6 +14,7 @@ export default function(r, host, userFormat, isAudioOnly, lang, isAudioMuted, di filename: r.filenameAttributes ? createFilename(r.filenameAttributes, filenamePattern, isAudioOnly, isAudioMuted) : r.filename, fileMetadata: !disableMetadata ? r.fileMetadata : false, + mediaMetadata: r.mediaMetadata, requestIP }, params = {}, diff --git a/src/modules/processing/request.js b/src/modules/processing/request.js index f2f58c65..269ea504 100644 --- a/src/modules/processing/request.js +++ b/src/modules/processing/request.js @@ -59,13 +59,15 @@ export function createResponse(responseType, responseData) { case "redirect": response = { - url: responseData.u + url: responseData.u, + mediaMetadata: responseData.mediaMetadata, } break; case "stream": response = { - url: createStream(responseData) + url: createStream(responseData), + mediaMetadata: responseData.mediaMetadata, } break; diff --git a/src/modules/processing/services/twitter.js b/src/modules/processing/services/twitter.js index 36a8669b..e102ccd6 100644 --- a/src/modules/processing/services/twitter.js +++ b/src/modules/processing/services/twitter.js @@ -159,12 +159,18 @@ export default async function({ id, index, toGif, dispatcher }) { case 0: return { error: 'ErrorNoVideosInTweet' }; case 1: + const mediaMetadata = { + duration: Math.round(media[0].video_info.duration_millis / 1000), + likes: baseTweet.favorite_count, + views: Number(tweetResult.views.count) + }; return { type: needsFixing(media[0]) ? "remux" : "normal", urls: bestQuality(media[0].video_info.variants), filename: `twitter_${id}.mp4`, audioFilename: `twitter_${id}_audio`, - isGif: media[0].type === "animated_gif" + isGif: media[0].type === "animated_gif", + mediaMetadata }; default: const picker = media.map((content, i) => { @@ -180,10 +186,17 @@ export default async function({ id, index, toGif, dispatcher }) { }) } + const mediaMetadata = { + duration: Math.round(content.video_info.duration_millis / 1000), + likes: baseTweet.favorite_count, + views: Number(tweetResult.views.count) + }; + return { type: 'video', url, thumb: content.media_url_https, + mediaMetadata } }); return { picker }; diff --git a/src/modules/processing/services/youtube.js b/src/modules/processing/services/youtube.js index 1c86b4ed..616c57b6 100644 --- a/src/modules/processing/services/youtube.js +++ b/src/modules/processing/services/youtube.js @@ -218,16 +218,25 @@ export default async function(o) { urls = [video.decipher(yt.session.player), audio.decipher(yt.session.player)]; } + const mediaMetadata = { + duration: info.basic_info.duration, + likes: info.basic_info.like_count, + views: info.basic_info.view_count + }; + if (match) { filenameAttributes.qualityLabel = match.quality_label; filenameAttributes.resolution = `${match.width}x${match.height}`; filenameAttributes.extension = codecMatch[format].container; filenameAttributes.youtubeFormat = format; + + return { type, urls, filenameAttributes, - fileMetadata + fileMetadata, + mediaMetadata, } }