Skip to content
This repository has been archived by the owner on Jan 9, 2024. It is now read-only.

Commit

Permalink
feat: Switch to new URL API (#111)
Browse files Browse the repository at this point in the history
* parseItem.js : Move to WHATWG URL API

* Fix url string

* utils.js : Move to WHATWG URL API

* main.js : Move to WHATWG URL API

* Add base url

* Pre-check for RD playlist

* Update lib/main.js

Co-authored-by: TimeForANinja <[email protected]>
  • Loading branch information
Progitiel and TimeForANinja authored Apr 25, 2021
1 parent 997ee06 commit 5827892
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 16 deletions.
23 changes: 12 additions & 11 deletions lib/main.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
const URL = require('url');
const UTIL = require('./utils.js');
const QS = require('querystring');
const PARSE_ITEM = require('./parseItem.js');
Expand Down Expand Up @@ -54,7 +53,7 @@ const main = module.exports = async(linkOrId, options, rt = 3) => {
visibility: info.badges && JSON.stringify(info.badges).includes('UNLISTED') ? 'unlisted' : 'everyone',
author: !secInfo ? null : {
name: info_owner.title.runs[0].text,
url: URL.resolve(BASE_PLIST_URL, info_owner.navigationEndpoint.commandMetadata.webCommandMetadata.url),
url: new URL(info_owner.navigationEndpoint.commandMetadata.webCommandMetadata.url, BASE_PLIST_URL).toString(),
avatars: info_owner.thumbnail.thumbnails.sort((a, b) => b.width - a.width),
bestAvatar: info_owner.thumbnail.thumbnails.sort((a, b) => b.width - a.width)[0],
channelID: info_owner.navigationEndpoint.browseEndpoint.browseId,
Expand Down Expand Up @@ -151,15 +150,16 @@ main.validateID = linkOrId => {
return true;
}
// Playlist link provided
const parsed = URL.parse(linkOrId, true);
const parsed = new URL(linkOrId, BASE_PLIST_URL);
if (!YT_HOSTS.includes(parsed.host)) return false;
if (Object.prototype.hasOwnProperty.call(parsed.query, 'list')) {
if (PLAYLIST_REGEX.test(parsed.query.list) || ALBUM_REGEX.test(parsed.query.list)) {
if (parsed.searchParams.has('list')) {
const listParam = parsed.searchParams.get('list');
if (PLAYLIST_REGEX.test(listParam) || ALBUM_REGEX.test(listParam)) {
return true;
}
// Mixes currently not supported
// They would require fetching a video page & resolving the side-loaded playlist
if (parsed.query.list && parsed.query.list.startsWith('RD')) {
if (listParam && listParam.startsWith('RD')) {
return false;
}
return false;
Expand Down Expand Up @@ -200,15 +200,16 @@ main.getPlaylistID = async linkOrId => {
return `UU${linkOrId.substr(2)}`;
}
// Playlist link provided
const parsed = URL.parse(linkOrId, true);
const parsed = new URL(linkOrId, BASE_PLIST_URL);
if (!YT_HOSTS.includes(parsed.host)) throw new Error('not a known youtube link');
if (Object.prototype.hasOwnProperty.call(parsed.query, 'list')) {
if (PLAYLIST_REGEX.test(parsed.query.list) || ALBUM_REGEX.test(parsed.query.list)) {
return parsed.query.list;
if (parsed.searchParams.has('list')) {
const listParam = parsed.searchParams.get('list');
if (PLAYLIST_REGEX.test(listParam) || ALBUM_REGEX.test(listParam)) {
return listParam;
}
// Mixes currently not supported
// They would require fetching a video page & resolving the side-loaded playlist
if (parsed.query.list && parsed.query.list.startsWith('RD')) {
if (listParam && listParam.startsWith('RD')) {
throw new Error('Mixes not supported');
}
// Default case
Expand Down
5 changes: 2 additions & 3 deletions lib/parseItem.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
const PATH = require('path');
const FS = require('fs');
const URL = require('url');
const UTIL = require('./utils.js');

const SKIP_TYPES = ['continuationItemRenderer'];
Expand All @@ -25,9 +24,9 @@ const parseItem = item => {
index: info.index ? UTIL.parseIntegerFromText(info.index) : -1,
id: info.videoId,
shortUrl: BASE_VIDEO_URL + info.videoId,
url: URL.resolve(BASE_VIDEO_URL, info.navigationEndpoint.commandMetadata.webCommandMetadata.url),
url: new URL(info.navigationEndpoint.commandMetadata.webCommandMetadata.url, BASE_VIDEO_URL).toString(),
author: {
url: URL.resolve(BASE_VIDEO_URL, author.navigationEndpoint.commandMetadata.webCommandMetadata.url),
url: new URL(author.navigationEndpoint.commandMetadata.webCommandMetadata.url, BASE_VIDEO_URL).toString(),
channelID: author.navigationEndpoint.browseEndpoint.browseId,
name: author.text,
},
Expand Down
3 changes: 1 addition & 2 deletions lib/utils.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
const URL = require('url');
const MINIGET = require('miniget');

const BASE_URL = 'https://www.youtube.com/';
Expand Down Expand Up @@ -96,7 +95,7 @@ exports.checkArgs = (plistId, options = {}) => {
// Sorts Images in descending order & normalizes the url's
exports.prepImg = img => {
// Resolve url
img.forEach(x => x.url = x.url ? URL.resolve(BASE_URL, x.url) : null);
img.forEach(x => x.url = x.url ? new URL(x.url, BASE_URL).toString() : null);
// Sort
return img.sort((a, b) => b.width - a.width);
};
Expand Down

0 comments on commit 5827892

Please sign in to comment.