YouTube is closing soon.....
This commit is contained in:
parent
b012e4d942
commit
5fbd98ca98
0
node-youtube-dl/YouTube/classes/Playlist.ts
Normal file
0
node-youtube-dl/YouTube/classes/Playlist.ts
Normal file
93
node-youtube-dl/YouTube/classes/Video.ts
Normal file
93
node-youtube-dl/YouTube/classes/Video.ts
Normal file
@ -0,0 +1,93 @@
|
||||
interface VideoOptions {
|
||||
id?: string;
|
||||
url? : string;
|
||||
title?: string;
|
||||
description?: string;
|
||||
duration_formatted: string;
|
||||
duration: number;
|
||||
uploadedAt?: string;
|
||||
views: number;
|
||||
thumbnail?: JSON;
|
||||
channel?: JSON;
|
||||
videos?: Video[];
|
||||
type : string;
|
||||
ratings : {
|
||||
likes: number;
|
||||
dislikes: number;
|
||||
}
|
||||
live: boolean;
|
||||
private: boolean;
|
||||
tags: string[];
|
||||
}
|
||||
|
||||
export class Video {
|
||||
id?: string;
|
||||
title?: string;
|
||||
description?: string;
|
||||
durationFormatted: string;
|
||||
duration: number;
|
||||
uploadedAt?: string;
|
||||
views: number;
|
||||
thumbnail?: JSON;
|
||||
channel?: JSON;
|
||||
videos?: Video[];
|
||||
likes: number;
|
||||
dislikes: number;
|
||||
live: boolean;
|
||||
private: boolean;
|
||||
tags: string[];
|
||||
|
||||
constructor(data : any){
|
||||
if(!data) throw new Error(`Can not initiate ${this.constructor.name} without data`)
|
||||
this.id = data.id || undefined;
|
||||
this.title = data.title || undefined;
|
||||
this.description = data.description || undefined;
|
||||
this.durationFormatted = data.duration_raw || "0:00";
|
||||
this.duration = (data.duration < 0 ? 0 : data.duration) || 0;
|
||||
this.uploadedAt = data.uploadedAt || undefined;
|
||||
this.views = parseInt(data.views) || 0;
|
||||
this.thumbnail = data.thumbnail || {};
|
||||
this.channel = data.channel || {};
|
||||
this.likes = data.ratings?.likes as number || 0;
|
||||
this.dislikes = data.ratings?.dislikes || 0;
|
||||
this.live = !!data.live;
|
||||
this.private = !!data.private;
|
||||
this.tags = data.tags || [];
|
||||
}
|
||||
|
||||
get url(){
|
||||
if(!this.id) return undefined
|
||||
else return `https://www.youtube.com/watch?v=${this.id}`;
|
||||
}
|
||||
|
||||
get type(): "video" {
|
||||
return "video";
|
||||
}
|
||||
|
||||
get toString(): string {
|
||||
return this.url || "";
|
||||
}
|
||||
|
||||
get toJSON(): VideoOptions{
|
||||
return {
|
||||
id: this.id,
|
||||
url: this.url,
|
||||
title: this.title,
|
||||
description: this.description,
|
||||
duration: this.duration,
|
||||
duration_formatted: this.durationFormatted,
|
||||
uploadedAt: this.uploadedAt,
|
||||
thumbnail: this.thumbnail,
|
||||
channel: this.channel,
|
||||
views: this.views,
|
||||
type: this.type,
|
||||
tags: this.tags,
|
||||
ratings: {
|
||||
likes: this.likes,
|
||||
dislikes: this.dislikes
|
||||
},
|
||||
live: this.live,
|
||||
private: this.private
|
||||
};
|
||||
}
|
||||
}
|
||||
1
node-youtube-dl/YouTube/index.ts
Normal file
1
node-youtube-dl/YouTube/index.ts
Normal file
@ -0,0 +1 @@
|
||||
export { search } from './search'
|
||||
10
node-youtube-dl/YouTube/search.ts
Normal file
10
node-youtube-dl/YouTube/search.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import { url_get } from "./utils/request";
|
||||
import fs from 'fs'
|
||||
|
||||
|
||||
export async function search(url:string, options? : {limit : number}) {
|
||||
let body = await url_get(url)
|
||||
let json_convert = body.split("var ytInitialData = ")[1].split(";</script>")[0]
|
||||
let result = JSON.parse(json_convert).contents.twoColumnSearchResultsRenderer.primaryContents.sectionListRenderer.contents[0].itemSectionRenderer.contents
|
||||
console.log(result.length)
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
import { URL } from 'node:url'
|
||||
import { url_get } from './extractor'
|
||||
import { url_get } from './request'
|
||||
import querystring from 'node:querystring'
|
||||
|
||||
interface formatOptions {
|
||||
@ -102,7 +102,7 @@ export function js_tokens( body:string ) {
|
||||
return tokens
|
||||
}
|
||||
|
||||
export function deciper_signature(tokens : string[], signature :string){
|
||||
function deciper_signature(tokens : string[], signature :string){
|
||||
let sig = signature.split('')
|
||||
let len = tokens.length
|
||||
for(let i = 0; i < len; i++ ){
|
||||
@ -137,7 +137,7 @@ function swappositions(array : string[], position : number){
|
||||
return array
|
||||
}
|
||||
|
||||
export function download_url(format: formatOptions, sig : string){
|
||||
function download_url(format: formatOptions, sig : string){
|
||||
let decoded_url;
|
||||
if(!format.url) return;
|
||||
decoded_url = format.url
|
||||
|
||||
@ -1,14 +1,8 @@
|
||||
import fetch from 'node-fetch'
|
||||
import { url_get } from './request'
|
||||
import { format_decipher, js_tokens } from './cipher'
|
||||
|
||||
export function valid_url(url : string): boolean{
|
||||
let valid_url = /^https?:\/\/(youtu\.be\/|(www\.)?youtube\.com\/(embed|watch|v|shorts)(\/|\?))/
|
||||
if(url.search(valid_url) !== -1) return true
|
||||
else return false
|
||||
}
|
||||
|
||||
export async function yt_initial_data(url : string){
|
||||
if(valid_url(url)){
|
||||
let body = await url_get(url)
|
||||
let player_response = JSON.parse(body.split("var ytInitialPlayerResponse = ")[1].split(";</script>")[0])
|
||||
let response = JSON.parse(body.split("var ytInitialData = ")[1].split(";</script>")[0])
|
||||
@ -45,10 +39,6 @@ export async function yt_initial_data(url : string){
|
||||
video_details
|
||||
}
|
||||
return final
|
||||
}
|
||||
else {
|
||||
throw 'Not a Valid YouTube URL'
|
||||
}
|
||||
}
|
||||
|
||||
export async function yt_deciphered_data(url : string) {
|
||||
@ -61,14 +51,3 @@ export async function yt_deciphered_data(url : string) {
|
||||
return data
|
||||
}
|
||||
}
|
||||
|
||||
export async function url_get (url : string) : Promise<string>{
|
||||
return new Promise(async(resolve, reject) => {
|
||||
let response = await fetch(url)
|
||||
|
||||
if(response.status === 200) {
|
||||
resolve(await response.text())
|
||||
}
|
||||
else reject(`Got ${response.status} from ${url}`)
|
||||
})
|
||||
}
|
||||
|
||||
1
node-youtube-dl/YouTube/utils/index.ts
Normal file
1
node-youtube-dl/YouTube/utils/index.ts
Normal file
@ -0,0 +1 @@
|
||||
export { yt_initial_data, yt_deciphered_data } from './extractor'
|
||||
6
node-youtube-dl/YouTube/utils/parser.ts
Normal file
6
node-youtube-dl/YouTube/utils/parser.ts
Normal file
@ -0,0 +1,6 @@
|
||||
import { Video } from "../classes/Video";
|
||||
|
||||
|
||||
export function ParseSearchResult(html:string) {
|
||||
|
||||
}
|
||||
12
node-youtube-dl/YouTube/utils/request.ts
Normal file
12
node-youtube-dl/YouTube/utils/request.ts
Normal file
@ -0,0 +1,12 @@
|
||||
import fetch, { RequestInit } from 'node-fetch'
|
||||
|
||||
export async function url_get (url : string, options? : RequestInit) : Promise<string>{
|
||||
return new Promise(async(resolve, reject) => {
|
||||
let response = await fetch(url, options)
|
||||
|
||||
if(response.status === 200) {
|
||||
resolve(await response.text())
|
||||
}
|
||||
else reject(`Got ${response.status} from ${url}`)
|
||||
})
|
||||
}
|
||||
@ -1,8 +1,8 @@
|
||||
import { yt_deciphered_data } from "./YouTube/utils/extractor";
|
||||
import { search } from "./YouTube/";
|
||||
|
||||
let main = async() => {
|
||||
let time_start = Date.now()
|
||||
await yt_deciphered_data('https://www.youtube.com/watch?v=jbMHA3P7RzU')
|
||||
await search('https://www.youtube.com/results?search_query=Hello+Neghibour')
|
||||
let time_end = Date.now()
|
||||
console.log(`Time Taken : ${(time_end - time_start)/1000} seconds`)
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user