Version 0.2.0 - Change Youtube Information Program
This commit is contained in:
139
backend/src/media/YoutubeInformation.js
Normal file
139
backend/src/media/YoutubeInformation.js
Normal file
@@ -0,0 +1,139 @@
|
||||
const {LogType} = require('loguix');
|
||||
const clog = new LogType("YoutubeInformation");
|
||||
const config = require('../utils/Database/Configuration');
|
||||
const YOUTUBE_API_KEY = config.getYoutubeApiKey()
|
||||
const { Song } = require('../player/Song');
|
||||
const { Playlist } = require('../player/Playlist');
|
||||
const { getReadableDuration } = require('../utils/TimeConverter');
|
||||
|
||||
|
||||
async function
|
||||
getQuery(query) {
|
||||
// Check Query not null and a string
|
||||
if(query === null && typeof query !== 'string') {
|
||||
clog.error("Impossible de rechercher une vidéo YouTube, car la requête est nulle");
|
||||
return null;
|
||||
}
|
||||
// * Fetch
|
||||
try {
|
||||
const response = await fetch(`https://www.googleapis.com/youtube/v3/search?part=snippet&type=video&q=${encodeURIComponent(query)}&key=${YOUTUBE_API_KEY}`);
|
||||
const data = await response.json();
|
||||
|
||||
var videoLink = null
|
||||
const videoId = data.items[0]?.id.videoId;
|
||||
if(videoId) videoLink = `https://www.youtube.com/watch?v=${videoId}`;
|
||||
if(videoLink === null) {
|
||||
clog.error("Impossible de récupérer le lien de la vidéo YouTube à partir de la requête");
|
||||
return null;
|
||||
}
|
||||
const song = await getVideo(videoLink);
|
||||
|
||||
return song;
|
||||
|
||||
} catch (error) {
|
||||
clog.error('Erreur lors de la recherche YouTube: ' + error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
async function getVideo(url) {
|
||||
// Extract video ID from URL if it exists and is valid (11 characters) and if not return "NOT_VALID"
|
||||
// Extract id from youtu.be youtube.com and music.youtube.com
|
||||
const videoId = url.match(/(?:youtu\.be\/|youtube\.com\/|music\.youtube\.com\/)(?:watch\?v=)?([a-zA-Z0-9_-]{11})/);
|
||||
if(videoId === null) {
|
||||
clog.error("Impossible de récupérer l'identifiant de la vidéo YouTube à partir de l'URL");
|
||||
return null;
|
||||
}
|
||||
// Fetch video information
|
||||
try {
|
||||
const response = await fetch(`https://www.googleapis.com/youtube/v3/videos?part=snippet&id=${videoId[1]}&key=${YOUTUBE_API_KEY}`);
|
||||
const data = await response.json();
|
||||
|
||||
const video = data.items[0];
|
||||
if(video) {
|
||||
|
||||
const songReturn = new Song()
|
||||
await songReturn.processYoutubeVideo(video);
|
||||
|
||||
return songReturn;
|
||||
} else {
|
||||
clog.error("Impossible de récupérer la vidéo YouTube à partir de l'identifiant");
|
||||
return null;
|
||||
}
|
||||
} catch (error) {
|
||||
clog.error('Erreur lors de la recherche de la vidéo YouTube:' + error);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
async function getPlaylist(url) {
|
||||
// Check Query not null and a string
|
||||
if(url === null && typeof url !== 'string') {
|
||||
clog.error("Impossible de rechercher une playlist YouTube, car la requête est nulle");
|
||||
return null;
|
||||
}
|
||||
// * Fetch
|
||||
try {
|
||||
// For Playlist
|
||||
const playlistId = url.match(/(?:youtu\.be\/|youtube\.com\/|music\.youtube.com\/)(?:playlist\?list=)?([a-zA-Z0-9_-]{34})/);
|
||||
if(playlistId === null) {
|
||||
clog.error("Impossible de récupérer l'identifiant de la vidéo YouTube à partir de l'URL");
|
||||
return null;
|
||||
}
|
||||
const response = await fetch(`https://www.googleapis.com/youtube/v3/search?part=snippet&type=playlist&q=${encodeURIComponent(playlistId[1])}&key=${YOUTUBE_API_KEY}`);
|
||||
const data = await response.json();
|
||||
|
||||
if(data.items.length === 0) {
|
||||
clog.error("Impossible de récupérer la playlist YouTube à partir de l'identifiant");
|
||||
return null;
|
||||
}
|
||||
|
||||
const playlist = new Playlist()
|
||||
playlist.type = "youtube"
|
||||
playlist.author = data.items[0].snippet.channelTitle
|
||||
playlist.authorId = data.items[0].snippet.channelId
|
||||
playlist.title = data.items[0].snippet.title
|
||||
playlist.thumbnail = data.items[0].snippet.thumbnails.high.url
|
||||
playlist.description = data.items[0].snippet.description
|
||||
playlist.url = `https://www.youtube.com/playlist?list=${playlistId[1]}`
|
||||
playlist.id = playlistId[1]
|
||||
|
||||
|
||||
|
||||
|
||||
// Get all songs from playlist
|
||||
|
||||
const responsePlaylist = await fetch(`https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=${playlistId[1]}&key=${YOUTUBE_API_KEY}&maxResults=100`);
|
||||
const dataPlaylist = await responsePlaylist.json();
|
||||
|
||||
if(dataPlaylist.items.length === 0) {
|
||||
clog.error("Impossible de récupérer les vidéos de la playlist YouTube à partir de l'identifiant ou la playlist est vide");
|
||||
return null;
|
||||
}
|
||||
|
||||
for (const video of dataPlaylist.items) {
|
||||
const song = new Song()
|
||||
video.id = video.snippet.resourceId.videoId
|
||||
await song.processYoutubeVideo(video)
|
||||
//? Add seconds to playlist duration
|
||||
playlist.duration += song.duration
|
||||
playlist.songs.push(song)
|
||||
}
|
||||
playlist.readduration = getReadableDuration(playlist.duration)
|
||||
return playlist;
|
||||
|
||||
|
||||
|
||||
|
||||
} catch (error) {
|
||||
clog.error('Erreur lors de la recherche YouTube: ' + error);
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = {getQuery, getVideo, getPlaylist}
|
Reference in New Issue
Block a user