summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--static/icons/sound.pngbin0 -> 610 bytes
-rw-r--r--static/index.html12
-rw-r--r--static/player.js20
-rw-r--r--static/playlist.js53
-rw-r--r--static/style.css12
6 files changed, 92 insertions, 6 deletions
diff --git a/.gitignore b/.gitignore
index c064cc9..0d8ffc4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@
*.vim
*.pyc
/config
+/cache
diff --git a/static/icons/sound.png b/static/icons/sound.png
new file mode 100644
index 0000000..6056d23
--- /dev/null
+++ b/static/icons/sound.png
Binary files differ
diff --git a/static/index.html b/static/index.html
index 15384aa..23e2db6 100644
--- a/static/index.html
+++ b/static/index.html
@@ -4,6 +4,7 @@
<title>foo</title>
<script src="/static/audio.js" type="text/javascript"></script>
<script src="/static/player.js" type="text/javascript"></script>
+ <script src="/static/playlist.js" type="text/javascript"></script>
<link rel="stylesheet" href="/static/style.css" type="text/css" />
</head>
<body>
@@ -14,7 +15,16 @@
<input type="button" value="Refresh directory" onclick="list(document.getElementById('current-dir').innerHTML.split(': ', 2)[1])" />
</div>
<div id="current-dir"></div>
- <ul id="song-links"></ul>
+ <div id="hpanel">
+ <span>
+ <span class="list-header">Browse directory</span>
+ <ul id="song-links"></ul>
+ </span>
+ <span>
+ <span class="list-header">Song queue</span>
+ <ul id="playlist"></ul>
+ </span>
+ </div>
<div id="audio-src-url">none</div>
<audio id="audio" controls="controls"></audio>
</body>
diff --git a/static/player.js b/static/player.js
index c0cf6ff..2fa8793 100644
--- a/static/player.js
+++ b/static/player.js
@@ -1,4 +1,5 @@
audio = null;
+playlist = null;
// pre-load some icons
cache_images = new Array(
@@ -51,7 +52,7 @@ function MusicListing(type, path, name, cached) {
if(type == 'dir') {
list(path);
} else if(type == 'file') {
- ml.play();
+ playlist.add(ml);
}
return false;
}
@@ -135,9 +136,24 @@ function event_handler(event) {
case 'cached':
case 'recoding':
log('[' + data['type'] + '] ' + data['path']);
+ // update directory browser
var a = get_a(data['path']);
if(a)
a.setAttribute('class', 'file file-' + data['type']);
+ // update song queue
+ var li = playlist.get(data['path']);
+ if(li) {
+ a = li.getElementsByTagName('a')[0];
+ if(data['type'] == 'cached') {
+ // play the current song if we were waiting for it
+ if(li == playlist.current)
+ a.onclick();
+ else
+ a.setAttribute('class', '');
+ } else {
+ a.setAttribute('class', 'file-recoding');
+ }
+ }
break;
case 'play':
log('[play] ' + data['path']);
@@ -163,5 +179,7 @@ window.onload = function() {
event_open();
audio = new Audio();
+ playlist = new Playlist(document.getElementById('playlist'), audio);
+ audio.audio.addEventListener('ended', function() { playlist.next(); });
list('/');
}
diff --git a/static/playlist.js b/static/playlist.js
new file mode 100644
index 0000000..5e41de5
--- /dev/null
+++ b/static/playlist.js
@@ -0,0 +1,53 @@
+function Playlist(pl, audio) {
+ this.pl = pl;
+ this.audio = audio;
+ this.current = null;
+
+ this.get = function(path) {
+ var li = this.current;
+ while(li) {
+ var a = li.getElementsByTagName('a')[0];
+ if(a.ml.path == path)
+ return li;
+ li = li.nextElementSibling;
+ }
+ return null;
+ }
+
+ this.add = function(ml) {
+ var a = document.createElement('a');
+ a.setAttribute('href', '#');
+ a.appendChild(document.createTextNode(ml.path));
+ a.ml = ml;
+ var li = document.createElement('li');
+ var pl = this;
+ a.onclick = function() {
+ while(li.previousElementSibling)
+ li.previousElementSibling.parentElement.removeChild(li.previousElementSibling);
+ a.setAttribute('class', 'playing');
+ pl.current = li;
+ ml.play();
+ return false;
+ }
+ log(a.click);
+
+ li.appendChild(a);
+ this.pl.appendChild(li);
+ }
+
+ this.next = function() {
+ log('next');
+ log('this: ' + this);
+ log('current: ' + this.current);
+ if(this.current) {
+ var old = this.current;
+ log('old: ' + old);
+ this.current = this.current.nextElementSibling;
+ old.parentElement.removeChild(old);
+ }
+ if(this.current) {
+ var a = this.current.getElementsByTagName('a')[0];
+ a.onclick();
+ }
+ }
+}
diff --git a/static/style.css b/static/style.css
index d086227..3ad648c 100644
--- a/static/style.css
+++ b/static/style.css
@@ -1,9 +1,13 @@
-ul#song-links { list-style-type: none; }
-ul#song-links a { text-decoration: none; color: inherit; }
-ul#song-links a:hover { text-decoration: underline; }
+ul#song-links a, ul#playlist a { text-decoration: none; color: inherit; }
+ul#song-links a:hover, ul#playlist a:hover { text-decoration: underline; }
a.dir { background-image: url('/static/icons/folder.png'); }
a.file { background-image: url('/static/icons/music.png'); }
a.file-cached { background-image: url('/static/icons/music-cached.png'); }
-a.dir, a.file { background-repeat: no-repeat; padding-left: 20px; }
+a.dir, a.file, ul#playlist li a { background-repeat: no-repeat; padding-left: 20px; }
a.file-recoding { background-image: url('/static/icons/loading.gif'); }
a.file-queued { background-image: url('/static/icons/music-queued.png'); }
+div#hpanel { margin-top: 1em; }
+div#hpanel span { display: inline-block; vertical-align: top; }
+div#hpanel span ul { list-style-type: none; padding-left: 0; margin-top: .5em; vertical-align: top; }
+ul#playlist li a.playing { background-image: url('/static/icons/sound.png'); }
+span.list-header { font-size: large; }