2.3.7 horizontal nav, media keys

This commit is contained in:
Trevor Squillario 2012-12-21 00:42:39 -05:00
parent 53ed1bc0d4
commit 77831e1ef6
17 changed files with 1914 additions and 1553 deletions

View file

@ -10,7 +10,7 @@ https://github.com/tsquillario/MiniSub/issues
Features
* HTML5 Audio with Flash fallback (provided by the SoundManager2 library)
* Flexible Layout (will scale to whatever size your browser window is)
* Keyboard shortcuts (back, forward, play/pause, skip to artist)
* Keyboard shortcuts (back, forward, play/pause, skip to artist, media keys)
* Playlist support (create new, add to existing, delete)
* Podcast support (includes description field on hover)
* Favorite/Starred support for Albums & Songs

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

View file

@ -24,6 +24,7 @@
<script src="js/plugins/jquery.scrollTo-1.4.2-min.js" type="text/javascript"></script>
<script src="js/jplayer/jquery.jplayer.min.js" type="text/javascript"></script>
<script src="js/fancybox/jquery.fancybox.pack.js" type="text/javascript"></script>
<script src="js/plugins/UnityShim.js" type="text/javascript"></script>
<script src="js/libs/utils.js" type="text/javascript"></script>
<script src="js/app.js" type="text/javascript"></script>
<script src="js/libs/api.js" type="text/javascript"></script>
@ -45,34 +46,36 @@
<li><a href="#tabPlaylists" id="action_tabPlaylists" title="Playlists"><img src="images/list_gd_16x14.png" /></a></li>
<li><a href="#tabPodcasts" id="action_tabPodcasts" title="Podcasts"><img src="images/rss_16x16.png" /></a></li>
<!--<li><a href="#tabVideos" id="action_tabVideos" title="Videos"><img src="images/movie_gd_16x16.png" /></a></li>-->
<li><a href="#tabPreferences" id="action_tabPreferences" class="last" title="Preferences"><img src="images/cog_16x16.png" /></a></li>
<li><a href="#tabSettings" id="action_tabSettings" class="last" title="Settings"><img src="images/cog_16x16.png" /></a></li>
</ul>
<div id="toploading"></div>
</div>
<div id="search">
<input type="text" id="Search" class="medium" title="Wildcards (*) supported"/>
<select id="SearchType" name="SearchType">
<option value="song">Song</option>
<option value="album">Album</option>
</select>
<a href="#" class="button" id="action_Search" title="Search"><img class="pad" src="images/magnifying_glass_alt_12x12.png" /></a>
</div>
<div id="content">
<div id="tabLibrary" class="tabcontent">
<div class="actions floatleft">
<a href="#" class="button" id="action_RefreshArtists" title="Refresh Artist List"><img class="pad" src="images/reload_9x11.png" /></a>
<a href="#" class="button" id="action_RescanLibrary" title="Rescan Library"><img class="pad" src="images/loop_alt1_gd_12x9.png" /></a>
<a href="#" class="button" id="action_DecreaseWidth" title="Decrease Width"><img src="images/minus_8x2.png" /></a>
<a href="#" class="button" id="action_IncreaseWidth" title="Increase Width"><img src="images/plus_8x8.png" /></a>
</div>
<div class="subactions floatleft">
<div id="songActions">
<a href="#" class="button disabled" id="action_SelectAll" title="Select All">All</a>
<a href="#" class="button disabled" id="action_SelectNone" title="Select None">None</a>
<a href="#" class="button disabled" id="action_AddToQueue" title="Add To Play Queue">+ Queue</a>
<a href="#" class="button disabled" id="action_AddToPlaylist" title="Add Selected To Playlist">+ Playlist</a>
<div id="submenu_AddToPlaylist" class="submenu shadow" style="display: none;"></div>
<a href="#" class="button disabled" id="action_PlayAlbum" title="Play Album"><img src="images/play_gl_6x8.png" /></a>
</div>
<input type="text" id="Search" class="medium" title="Wildcards (*) supported"/>
<select id="SearchType" name="SearchType">
<option value="song">Song</option>
<option value="album">Album</option>
</select>
<a href="#" class="button" id="action_Search" title="Search"><img class="pad" src="images/magnifying_glass_alt_12x12.png" /></a>
</div>
<div id="Albums" class="section lgsection floatleft">
<div class="clear"></div>
<div id="Albums" class="section lgsection">
<div class="loading"></div>
<div id="Artists" class="smsection floatleft" tabindex="0">
<div class="padder">
@ -92,33 +95,36 @@
</div>
<div id="BottomContainer"><ul id="BottomIndex"></ul></div>
</div>
<div id="BreadCrumbContainer"><div id="BreadCrumb"><a href="#" id="BreadHome"><img src="images/home_gl_12x12.png" /></a><div id="BreadCrumbs" class="floatleft"></div></div></div>
<table id="AlbumContainer" class="simplelist songlist noselect" cellspacing="1">
<thead></thead>
<tbody></tbody>
</table>
<div class="tablecontainer">
<div id="BreadCrumbContainer"><div id="BreadCrumb"><a href="#" id="BreadHome"><img src="images/home_gl_12x12.png" /></a><div id="BreadCrumbs" class="floatleft"></div></div></div>
<table id="AlbumContainer" class="simplelist songlist noselect" cellspacing="1">
<thead></thead>
<tbody></tbody>
</table>
</div>
</div>
<div id="status_Library" class="status alignleft" data-type="" data-offset=""><img src="images/arrow_left_gl_8x8.png" /> <a id="action_PreviousAlbumList" class="previous" href="#">Previous</a> | <a id="action_NextAlbumList" class="next" href="#">Next</a> <img src="images/arrow_right_gl_8x8.png" /></div>
<div class="clear"></div>
</div>
<div id="tabQueue" class="tabcontent">
<div class="actions floatleft">
<a href="#" class="button" id="action_Shuffle" title="Shuffle"><img src="images/fork_11x12.png" /></a>
<a href="#" class="button" id="action_Empty" title="Remove All">Empty</a>
</div>
<div class="subactions floatleft">
<div id="currentActions">
<a href="#" class="button disabled" id="action_Shuffle" title="Shuffle"><img src="images/fork_11x12.png" /></a>
<a href="#" class="button disabled" id="action_CurrentSelectAll" title="Select All">All</a>
<a href="#" class="button disabled" id="action_CurrentSelectNone" title="Select None">None</a>
<a href="#" class="button disabled" id="action_CurrentRemoveSongs" title="Remove selected song(s) from Play Queue">Remove Song(s)</a>
<a href="#" class="button disabled" id="action_Empty" title="Remove All">Empty</a>
<a href="#" class="button disabled" id="action_AddCurrentToPlaylist" title="Add Selected To Playlist">+ Playlist</a>
<div id="submenu_AddCurrentToPlaylist" class="submenu shadow" style="display: none;"></div>
<div id="submenu_AddCurrentToPlaylist" class="submenu shadow" style="display: none;"></div> |
<a href="#" class="button" id="action_AutoPilot" title="Autopilot"><img class="pad" src="images/steering_wheel_gd_12x12.png" /></a>
</div>
<a href="#" class="button" id="action_Preview" title="Turn on Album Preview"><img class="pad" src="images/aperture_gd_12x12.png" /></a>
</div>
<div id="CurrentPlaylist" class="section fullsection floatleft noselect">
<div class="tablecontainerfull">
<table id="CurrentPlaylistContainer" class="simplelist songlist" cellspacing="1">
<thead></thead>
<tbody></tbody>
</table>
</div>
</div>
<div id="status_Current" class="status">0 song(s), 00:00:00 total time</div>
</div>
@ -146,10 +152,12 @@
<ul id="PlaylistContainer" class="simplelist mainlist"></ul>
</div>
</div>
<div class="tablecontainer">
<table id="TrackContainer" class="simplelist songlist">
<thead></thead>
<tbody></tbody>
</table>
</div>
</div>
<div id="status_Playlists" class="status">0 song(s), 00:00:00 total time</div>
</div>
@ -168,10 +176,12 @@
<ul id="ChannelsContainer" class="simplelist mainlist"></ul>
</div>
</div>
<div class="tablecontainer">
<table id="PodcastContainer" class="simplelist songlist">
<thead></thead>
<tbody></tbody>
</table>
</div>
</div>
<div id="status_Podcasts" class="status">0 song(s), 00:00:00 total time</div>
</div>
@ -182,32 +192,108 @@
<div class="subactions floatleft"><span class="alert">***Opens new window to the video URL...</span>
</div>
<div id="Videos" class="section fullsection floatleft noselect">
<div class="tablecontainer">
<table id="VideosContainer" class="simplelist songlist" cellspacing="1">
<thead></thead>
<tbody></tbody>
</table>
</div>
<div id="videodeck"></div>
<div id="videooverlay" class="darkoverlay"></div>
</div>
</div>
<div id="tabPreferences" class="tabcontent">
<div class="actions floatleft">
<a href="#" class="button" id="ResetPreferences" title="Reset Preferences">Reset</a>
<a href="#" class="button" id="SavePreferences" title="Save Preferences">Save</a>
</div>
<div class="clear"></div>
<div id="tabSettings" class="tabcontent">
<div class="section lgsection floatleft">
<div class="subsection floatleft">
<h3 class="title">Login</h3>
<label for="Username">Username <span class="red">*</span></label><br />
<input type="text" id="Username" name="Username" class="large"/><br />
<label for="Password">Password <span class="red">*</span></label><br />
<input type="password" id="Password" name="Password" class="large"/><br />
<label for="Server">Server <span class="red">*</span></label><br />
<input type="text" id="Server" name="Server" class="xlarge" title="Subsonic Server URL Ex: http://host:port/subsonic"/><br />
<!--<a href="#" class="button" id="action_RequestURL" title="Request Permission for Server URL">Enable URL</a><br />-->
<label for="SubsonicVersion">Subsonic API: <span class="apiversion" id="SubsonicVersion"></span></label><br />
<label for="SMStats">Audio State: <span id="SMStats"></span></label><br />
<div class="tablecontainerfull">
<div class="form">
<div class="subsection floatleft">
<h3 class="title">Login</h3>
<label for="Username">Username <span class="red">*</span></label><br />
<input type="text" id="Username" name="Username" class="large"/><br />
<label for="Password">Password <span class="red">*</span></label><br />
<input type="password" id="Password" name="Password" class="large"/><br />
<label for="Server">Server <span class="red">*</span></label><br />
<input type="text" id="Server" name="Server" class="xlarge" title="Subsonic Server URL Ex: http://host:port/subsonic"/><br />
<!--<a href="#" class="button" id="action_RequestURL" title="Request Permission for Server URL">Enable URL</a><br />-->
<label for="SubsonicVersion">Subsonic API: <span class="apiversion" id="SubsonicVersion"></span></label><br />
<label for="SMStats">Audio State: <span id="SMStats"></span></label><br /><br />
<div id="donate" class="subsection floatleft">
<h3 class="title">Buy me a <span class="beer">beer</span>! I'd like that :)</h3>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="VMTENRSJWQ234">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>
<small>*This is a donation to <a href="https://twitter.com/tsquillario" target="_blank">tsquillario</a>, the developer of <a href="https://github.com/tsquillario/MiniSub" target="_blank">MiniSub</a>.
<br />Not related to a Subsonic License!</small>
</div>
</div>
<div class="subsection floatleft">
<h3 class="title">Options</h3>
<label for="Theme">Theme</label><br />
<select id="Theme" name="Theme" class="large">
<option value="default">Default</option>
<option value="dark">Dark</option>
</select><br />
<label for="AutoPlaylists">Genres</label><br />
<select id="Genres" name="Genres" class="large"></select><br />
<input type="text" id="AutoPlaylists" name="AutoPlaylists" class="large" title="Comma separated list of genres for Auto Playlists"/><br />
<!--<label for="AutoFilter">Filter</label><br />
<input type="text" id="AutoFilter" name="AutoFilter" class="large" title="Comma separated list of albums for the AutoPilot Filter"/><br />-->
<label for="AutoAlbumSize">Auto Album Size (Default 15)</label><br />
<input type="text" id="AutoAlbumSize" name="AutoAlbumSize" class="large" title="Number of Albums to Get on the Music Library tab"/><br />
<label for="AutoPlaylistSize">Auto Playlist Size (Default 25)</label><br />
<input type="text" id="AutoPlaylistSize" name="AutoPlaylistSize" class="large" title="Number of Songs to Get on the Playlist tab"/><br />
<label for="ApplicationName">Application Name (Default MiniSub)</label><br />
<input type="text" id="ApplicationName" name="ApplicationName" class="large" title="Custom Player Name"/><br />
</div>
<div class="subsection floatleft">
<div class="checkboxes">
<fieldset>
<legend class="aligncenter">Display</legend>
<div class="inputwrap"><input type="checkbox" id="HideAZ" name="HideAZ" value="1" title="Hide A-Z at Bottom of Artists"/></div>
<label for="HideAZ">Hide A-Z</label>
<div class="clear"></div>
<div class="inputwrap"><input type="checkbox" id="ScrollTitle" name="ScrollTitle" value="1" title="Scroll the Title Once"/></div>
<label for="ScrollTitle">Scroll Title</label>
</fieldset>
<div class="clear"></div>
<fieldset>
<legend class="aligncenter">Advanced</legend>
<div class="inputwrap"><input type="checkbox" id="Debug" name="Debug" value="1" title="Enable Debug Mode (Events will be logged to the Javascript Console)"/></div>
<label for="Debug">Debug Mode</label>
<div class="clear"></div>
<div class="inputwrap"><input type="checkbox" id="ForceFlash" name="ForceFlash" value="1" title="Force Flash Plugin for Audio (Option doesn't work with Chrome App)"/></div>
<label for="ForceFlash">Force Flash </label>
<div class="clear"></div>
<div class="inputwrap"><input type="checkbox" id="Protocol" name="Protocol" value="1" title="Enable Cross-Domain AJAX Requests (Use if MiniSub is hosted in a different domain than Subsonic)"/></div>
<label for="Protocol">Enable JSONP</label>
</fieldset>
<div class="clear"></div>
<fieldset>
<legend class="aligncenter">HTML5 [Beta]</legend>
<span>Notifications</span><br />
<div class="clear"></div>
<div class="inputwrap"><input type="checkbox" id="Notification_Song" name="Notification_Song" value="1" title="Enable Notifications When Tracks Change"/></div>
<label for="Notification_Song">Song Change</label>
<div class="clear"></div>
<div class="inputwrap"><input type="checkbox" id="Notification_NowPlaying" name="Notification_NowPlaying" value="1" title="Enable Notifications When Other Users Play Songs"/></div>
<label for="Notification_Song">Now Playing</label>
<div class="clear"></div>
<span>Local Storage</span><br />
<div class="clear"></div>
<div class="inputwrap"><input type="checkbox" id="SaveTrackPosition" name="SaveTrackPosition" value="1" title="Saves Play Queue & Track Position Periodically (Uses HTML5: localStorage)"/></div>
<label for="SaveTrackPosition">Save Progress</label>
</fieldset>
</div>
<div class="clear"></div>
</div>
<div class="clear"></div>
<div class="submitsettings">
<a href="#" class="button" id="ResetSettings" title="Reset Settings">Reset</a>
<a href="#" class="button" id="SaveSettings" title="Save Settings">Save</a>
</div>
</div>
<div class="subsection floatleft">
<h3 class="title">Keyboard Shortcuts</h3>
@ -218,80 +304,10 @@
<li><em>&rarr;</em> Next Track</li>
<li><em>&larr;</em> Previous Track</li>
<li><em>-/_</em> Volume Down <em>=/+</em> Volume Up</li>
<li><span></span></li>
<li><em>Media Keys</em> via <a href="https://chrome.google.com/webstore/detail/swayfm-unified-music-medi/icckhjgjjompfgoiidainoapgjepncej" target="_blank">Sway.fm Unified Music Media Keys</a></li>
</ul>
</div>
<div class="clear"></div>
<div class="subsection floatleft">
<h3 class="title">Options</h3>
<label class="red">* Refresh (F5) required</label><br />
<label for="Theme">Theme</label><br />
<select id="Theme" name="Theme" class="large">
<option value="default">Default</option>
<option value="dark">Dark</option>
</select><br />
<label for="AutoPlaylists">Genres</label><br />
<select id="Genres" name="Genres" class="large"></select><br />
<input type="text" id="AutoPlaylists" name="AutoPlaylists" class="large" title="Comma separated list of genres for Auto Playlists"/><br />
<label for="AutoAlbumSize">Auto Album Size (Default 15)</label><br />
<input type="text" id="AutoAlbumSize" name="AutoAlbumSize" class="large" title="Number of Albums to Get on the Music Library tab"/><br />
<label for="AutoPlaylistSize">Auto Playlist Size (Default 25)</label><br />
<input type="text" id="AutoPlaylistSize" name="AutoPlaylistSize" class="large" title="Number of Songs to Get on the Playlist tab"/><br />
<label for="ApplicationName">Application Name (Default MiniSub)*</label><br />
<input type="text" id="ApplicationName" name="ApplicationName" class="large" title="Custom Player Name"/><br />
</div>
<div class="subsection floatleft">
<div class="checkboxes">
<fieldset>
<legend class="aligncenter">Display</legend>
<div class="inputwrap"><input type="checkbox" id="HideAZ" name="HideAZ" value="1" title="Hide A-Z at Bottom of Artists"/></div>
<label for="HideAZ">Hide A-Z</label>
<div class="clear"></div>
<div class="inputwrap"><input type="checkbox" id="ScrollTitle" name="ScrollTitle" value="1" title="Scroll the Title Once"/></div>
<label for="ScrollTitle">Scroll Title</label>
</fieldset>
<div class="clear"></div>
<fieldset>
<legend class="aligncenter">Advanced</legend>
<div class="inputwrap"><input type="checkbox" id="Debug" name="Debug" value="1" title="Enable Debug Mode (Events will be logged to the Javascript Console)"/></div>
<label for="Debug">Debug Mode</label>
<div class="clear"></div>
<div class="inputwrap"><input type="checkbox" id="ForceFlash" name="ForceFlash" value="1" title="Force Flash Plugin for Audio (Option doesn't work with Chrome App)"/></div>
<label for="ForceFlash">Force Flash </label>
<div class="clear"></div>
<div class="inputwrap"><input type="checkbox" id="Protocol" name="Protocol" value="1" title="Enable Cross-Domain AJAX Requests (Use if MiniSub is hosted in a different domain than Subsonic)"/></div>
<label for="Protocol">Enable JSONP*</label>
</fieldset>
<div class="clear"></div>
<fieldset>
<legend class="aligncenter">HTML5 [Beta]</legend>
<span>Notifications</span><br />
<div class="clear"></div>
<div class="inputwrap"><input type="checkbox" id="Notification_Song" name="Notification_Song" value="1" title="Enable Notifications When Tracks Change"/></div>
<label for="Notification_Song">Song Change</label>
<div class="clear"></div>
<div class="inputwrap"><input type="checkbox" id="Notification_NowPlaying" name="Notification_NowPlaying" value="1" title="Enable Notifications When Other Users Play Songs"/></div>
<label for="Notification_Song">Now Playing</label>
<div class="clear"></div>
<span>Local Storage</span><br />
<div class="clear"></div>
<div class="inputwrap"><input type="checkbox" id="SaveTrackPosition" name="SaveTrackPosition" value="1" title="Saves Play Queue & Track Position Periodically (Uses HTML5: localStorage)"/></div>
<label for="SaveTrackPosition">Save Progress</label>
</fieldset>
</div>
</div>
<div id="donate" class="subsection floatleft">
<h3 class="title">Buy me a <span class="beer">beer</span>! I'd like that :)</h3>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_blank">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="VMTENRSJWQ234">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>
<small>*This is a donation to <a href="https://twitter.com/tsquillario" target="_blank">tsquillario</a>, the developer of <a href="https://github.com/tsquillario/MiniSub" target="_blank">MiniSub</a>.
<br />Not related to a Subsonic License!</small>
</div>
<div class="clear"></div>
<div class="subsection floatleft">
<h3 class="title">Change Log</h3>
<ul id="ChangeLog" class="preferences">
@ -300,7 +316,13 @@
<span class="changes">- </span>
</li>
-->
<li class="log"><span class="version"> - 2.3.6</span>
<li class="log"><span class="version">12/21/2012 - 2.3.7</span>
<span class="changes">- Added support for the <a href="https://chrome.google.com/webstore/detail/swayfm-unified-music-medi/icckhjgjjompfgoiidainoapgjepncej" target="_blank">Sway.fm Unified Music Media Keys</a> Chrome extension</span>
<span class="changes">- Added Artist links</span>
<span class="changes">- Fixed click behavior of song notification popup</span>
<span class="changes">- Search is now displayed globally</span>
</li>
<li class="log"><span class="version">12/6/2012 - 2.3.6</span>
<span class="changes">- Added Setting to toggle JSONP (This is for cross-domain requests, aka Subsonic is hosted on a different domain than MiniSub)</span>
<span class="changes">- Switched back to URL authentication (Including coverArt)</span>
</li>
@ -453,6 +475,7 @@
<li>Audio Library - <a href="http://jplayer.org" target="_blank">http://jplayer.org</a></li>
</ul>
</div>
</div>
</div>
<div class="clear"></div>
</div>
@ -465,12 +488,15 @@
<div id="Chat">
<div class="header"><img src="images/chat_alt_stroke_12x12.png" /> Chat</div>
<div id="ChatMsgs"></div>
<div class="submit"><img src="images/comment_stroke_gl_12x11.png" /><input type="text" id="ChatMsg" class="chat" title="Hit [Enter] to Post" /></div>
</div>
<div class="submit"><img src="images/comment_stroke_gl_12x11.png" /><input type="text" id="ChatMsg" class="chat" title="Hit [Enter] to Post" /></div>
</div>
<!-- Audio Player -->
<div class="clear"></div>
<div id="player">
<div class="clear"></div>
</div><!-- end #content -->
<div id="player">
<div id="playerleft" class="floatleft">
<div class="playeractions floatleft">
<a href="#" class="button" id="PreviousTrack" title="Previous Track"><img src="images/first_24x24.png" /></a>
@ -512,11 +538,10 @@
<div class="error-message"></div>
</div>
</div>
<div id="preview"></div>
</div>
<div class="clear"></div>
</div>
<div class="clear"></div>
</div><!-- end #content -->
</div><!-- end #container -->
</body>
</html>

View file

@ -12,7 +12,9 @@ var passwordenc;
var server;
var smwidth;
var apiVersion = '1.6.0';
var currentVersion = '2.3.6';
var currentVersion = '2.3.7';
var applicationName;
var unity;
// Get URL Querystring Parameters
var u = getParameterByName('u');
@ -30,12 +32,16 @@ if (u && p && s) {
}
if (!getCookie('Server')) {
setCookie('Server', s, { expires: 365 });
baseURL = getCookie('Server') + '/rest';
server = getCookie('Server') + '/rest';
baseURL = server;
}
window.location.href = getPathFromUrl(window.location);
}
var applicationName;
if (getCookie('Server')) {
server = getCookie('Server') + '/rest';
baseURL = server;
}
if (getCookie('ApplicationName')) {
applicationName = getCookie('ApplicationName');
} else {
@ -59,4 +65,4 @@ if (getCookie('Protocol')) {
protocol = 'jsonp';
}
var auth = makeBaseAuth(username, password.substring(4, password.length).hexDecode());
baseParams = 'u=' + username + '&p=' + password + '&f=' + protocol;
baseParams = 'u=' + username + '&p=' + password + '&f=' + protocol + '&v=' + apiVersion + '&c=' + applicationName;

File diff suppressed because it is too large Load diff

View file

@ -4,7 +4,7 @@ function updateChatMessages() {
updater = $.periodic({ period: 1000, decay: 1.5, max_period: 1800000 }, function () {
$.ajax({
periodic: this,
url: baseURL + '/getChatMessages.view?' + baseParams + '&v=' + apiVersion + '&c=' + applicationName + '&since=' + starttime,
url: baseURL + '/getChatMessages.view?' + baseParams + '&since=' + starttime,
method: 'GET',
dataType: protocol,
timeout: 10000,
@ -52,7 +52,7 @@ function addChatMessage(msg) {
url: baseURL + '/addChatMessage.view?' + baseParams,
dataType: protocol,
timeout: 10000,
data: { v: apiVersion, c: applicationName, message: msg },
data: { message: msg },
success: function () {
updater.reset();
},

View file

@ -1,15 +1,16 @@
function generateRowHTML(child, appendto) {
var html, isDir, starred, duration, artist, artistId, i;
function generateRowHTML(child, appendto, artistid) {
var html, isDir, starred, duration, artistid, artist, i;
isDir = child.isDir;
if (child.starred !== undefined) { starred = true; } else { starred = false; }
if (child.duration !== undefined) { duration = child.duration; } else { duration = ''; }
if (child.artist !== undefined) { artist = child.artist; } else { artist = ''; }
if (typeof child.starred != 'undefined') { starred = true; } else { starred = false; }
if (typeof child.duration != 'undefined') { duration = child.duration; } else { duration = ''; }
if (typeof child.artist != 'undefined') { artist = child.artist; } else { artist = ''; }
//if (typeof child.artistId != 'undefined') { artistid = child.artistId; } else { artistid = ''; }
if (isDir === true) {
html = generateAlbumHTML(child.id, child.parent, child.coverArt, child.title, artist, child.userRating, starred, child.created);
} else {
var track;
if (child.track === undefined) { track = "&nbsp;"; } else { track = child.track; }
html = generateSongHTML(child.id, child.parent, track, child.title, '', artist, child.album, child.coverArt, child.userRating, starred, duration);
html = generateSongHTML(child.id, child.parent, artistid, track, child.title, '', artist, child.album, child.coverArt, child.userRating, starred, duration);
}
return html;
}
@ -21,7 +22,7 @@ function generateAlbumHeaderHTML() {
function generateAlbumHTML(childid, parentid, coverart, title, artist, rating, starred, created) {
var html;
html = '<tr class=\"album\" childid=\"' + childid + '\" parentid=\"' + parentid + '\" userrating=\"' + rating + '\">';
html += '<td class=\"itemactions\"><a class=\"add\" href=\"\" title=\"Add To Play Queue\"></a>';
html += '<td><div class=\"itemactions\"><a class=\"add\" href=\"\" title=\"Add To Play Queue\"></a>';
html += '<a class=\"play\" href=\"\" title=\"Play\"></a>';
html += '<a class=\"download\" href=\"\" title=\"Download\"></a>';
if (starred) {
@ -29,14 +30,14 @@ function generateAlbumHTML(childid, parentid, coverart, title, artist, rating, s
} else {
html += '<a class=\"rate\" href=\"\" title=\"Add To Favorites\"></a>';
}
html += '</td>';
html += '</div></td>';
if (coverart == undefined) {
html += '<td class=\"albumart\"><img src=\"images/albumdefault_50.jpg\" /></td>';
} else {
html += '<td class=\"albumart\"><img src=\"' + baseURL + '/getCoverArt.view?' + baseParams + '&v=' + apiVersion + '&c=' + applicationName + '&size=50&id=' + coverart + '\" /></td>';
html += '<td class=\"albumart\"><img src=\"' + baseURL + '/getCoverArt.view?' + baseParams + '&size=50&id=' + coverart + '\" /></td>';
}
html += '<td class=\"album\">' + title + '</td>';
html += '<td class=\"artist\">' + artist + '</td>';
html += '<td class=\"artist\"><a href=\"#\" >' + artist + '</a></td>';
html += '<td class=\"date\">' + $.format.date(new Date(created), "yyyy-MM-dd h:mm a") + '</td>';
html += '</tr>';
return html;
@ -46,7 +47,7 @@ function generateSongHeaderHTML() {
html = '<tr><th></th><th class=\"type-int\">Track</th><th class=\"type-string\">Title</th><th class=\"type-string\">Artist</th><th class=\"type-string\">Album</th><th class=\"alignright\">Time</th></tr>';
return html;
}
function generateSongHTML(childid, parentid, track, title, description, artist, album, coverart, rating, starred, duration) {
function generateSongHTML(childid, parentid, artistid, track, title, description, artist, album, coverart, rating, starred, duration) {
var time;
if (duration == '') {
time = '00:00'
@ -54,8 +55,8 @@ function generateSongHTML(childid, parentid, track, title, description, artist,
time = secondsToTime(duration);
}
var html;
html = '<tr class=\"row song\" id=\"' + childid + '\" childid=\"' + childid + '\" parentid=\"' + parentid + '\" duration=\"' + duration + '\" userrating=\"' + rating + '\">';
html += '<td class=\"itemactions\"><a class=\"add\" href=\"\" title=\"Add To Play Queue\"></a>';
html = '<tr class=\"row song\" id=\"' + childid + '\" childid=\"' + childid + '\" parentid=\"' + parentid + '\" artistid=\"' + artistid + '\" duration=\"' + duration + '\" userrating=\"' + rating + '\">';
html += '<td><div class=\"itemactions\"><a class=\"add\" href=\"\" title=\"Add To Play Queue\"></a>';
html += '<a class=\"remove\" href=\"\" title=\"Remove\"></a>';
html += '<a class=\"play\" href=\"\" title=\"Play\"></a>';
html += '<a class=\"download\" href=\"\" title=\"Download\"></a>';
@ -64,7 +65,7 @@ function generateSongHTML(childid, parentid, track, title, description, artist,
} else {
html += '<a class=\"rate\" href=\"\" title=\"Add To Favorites\"></a>';
}
html += '</td>';
html += '</div></td>';
html += '<td class=\"track\">' + track + '</td>';
if (description != '' && description != null) {
html += '<td class=\"title\" title=\"' + toHTML.on(description) + '\">' + title + '</td>';
@ -77,7 +78,7 @@ function generateSongHTML(childid, parentid, track, title, description, artist,
if (coverart == undefined) {
coverartSrc = 'images/albumdefault_25.jpg';
} else {
coverartSrc = baseURL + '/getCoverArt.view?' + baseParams + '&v=' + apiVersion + '&c=' + applicationName + '&size=25&id=' + coverart;
coverartSrc = baseURL + '/getCoverArt.view?' + baseParams + '&size=25&id=' + coverart;
}
html += '<td class=\"album\" data-order-by=\"' + album + '\"><a href="#"><img src=\"' + coverartSrc + '\" />' + album + '</a></td>';
html += '<td class=\"time\">' + time + '</td>';

View file

@ -1,14 +1,15 @@
var scrobbled = false;
var timerid = 0;
var marquee;
function getSongData(el, songid, albumid, position, loadonly) {
var runningVersion = parseVersionString(apiVersion);
var minimumVersion = parseVersionString('1.8.0');
if (checkVersion(runningVersion, minimumVersion)) {
if (debug) { console.log('apiVersion at or above 1.8.0 using getSong.view'); }
ajaxUrl = baseURL + '/getSong.view?' + baseParams + '&v=' + apiVersion + '&c=' + applicationName + '&id=' + songid;
ajaxUrl = baseURL + '/getSong.view?' + baseParams + '&id=' + songid;
} else {
if (debug) { console.log('apiVersion below 1.8.0 using getMusicDirectory.view'); }
ajaxUrl = baseURL + '/getMusicDirectory.view?' + baseParams + '&v=' + apiVersion + '&c=' + applicationName + '&id=' + albumid; // Deprecated: apiVersion 1.8.0
ajaxUrl = baseURL + '/getMusicDirectory.view?' + baseParams + '&id=' + albumid; // Deprecated: apiVersion 1.8.0
}
if (debug) { console.log(ajaxUrl) }
$.ajax({
@ -86,8 +87,8 @@ function playSong(el, songid, albumid, title, artist, album, coverart, rating, s
coverartSrc = 'images/albumdefault_60.jpg';
coverartFullSrc = '';
} else {
coverartSrc = baseURL + '/getCoverArt.view?' + baseParams + '&v=' + apiVersion + '&c=' + applicationName + '&size=60&id=' + coverart;
coverartFullSrc = baseURL + '/getCoverArt.view?' + baseParams + '&v=' + apiVersion + '&c=' + applicationName + '&id=' + coverart;
coverartSrc = baseURL + '/getCoverArt.view?' + baseParams + '&size=60&id=' + coverart;
coverartFullSrc = baseURL + '/getCoverArt.view?' + baseParams + '&id=' + coverart;
}
$('#coverartimage').attr('href', coverartFullSrc);
$('#coverartimage img').attr('src', coverartSrc);
@ -124,15 +125,25 @@ function playSong(el, songid, albumid, title, artist, album, coverart, rating, s
ready: function () {
if (suffix == 'oga') {
$(this).jPlayer("setMedia", {
oga: baseURL + '/stream.view?' + baseParams + '&v=' + apiVersion + '&c=' + applicationName + '&id=' + songid + '&salt=' + salt,
oga: baseURL + '/stream.view?' + baseParams + '&id=' + songid + '&salt=' + salt,
});
} else if (suffix == 'mp3') {
$(this).jPlayer("setMedia", {
mp3: baseURL + '/stream.view?' + baseParams + '&v=' + apiVersion + '&c=' + applicationName + '&id=' + songid + '&salt=' + salt,
mp3: baseURL + '/stream.view?' + baseParams + '&id=' + songid + '&salt=' + salt,
});
}
if (!loadonly) {
$(this).jPlayer("play");
var playerState = {
playing: true,
title: title,
artist: artist,
favorite: false,
albumArt: coverartFullSrc
}
if (unity) {
unity.sendState(playerState);
}
} else {
$('#' + songid).addClass('playing');
$(this).jPlayer("pause", position);
@ -241,7 +252,7 @@ function playVideo(id, bitrate) {
function scrobbleSong(submission) {
var songid = $('#songdetails_song').attr('childid');
$.ajax({
url: baseURL + '/scrobble.view?' + baseParams + '&v=' + apiVersion + '&c=' + applicationName + '&id=' + songid + "&submission=" + submission,
url: baseURL + '/scrobble.view?' + baseParams + '&id=' + songid + "&submission=" + submission,
method: 'GET',
dataType: protocol,
timeout: 10000,
@ -254,7 +265,7 @@ function scrobbleSong(submission) {
}
function rateSong(songid, rating) {
$.ajax({
url: baseURL + '/setRating.view?' + baseParams + '&v=' + apiVersion + '&c=' + applicationName + '&id=' + songid + "&rating=" + rating,
url: baseURL + '/setRating.view?' + baseParams + '&id=' + songid + "&rating=" + rating,
method: 'GET',
dataType: protocol,
timeout: 10000,
@ -267,9 +278,9 @@ function starItem(itemid, starred) {
var url;
if (itemid !== undefined) {
if (starred) {
url = baseURL + '/star.view?' + baseParams + '&v=' + apiVersion + '&c=' + applicationName + '&id=' + itemid;
url = baseURL + '/star.view?' + baseParams + '&id=' + itemid;
} else {
url = baseURL + '/unstar.view?' + baseParams + '&v=' + apiVersion + '&c=' + applicationName + '&id=' + itemid;
url = baseURL + '/unstar.view?' + baseParams + '&id=' + itemid;
}
$.ajax({
url: url,

View file

@ -238,15 +238,16 @@ var timer = null;
var scrollMsg = "";
var pos = 0;
function scrollTitle(text) {
if (scrollMsg === "") {
if (text === "") {
if (scrollMsg == "") {
if (text == "") {
scrollMsg = document.title;
} else {
scrollMsg = text;
}
} else {
if (text != undefined && text != scrollMsg) {
if (typeof text != 'undefined' && text != scrollMsg) {
scrollMsg = text;
pos = 0;
}
}
var msg = scrollMsg;
@ -261,7 +262,7 @@ function scrollTitle(text) {
if (pos > ml) {
pos = 0;
} else {
//timer = window.setTimeout("scrollTitle()", speed);
timer = window.setTimeout("scrollTitle()", speed);
}
// To stop timer, clearTimeout(timer);
}
@ -287,6 +288,7 @@ function showNotification(pic, title, text, type, bind) {
if (bind = '#NextTrack') {
popup.addEventListener('click', function () {
$(bind).click();
this.cancel();
})
}
notifications.push(popup);

62
js/plugins/UnityShim.js Normal file
View file

@ -0,0 +1,62 @@
/*
* Use this function to create a Unity Music Shim. To use it, simply call setSupports to tell unity
* which features you support, give it a callback for actions as documented below,
* and notify it when your player state changes.
*/
var UnityMusicShim = function() {
var UnityObj = {};
/*
* sendState requires an object with any of the following properties.
* Call this whenever your player state changes.
*
* - playing: Boolean whether or not you are currently playing music
* - title: String the title of the current song
* - artist: String the artist of the current song
* - albumArt: String a URL to the album art of the current song. This must be a publically accessible url
* - favorite: Boolean whether or not the current song is marked as a favorite
* - thumbsUp: Boolean whether or not the current song is marked as thumbs up
* - thumbsDown: Boolean whether or not the current song is marked as thumbs down
*/
UnityObj.sendState = function(state) {
var evt = document.createEvent("CustomEvent");
evt.initEvent("UnityStateEvent", true, true );
document.body.setAttribute('data-unity-state', JSON.stringify(state));
document.body.dispatchEvent(evt, state);
}
document.body.addEventListener('UnityActionEvent', function(e) {
var action = JSON.parse(document.body.getAttribute('data-unity-action'));
if (UnityObj._callbackObject) UnityObj._callbackObject[action]();
});
/*
* addCallbackObject requires an object with functions mapping to any features you support.
* - playpause: Toggle the paused state of your player.
* - next: Skip to the next song.
* - previous: Skip to the previous song.
* - thumbsUp: Mark (or unmark) this song as thumbs up.
* - thumbsDown: Mark (or unmark) this song as thumbs up.
* - favorite: Mark (or unmark) this song as a favorite.
*/
UnityObj.setCallbackObject = function(cbObj) {
UnityObj._callbackObject = cbObj;
};
/*
* setSupports requires an object with any of the following features that your player supports.
* Pass true for anything you support, and omit any you don't.
*
* - playpause: Whether you support pausing the song. You must support this to use Unity
* - next: Whether you support skipping the current song.
* - previous: Whether you support going back to a previous song.
* - thumbsUp: Whether you support giving a song a thumbs up.
* - thumbsDown: Whether you support giving a song a thumbs down.
* - favorite: Whether you support marking song as a favorite.
*/
UnityObj.setSupports = function(supports) {
var evt = document.createEvent("CustomEvent");
evt.initEvent("UnitySupportsEvent", true, true );
document.body.setAttribute('data-unity-supports', JSON.stringify(supports));
document.body.dispatchEvent(evt, supports);
}
return UnityObj;
};

View file

@ -27,6 +27,8 @@
var currentSong = JSON.parse(getCookie("CurrentSong"));
getSongData(null, currentSong.songid, currentSong.albumid, currentSong.position, true);
loadCurrentPlaylist();
updateStatus('#status_Current', countCurrentPlaylist('#CurrentPlaylistContainer'));
$('#tabQueue a.button').removeClass('disabled');
}
resizeContent();
});
@ -42,11 +44,13 @@ function resizeContent() {
$('.smsection').css({ 'height': (($(window).height() - 168)) + 'px' });
var smheight = $('.smsection').height();
var smwidth = $('.smsection').width();
$('.tablecontainer').css({ 'width': ((screenwidth - smwidth) - 10) + 'px' });
/*
$('#BottomContainer').css({ 'top': smheight + 35 + 'px' });
if (getCookie('sidebar')) {
var tabwidth = $(window).width() - 264;
if (tabwidth >= 700) {
$('.tabcontent').css({ 'width': tabwidth + 'px' });
//$('.tabcontent').css({ 'width': tabwidth + 'px' });
}
var sbheight = $(window).height() - 152;
var sbwidth = $('#SideBar').width();
@ -56,26 +60,29 @@ function resizeContent() {
} else {
var tabwidth = $(window).width() - 58;
if (tabwidth >= 300) {
$('.tabcontent').css({ 'width': tabwidth + 'px' });
//$('.tabcontent').css({ 'width': tabwidth + 'px' });
$('.status').css({ 'right': 4 + 'px' });
}
}
var tabwidth = $('.tabcontent').width();
$('#BreadCrumbContainer, #AlbumContainer, #TrackContainer, #PodcastContainer').css({ 'width': (tabwidth - smwidth - 45) + 'px' });
$('#CurrentPlaylistContainer, #VideosContainer').css({ 'width': (tabwidth - 30) + 'px' });
$('#player').css({ 'width': tabwidth + 'px' });
//$('#player').css({ 'width': tabwidth + 'px' });
*/
}
function resizeSMSection(x) {
var screenwidth = $(window).width();
var defwidth = 200;
var smwidth = $('.smsection').width();
var newsmwidth = smwidth + parseInt(x);
var newwidth = newsmwidth - defwidth;
if (smwidth != newsmwidth && newsmwidth > 150 && newsmwidth < 500) {
$('.smsection').css({ 'width': (newsmwidth) + 'px' });
$('.actions').css({ 'width': (newsmwidth - 5) + 'px' });
//$('.actions').css({ 'width': (newsmwidth - 5) + 'px' });
$('#BottomContainer').css({ 'width': (newsmwidth - 23) + 'px' });
$('.tablecontainer').css({ 'width': ((screenwidth - newsmwidth) - 10) + 'px' });
setCookie('defaultsmwidth', newwidth);
var ulwidth = newsmwidth + 6;
$('#BreadCrumbContainer, #AlbumContainer, #TrackContainer, #PodcastContainer').css({ 'margin-left': (ulwidth + 15) + 'px' });
//$('#BreadCrumbContainer, #AlbumContainer, #TrackContainer, #PodcastContainer').css({ 'margin-left': (ulwidth + 15) + 'px' });
}
}

View file

@ -2,13 +2,13 @@
// Inject Basic Auth
/*
$.ajaxSetup({
beforeSend: function (req) {
req.setRequestHeader('Authorization', auth);
}
//headers: { "Authorization": "Basic " + auth }
beforeSend: function (req) {
req.setRequestHeader('Authorization', auth);
}
//headers: { "Authorization": "Basic " + auth }
});
*/
// Fill Preferences from Cookies
// Fill Settings from Cookies
if (getCookie('username')) { $('#Username').val(getCookie('username')); }
//$('#Password').val(getCookie('passwordenc'));
if (getCookie('AutoPlaylists')) { $('#AutoPlaylists').val(getCookie('AutoPlaylists')); }
@ -17,11 +17,7 @@
if (getCookie('Server')) { $('#Server').val(getCookie('Server')); }
if (getCookie('ApplicationName')) { $('#ApplicationName').val(getCookie('ApplicationName')); }
if (getCookie('Server')) {
baseURL = getCookie('Server') + '/rest';
}
// Set Preferences defaults
// Set Settings defaults
if (getCookie('Theme')) {
$('#Theme').val(getCookie('Theme'));
var theme = getCookie('Theme');
@ -76,6 +72,28 @@
setCookie('CurrentVersion', currentVersion);
}
// Sway.fm Unity Plugin
unity = UnityMusicShim();
unity.setSupports({
playpause: true,
next: true,
previous: true
});
unity.setCallbackObject({
pause: function () {
if (debug) { console.log("Unity: Recieved playpause command"); }
playPauseSong();
},
next: function () {
if (debug) { console.log("Unity: Recieved next command"); }
$('#NextTrack').click();
},
previous: function () {
if (debug) { console.log("Unity: Recieved previous command"); }
$('#PreviousTrack').click();
}
});
// Table Sorting
$('#CurrentPlaylistContainer').stupidtable();
$('#TrackContainer').stupidtable();
@ -133,7 +151,7 @@
if (debug) { console.log("TAG VIDEOS"); }
loadVideos(true);
break;
case '#tabPreferences':
case '#tabSettings':
getGenres();
break;
default:
@ -144,8 +162,8 @@
// Tabs
$('.tabcontent').hide(); //Hide all content
if (!getCookie('username') && !getCookie('passwordenc') && !getCookie('Server')) { // Show Preferences
loadTabContent('#tabPreferences');
if (!getCookie('username') && !getCookie('passwordenc') && !getCookie('Server')) { // Show Settings
loadTabContent('#tabSettings');
} else {
if (window.location.hash) {
var hash = window.location.hash;
@ -197,13 +215,9 @@
$('#Artists').stop().scrollTo(el, 400);
}
} else if (unicode == 39 || unicode == 176) { // right arrow
var next = $('#CurrentPlaylistContainer tr.playing').next();
if (!next.length) next = $('#CurrentPlaylistContainer li').first();
changeTrack(next);
$('#NextTrack').click();
} else if (unicode == 37 || unicode == 177) { // back arrow
var prev = $('#CurrentPlaylistContainer tr.playing').prev();
if (!prev.length) prev = $('#CurrentPlaylistContainer tr').last();
changeTrack(prev);
$('#PreviousTrack').click();
} else if (unicode == 32 || unicode == 179 || unicode == 0179) { // spacebar
playPauseSong();
return false;
@ -249,8 +263,7 @@
$('#AutoAlbumContainer li').removeClass('selected');
$('#ArtistContainer li').removeClass('selected');
$(this).addClass('selected');
getAlbums($(this).attr("id"), '', '#AlbumContainer tbody');
$('#BreadCrumbs').html('<a href=\"\" artistid=\"' + $(this).attr("id") + '\">' + $(this).find('span').text() + '</a>');
getMusicDirectory($(this).attr("id"), '', '#AlbumContainer tbody', '');
});
$('#BottomIndex li a').live('click', function () {
var el = 'a[name = "index_' + $(this).text() + '"]';
@ -268,45 +281,39 @@
return false;
});
$('#BreadCrumbs a').live('click', function () {
var artistid = $(this).attr('artistid');
var parentid = $(this).attr('parentid');
var albumid = $(this).attr('albumid');
if (typeof artistid != 'undefined') {
getAlbums(artistid, '', '#AlbumContainer tbody');
if (typeof parentid != 'undefined') {
getMusicDirectory(parentid, '', '#AlbumContainer tbody', '');
} else if (typeof albumid != 'undefined') {
getAlbums(albumid, '', '#AlbumContainer tbody');
parentid = $(this).prev().attr('parentid');
getMusicDirectory(albumid, '', '#AlbumContainer tbody', parentid);
}
return false;
});
$('tr.album').live('click', function (e) {
var albumid = $(this).attr('childid');
var album = $(this).find('td.album').text();
var artistid = $(this).attr('parentid');
var artist = $(this).find('td.artist').text();
getAlbums(albumid, '', '#AlbumContainer tbody');
var html = '<a href=\"\" artistid=\"' + artistid + '\">' + artist + '</a>';
html += ' ><a href=\"\" albumid=\"' + albumid + '\">' + album + '</a>';
$('#BreadCrumbs').html(html);
getMusicDirectory(albumid, '', '#AlbumContainer tbody', artistid);
return false;
});
$('tr.album a.play').live('click', function (e) {
var albumid = $(this).parent().parent().attr('childid');
var artistid = $(this).parent().parent().attr('parentid');
getAlbums(albumid, 'autoplay', '#CurrentPlaylistContainer');
var albumid = $(this).parent().parent().parent().attr('childid');
getMusicDirectory(albumid, 'autoplay', '#CurrentPlaylistContainer', '');
return false;
});
$('tr.album a.add').live('click', function (e) {
var albumid = $(this).parent().parent().attr('childid');
var artistid = $(this).parent().parent().attr('parentid');
getAlbums(albumid, 'add', '#CurrentPlaylistContainer');
var albumid = $(this).parent().parent().parent().attr('childid');
getMusicDirectory(albumid, 'add', '#CurrentPlaylistContainer', '');
return false;
});
$('tr.album a.download').live('click', function (event) {
var itemid = $(this).parent().parent().attr('childid');
var itemid = $(this).parent().parent().parent().attr('childid');
downloadItem(itemid, 'item');
return false;
});
$('tr.album a.rate').live('click', function (event) {
var itemid = $(this).parent().parent().attr('childid');
var itemid = $(this).parent().parent().parent().attr('childid');
//rateSong(itemid, 5);
starItem(itemid, true);
$(this).removeClass('rate');
@ -314,13 +321,22 @@
return false;
});
$('tr.album a.favorite').live('click', function (event) {
var itemid = $(this).parent().parent().attr('childid');
var itemid = $(this).parent().parent().parent().attr('childid');
//rateSong(itemid, 0);
starItem(itemid, false);
$(this).removeClass('favorite');
$(this).addClass('rate');
return false;
});
$('tr.album td.artist a').live('click', function (event) {
var parentid = $(this).parent().parent().attr('parentid');
if (parentid !== "undefined") {
$('#AutoAlbumContainer li').removeClass('selected');
$('#ArtistContainer li').removeClass('selected');
getMusicDirectory(parentid, '', '#AlbumContainer tbody', '');
}
return false;
});
// Track - Click Events
// Multiple Select
@ -354,17 +370,16 @@
// Double Click
$('table.songlist tr.song').live('dblclick', function (e) {
e.preventDefault();
//$(this).addClass('playing').siblings().removeClass('playing');
var songid = $(this).attr('childid');
var albumid = $(this).attr('parentid');
getSongData(this, songid, albumid, 0, false);
});
$('table.songlist tr.song a.play').live('click', function (event) {
var songid = $(this).parent().parent().attr('childid');
var albumid = $(this).parent().parent().attr('parentid');
var songid = $(this).parent().parent().parent().attr('childid');
var albumid = $(this).parent().parent().parent().attr('parentid');
if (!$('#tabQueue').is(':visible')) {
$('#CurrentPlaylistContainer tbody').empty();
var track = $(this).parent().parent();
var track = $(this).parent().parent().parent();
$(track).clone().appendTo('#CurrentPlaylistContainer');
id = 0;
count = 0;
@ -380,27 +395,27 @@
albumid = $(firstsong).attr('parentid');
getSongData(firstsong, songid, albumid, 0, false);
} else {
getSongData($(this).parent().parent(), songid, albumid, 0, false);
getSongData($(this).parent().parent().parent(), songid, albumid, 0, false);
}
return false;
});
$('table.songlist tr.song a.download').live('click', function (event) {
var itemid = $(this).parent().parent().attr('childid');
var itemid = $(this).parent().parent().parent().attr('childid');
downloadItem(itemid, 'item');
return false;
});
$('table.songlist tr.song a.add').live('click', function (event) {
var track = $(this).parent().parent();
var track = $(this).parent().parent().parent();
$(track).clone().appendTo('#CurrentPlaylistContainer');
return false;
});
$('table.songlist tr.song a.remove').live('click', function (event) {
var track = $(this).parent().parent();
var track = $(this).parent().parent().parent();
$(track).remove();
return false;
});
$('table.songlist tr.song a.rate').live('click', function (event) {
var songid = $(this).parent().parent().attr('childid');
var songid = $(this).parent().parent().parent().attr('childid');
//rateSong(songid, 5);
starItem(songid, true);
$(this).removeClass('rate');
@ -408,7 +423,7 @@
return false;
});
$('table.songlist tr.song a.favorite').live('click', function (event) {
var songid = $(this).parent().parent().attr('childid');
var songid = $(this).parent().parent().parent().attr('childid');
//rateSong(songid, 0);
starItem(songid, false);
$(this).removeClass('favorite');
@ -420,21 +435,10 @@
if (parentid != '' && parentid !== undefined) {
$('#AutoAlbumContainer li').removeClass('selected');
$('#ArtistContainer li').removeClass('selected');
getAlbums(parentid, 'link', '#AlbumContainer tbody');
getMusicDirectory(parentid, 'link', '#AlbumContainer tbody', '');
}
return false;
});
/*
$('table.songlist tr.song td.artist a').live('click', function (event) {
var artistid = $(this).parent().parent().attr('artistid');
if (artistid != '' && artistid !== undefined) {
$('#AutoAlbumContainer li').removeClass('selected');
$('#ArtistContainer li').removeClass('selected');
getArtist(artistid, 'link', '#AlbumContainer tbody');
}
return false;
});
*/
$('li.index').live('click', function (e) {
$('#Artists').stop().scrollTo('#auto', 400);
return false;
@ -497,7 +501,6 @@
return false;
});
$('#action_RefreshArtists').click(function () {
//loadArtists("", true);
if (getCookie('MusicFolders')) {
loadArtists(getCookie('MusicFolders'), true);
} else {
@ -505,6 +508,10 @@
}
return false;
});
$('#action_RescanLibrary').click(function () {
rescanLibrary();
return false;
});
$('#action_IncreaseWidth').click(function () {
resizeSMSection(50);
return false;
@ -595,6 +602,7 @@
$('#action_Empty').live('click', function () {
$('#CurrentPlaylistContainer tbody').empty();
deleteCurrentPlaylist();
updateStatus('#status_Current', '');
return false;
});
$('#action_AddCurrentToPlaylist').click(function () {
@ -625,7 +633,7 @@
$('#songdetails').click(function (e) {
var source = e.target.nodeName;
var hash = window.location.hash;
if (source != 'A' && hash != '#tabQueue') {
if (source != 'A' && source != 'IMG' && hash != '#tabQueue') {
loadTabContent('#tabQueue');
}
});
@ -705,6 +713,16 @@
}
return false;
});
$('#action_CurrentRemoveSongs').click(function () {
if (!$(this).hasClass('disabled')) {
if ($('#CurrentPlaylist tr.selected').length > 0) {
$('#CurrentPlaylist tr.selected').each(function () {
$(this).remove();
});
}
}
return false;
});
$('#action_AutoPilot').click(function () {
var msg;
if (getCookie('AutoPilot')) {
@ -723,16 +741,34 @@
if ($('#CurrentPlaylistContainer tbody').html() == '' && !audio) {
$('#CurrentPlaylistContainer tbody').empty();
getRandomSongList('autoplay', '#CurrentPlaylistContainer tbody', '', folder);
$('#currentActions a.button').removeClass('disabled');
$('#tabQueue a.button').removeClass('disabled');
} else {
getRandomSongList('', '#CurrentPlaylistContainer tbody', '', folder);
$('#currentActions a.button').removeClass('disabled');
$('#tabQueue a.button').removeClass('disabled');
}
}
$(this).attr("title", msg);
updateMessage(msg, true);
return false;
});
var preview = true;
$('#action_Preview').click(function () {
var msg;
if (preview) {
//setCookie('Preview', null);
previewStarredCoverArt();
//$('#action_Preview').addClass('selected');
msg = 'Preview On';
//preview = false;
} else {
//setCookie('Preview', true);
//$('#action_Preview').removeClass('selected');
//msg = 'Preview Off';
}
$(this).attr("title", msg);
updateMessage(msg, true);
return false;
});
// Playlist Click Events
$('#AutoPlaylistContainer li.item').live('click', function () {
@ -887,7 +923,12 @@
} else {
next = $('#AlbumContainer tr.playing').next();
}
changeTrack(next);
//changeTrack(next);
if (!changeTrack(next)) {
if (getCookie('AutoPilot')) {
getRandomSongList('autoplayappend', '#CurrentPlaylistContainer tbody', '', '');
}
}
return false;
});
$('#PreviousTrack').live('click', function () {
@ -895,10 +936,21 @@
changeTrack(prev);
return false;
});
$("a#coverartimage").fancybox({
'hideOnContentClick': true,
'type': 'image'
beforeShow : function() {
this.title = $('#songdetails_artist').html();
},
afterLoad : function() {
//this.inner.prepend( '<h1>1. My custom title</h1>' );
//this.content = '<h1>2. My custom title</h1>';
},
hideOnContentClick: true,
type: 'image',
openEffect: 'none',
closeEffect: 'none',
});
$('#songdetails a.rate').live('click', function (event) {
var itemid = $('#songdetails_song').attr('childid');
if (itemid !== undefined) {
@ -964,13 +1016,19 @@
}
});
// Preferences Click Events
$('#SavePreferences').live('click', function () {
var username = $('#Username').val();
var password = $('#Password').val();
setCookie('username', username);
if (password != "") {
setCookie('passwordenc', 'enc:' + HexEncode(password));
// Settings Click Events
$('#SaveSettings').live('click', function () {
if ($('#Username').val() != "") {
username = $('#Username').val();
setCookie('username', username);
}
if ($('#Password').val() != "") {
password = 'enc:' + HexEncode($('#Password').val());
setCookie('passwordenc', password);
}
if ($('#Server').val() != "") {
server = $('#Server').val();
setCookie('Server', server);
}
var AutoPlaylists = $('#AutoPlaylists').val();
setCookie('AutoPlaylists', AutoPlaylists);
@ -978,16 +1036,103 @@
setCookie('AutoAlbumSize', AutoAlbumSize);
var AutoPlaylistSize = $('#AutoPlaylistSize').val();
setCookie('AutoPlaylistSize', AutoPlaylistSize);
var server = $('#Server').val();
if (server != "") {
setCookie('Server', server);
// Application Name
if ($('#ApplicationName').val() != "") {
applicationName = $('#ApplicationName').val();
setCookie('ApplicationName', applicationName);
}
var applicationname = $('#ApplicationName').val();
if (applicationname != "") {
setCookie('ApplicationName', applicationname);
// Hide AZ
if ($('#HideAZ').is(':checked')) {
setCookie('HideAZ', '1');
$('#BottomContainer').hide();
} else {
setCookie('HideAZ', null);
$('#BottomContainer').show();
}
updateMessage('Preferences Saved...', true);
//location.reload(true);
// Song Notification
if ($('#Notification_Song').is(':checked')) {
requestPermissionIfRequired();
if (hasNotificationPermission()) {
setCookie('Notification_Song', '1');
} else {
alert('HTML5 Notifications are not available for your current browser, Sorry :(');
return false;
}
} else {
setCookie('Notification_Song', null);
}
// Now Playing Notification
if ($('#Notification_NowPlaying').is(':checked')) {
requestPermissionIfRequired();
if (hasNotificationPermission()) {
setCookie('Notification_NowPlaying', '1');
} else {
alert('HTML5 Notifications are not available for your current browser, Sorry :(');
return false;
}
} else {
setCookie('Notification_NowPlaying', null);
}
// Scroll Title
if ($('#ScrollTitle').is(':checked')) {
setCookie('ScrollTitle', '1');
} else {
setCookie('ScrollTitle', null);
}
// Debug
if ($('#Debug').is(':checked')) {
setCookie('Debug', '1');
debug = true;
} else {
setCookie('Debug', null);
debug = false;
}
// Force Flash
if ($('#ForceFlash').is(':checked')) {
setCookie('ForceFlash', '1');
/*
if (confirm('Switching to the Flash audio player requires a page refresh. Would you like to do that now?')) {
location.reload(true);
} else {
}
*/
} else {
setCookie('ForceFlash', null);
}
// JSONP
if ($('#Protocol').is(':checked')) {
protocol = 'jsonp';
setCookie('Protocol', '1');
} else {
protocol = 'json';
setCookie('Protocol', null);
}
// Save Progress
if ($('#SaveTrackPosition').is(':checked')) {
setCookie('SaveTrackPosition', '1');
var audio = typeof $("#playdeck").data("jPlayer") != 'undefined' ? true : false;
if (audio) {
saveTrackPosition();
}
} else {
setCookie('SaveTrackPosition', null);
setCookie('CurrentSong', null);
deleteCurrentPlaylist();
}
updateBaseParams();
alert('Settings Saved');
return false;
});
$('#ResetSettings').live('click', function () {
setCookie('username', null);
setCookie('password', null);
setCookie('AutoAlbumSize', null);
setCookie('AutoPlaylistSize', null);
setCookie('Server', null);
setCookie('ApplicationName', null);
setCookie('HideAZ', null);
location.reload(true);
});
$('#Theme').live('change', function () {
var theme = $(this).val();
@ -1005,103 +1150,6 @@
}
$('#AutoPlaylists').val(newGenres);
});
$('#HideAZ').live('click', function () {
if ($('#HideAZ').is(':checked')) {
setCookie('HideAZ', '1');
$('#BottomContainer').hide();
} else {
setCookie('HideAZ', null);
$('#BottomContainer').show();
}
});
$('#Notification_Song').live('click', function () {
if ($('#Notification_Song').is(':checked')) {
requestPermissionIfRequired();
if (hasNotificationPermission()) {
setCookie('Notification_Song', '1');
} else {
alert('HTML5 Notifications are not available for your current browser, Sorry :(');
return false;
}
} else {
setCookie('Notification_Song', null);
}
});
$('#Notification_NowPlaying').live('click', function () {
if ($('#Notification_NowPlaying').is(':checked')) {
requestPermissionIfRequired();
if (hasNotificationPermission()) {
setCookie('Notification_NowPlaying', '1');
} else {
alert('HTML5 Notifications are not available for your current browser, Sorry :(');
return false;
}
} else {
setCookie('Notification_NowPlaying', null);
}
});
$('#ScrollTitle').live('click', function () {
if ($('#ScrollTitle').is(':checked')) {
setCookie('ScrollTitle', '1');
} else {
setCookie('ScrollTitle', null);
}
});
$('#Debug').live('click', function () {
if ($('#Debug').is(':checked')) {
setCookie('Debug', '1');
debug = true;
} else {
setCookie('Debug', null);
debug = false;
}
});
$('#ForceFlash').live('click', function () {
if ($('#ForceFlash').is(':checked')) {
setCookie('ForceFlash', '1');
} else {
setCookie('ForceFlash', null);
}
//location.reload(true);
});
$('#Protocol').live('click', function () {
if ($('#Protocol').is(':checked')) {
setCookie('Protocol', '1');
} else {
setCookie('Protocol', null);
}
//location.reload(true);
});
$('#SaveTrackPosition').live('click', function () {
if ($('#SaveTrackPosition').is(':checked')) {
setCookie('SaveTrackPosition', '1');
var audio = typeof $("#playdeck").data("jPlayer") != 'undefined' ? true : false;
if (audio) {
saveTrackPosition();
}
} else {
setCookie('SaveTrackPosition', null);
setCookie('CurrentSong', null);
deleteCurrentPlaylist();
}
//location.reload(true);
});
$('input#Password').keydown(function (e) {
var unicode = e.charCode ? e.charCode : e.keyCode;
if (unicode == 13) {
$('#SavePreferences').click();
}
});
$('#ResetPreferences').live('click', function () {
setCookie('username', null);
setCookie('password', null);
setCookie('AutoAlbumSize', null);
setCookie('AutoPlaylistSize', null);
setCookie('Server', null);
setCookie('ApplicationName', null);
setCookie('HideAZ', null);
//location.reload(true);
});
$('#ChangeLogShowMore').live('click', function () {
$('ul#ChangeLog li.log').each(function (i, el) {
$(el).show();
@ -1122,5 +1170,5 @@
$("#TrackContainer tbody").sortable({
helper: fixHelper
}).disableSelection();
}); // End document.ready
}); // End document.ready

View file

@ -2,7 +2,7 @@
"manifest_version": 2,
"name": "MiniSub",
"description": "MiniSub - HTML5 Mini Player for Subsonic",
"version": "2.3.6",
"version": "2.3.7",
"app": {
"launch": {
"local_path": "index.html"

View file

@ -52,43 +52,23 @@ span.apiversion
border-right: 1px solid #232323;
border-bottom: none;
}
#nav a.first
{
border-top: 1px solid #232323;
}
#nav a.first:hover
{
border: 1px solid #5A5A5A;
border-right: 1px solid #232323;
border-bottom: none;
}
#nav a.last
{
border-bottom: 1px solid #232323;
}
#nav a.last:hover
{
border: 1px solid #5A5A5A;
border-right: 1px solid #232323;
border-bottom: none;
}
#nav a.active
{
color: #545454;
background: #2E2E2E;
border: 1px solid #1D1D1D;
border-right: none;
border-bottom: none;
}
#nav a.active:hover
{
color: #545454;
border: 1px solid #5A5A5A;
border-right: none;
border-bottom: 1px solid #1D1D1D;
border: 1px solid #1D1D1D;
border-bottom: none;
}
#SideBar
{
background: #2e2e2e;
background: #292929;
border: 1px solid #1d1d1d;
}
#NowPlaying, #ChatMsgs
@ -301,6 +281,13 @@ ul.preferences li em
box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1);
color: #f2f2f2;
}
.form {
border: 1px solid #1A1A1A;
background: #292929;
overflow: auto;
float: left;
margin: 10px;
}
.inputwrap
{
border: 1px solid #1d1d1d;
@ -315,10 +302,18 @@ label
}
#donate {
background: #232323;
border: 1px solid #1D1D1D;
}
::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 2px rgba(0,0,0,0.2);
-webkit-border-radius: 10px;
background: #252525;
}
::-webkit-scrollbar-thumb {
background: rgba(34, 34, 34, 0.8);
border: 1px solid #1a1a1a;
-webkit-border-radius: 10px;
border-radius: 10px;
background: rgba(29, 29, 29, 0.8);
-webkit-box-shadow: inset 0 0 2px rgba(0,0,0,0.2);
}
::-webkit-scrollbar-thumb:window-inactive {
background: rgba(34, 34, 34, 0.2);

View file

@ -1,3 +1,4 @@
html, body { height: 100%; }
body
{
font: 100% Trebuchet MS, Arial, Helvetica, sans-serif;
@ -6,6 +7,7 @@ body
padding: 0;
text-align: center;
color: #5b5b4e;
height: 100%;
}
img
{
@ -54,28 +56,33 @@ span.apiversion
#container {
text-align: left;
/*min-height: 600px;*/
min-width: 810px;
}
#nav
{
height: 127px;
position: absolute;
top: 44px;
left: 0px;
z-index: 99;
overflow: hidden;
position: relative;
width: 100%;
height: 100%;
}
a#logo
{
position: absolute;
width: 54px;
height: 36px;
background: url('../images/subsonic_36.png') no-repeat 6px 4px;
cursor: pointer;
background: url('../images/subsonic_36.png') no-repeat 5px 1px;
cursor: pointer;
top: 0;
right: 248px;
}
a#logo:hover
{
background: url('../images/subsonic_dn_36.png') no-repeat 6px 4px;
background: url('../images/subsonic_dn_36.png') no-repeat 5px 1px;
}
#nav
{
height: 54px;
width: 270px;
position: absolute;
top: 2px;
left: 0;
z-index: 99;
}
#nav ul
{
@ -85,12 +92,14 @@ a#logo:hover
}
#nav li
{
width: 50px;
float: left;
margin: 0 1px 0 0;
}
#nav a
{
display: block;
padding: 13px 9px 13px 15px;
padding: 8px 12px;
height: 21px;
color: #7C7C7C;
letter-spacing: -1px;
font-weight: bold;
@ -107,37 +116,20 @@ a#logo:hover
border: 1px solid #D5D5D5;
border-bottom: none;
}
#nav a.first
{
border-top: 1px solid #E4E4E4;
}
#nav a.first:hover
{
color: #545454;
border: 1px solid #D5D5D5;
border-bottom: none;
}
#nav a.last
{
border-bottom: 1px solid #E4E4E4;
}
#nav a.last:hover
{
color: #545454;
border: 1px solid #D5D5D5;
}
#nav a.active
{
color: #545454;
background: #ffffff;
border: 1px solid #CBCBCB;
border-right: none;
border-bottom: none;
padding: 8px 12px 9px 12px;
}
#nav a.active:hover
{
color: #545454;
border: 1px solid #CBCBCB;
border-right: none;
border-bottom: none;
}
#nav a img
{
@ -149,11 +141,20 @@ a#logo:hover
display: block;
margin: 3px 0 4px 1px;
}
#search
{
height: 30px;
width: 250px;
position: absolute;
top: 6px;
right: 0;
z-index: 1;
}
#content
{
background: #EDEDED;
overflow: hidden;
width: 100%;
height: 100%;
}
#content h2
{
@ -163,45 +164,42 @@ a#logo:hover
}
.tabcontent
{
min-height: 400px;
min-width: 900px;
margin-left: 53px;
margin: 0;
}
.smsection
{
width: 200px;
min-height: 360px;
padding: 0 0 40px 0;
float: left;
overflow-y: scroll;
overflow-x: hidden;
background: #fff;
/*border-right: 1px solid #f2f2f2;*/
position: absolute;
top: 39px;
left: 60px;
top: 0;
bottom: 0;
left: 4px;
outline: none;
}
.lgsection
{
height: 100%;
width: 100%;
min-height: 400px;
overflow: auto;
background: #fff;
border: 1px solid #cbcbcb;
margin-top: 4px;
border-top: 1px solid #cbcbcb;
border-bottom: 1px solid #cbcbcb;
position: absolute;
top: 40px;
bottom: 84px;
width: 100%;
}
.fullsection
{
height: 100%;
width: 100%;
min-width: 450px;
min-height: 400px;
overflow: auto;
background: #fff;
border: 1px solid #cbcbcb;
margin-top: 4px;
position: absolute;
top: 40px;
bottom: 84px;
width: 100%;
}
.padder
{
@ -228,7 +226,7 @@ a#logo:hover
display: none;
height: 35px;
width: 40px;
margin: 0 0 0 7px;
margin: 0 0 0 2px;
background: url('../images/ajax-loader.gif') no-repeat center center;
float: left;
}
@ -253,7 +251,7 @@ a#logo:hover
border: 1px solid #A6CBF3;
border-radius: 4px 4px 4px 4px;
box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1);
opacity: 0.8;
opacity: 0.95;
cursor: pointer;
}
.status
@ -264,8 +262,8 @@ a#logo:hover
text-align: center;
position: absolute;
z-index: 99;
bottom: 87px;
right: 4px;
bottom: 85px;
right: 0;
background: #f2f2f2;
padding: 2px 10px;
border-top: 1px solid #CBCBCB;
@ -381,7 +379,7 @@ ul.mainlist li.item a.add:hover
}
#BreadCrumbContainer
{
margin: 5px 5px 0 221px;
margin: 5px 5px 0 0;
font-size: 12px;
height: 22px;
}
@ -399,6 +397,10 @@ ul.mainlist li.item a.add:hover
padding: 2px 0px 2px 0;
float: left;
}
#BreadCrumbs span
{
margin: 0 2px 0 6px;
}
#BreadCrumbs a
{
margin: 0 2px 0 6px;
@ -417,11 +419,11 @@ ul.mainlist li.item a.add:hover
#AlbumContainer
{
margin: 0 5px 5px 221px;
margin: 0 5px 5px 0;
}
#TrackContainer, #PodcastContainer
{
margin: 5px 5px 5px 221px;
margin: 5px 5px 5px 0;
}
#CurrentPlaylistContainer tr.song a.add
{
@ -440,6 +442,26 @@ ul.mainlist li.item a.add:hover
{
background: url('../images/minus_8x2.png') no-repeat 6px center #DEECFB;
}
.tablecontainer
{
position: absolute;
top: 0;
bottom: 0;
right: 0;
overflow-y: auto;
overflow-x: hidden;
width: auto;
}
.tablecontainerfull
{
position: absolute;
top: 0;
bottom: 0;
right: 0;
overflow-y: auto;
overflow-x: hidden;
width: 100%;
}
table.songlist
{
margin: 5px;
@ -488,10 +510,24 @@ table.songlist tr.album td.title
table.songlist tr.album td.artist
{
}
table.songlist tr.album td.itemactions
table.songlist tr.album td.artist a
{
width: 85px;
padding-left: 10px;
color: #829FC0;
text-decoration: none;
float: left;
overflow: hidden;
white-space: nowrap;
}
table.songlist tr.album td.artist a:hover
{
text-decoration: underline;
}
table.songlist tr.album .itemactions
{
width: 80px;
padding: 0 10px;
margin: 0;
float: right;
}
table.songlist tr.album td.albumart
{
@ -561,7 +597,6 @@ table.songlist tr.album a.favorite
float: left;
height: 50px;
width: 20px;
margin: 0 5px 0 0;
display: block;
background: url('../images/star_yo_12x12.png') 2px center no-repeat;
}
@ -576,13 +611,12 @@ table.songlist tr.row td
font-size: 13px;
padding: 9px 10px;
}
table.songlist tr.row td.itemactions
table.songlist tr.row .itemactions
{
width: 85px;
padding-left: 26px;
width: 80px;
padding: 0 10px;
/*display: block;*/
margin: auto 0;
height: 18px;
float: right;
}
table.songlist tr.row td.track
{
@ -712,7 +746,6 @@ table.songlist tr.selected td.album a
}
#ArtistContainer
{
min-height: 360px;
}
#BottomContainer
{
@ -746,22 +779,17 @@ table.songlist tr.selected td.album a
}
.actions
{
width: 195px;
height: 29px;
margin: 4px 0 0 0;
height: 30px;
margin: 6px 20px 0 265px;
padding: 0 0 0 5px;
}
.subactions
{
height: 29px;
width: 660px;
margin: 4px 0 0 0;
margin: 5px 0 0 0;
padding: 0 0 0 5px;
}
#songActions
{
float: left;
}
.submenu
{
position: absolute;
@ -804,12 +832,15 @@ table.songlist tr.selected td.album a
{
display: none;
width: 200px;
position: fixed;
top: 37px;
right: 4px;
background: none repeat scroll 0 0 #FFFFFF;
min-height: 350px;
background: none repeat scroll 0 0 #fcfcfc;
border: 1px solid #CBCBCB;
min-height: 400px;
border-right: none;
position: absolute;
top: 40px;
bottom: 200px;
right: 0;
opacity: .85;
}
#SideBar .header
{
@ -819,14 +850,24 @@ table.songlist tr.selected td.album a
font-variant: small-caps;
font-weight: bold;
}
#SideBar .submit
{
padding: 0 2px;
position: absolute;
bottom: 0;
}
#ChatMsgs
{
border-bottom: 1px solid #F2F2F2;
padding: 5px;
margin: 0 0 2px;
text-align: right;
overflow-y: auto;
overflow-x: hidden;
position: absolute;
width: 192px;
bottom: 38px;
top: 220px;
border-bottom: 1px solid #F2F2F2;
}
#ChatMsgs .msg
{
@ -846,10 +887,7 @@ table.songlist tr.selected td.album a
font-size: 9px;
color: #CAD0D7;
}
#Chat .submit
{
padding: 0 2px;
}
#submenu_NowPlaying
{
left: 605px;
@ -890,13 +928,31 @@ table.songlist tr.selected td.album a
{
}
#queue
{
background: #fff;
border-top: 1px solid #cbcbcb;
border-bottom: 1px solid #cbcbcb;
margin: 4px 0;
height: 75px;
position: absolute;
bottom: 0; /* Sit it on the bottom */
left: 0;
width: 100%; /* As wide as it's allowed */
}
/* Player Style */
#player
{
background: #fff;
border: 1px solid #cbcbcb;
margin: 2px 0 5px 0;
margin-left: 53px;
border-top: 1px solid #cbcbcb;
border-bottom: 1px solid #cbcbcb;
margin: 4px 0;
height: 75px;
position: absolute;
bottom: 0; /* Sit it on the bottom */
left: 0;
width: 100%; /* As wide as it's allowed */
}
#audiocontainer
{
@ -994,6 +1050,7 @@ table.songlist tr.selected td.album a
float: left;
padding: 2px;
}
#preview { display: none; }
#songdetails
{
width: 322px;
@ -1275,6 +1332,7 @@ a.selected {
a.disabled {
color: #B7B7B7;
background: #f1f1f1;
opacity: .6;
}
a.disabled:hover {
color: #B7B7B7;
@ -1296,12 +1354,13 @@ a.button img.pad { margin: 1px 0 -1px 0; }
::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 2px rgba(0,0,0,0.2);
-webkit-border-radius: 10px;
background: #f2f2f2;
border-radius: 10px;
}
::-webkit-scrollbar-thumb {
-webkit-border-radius: 10px;
border-radius: 10px;
background: rgba(237, 237, 237, 0.4);
background: rgba(201, 201, 201, 0.4);
-webkit-box-shadow: inset 0 0 2px rgba(0,0,0,0.2);
}
::-webkit-scrollbar-thumb:window-inactive {
@ -1309,6 +1368,13 @@ a.button img.pad { margin: 1px 0 -1px 0; }
}
/* Form Style */
.form {
border: 1px solid #f2f2f2;
background: #fcfcfc;
overflow: auto;
float: left;
margin: 10px;
}
input
{
font-family: Calibri, Arial, Verdana;
@ -1363,6 +1429,10 @@ select#MusicFolders
{
margin: 0 5px;
}
.submitsettings {
margin: 0 40px 20px 40px;
float: right;
}
label
{
font-size: 12px;