diff --git a/src/modules/processing/services/twitter.js b/src/modules/processing/services/twitter.js index 2c36419f..b59e0d99 100644 --- a/src/modules/processing/services/twitter.js +++ b/src/modules/processing/services/twitter.js @@ -1,13 +1,22 @@ import { genericUserAgent } from "../../config.js"; import { createStream } from "../../stream/manage.js"; -function bestQuality(arr) { - return arr.filter(v => v["content_type"] === "video/mp4").sort((a, b) => Number(b.bitrate) - Number(a.bitrate))[0]["url"] -} - // fix all videos affected by the container bug in twitter muxer (took them over two weeks to fix it????) const badContainerStart = new Date(1701446400000); const badContainerEnd = new Date(1702605600000); +const TWITTER_EPOCH = 1288834974657n; + +function needsFixing(media) { + const representativeId = media.source_status_id_str ?? media.id_str; + const mediaTimestamp = new Date( + Number((BigInt(representativeId) >> 22n) + TWITTER_EPOCH) + ) + return mediaTimestamp > badContainerStart && mediaTimestamp < badContainerEnd; +} + +function bestQuality(arr) { + return arr.filter(v => v["content_type"] === "video/mp4").sort((a, b) => Number(b.bitrate) - Number(a.bitrate))[0]["url"] +} export default async function(obj) { let _headers = { @@ -64,13 +73,14 @@ export default async function(obj) { let single, multiple = [], media = baseMedia["media"]; media = media.filter((i) => { if (i["type"] === "video" || i["type"] === "animated_gif") return true }); - let tweetDate = new Date(baseTweet.created_at), - needsFixing = tweetDate > badContainerStart && tweetDate < badContainerEnd; + if (media.length === 0) { + return { error: 'ErrorNoVideosInTweet' } + } if (media.length > 1) { for (let i in media) { let downloadUrl = bestQuality(media[i]["video_info"]["variants"]); - if (needsFixing) { + if (needsFixing(media[i])) { downloadUrl = createStream({ service: "twitter", type: "remux", @@ -84,15 +94,13 @@ export default async function(obj) { url: downloadUrl }) } - } else if (media.length === 1) { - single = bestQuality(media[0]["video_info"]["variants"]) } else { - return { error: 'ErrorNoVideosInTweet' } + single = bestQuality(media[0]["video_info"]["variants"]) } if (single) { return { - type: needsFixing? "remux" : "normal", + type: needsFixing(media[0]) ? "remux" : "normal", urls: single, filename: `twitter_${obj.id}.mp4`, audioFilename: `twitter_${obj.id}_audio`