Initial Commit
This commit is contained in:
commit
c309554dd0
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
*/
|
7
README.md
Normal file
7
README.md
Normal file
@ -0,0 +1,7 @@
|
||||
#README
|
||||
|
||||
A simple Javascript and HTML5 music player for fedi instances.
|
||||
|
||||
Intended to be displayed in an iframe in the optional panel for pleroma instances.
|
||||
|
||||
git clone the repository into instance/panel.html
|
71
audioPlayer.js
Normal file
71
audioPlayer.js
Normal file
@ -0,0 +1,71 @@
|
||||
function appendMusicList(el, title, time)
|
||||
{
|
||||
const tr = document.createElement("tr")
|
||||
const tdtitle = document.createElement("td")
|
||||
const tdtime = document.createElement("td")
|
||||
const div = document.createElement("div")
|
||||
|
||||
tr.setAttribute("id", "queue-item")
|
||||
tdtitle.setAttribute("class", "title")
|
||||
tdtime.setAttribute("width", "50")
|
||||
tdtime.innerHTML = time
|
||||
div.setAttribute("colspan", "2")
|
||||
div.innerHTML = title
|
||||
|
||||
tdtitle.appendChild(div)
|
||||
tr.appendChild(tdtitle)
|
||||
tr.appendChild(tdtime)
|
||||
el.appendChild(tr)
|
||||
|
||||
return tr
|
||||
}
|
||||
|
||||
function audioPlayer()
|
||||
{
|
||||
const aPlay = document.getElementById("audioPlayer");
|
||||
const aList = document.getElementById("audioPlaylist");
|
||||
const aTrack = document.getElementById("audioTrack");
|
||||
const aArtist = document.getElementById("audioArtist");
|
||||
const aCoverArt = document.getElementById("audioCoverArt")
|
||||
|
||||
var currentSong = null;
|
||||
|
||||
function changeSong(idx, doplay=true)
|
||||
{
|
||||
if (idx === currentSong)
|
||||
{
|
||||
aPlay.play()
|
||||
return
|
||||
}
|
||||
const aListLinks = aList.getElementsByTagName("tr");
|
||||
if (currentSong !== null)
|
||||
{
|
||||
aListLinks[currentSong].classList.remove("current-song");
|
||||
}
|
||||
currentSong = idx % aListLinks.length
|
||||
aListLinks[currentSong].classList.add("current-song");
|
||||
|
||||
const aSelected = aListLinks[currentSong].getElementsByTagName("div")[0]
|
||||
aPlay.src = musicList[idx][0]
|
||||
aTrack.innerHTML = musicList[idx][1]
|
||||
aArtist.innerHTML = musicList[idx][2]
|
||||
aCoverArt.src = musicList[idx][4]
|
||||
if (doplay === true)
|
||||
{
|
||||
aPlay.play();
|
||||
}
|
||||
}
|
||||
|
||||
musicList.forEach((value, index, array) => {
|
||||
const el = appendMusicList(aList, value[1], value[3])
|
||||
el.addEventListener("click", () => {
|
||||
// el.preventDefault();
|
||||
changeSong(index);
|
||||
});
|
||||
})
|
||||
|
||||
aPlay.addEventListener("ended", function(){
|
||||
changeSong(currentSong + 1);
|
||||
})
|
||||
changeSong(0, false);
|
||||
}
|
38
index.html
Normal file
38
index.html
Normal file
@ -0,0 +1,38 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Music Player</title>
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
</head>
|
||||
<body>
|
||||
<main>
|
||||
<article>
|
||||
<aside>
|
||||
<img id="audioCoverArt" class="audioCoverArt" src="" alt="Cover"></img>
|
||||
</aside>
|
||||
<div class="content">
|
||||
<header>
|
||||
<h3>
|
||||
<a id="audioTrack">Track</a>
|
||||
</h3>
|
||||
By
|
||||
<a id="audioArtist">Artist</a>
|
||||
</header>
|
||||
</div>
|
||||
</article>
|
||||
<audio controls id="audioPlayer">
|
||||
Sorry, your browser doesn't support HTML5!
|
||||
</audio>
|
||||
<div class="queue-wrapper">
|
||||
<table class="playlist">
|
||||
<tbody id="audioPlaylist">
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<script src="musicList.js"></script>
|
||||
<script src="audioPlayer.js"></script>
|
||||
<script>audioPlayer();</script>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
12
musicList.js
Normal file
12
musicList.js
Normal file
@ -0,0 +1,12 @@
|
||||
const musicList = [
|
||||
["media/declare_war_on_all_vocaloid", "Declare War on All Vocaloid", "Sukone Tei", "05:53", "art/declare_war_on_all_vocaloid.png"],
|
||||
["media/chains.m4a", "Chains", "Sukone Tei", "05:46", "art/chains.png"],
|
||||
["media/loyalty.opus", "Verheerender - LOYALTY", "Azur Lane", "01:45", "art/loyalty.jpg"],
|
||||
["media/true_love_restraint.mp3", "True Love Restraint", "Len Kagamine", "03:35", "art/true_love_restraint.jpg"],
|
||||
["media/tei.opus", "Tei", "Sukone Tei", "04:18", "art/tei.png"],
|
||||
["media/insanity.mp3", "iNSaNiTY", "Teto Sakebi + Ritsu Kire", "04:55", "art/insanity.png"],
|
||||
["media/youre_seriously_mad.flac", "You’re Seriously Mad? I’m Not Mistaken Here?", "MAYU", "03:50", "art/your_seriously_mad.png"],
|
||||
["media/psychotic_love_song.flac", "Psychotic Love Song", "Sukone Tei", "05:02", "art/psychoticlovesong.png"],
|
||||
["media/rotten_girl.mp3", "Rotten Girl, Grotesque Romance", "Hatsune Miku", "04:10", "art/grotesquromance.png"],
|
||||
["media/monopolizing_romance.flac", "Monopolizing Romance", "Hatsune Miku", "03:36", "art/monopolizing_romance.png"]
|
||||
]
|
10
panel.html
Normal file
10
panel.html
Normal file
@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Music Player</title>
|
||||
<link rel="stylesheet" href="styles.css">
|
||||
</head>
|
||||
<iframe scrolling="no" src=index.html width=100% height=307px frameborder="no">
|
||||
</iframe>
|
||||
</html>
|
91
styles.css
Normal file
91
styles.css
Normal file
@ -0,0 +1,91 @@
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
html {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
main {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
aside {
|
||||
padding: .5em;
|
||||
float: right;
|
||||
max-width: 120px;
|
||||
max-height: 120px;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
img.audioCoverArt{
|
||||
height: 60px;
|
||||
width: 60px;
|
||||
}
|
||||
|
||||
article{
|
||||
background-color: #1b1c1d;
|
||||
color: white;
|
||||
position: relative;
|
||||
display: block;
|
||||
padding: 1.25em;
|
||||
}
|
||||
|
||||
.queue-wrapper {
|
||||
flex: 1;
|
||||
padding: .5em;
|
||||
background-color: #2f3030;
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: .5em;
|
||||
font-size: 90%;
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
.current-song * {
|
||||
background-color: white;
|
||||
color: black;
|
||||
}
|
||||
|
||||
tr:hover {
|
||||
background-color: #1b1c1d;
|
||||
color: white;
|
||||
}
|
||||
|
||||
tr {
|
||||
cursor: pointer;
|
||||
color: white;
|
||||
}
|
||||
|
||||
audio {
|
||||
width: 100%;
|
||||
vertical-align: bottom;
|
||||
background-color: #1b1c1d;
|
||||
}
|
||||
|
||||
audio::-webkit-media-controls-enclosure{
|
||||
border-radius: 0px;
|
||||
max-height: 40px;
|
||||
}
|
||||
|
||||
audio::-webkit-media-controls-play-button {
|
||||
background-color: lightblue;
|
||||
}
|
Loading…
Reference in New Issue
Block a user