b68/packages/cli/bin/commands/yt.js

206 lines
6.5 KiB
JavaScript

import fetch from 'node-fetch'
import APIURL from '../../api.config.js'
import fs from 'fs'
import Configstore from 'configstore'
import URLParse from 'url-parse'
import QueryString from 'query-string'
const packageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8'))
const configStore = new Configstore(packageJson.name)
export const videoInfo = async (url) => {
if (!configStore.has('email' || !configStore.has('apiKey'))) {
console.log('Please authenticate first!')
process.exit(1)
}
const ytURL = URLParse(url)
const q = QueryString.parse(ytURL.query)
if (
(ytURL.hostname !== 'www.youtube.com' &&
ytURL.hostname !== 'youtube.com') ||
!q.v
) {
console.log('Invalid YT URL or no video ID found!')
process.exit(1)
}
var options = {
method: 'GET',
url: APIURL + '/api/private/yt/video/' + q.v,
headers: {
apikey: configStore.get('apiKey'),
email: configStore.get('email'),
},
}
const response = await fetch(options.url, {
method: 'GET',
headers: options.headers,
})
const data = await response.json()
console.log('Title: ' + data.snippet.title)
console.log('Description: ' + data.snippet.description)
console.log('Published at: ' + data.snippet.publishedAt)
console.log('Channel: ' + data.snippet.channelTitle)
console.log('Views: ' + data.statistics.viewCount)
console.log('Likes: ' + data.statistics.likeCount)
process.exit(0)
}
export const channelInfo = async (url) => {
// if(!configStore.has("email" || !configStore.has("apiKey"))){
// console.log("Please authenticate first!");
// process.exit(1);
// }
// const ytURL = URLParse(url);
// const q = QueryString.parse(ytURL.query)
// if((ytURL.hostname !== "www.youtube.com" && ytURL.hostname !== "youtube.com") || !q.channelId){
// console.log("Invalid YT URL or no channel ID found!");
// process.exit(1);
// }
// var options = {
// 'method': 'GET',
// 'url': APIURL+'/api/private/yt/channel/'+q.channelId,
// 'headers': {
// 'apikey': configStore.get('apiKey'),
// 'email': configStore.get('email')
// }
// };
// await fetch(options.url, {
// method: 'GET',
// headers: options.headers
// }).then(res => res.json())
// .then(data => {
// console.log("Title: "+data.snippet.title);
// console.log("Description: "+data.snippet.description);
// console.log("Published at: "+data.snippet.publishedAt);
// console.log("Channel: "+data.snippet.channelTitle);
// console.log("Views: "+data.statistics.viewCount);
// console.log("Likes: "+data.statistics.likeCount);
// process.exit(0)
// }).catch(err => {
// console.log(err);
// process.exit(1);
// })
console.log('Not implemented yet!')
process.exit(1)
}
export const playlistInfo = async (url) => {
if (!configStore.has('email' || !configStore.has('apiKey'))) {
console.log('Please authenticate first!')
process.exit(1)
}
const ytURL = URLParse(url)
const q = QueryString.parse(ytURL.query)
if (
(ytURL.hostname !== 'www.youtube.com' &&
ytURL.hostname !== 'youtube.com') ||
!q.list
) {
console.log('Invalid YT URL or no channel ID found!')
process.exit(1)
}
var options = {
method: 'GET',
url: APIURL + '/api/private/yt/playlist/' + q.list,
headers: {
apikey: configStore.get('apiKey'),
email: configStore.get('email'),
},
}
const response = await fetch(options.url, {
method: 'GET',
headers: options.headers,
}).then((res) => res.json())
// console.log(response)
console.log('Title: ' + response.snippet.title)
console.log('Description: ' + response.snippet.description)
console.log('Published at: ' + response.snippet.publishedAt)
console.log('Channel: ' + response.snippet.channelTitle)
console.log('Items: ' + response.contentDetails.itemCount)
process.exit(0)
}
export const playlistItems = async (url) => {
if (!configStore.has('email' || !configStore.has('apiKey'))) {
console.log('Please authenticate first!')
process.exit(1)
}
const ytURL = URLParse(url)
const q = QueryString.parse(ytURL.query)
if (
(ytURL.hostname !== 'www.youtube.com' &&
ytURL.hostname !== 'youtube.com') ||
!q.list
) {
console.log('Invalid YT URL or no channel ID found!')
process.exit(1)
}
var options = {
method: 'GET',
url: APIURL + '/api/private/yt/playlist/' + q.list + '/items',
headers: {
apikey: configStore.get('apiKey'),
email: configStore.get('email'),
},
}
const response = await fetch(options.url, {
method: 'GET',
headers: options.headers,
}).then((res) => res.json())
// console.log(response)
console.log(response.length)
for (const item of response) {
console.log('\n')
console.log('Title: ' + item.snippet.title)
console.log('Published at: ' + item.snippet.publishedAt)
console.log('Channel: ' + item.snippet.channelTitle)
console.log(
'URL: ' +
'https://youtube.com/watch?v=' +
item.snippet.resourceId.videoId
)
}
process.exit(0)
}
export const spotify = async (url) => {
if (!configStore.has('email' || !configStore.has('apiKey'))) {
console.log('Please authenticate first!')
process.exit(1)
}
const spotURL = URLParse(url)
const trackID = spotURL.pathname.split('/')[2]
if (
spotURL.hostname !== 'open.spotify.com' ||
!trackID ||
spotURL.pathname.split('/')[1] !== 'track'
) {
console.log('Invalid Spotify URL or no tracks found!')
process.exit(1)
}
var options = {
method: 'GET',
url: APIURL + '/api/private/yt/convertSpotify/' + trackID,
headers: {
apikey: configStore.get('apiKey'),
email: configStore.get('email'),
},
}
const response = await fetch(options.url, {
method: 'GET',
headers: options.headers,
}).then((res) => res.json())
console.log('Youtube URL: ' + response.videoURL)
process.exit(0)
}
export default {
videoInfo,
channelInfo,
playlistInfo,
playlistItems,
spotify,
}