akkun3704 commited on
Commit
9198234
·
1 Parent(s): 4cf7277

Create index.js

Browse files
Files changed (1) hide show
  1. index.js +116 -0
index.js ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const yts = require('yt-search')
2
+ const morgan = require('morgan')
3
+ const express = require('express')
4
+
5
+ const ytIdRegex = /(?:http(?:s|):\/\/|)(?:(?:www\.|)?youtube(?:\-nocookie|)\.com\/(?:shorts\/)?(?:watch\?.*(?:|\&)v=|embed\/|v\/)?|youtu\.be\/)([-_0-9A-Za-z]{11})/
6
+
7
+ const post = (url, form, headers = {}) => fetch(url, {
8
+ method: 'post',
9
+ body: new URLSearchParams(form),
10
+ headers
11
+ })
12
+
13
+ const convert = async (url, v_id, ftype, fquality, fname, token, timeExpire) => {
14
+ let params = {
15
+ v_id, ftype,
16
+ fquality, fname,
17
+ token, timeExpire,
18
+ client: 'yt5s.com'
19
+ }
20
+ let resServer = await (await post(url, params, { 'x-requested-key': 'de0cfuirtgf67a' })).json()
21
+ let server = resServer.c_server
22
+ if (!server && ftype === 'mp3') return server || resServer.d_url || ''
23
+ let data = await (await post(`${server}/api/json/convert`, params)).json()
24
+ // console.log(data)
25
+ let result
26
+ if (data.statusCode === 200) result = data.result
27
+ while (!result) {
28
+ let json = await (await post(`${server}/api/json/convert`, params)).json()
29
+ // console.log(json)
30
+ if (json.statusCode === 200) {
31
+ result = json.result
32
+ break
33
+ }
34
+ await new Promise(resolve => setTimeout(resolve, 2000))
35
+ }
36
+ return result
37
+ }
38
+
39
+ const youtubedl = async (url) => {
40
+ let html = await (await fetch('https://yt5s.com/en32')).text()
41
+ let urlAjax = (html.match(/k_url_search="(.*?)"/) || [])[1]
42
+ let urlConvert = (html.match(/k_url_convert="(.*?)"/) || [])[1]
43
+ let json = await (await post(urlAjax, { q: url, vt: 'home' })).json()
44
+ let video = {}, audio = {}
45
+ if (!json?.links) throw json.mess
46
+ Object.values(json.links.mp4).map(({ k, size }) => video[k] = {
47
+ quality: k,
48
+ fileSizeH: size,
49
+ fileSize: parseFloat(size) * (/MB$/.test(size) ? 1000 : 1),
50
+ download: convert.bind(null, urlConvert, json.vid, 'mp4', k, json.fn, json.token, parseInt(json.timeExpires))
51
+ })
52
+
53
+ Object.values(json.links.mp3).map(({ key, size }) => audio[key] = {
54
+ quality: key,
55
+ fileSizeH: size,
56
+ fileSize: parseFloat(size) * (/MB$/.test(size) ? 1000 : 1),
57
+ download: convert.bind(null, urlConvert, json.vid, 'mp3', key.replace(/kbps/i, ''), json.fn, json.token, parseInt(json.timeExpires))
58
+ })
59
+
60
+ return {
61
+ id: json.vid,
62
+ title: json.title,
63
+ thumbnail: `https://i.ytimg.com/vi/${json.vid}/0.jpg`,
64
+ video,
65
+ audio
66
+ }
67
+ }
68
+
69
+ const app = express()
70
+ .set('json spaces', 4)
71
+ .use(morgan('dev'))
72
+ .use(express.json())
73
+ .all('/', (_, res) => res.send('Hello World'))
74
+ .get('/yt', async (req, res) => {
75
+ const host = 'https://' + req.get('host')
76
+ try {
77
+ const { url, type, quality, json } = req.query
78
+ if (!ytIdRegex.test(url)) return res.json({ message: 'Invalid URL' })
79
+ if (!!json) {
80
+ let ytId = ytIdRegex.exec(url)?.[1]
81
+ if (!ytId) return res.json({ message: 'No video id found' })
82
+ let data = await yts({ videoId: ytId })
83
+ return res.json({
84
+ ...data,
85
+ download: {
86
+ audio: `${host}/yt?url=${url}&type=audio&quality=`,
87
+ video: `${host}/yt?url=${url}&type=video&quality=`,
88
+ }
89
+ })
90
+ }
91
+ if (!type || !/audio|video/i.test(type)) type = 'video'
92
+ let data = await youtubedl(url).catch(e => console.log(e))
93
+ if (!data) return res.json({ message: 'Error: link download not found' })
94
+ type = type.toLowerCase()
95
+ let result = quality ? Object.values(data[type]).find(x => x.quality == quality) : Object.values(data[type])[0]
96
+ if (quality && !result) return res.json({ message: `Invalid quality: ${quality}, available quality (${Object.keys(data[type]).join('/')})` })
97
+ if (!result) return res.json({ message: 'Error: can\'t download' })
98
+ res.redirect(await result.download())
99
+ } catch (e) {
100
+ console.log(e)
101
+ res.json({ message: e })
102
+ }
103
+ })
104
+ .get('/search', async (req, res) => {
105
+ try {
106
+ let q = req.query.q || req.query.query
107
+ if (!q) return res.json({ message: 'Input parameter q' })
108
+ let data = await yts(q)
109
+ if (!data.all[0]) return res.json({ message: 'Not found' })
110
+ res.json(data.all)
111
+ } catch (e) {
112
+ console.log(e)
113
+ res.json({ message: e })
114
+ }
115
+ })
116
+ .listen(7860, () => console.log('App running on port 7860'))