Release v2.5.0.
This commit is contained in:
commit
25e29b4ed1
@ -22,7 +22,6 @@ env:
|
|||||||
- TOX_ENV=tidy
|
- TOX_ENV=tidy
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- "sudo sed -i '/127.0.1.1/d' /etc/hosts" # Workaround https://github.com/tornadoweb/tornado/issues/1573
|
|
||||||
- "sudo apt-get update -qq"
|
- "sudo apt-get update -qq"
|
||||||
|
|
||||||
install:
|
install:
|
||||||
|
|||||||
13
README.rst
13
README.rst
@ -52,7 +52,7 @@ Installation
|
|||||||
|
|
||||||
Install by running::
|
Install by running::
|
||||||
|
|
||||||
pip install mopidy-musicbox-webclient
|
sudo pip install mopidy-musicbox-webclient
|
||||||
|
|
||||||
|
|
||||||
Alternatively, clone the repository and run ``sudo python setup.py install`` from within the project directory. e.g. ::
|
Alternatively, clone the repository and run ``sudo python setup.py install`` from within the project directory. e.g. ::
|
||||||
@ -105,6 +105,17 @@ Project resources
|
|||||||
Changelog
|
Changelog
|
||||||
=========
|
=========
|
||||||
|
|
||||||
|
v2.5.0 (2017-05-22)
|
||||||
|
------------
|
||||||
|
|
||||||
|
- Detect additional stream formats (rtmp, rtmps, rtsp).
|
||||||
|
- Include details of currently selected page in HTML title tag. (Addresses: `#243 <https://github.com/pimusicbox/mopidy-musicbox-webclient/issues/243>`_).
|
||||||
|
|
||||||
|
**Fixes**
|
||||||
|
|
||||||
|
- Prevent excessive calls to the Mopidy server while buffering. (Fixes: `#237 <https://github.com/pimusicbox/mopidy-musicbox-webclient/issues/237>`_).
|
||||||
|
- Only allow browsing tracks by album if a URI is available for that album. (Fixes: `#250 <https://github.com/pimusicbox/mopidy-musicbox-webclient/issues/250>`_).
|
||||||
|
|
||||||
v2.4.0 (2017-03-15)
|
v2.4.0 (2017-03-15)
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import os
|
|||||||
|
|
||||||
from mopidy import config, ext
|
from mopidy import config, ext
|
||||||
|
|
||||||
__version__ = '2.4.0'
|
__version__ = '2.5.0'
|
||||||
|
|
||||||
|
|
||||||
class Extension(ext.Extension):
|
class Extension(ext.Extension):
|
||||||
|
|||||||
@ -36,7 +36,7 @@
|
|||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body data-websocket-url="{{ websocketUrl }}" data-is-musicbox="{{ isMusicBox }}" data-has-alarmclock="{{ hasAlarmClock }}" data-on-track-click="{{ onTrackClick }}" data-program-name="{{ programName }}" data-hostname="{{ hostname }}">
|
<body data-websocket-url="{{ websocketUrl }}" data-is-musicbox="{{ isMusicBox }}" data-has-alarmclock="{{ hasAlarmClock }}" data-on-track-click="{{ onTrackClick }}" data-program-name="{{ programName }}" data-hostname="{{ hostname }}" data-title="{{ title }}">
|
||||||
<div data-role="page" id="page" class="ui-responsive-panel" data-theme="c" data-title="{{ title }}">
|
<div data-role="page" id="page" class="ui-responsive-panel" data-theme="c" data-title="{{ title }}">
|
||||||
<div data-role="panel" id="panel" data-position="left" data-theme="a" data-display="reveal" data-position-fixed="true">
|
<div data-role="panel" id="panel" data-position="left" data-theme="a" data-display="reveal" data-position-fixed="true">
|
||||||
|
|
||||||
|
|||||||
@ -306,8 +306,12 @@ function renderSongLiDivider (previousTrack, track, nextTrack, target) {
|
|||||||
// Render differently if part of an album.
|
// Render differently if part of an album.
|
||||||
if (!hasSameAlbum(previousTrack, track) && hasSameAlbum(track, nextTrack)) {
|
if (!hasSameAlbum(previousTrack, track) && hasSameAlbum(track, nextTrack)) {
|
||||||
// Large divider with album cover.
|
// Large divider with album cover.
|
||||||
|
showAlbum = ''
|
||||||
|
if (typeof track.album.uri !== 'undefined') {
|
||||||
|
showAlbum = 'onclick="return library.showAlbum(\'' + track.album.uri + '\', mopidy);"'
|
||||||
|
}
|
||||||
html +=
|
html +=
|
||||||
'<li class="albumdivider"><a href="#" onclick="return library.showAlbum(\'' + track.album.uri + '\', mopidy);">' +
|
'<li class="albumdivider"><a href="#" ' + showAlbum + '>' +
|
||||||
'<img id="' + getjQueryID(target + '-cover', track.uri) + '" class="artistcover" width="30" height="30"/>' +
|
'<img id="' + getjQueryID(target + '-cover', track.uri) + '" class="artistcover" width="30" height="30"/>' +
|
||||||
'<h1>' + track.album.name + '</h1><p>' +
|
'<h1>' + track.album.name + '</h1><p>' +
|
||||||
renderSongLiTrackArtists(track) + '</p></a></li>'
|
renderSongLiTrackArtists(track) + '</p></a></li>'
|
||||||
@ -482,7 +486,7 @@ function showOffline (on) {
|
|||||||
|
|
||||||
// from http://dzone.com/snippets/validate-url-regexp
|
// from http://dzone.com/snippets/validate-url-regexp
|
||||||
function validUri (uri) {
|
function validUri (uri) {
|
||||||
var regexp = /^(mms|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
|
var regexp = /^(http|https|mms|rtmp|rtmps|rtsp):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
|
||||||
return regexp.test(uri)
|
return regexp.test(uri)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -338,11 +338,12 @@ function switchContent (divid, uri) {
|
|||||||
|
|
||||||
function setHeadline (site) {
|
function setHeadline (site) {
|
||||||
site = site.trim()
|
site = site.trim()
|
||||||
str = $('.mainNav').find('a[href$=' + site + ']').text()
|
headline = $('.mainNav').find('a[href$=' + site + ']').text()
|
||||||
if (str === '') {
|
if (headline === '') {
|
||||||
str = site.charAt(0).toUpperCase() + site.slice(1)
|
headline = site.charAt(0).toUpperCase() + site.slice(1)
|
||||||
}
|
}
|
||||||
$('#contentHeadline').html('<a href="#home" onclick="switchContent(\'home\'); return false;">' + str + '</a>')
|
$('#contentHeadline').html('<a href="#home" onclick="switchContent(\'home\'); return false;">' + headline + '</a>')
|
||||||
|
return headline
|
||||||
}
|
}
|
||||||
|
|
||||||
// update tracklist options.
|
// update tracklist options.
|
||||||
@ -371,7 +372,8 @@ function locationHashChanged () {
|
|||||||
var divid = hash[0].substr(1)
|
var divid = hash[0].substr(1)
|
||||||
var uri = hash[1]
|
var uri = hash[1]
|
||||||
|
|
||||||
setHeadline(divid)
|
headline = setHeadline(divid)
|
||||||
|
updateDocumentTitle(headline)
|
||||||
|
|
||||||
if ($(window).width() < 880) {
|
if ($(window).width() < 880) {
|
||||||
$('#panel').panel('close')
|
$('#panel').panel('close')
|
||||||
@ -621,3 +623,8 @@ function updatePlayIcons (uri, tlid, popupMenuIcon) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function updateDocumentTitle (headline) {
|
||||||
|
headline = headline || $('#contentHeadline').text()
|
||||||
|
document.title = headline + ' | ' + $(document.body).data('title')
|
||||||
|
}
|
||||||
|
|||||||
@ -106,7 +106,9 @@
|
|||||||
// check in the timeout callback than doing another function call.
|
// check in the timeout callback than doing another function call.
|
||||||
clearTimeout(this._scheduleID)
|
clearTimeout(this._scheduleID)
|
||||||
this._isSyncScheduled = false
|
this._isSyncScheduled = false
|
||||||
this._scheduleID = setTimeout($.proxy(function () { this._isSyncScheduled = true }, this), milliseconds)
|
if (milliseconds >= 0) {
|
||||||
|
this._scheduleID = setTimeout($.proxy(function () { this._isSyncScheduled = true }, this), milliseconds)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SyncedProgressTimer.prototype._doSync = function (position, duration) {
|
SyncedProgressTimer.prototype._doSync = function (position, duration) {
|
||||||
@ -116,6 +118,8 @@
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._scheduleSync(-1) // Ensure that only one sync process is active at a time.
|
||||||
|
|
||||||
var _this = this
|
var _this = this
|
||||||
_this._mopidy.playback.getTimePosition().then(function (targetPosition) {
|
_this._mopidy.playback.getTimePosition().then(function (targetPosition) {
|
||||||
if (_this.syncState === SyncedProgressTimer.SYNC_STATE.NOT_SYNCED) {
|
if (_this.syncState === SyncedProgressTimer.SYNC_STATE.NOT_SYNCED) {
|
||||||
@ -179,8 +183,7 @@
|
|||||||
|
|
||||||
SyncedProgressTimer.prototype.stop = function () {
|
SyncedProgressTimer.prototype.stop = function () {
|
||||||
this._progressTimer.stop()
|
this._progressTimer.stop()
|
||||||
clearTimeout(this._scheduleID)
|
this._scheduleSync(-1)
|
||||||
this._isSyncScheduled = false
|
|
||||||
if (this.syncState !== SyncedProgressTimer.SYNC_STATE.SYNCED && this._previousSyncPosition) {
|
if (this.syncState !== SyncedProgressTimer.SYNC_STATE.SYNCED && this._previousSyncPosition) {
|
||||||
// Timer was busy trying to sync when it was stopped, fallback to displaying the last synced position on screen.
|
// Timer was busy trying to sync when it was stopped, fallback to displaying the last synced position on screen.
|
||||||
this.positionNode.nodeValue = SyncedProgressTimer.format(this._previousSyncPosition)
|
this.positionNode.nodeValue = SyncedProgressTimer.format(this._previousSyncPosition)
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
CACHE MANIFEST
|
CACHE MANIFEST
|
||||||
|
|
||||||
# 2017-02-26:v1
|
# 2017-10-07:v1
|
||||||
|
|
||||||
NETWORK:
|
NETWORK:
|
||||||
*
|
*
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
from __future__ import absolute_import, division, print_function, unicode_literals
|
from __future__ import absolute_import, division, print_function, unicode_literals
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import socket
|
import socket
|
||||||
import string
|
import string
|
||||||
|
|||||||
2
tox.ini
2
tox.ini
@ -14,7 +14,7 @@ deps =
|
|||||||
pytest-cov
|
pytest-cov
|
||||||
pytest-xdist
|
pytest-xdist
|
||||||
responses
|
responses
|
||||||
install_command = pip install --allow-unverified=mopidy --pre {opts} {packages}
|
install_command = pip install --pre {opts} {packages}
|
||||||
commands =
|
commands =
|
||||||
py.test \
|
py.test \
|
||||||
--basetemp={envtmpdir} \
|
--basetemp={envtmpdir} \
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user