Finished up with internet archive api utility.
This commit is contained in:
parent
4c1d3c9db5
commit
b443840c29
9 changed files with 241 additions and 43 deletions
84
src/utils/media/internetArchiveUtils.js
Normal file
84
src/utils/media/internetArchiveUtils.js
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
/*Canopy - The next generation of stoner streaming software
|
||||
Copyright (C) 2024-2025 Rainbownapkin and the TTN Community
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.*/
|
||||
|
||||
//Node Imports
|
||||
const url = require("node:url");
|
||||
|
||||
//Local Imports
|
||||
const regexUtils = require('../regexUtils');
|
||||
|
||||
module.exports.fetchMetadata = async function(link){
|
||||
//Parse link
|
||||
const parsedLink = new url.URL(link);
|
||||
//Split link path
|
||||
const splitPath = parsedLink.pathname.split('/');
|
||||
//Get ItemID from link path
|
||||
const itemID = splitPath[2]
|
||||
//Splice the empty string, request type, and item ID out from link path
|
||||
splitPath.splice(0,3)
|
||||
//Join remaining link path back together to get requested file path within the given archive.org upload
|
||||
const requestedPath = decodeURIComponent(splitPath.join('/'));
|
||||
|
||||
//Create metadata link from itemID
|
||||
const metadataLink = `https://archive.org/metadata/${itemID}`;
|
||||
|
||||
//Fetch item metadata from the internet archive
|
||||
const response = await fetch(metadataLink,
|
||||
{
|
||||
method: "GET"
|
||||
}
|
||||
);
|
||||
|
||||
//If we hit a snag
|
||||
if(!response.ok){
|
||||
//Scream and shout
|
||||
const errorBody = await response.text();
|
||||
throw new Error(`Internet Archive Error '${response.status}': ${errorBody}`);
|
||||
}
|
||||
|
||||
//Collect our metadata
|
||||
const rawMetadata = await response.json();
|
||||
|
||||
//Filter out any in-compatible files
|
||||
const compatibleFiles = rawMetadata.files.filter(compatibilityFilter);
|
||||
|
||||
//If we're requesting an empty path
|
||||
if(requestedPath == ''){
|
||||
//Return item metadata and compatible files
|
||||
return {
|
||||
files: compatibleFiles,
|
||||
metadata: rawMetadata.metadata
|
||||
}
|
||||
//Other wise
|
||||
}else{
|
||||
//Return item metadata and matching compatible files
|
||||
return {
|
||||
//Filter files out that don't match requested path and return remaining list
|
||||
files: compatibleFiles.filter(pathFilter),
|
||||
metadata: rawMetadata.metadata
|
||||
}
|
||||
}
|
||||
|
||||
function compatibilityFilter(file){
|
||||
//return true for all files that match for web-safe formats
|
||||
return file.format == "h.264"
|
||||
}
|
||||
|
||||
function pathFilter(file){
|
||||
//return true for all file names which match the given requested file path
|
||||
return file.name.match(`^${regexUtils.escapeRegex(requestedPath)}`);
|
||||
}
|
||||
}
|
||||
23
src/utils/regexUtils.js
Normal file
23
src/utils/regexUtils.js
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
/*Canopy - The next generation of stoner streaming software
|
||||
Copyright (C) 2024-2025 Rainbownapkin and the TTN Community
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as
|
||||
published by the Free Software Foundation, either version 3 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.*/
|
||||
|
||||
module.exports.escapeRegex = function(string){
|
||||
/* I won't lie this line was whole-sale ganked from stack overflow like a fucking skid
|
||||
In my defense I only did it because js-runtime-devs are taking fucking eons to implement RegExp.escape()
|
||||
This should be replaced once that function becomes available in mainline versions of node.js:
|
||||
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/escape */
|
||||
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue