diff --git a/api/search.js b/api/search.js index 0fd668b..3e1dbaf 100644 --- a/api/search.js +++ b/api/search.js @@ -1,4 +1,4 @@ -const fetch = require("node-fetch") +const {request} = require("../utils/request") const {render} = require("pinski/plugins") const {getUser} = require("../utils/getuser") const converters = require("../utils/converters") @@ -10,7 +10,10 @@ module.exports = [ const instanceOrigin = getUser(req).getSettingsOrDefaults().instance const fetchURL = new URL(`${instanceOrigin}/api/v1/search`) fetchURL.searchParams.set("q", query) - const results = await fetch(fetchURL.toString()).then(res => res.json()) + const results = await request(fetchURL.toString()).then(res => res.json()) + const error = results.error || results.message || results.code + + if (error) throw new Error(`Instance said: ${error}`) for (const video of results) { converters.normaliseVideoInfo(video) diff --git a/api/video.js b/api/video.js index 3bb004d..e2d6a0a 100644 --- a/api/video.js +++ b/api/video.js @@ -1,3 +1,4 @@ +const {request} = require("../utils/request") const fetch = require("node-fetch") const {render} = require("pinski/plugins") const db = require("../utils/db") @@ -127,7 +128,7 @@ module.exports = [ if (!settings.local) { const instanceOrigin = settings.instance const outURL = `${instanceOrigin}/api/v1/videos/${id}` - const videoPromise = fetch(outURL).then(res => res.json()) + const videoPromise = request(outURL).then(res => res.json()) return renderVideo(videoPromise, {user, id, instanceOrigin}) } else { return render(200, "pug/local-video.pug", {id}) diff --git a/utils/converters.js b/utils/converters.js index 1beb969..eab6807 100644 --- a/utils/converters.js +++ b/utils/converters.js @@ -39,7 +39,7 @@ function lengthSecondsToLengthText(seconds) { */ function normaliseVideoInfo(video) { if (!video.second__lengthText && video.lengthSeconds > 0) { - video.second__lengthText = converters.lengthSecondsToLengthText(video.lengthSeconds) + video.second__lengthText = lengthSecondsToLengthText(video.lengthSeconds) } if (!video.second__lengthText && video.lengthSeconds === 0) { video.second__lengthText = "LIVE" diff --git a/utils/request.js b/utils/request.js new file mode 100644 index 0000000..b08fe27 --- /dev/null +++ b/utils/request.js @@ -0,0 +1,11 @@ +const fetch = require("node-fetch") + +function request(url, options = {}) { + if (!options.headers) options.headers = {} + options.headers = { + "user-agent": "CloudTubeBackend/1.0" + } + return fetch(url, options) +} + +module.exports.request = request diff --git a/utils/youtube.js b/utils/youtube.js index 1987394..cc7e15a 100644 --- a/utils/youtube.js +++ b/utils/youtube.js @@ -1,10 +1,10 @@ -const fetch = require("node-fetch") +const {request} = require("./request") const db = require("./db") async function fetchChannel(ucid, instance) { if (!instance) throw new Error("No instance parameter provided") // fetch - const channel = await fetch(`${instance}/api/v1/channels/${ucid}`).then(res => res.json()) + const channel = await request(`${instance}/api/v1/channels/${ucid}`).then(res => res.json()) // update database const bestIcon = channel.authorThumbnails.slice(-1)[0] const iconURL = bestIcon ? bestIcon.url : null