diff --git a/src/utils/media/yanker.js b/src/utils/media/yanker.js index d0913e3..6ee63db 100644 --- a/src/utils/media/yanker.js +++ b/src/utils/media/yanker.js @@ -15,7 +15,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see .*/ //NPM Imports -const url = require("node:url"); +//const url = require("node:url"); const validator = require('validator');//No express here, so regular validator it is! //local import @@ -32,7 +32,11 @@ module.exports.yankMedia = async function(url, title){ //return media object list from IA module return await iaUtil.fetchMetadata(pullType.id, title); case "yt": + //return mediao object list from the YT-DLP module's youtube function return await ytdlpUtil.fetchYoutubeVideoMetadata(pullType.id, title); + case "dm": + //return mediao object list from the YT-DLP module's dailymotion function + return await ytdlpUtil.fetchDailymotionMetadata(pullType.id, title); default: //return null to signify a bad url return null; @@ -43,8 +47,9 @@ module.exports.refreshRawLink = async function(mediaObj){ switch(mediaObj.type){ case 'yt': //Scrape expiration from query strings - //const expires = mediaObj.rawLink.match(/expire=([0-9]+)/); //Keeping this regex version I wrote at first in-case we need the speed - const expires = new URL(mediaObj.rawLink).searchParams.get("expire"); + 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 + //const expires = new URL(mediaObj.rawLink).searchParams.get("expire"); //If we have a valid raw file link that will be good by the end of the video if(expires != null && (expires * 1000) > mediaObj.getEndTime()){ @@ -96,6 +101,14 @@ module.exports.getMediaType = async function(url){ } } + //If we have a match to a dailymotion video + if(match = url.match(/dailymotion\.com\/video\/([a-z0-9]{7})/)){ + return { + type: "dm", + id: match[1] + } + } + //If we fell through all of our media types without a match return{ type: null, diff --git a/src/utils/media/ytdlpUtils.js b/src/utils/media/ytdlpUtils.js index 61d3c41..16bbd4e 100644 --- a/src/utils/media/ytdlpUtils.js +++ b/src/utils/media/ytdlpUtils.js @@ -29,10 +29,10 @@ const media = require('../../app/channel/media/media.js'); const regexUtils = require('../regexUtils.js'); const loggerUtils = require('../loggerUtils.js') -module.exports.fetchYoutubeVideoMetadata = async function(id, title){ +module.exports.fetchYoutubMetadata = async function(id, title){ try{ //Try to pull media from youtube id - const media = await fetchMetadata(`https://youtu.be/${id}`, title,'yt'); + const media = await fetchMetadata(`https://youtu.be/${id}`, title, 'yt'); //Return found media return media; @@ -42,19 +42,31 @@ module.exports.fetchYoutubeVideoMetadata = async function(id, title){ if(err.message.match("Sign in to confirm you’re not a bot.")){ //Make our own error with blackjack and hookers throw loggerUtils.exceptionSmith("The server's IP address has been banned by youtube. Please contact your server's administrator.", "queue"); + //Otherwise if we don't have a good way to handle it + }else{ + //toss it back up + throw err; } } } +module.exports.fetchDailymotionMetadata = async function(id, title){ + //Pull media from dailymotion link + const media = await fetchMetadata(`https://dailymotion.com/video/${id}`, title, 'dm'); + + //Return found media; + return media; +} + //Generic YTDLP function meant to be used by service-sepecific fetchers which will then be used to fetch video metadata -async function fetchMetadata(link, title, type){ +async function fetchMetadata(link, title, type, format = 'b'){ //Create media list const mediaList = []; //Pull raw metadata const rawMetadata = await ytdlp(link, { dumpSingleJson: true, - format: 'b' + format }); //Pull data from rawMetadata, sanatizing title to prevent XSS diff --git a/www/js/channel/player.js b/www/js/channel/player.js index eef1d0a..552d3fb 100644 --- a/www/js/channel/player.js +++ b/www/js/channel/player.js @@ -88,7 +88,7 @@ class player{ //Otherwise }else{ //If we have a raw-file compatible source - if(data.media.type == 'ia' || data.media.type == 'raw' || data.media.type == 'yt'){ + if(data.media.type == 'ia' || data.media.type == 'raw' || data.media.type == 'yt' || data.media.type == 'dm'){ //Create a new raw file handler for it this.mediaHandler = new rawFileHandler(client, this, data.media); //Sync to time stamp