Icecast cachebuster
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -77,7 +77,7 @@
|
|||||||
|
|
||||||
// Release details
|
// Release details
|
||||||
// These are automatically injected to built HTML
|
// These are automatically injected to built HTML
|
||||||
var build = "1530477679";
|
var build = "1530521605";
|
||||||
var version = "3.21.4";
|
var version = "3.21.4";
|
||||||
|
|
||||||
// Construct the script tag
|
// Construct the script tag
|
||||||
|
|||||||
2
src/js/bootstrap.js
vendored
2
src/js/bootstrap.js
vendored
@ -44,7 +44,7 @@ var initialState = {
|
|||||||
users: {},
|
users: {},
|
||||||
tracks: {},
|
tracks: {},
|
||||||
http_streaming_enabled: false,
|
http_streaming_enabled: false,
|
||||||
http_streaming_encoding: 'mpeg',
|
http_streaming_cachebuster: null,
|
||||||
http_streaming_url: "http://"+window.location.hostname+":8000/mopidy"
|
http_streaming_url: "http://"+window.location.hostname+":8000/mopidy"
|
||||||
},
|
},
|
||||||
ui: {
|
ui: {
|
||||||
|
|||||||
@ -29,7 +29,9 @@ class PlaybackControls extends React.Component{
|
|||||||
|
|
||||||
componentDidMount(){
|
componentDidMount(){
|
||||||
if (this.props.http_streaming_enabled){
|
if (this.props.http_streaming_enabled){
|
||||||
this.playStream();
|
|
||||||
|
// Bust our cache, and by consequence, play our stream
|
||||||
|
this.props.coreActions.cachebustHttpStream();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,32 +43,33 @@ class PlaybackControls extends React.Component{
|
|||||||
this.stream.src = null;
|
this.stream.src = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!props.current_track || !props.http_streaming_enabled || !props.http_streaming_url){
|
if (!props.http_streaming_enabled || !props.http_streaming_url){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Use our track's URI as a cache mechanism. This prevents the browser from starting
|
this.stream.src = props.http_streaming_url+"?cb="+props.http_streaming_cachebuster;
|
||||||
// the stream right back at the beginning (which would play from the browser's cache, ie first render)
|
this.stream.muted = props.http_streaming_mute;
|
||||||
var url = props.http_streaming_url+"?cache_buster="+props.current_track.uri;
|
this.stream.volume = props.http_streaming_volume / 100;
|
||||||
|
|
||||||
this.stream.muted = this.props.http_streaming_mute;
|
|
||||||
this.stream.volume = this.props.http_streaming_volume / 100;
|
|
||||||
this.stream.src = url;
|
|
||||||
this.stream.play();
|
this.stream.play();
|
||||||
|
|
||||||
|
console.log("Playing stream: "+this.stream.src);
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillReceiveProps(nextProps){
|
componentWillReceiveProps(nextProps){
|
||||||
|
|
||||||
// When the track changes, update our stream URL to reflect the cache buster
|
// Cachebuster changed
|
||||||
// TODO: This will crop the end of tracks by the duration of the buffer. Perhaps create
|
// This happens when playback changes, so that the stream is "new", rather
|
||||||
// a timestamp to only update the stream when a track has been skipped?
|
// than the original stream. This prevents the browser cache from starting
|
||||||
if (!this.props.current_track && nextProps.current_track ||
|
// the stream right from the beginning (which could be hours of continuous playback).
|
||||||
this.props.current_track && nextProps.current_track && this.props.current_track.uri !== nextProps.current_track.uri){
|
if (this.props.http_streaming_cachebuster !== nextProps.http_streaming_cachebuster){
|
||||||
|
this.playStream(nextProps);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Just been enabled
|
||||||
|
if (!this.props.http_streaming_enabled && nextProps.http_streaming_enabled){
|
||||||
this.playStream(nextProps);
|
this.playStream(nextProps);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Currently have a stream running
|
|
||||||
if (this.stream){
|
if (this.stream){
|
||||||
|
|
||||||
// Just been muted
|
// Just been muted
|
||||||
@ -80,7 +83,7 @@ class PlaybackControls extends React.Component{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Just been disabled
|
// Just been disabled
|
||||||
if (nextProps.http_streaming_enabled){
|
if (!nextProps.http_streaming_enabled){
|
||||||
this.stream = null;
|
this.stream = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -210,6 +213,7 @@ const mapStateToProps = (state, ownProps) => {
|
|||||||
http_streaming_volume: (state.core.http_streaming_volume ? state.core.http_streaming_volume : 50),
|
http_streaming_volume: (state.core.http_streaming_volume ? state.core.http_streaming_volume : 50),
|
||||||
http_streaming_mute: (state.core.http_streaming_mute ? state.core.http_streaming_mute : false),
|
http_streaming_mute: (state.core.http_streaming_mute ? state.core.http_streaming_mute : false),
|
||||||
http_streaming_url: (state.core.http_streaming_url ? state.core.http_streaming_url : null),
|
http_streaming_url: (state.core.http_streaming_url ? state.core.http_streaming_url : null),
|
||||||
|
http_streaming_cachebuster: state.core.http_streaming_cachebuster,
|
||||||
current_track: (state.core.current_track && state.core.tracks[state.core.current_track.uri] !== undefined ? state.core.tracks[state.core.current_track.uri] : null),
|
current_track: (state.core.current_track && state.core.tracks[state.core.current_track.uri] !== undefined ? state.core.tracks[state.core.current_track.uri] : null),
|
||||||
next_track: (state.core.next_track_uri && state.core.tracks[state.core.next_track_uri] !== undefined ? state.core.tracks[state.core.next_track_uri] : null),
|
next_track: (state.core.next_track_uri && state.core.tracks[state.core.next_track_uri] !== undefined ? state.core.tracks[state.core.next_track_uri] : null),
|
||||||
radio_enabled: (state.ui.radio && state.ui.radio.enabled ? true : false),
|
radio_enabled: (state.ui.radio && state.ui.radio.enabled ? true : false),
|
||||||
|
|||||||
@ -72,6 +72,12 @@ export function clearCurrentTrack(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function cachebustHttpStream(){
|
||||||
|
return {
|
||||||
|
type: 'CACHEBUST_HTTP_STREAM'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -7,6 +7,9 @@ export default function reducer(core = {}, action){
|
|||||||
case 'CORE_SET':
|
case 'CORE_SET':
|
||||||
return Object.assign({}, core, action.data)
|
return Object.assign({}, core, action.data)
|
||||||
|
|
||||||
|
case 'CACHEBUST_HTTP_STREAM':
|
||||||
|
return Object.assign({}, core, {http_streaming_cachebuster: new Date().getTime()})
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Current track and tracklist
|
* Current track and tracklist
|
||||||
**/
|
**/
|
||||||
|
|||||||
Reference in New Issue
Block a user