{"R_vixen|tushy|tushyraw|blacked|slayed|deeper":{"link":"(vixen|tushy|tushyraw|blacked|blackedraw|slayed|deeper)\\.com/videos/.+","res":":\nconst max_resolution = 1080;\n\nconst vidId = $._.match(/videoTokenId\":\"(?<id>\\d+)/)?.groups?.id;\nif (!vidId) return;\n\nconst req = new XMLHttpRequest();\nreq.open('POST', `https://www.${$[1]}.com/graphql`, false);\nreq.setRequestHeader('Content-Type', 'application/json');\nreq.send(\n `{\"operationName\":\"getToken\",\"variables\":{\"videoId\":\"${vidId}\",\"device\":\"trailer\"},\"query\":\"query getToken($videoId: ID!, $device: Device!) {generateVideoToken(input: {videoId: $videoId, device: $device}) {p270 {token}p360 {token}p480 {token}p720 {token}p1080 {token}p2160 {token}}}\"}`\n);\nif (req.status !== 200) return;\n\nlet streams = {};\ntry { streams = JSON.parse(req.responseText)?.data?.generateVideoToken;} catch (e) { return; }\n\nconst trailers = Object.keys(streams)\n .map(s => ({ res: Number(s.replace(/\\D/g, '')), url: streams[s]?.token }))\n .filter(a => a.res <= max_resolution)\n .sort((a, b) => a.res - b.res);\n\nreturn trailers.pop()?.url || null;","note":"Change max_resolution to your max preferred resolution.\ne.g.\n1080 will result in 1080p video\n900 will result in 720p video"}} |