Started working on pushing multiple raw links to user.

This commit is contained in:
rainbow napkin 2025-10-29 08:35:37 -04:00
parent 349a6b82aa
commit e0832c2c1f
3 changed files with 47 additions and 12 deletions

View file

@ -26,9 +26,9 @@ class media{
* @param {String} id - Video ID from source (IE: youtube watch code/archive.org file path) * @param {String} id - Video ID from source (IE: youtube watch code/archive.org file path)
* @param {String} type - Original video source * @param {String} type - Original video source
* @param {Number} duration - Length of media in seconds * @param {Number} duration - Length of media in seconds
* @param {String} rawLink - URL to raw file copy of media, not applicable to all sources * @param {String} rawLink - URLs to raw file copies of media, not applicable to all sources, not saved to the DB
*/ */
constructor(title, fileName, url, id, type, duration, rawLink = url){ constructor(title, fileName, url, id, type, duration, rawLink){
/** /**
* Chosen title of media * Chosen title of media
*/ */
@ -59,10 +59,18 @@ class media{
*/ */
this.duration = duration; this.duration = duration;
/** if(rawLink == null){
* URL to raw file copy of media, not applicable to all sources /**
*/ * URL to raw file copy of media, not applicable to all sources
this.rawLink = rawLink; */
this.rawLink = {
audio: [],
video: [],
combo: [['default',url]]
};
}else{
this.rawLink = rawLink;
}
} }
} }

View file

@ -67,6 +67,8 @@ module.exports.yankMedia = async function(url, title){
module.exports.refreshRawLink = async function(mediaObj){ module.exports.refreshRawLink = async function(mediaObj){
switch(mediaObj.type){ switch(mediaObj.type){
case 'yt': case 'yt':
console.log("lolnope");
/* We're skipping this one for now...
//Scrape expiration from query strings //Scrape expiration from query strings
const expires = mediaObj.rawLink.match(/expire=([0-9]+)/); const expires = mediaObj.rawLink.match(/expire=([0-9]+)/);
//Went with regex for speed, but I figure I'd keep this around in case we want the accuracy of a battle-tested implementation //Went with regex for speed, but I figure I'd keep this around in case we want the accuracy of a battle-tested implementation
@ -85,6 +87,7 @@ module.exports.refreshRawLink = async function(mediaObj){
//return media object //return media object
return mediaObj; return mediaObj;
*/
} }
//Return null to tell the calling function there is no refresh required for this media type //Return null to tell the calling function there is no refresh required for this media type

View file

@ -100,7 +100,7 @@ module.exports.fetchDailymotionMetadata = async function(id, title){
* @param {String} type - Link type to attach to the resulting media object * @param {String} type - Link type to attach to the resulting media object
* @returns {Array} Array of Media objects containing relevant metadata * @returns {Array} Array of Media objects containing relevant metadata
*/ */
async function fetchVideoMetadata(link, title, type, format = 'b'){ async function fetchVideoMetadata(link, title, type, format = 'ba,bv'){
//Create media list //Create media list
const mediaList = []; const mediaList = [];
@ -109,16 +109,40 @@ async function fetchVideoMetadata(link, title, type, format = 'b'){
//Pull data from rawMetadata, sanatizing title to prevent XSS //Pull data from rawMetadata, sanatizing title to prevent XSS
const name = validator.escape(validator.trim(rawMetadata.title)); const name = validator.escape(validator.trim(rawMetadata.title));
const rawLink = rawMetadata.requested_downloads[0].url;
//Create new raw link object (should we make a class? Probably over kill for a fucking method-less hashtable)
const rawLinks = {
audio: [],
video: [],
combo: []
}
//for each item
for(const link of rawMetadata.requested_downloads){
//if there isn't video included
if(link.vcodec == 'none'){
//Add the link under the format within the audio map
rawLinks.audio.push([link.format_note, link.url]);
//if there isn't audio included
}else if(link.acodec == 'none'){
//Add the link under the format within the video map
rawLinks.video.push([link.format_note, link.url]);
//otherwise, it includes audio and video
}else{
//Add the link under the format within the combo map
rawLinks.combo.push([link.format_note, link.url]);
}
}
const id = rawMetadata.id; const id = rawMetadata.id;
//if we where handed a null title //if we where handed a null title
if(title == null || title == ''){ if(title == null || title == ''){
//Create new media object from file info substituting filename for title //Create new media object from file info substituting filename for title
mediaList.push(new media(name, name, link, id, type, Number(rawMetadata.duration), rawLink)); mediaList.push(new media(name, name, link, id, type, Number(rawMetadata.duration), rawLinks));
}else{ }else{
//Create new media object from file info //Create new media object from file info
mediaList.push(new media(title, name, link, id, type, Number(rawMetadata.duration), rawLink)); mediaList.push(new media(title, name, link, id, type, Number(rawMetadata.duration), rawLinks));
} }
//Return list of media //Return list of media
@ -136,10 +160,10 @@ async function fetchVideoMetadata(link, title, type, format = 'b'){
* @param {String} format - Format string to hand YT-DLP, defaults to 'b' * @param {String} format - Format string to hand YT-DLP, defaults to 'b'
* @returns {Object} Metadata dump from YT-DLP * @returns {Object} Metadata dump from YT-DLP
*/ */
async function ytdlpFetch(link, format = 'b'){ async function ytdlpFetch(link, format = 'ba,ogg'){
//return promise from ytdlp //return promise from ytdlp
return ytdlp(link, { return ytdlp(link, {
format,
dumpSingleJson: true, dumpSingleJson: true,
format
}); });
} }