37 lines
1.3 KiB
TypeScript
37 lines
1.3 KiB
TypeScript
import { videoIdPattern, videoPattern } from "../utils/patterns";
|
|
|
|
export const extractID = (url: string) => {
|
|
const url_ = url.trim();
|
|
if (url_.startsWith("https")) {
|
|
if (url_.indexOf("list=") === -1) {
|
|
const video_id = extractVideoId(url_);
|
|
if (!video_id) throw new Error("This is not a YouTube url or videoId or PlaylistID");
|
|
return video_id;
|
|
} else {
|
|
return url_.split("list=")[1].split("&")[0];
|
|
}
|
|
} else return url_;
|
|
};
|
|
|
|
function extractVideoId(urlOrId: string): string | false {
|
|
if (urlOrId.startsWith("https://") && urlOrId.match(videoPattern)) {
|
|
let id: string;
|
|
if (urlOrId.includes("youtu.be/")) {
|
|
id = urlOrId.split("youtu.be/")[1].split(/(\?|\/|&)/)[0];
|
|
} else if (urlOrId.includes("youtube.com/embed/")) {
|
|
id = urlOrId.split("youtube.com/embed/")[1].split(/(\?|\/|&)/)[0];
|
|
} else if (urlOrId.includes("youtube.com/shorts/")) {
|
|
id = urlOrId.split("youtube.com/shorts/")[1].split(/(\?|\/|&)/)[0];
|
|
} else if (urlOrId.includes("youtube.com/live/")) {
|
|
id = urlOrId.split("youtube.com/live/")[1].split(/(\?|\/|&)/)[0];
|
|
} else {
|
|
id = (urlOrId.split("watch?v=")[1] ?? urlOrId.split("&v=")[1]).split(/(\?|\/|&)/)[0];
|
|
}
|
|
|
|
if (id.match(videoIdPattern)) return id;
|
|
} else if (urlOrId.match(videoIdPattern)) {
|
|
return urlOrId;
|
|
}
|
|
|
|
return false;
|
|
} |