253 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			253 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| $('body').hide();
 | |
| 
 | |
| var CurrentMusicPlayerName = null
 | |
| let VideoIndexInMusicPlayer = 0;
 | |
| let CurrentVideoIndexInMusicPlayer = 0;
 | |
| 
 | |
| 
 | |
| function GetElementByClassName(className) {
 | |
|     return $('.' + className)
 | |
| }
 | |
| 
 | |
| function GetElementByIdentifier(identifier) {
 | |
|     return $('#' + identifier)
 | |
| }
 | |
| 
 | |
| function GetElementByTagName(tagName) {
 | |
|     return $(tagName)
 | |
| }
 | |
| 
 | |
| function SendClientEvent(action, data) {
 | |
|     $.post('https://ngd-dj/'+action, JSON.stringify(data));
 | |
| }
 | |
| 
 | |
| // User Interraction
 | |
| 
 | |
| $('#AddYoutubeVideo').click(function () { 
 | |
|     GetElementByClassName('YoutubeVideoAdder').css('display','flex');
 | |
| })
 | |
| 
 | |
| $('#CancelYoutubeVideo').click(function () { 
 | |
|     GetElementByClassName('YoutubeVideoAdder').css('display','none'); 
 | |
| })
 | |
| 
 | |
| $('#SubmitYoutubeVideo').click(function () {
 | |
|     var url = $('.YoutubeVideo').val();
 | |
|     GetElementByClassName('YoutubeVideo').val('');
 | |
|     GetElementByClassName('YoutubeVideoAdder').css('display','none');
 | |
|     if (IsValidYouTubeUrl(url)) {
 | |
|         var video_id = GetYoutubeVideoId(url);
 | |
|         SendClientEvent('NewVideo', { name : CurrentMusicPlayerName, video_id : video_id})
 | |
|         UpdatePlayList({id : video_id, playing : false});   
 | |
|     }
 | |
| })
 | |
| 
 | |
| $('input[type=range]').on('input', function () {
 | |
|     SendClientEvent('ChangeVolume', { name : CurrentMusicPlayerName, volume : $(this).val() / 100})
 | |
| });
 | |
| 
 | |
| $('#close').click(function () { 
 | |
|     Close();
 | |
| })
 | |
| 
 | |
| // Events
 | |
| 
 | |
| window.addEventListener('message', function (event) {
 | |
|     let e = event.data;
 | |
|     switch (e.action) {     
 | |
|         case "ShowMusicPlayer":
 | |
|             ShowMusicPlayer(e.data);
 | |
|             break;
 | |
|         default: break;
 | |
|     }
 | |
| });
 | |
| 
 | |
| $(function () {
 | |
| 	$(document).keyup(function (e) {
 | |
| 		let keyCode = e.keyCode || e.which;
 | |
| 		if (keyCode == 27) {
 | |
|             Close();
 | |
| 		}
 | |
| 	});
 | |
| });
 | |
| 
 | |
| function Close() {
 | |
|     SendClientEvent('close', {})
 | |
|     GetElementByClassName('video_boxes').html('');
 | |
|     GetElementByClassName('Title').html('');
 | |
|     VideoIndexInMusicPlayer = 0;
 | |
|     CurrentVideoIndexInMusicPlayer = 0;
 | |
|     ResetAllStyles();
 | |
|     GetElementByTagName('body').hide();
 | |
| }
 | |
| 
 | |
| // Functions
 | |
| 
 | |
| function ShowMusicPlayer(data) {
 | |
|     CurrentMusicPlayerName = data.name;
 | |
|     GetElementByClassName('Title').html(data.musicPlayerData.title);
 | |
|     CreatePlaylist(data);
 | |
|     GetElementByTagName('body').show();
 | |
| }
 | |
| 
 | |
| function CreatePlaylist(data) {
 | |
|     for (const video of data.musicPlayerData.playlist) {
 | |
|         UpdatePlayList(video);
 | |
|     }
 | |
| }
 | |
| 
 | |
| function PlayYoutubeVideo(video_id, video_index) { 
 | |
|     SendClientEvent('PlayVideo', {name : CurrentMusicPlayerName, video_id : video_id, previous_video_index : parseInt(CurrentVideoIndexInMusicPlayer), current_video_index : parseInt(video_index)}) 
 | |
|     UpdateCover(video_id);
 | |
|     UpdatePlayListActions(video_index);
 | |
| }
 | |
| 
 | |
| function ReplayYoutubeVideo(video_id, video_index) { 
 | |
|     SendClientEvent('ReplayVideo', {name : CurrentMusicPlayerName, video_id : video_id, current_video_index : parseInt(video_index)}) 
 | |
|     GetElementByIdentifier('video_'+video_index+' .play').css('display','none');
 | |
|     GetElementByIdentifier('video_'+video_index+' .pause').css('display','block');
 | |
|     GetElementByIdentifier('video_'+video_index+' .replay').css('display','block');
 | |
|     GetElementByIdentifier('video_'+video_index+' .equalizer').css('display','block'); 
 | |
| }
 | |
| 
 | |
| function PauseYoutubeVideo(video_index) {
 | |
|     GetElementByIdentifier('video_'+video_index+' .play').css('display','block');
 | |
|     GetElementByIdentifier('video_'+video_index+' .pause').css('display','none'); 
 | |
|     SendClientEvent('PauseVideo', {name : CurrentMusicPlayerName, current_video_index : parseInt(video_index)}) 
 | |
| }
 | |
| 
 | |
| function UpdateCover(video_id) {
 | |
|     GetElementByClassName('current').css('background',`url('https://img.youtube.com//vi/${video_id}/0.jpg') center center`);
 | |
|     GetElementByClassName('current').css('background-size',`contain`);
 | |
|     GetElementByClassName('current').css('background-repeat',`no-repeat`);
 | |
| }
 | |
| 
 | |
| function RemoveYoutubeVideo(video_id, video_index) {
 | |
|     GetElementByIdentifier('video_'+video_index).css('display','none');
 | |
|     SendClientEvent('RemoveVideo', {name : CurrentMusicPlayerName, video_index : parseInt(video_index)}) 
 | |
|     if(video_index == CurrentVideoIndexInMusicPlayer) {
 | |
|         ResetCover()
 | |
|     }
 | |
| }
 | |
| 
 | |
| function UpdatePlayListActions(video_index) {
 | |
|     if (CurrentVideoIndexInMusicPlayer == 0 ) {
 | |
|         CurrentVideoIndexInMusicPlayer = video_index;
 | |
|         GetElementByIdentifier('video_'+video_index+' .play').css('display','none');
 | |
|         GetElementByIdentifier('video_'+video_index+' .pause').css('display','block');
 | |
|         GetElementByIdentifier('video_'+video_index+' .replay').css('display','block');
 | |
|         GetElementByIdentifier('video_'+video_index+' .equalizer').css('display','block'); 
 | |
|     }
 | |
|     else if (CurrentVideoIndexInMusicPlayer != video_index) {
 | |
|         GetElementByIdentifier('video_'+CurrentVideoIndexInMusicPlayer+' .play').css('display','block');
 | |
|         GetElementByIdentifier('video_'+CurrentVideoIndexInMusicPlayer+' .pause').css('display','none');
 | |
|         GetElementByIdentifier('video_'+CurrentVideoIndexInMusicPlayer+' .replay').css('display','none');
 | |
|         GetElementByIdentifier('video_'+CurrentVideoIndexInMusicPlayer+' .equalizer').css('display','none'); 
 | |
|         GetElementByIdentifier('video_'+video_index+' .play').css('display','none');
 | |
|         GetElementByIdentifier('video_'+video_index+' .pause').css('display','block');
 | |
|         GetElementByIdentifier('video_'+video_index+' .replay').css('display','block');
 | |
|         GetElementByIdentifier('video_'+video_index+' .equalizer').css('display','block'); 
 | |
|         CurrentVideoIndexInMusicPlayer = video_index;
 | |
|     }
 | |
|     else{
 | |
|         GetElementByIdentifier('video_'+video_index+' .play').css('display','none');
 | |
|         GetElementByIdentifier('video_'+video_index+' .pause').css('display','block');
 | |
|         GetElementByIdentifier('video_'+video_index+' .replay').css('display','block');
 | |
|         GetElementByIdentifier('video_'+video_index+' .equalizer').css('display','block'); 
 | |
|     }
 | |
| }
 | |
| 
 | |
| function ResetAllStyles() {
 | |
|     GetElementByClassName('current').removeAttr('style');
 | |
|     GetElementByClassName('play').removeAttr('style');
 | |
|     GetElementByClassName('pause').removeAttr('style');
 | |
|     GetElementByClassName('replay').removeAttr('style');
 | |
|     GetElementByClassName('equalizer').removeAttr('style');
 | |
| }
 | |
| 
 | |
| function ResetCover() {
 | |
|     GetElementByClassName('current').removeAttr('style');
 | |
| }
 | |
| 
 | |
| 
 | |
| //██╗  ██╗████████╗███╗   ███╗██╗         ██████╗ ██╗   ██╗██╗██╗     ██████╗ ███████╗██████╗ 
 | |
| //██║  ██║╚══██╔══╝████╗ ████║██║         ██╔══██╗██║   ██║██║██║     ██╔══██╗██╔════╝██╔══██╗
 | |
| //███████║   ██║   ██╔████╔██║██║         ██████╔╝██║   ██║██║██║     ██║  ██║█████╗  ██████╔╝
 | |
| //██╔══██║   ██║   ██║╚██╔╝██║██║         ██╔══██╗██║   ██║██║██║     ██║  ██║██╔══╝  ██╔══██╗
 | |
| //██║  ██║   ██║   ██║ ╚═╝ ██║███████╗    ██████╔╝╚██████╔╝██║███████╗██████╔╝███████╗██║  ██║
 | |
| //╚═╝  ╚═╝   ╚═╝   ╚═╝     ╚═╝╚══════╝    ╚═════╝  ╚═════╝ ╚═╝╚══════╝╚═════╝ ╚══════╝╚═╝  ╚═╝
 | |
| 
 | |
| 
 | |
| function UpdatePlayList(video) {
 | |
|     VideoIndexInMusicPlayer = VideoIndexInMusicPlayer + 1;
 | |
|     var infos = GetVideoTitle(video.id);
 | |
|     $(".video_boxes").append(`<div class="video_box" id="video_${VideoIndexInMusicPlayer}">
 | |
|             <div class="video_info">
 | |
|                 <div class="delete"><i class="material-icons" onClick="RemoveYoutubeVideo('${video.id}','${VideoIndexInMusicPlayer}')">playlist_remove</i></div>
 | |
|                 <div class="img" style ="background: url(https://img.youtube.com//vi/${video.id}/0.jpg) center center;background-size: cover;"></div>
 | |
|                 <div class="titles">
 | |
|                     <h5>${infos[0].substring(0, 25)}</h5>
 | |
|                     <p>${infos[1].substring(0, 25)}</p>
 | |
|                 </div>
 | |
|             </div>
 | |
|             <div class="actions">
 | |
|                 <div class="equalizer"><i class="material-icons" style ="color: #F44336;">equalizer</i></div>
 | |
|                 <div class="play"><i class="material-icons" onClick="PlayYoutubeVideo('${video.id}','${VideoIndexInMusicPlayer}')">play_arrow</i></div>
 | |
| 				<div class="pause"><i class="material-icons" onClick="PauseYoutubeVideo('${VideoIndexInMusicPlayer}')">pause</i></div>
 | |
| 				<div class="replay"><i class="material-icons" onClick="ReplayYoutubeVideo('${video.id}','${VideoIndexInMusicPlayer}')">replay</i></div>
 | |
|             </div>
 | |
|         </div>`);
 | |
|     if (video.playing == true) {
 | |
|         CurrentVideoIndexInMusicPlayer = VideoIndexInMusicPlayer;
 | |
|         GetElementByIdentifier('video_'+VideoIndexInMusicPlayer+' .play').css('display', video.paused ? 'block' : 'none');
 | |
|         GetElementByIdentifier('video_'+VideoIndexInMusicPlayer+' .pause').css('display', video.paused ? 'none' : 'block');
 | |
|         GetElementByIdentifier('video_'+VideoIndexInMusicPlayer+' .replay').css('display','block');
 | |
|         GetElementByIdentifier('video_'+VideoIndexInMusicPlayer+' .equalizer').css('display','block');  
 | |
|         UpdateCover(video.id);
 | |
|     }
 | |
|     if(video.removed == true) {
 | |
|         GetElementByIdentifier('video_'+VideoIndexInMusicPlayer).css('display','none');
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| //██╗   ██╗ ██████╗ ██╗   ██╗████████╗██╗   ██╗██████╗ ███████╗    ██╗   ██╗████████╗██╗██╗     ███████╗
 | |
| //╚██╗ ██╔╝██╔═══██╗██║   ██║╚══██╔══╝██║   ██║██╔══██╗██╔════╝    ██║   ██║╚══██╔══╝██║██║     ██╔════╝
 | |
| // ╚████╔╝ ██║   ██║██║   ██║   ██║   ██║   ██║██████╔╝█████╗      ██║   ██║   ██║   ██║██║     ███████╗
 | |
| //  ╚██╔╝  ██║   ██║██║   ██║   ██║   ██║   ██║██╔══██╗██╔══╝      ██║   ██║   ██║   ██║██║     ╚════██║
 | |
| //   ██║   ╚██████╔╝╚██████╔╝   ██║   ╚██████╔╝██████╔╝███████╗    ╚██████╔╝   ██║   ██║███████╗███████║
 | |
| //   ╚═╝    ╚═════╝  ╚═════╝    ╚═╝    ╚═════╝ ╚═════╝ ╚══════╝     ╚═════╝    ╚═╝   ╚═╝╚══════╝╚══════╝
 | |
| 
 | |
| 
 | |
| function IsValidYouTubeUrl(url) {
 | |
|     if (url != undefined || url != '') {
 | |
|         var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/;
 | |
|         var match = url.match(regExp);
 | |
|         if (match && match[2].length == 11) {     
 | |
|             return true
 | |
|         }
 | |
|         return false
 | |
|     }
 | |
| }
 | |
| 
 | |
| function GetYoutubeVideoId(url) {
 | |
|     var video_id = url.split('v=')[1];
 | |
|     var ampersandPosition = video_id.indexOf('&');
 | |
|     if(ampersandPosition != -1) {
 | |
|         video_id = video_id.substring(0, ampersandPosition);
 | |
|     }
 | |
|     return video_id
 | |
| }
 | |
| 
 | |
| function GetVideoTitle(video_id) {
 | |
|     const apiUrl = `https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=${video_id}&format=json`;
 | |
|     const xhr = new XMLHttpRequest();
 | |
|     xhr.open('GET', apiUrl, false);
 | |
|     xhr.send();
 | |
|     if (xhr.status === 200) {
 | |
|         const data = JSON.parse(xhr.responseText);
 | |
|         return [data.title, data.author_name];
 | |
|     } else {
 | |
|         return "Unknown";
 | |
|     }
 | |
| }
 | 
