Skip to content

Commit 6ea3641

Browse files
authored
Merge pull request #2152 from StoDevX/android-ksto-fixes
Make the KSTO stream a bit less hacksy
2 parents 1f0c08d + e68a5b4 commit 6ea3641

File tree

2 files changed

+88
-62
lines changed

2 files changed

+88
-62
lines changed

source/views/streaming/radio/controller.js

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import {
88
StyleSheet,
99
Text,
1010
View,
11+
Platform,
1112
} from 'react-native'
13+
import noop from 'lodash/noop'
1214
import * as c from '../../components/colors'
1315
import {TabBarIcon} from '../../components/tabbar-icon'
1416
import {callPhone} from '../../components/call-phone'
@@ -17,9 +19,11 @@ import type {TopLevelViewPropsType} from '../../types'
1719
import {StreamPlayer} from './player'
1820
import type {PlayState, HtmlAudioError, Viewport} from './types'
1921
import {ActionButton, ShowCalendarButton, CallButton} from './buttons'
22+
import {openUrl} from '../../components/open-url'
2023

2124
const image = require('../../../../images/streaming/ksto/ksto-logo.png')
2225
const stationNumber = '+15077863602'
26+
const kstoLiveUrl = 'https://www.stolaf.edu/multimedia/play/embed/ksto.html'
2327

2428
type Props = TopLevelViewPropsType
2529

@@ -87,7 +91,21 @@ export class KSTOView extends React.PureComponent<Props, State> {
8791
callPhone(stationNumber)
8892
}
8993

94+
openStreamWebsite = () => {
95+
openUrl(kstoLiveUrl)
96+
}
97+
9098
renderPlayButton = (state: PlayState) => {
99+
if (Platform.OS === 'android') {
100+
return (
101+
<ActionButton
102+
icon="ios-planet"
103+
onPress={this.openStreamWebsite}
104+
text="Open"
105+
/>
106+
)
107+
}
108+
91109
switch (state) {
92110
case 'paused':
93111
return (
@@ -105,7 +123,7 @@ export class KSTOView extends React.PureComponent<Props, State> {
105123
)
106124

107125
default:
108-
return <ActionButton icon="ios-bug" onPress={() => {}} text="Error" />
126+
return <ActionButton icon="ios-bug" onPress={noop} text="Error" />
109127
}
110128
}
111129

@@ -163,16 +181,18 @@ export class KSTOView extends React.PureComponent<Props, State> {
163181
<ShowCalendarButton onPress={this.openSchedule} />
164182
</Row>
165183

166-
<StreamPlayer
167-
onEnded={this.handleStreamEnd}
168-
// onWaiting={this.handleStreamWait}
169-
onError={this.handleStreamError}
170-
// onStalled={this.handleStreamStall}
171-
onPause={this.handleStreamPause}
172-
onPlay={this.handleStreamPlay}
173-
playState={this.state.playState}
174-
style={styles.webview}
175-
/>
184+
{Platform.OS !== 'android' ? (
185+
<StreamPlayer
186+
onEnded={this.handleStreamEnd}
187+
// onWaiting={this.handleStreamWait}
188+
onError={this.handleStreamError}
189+
// onStalled={this.handleStreamStall}
190+
onPause={this.handleStreamPause}
191+
onPlay={this.handleStreamPlay}
192+
playState={this.state.playState}
193+
style={styles.webview}
194+
/>
195+
) : null}
176196
</View>
177197
</ScrollView>
178198
)

source/views/streaming/radio/player.js

Lines changed: 57 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import * as React from 'react'
44
import {WebView} from 'react-native'
55
import type {PlayState, HtmlAudioError} from './types'
66

7-
const kstoStream = 'https://cdn.stobcm.com/radio/ksto1.stream/master.m3u8'
7+
const kstoEmbed = 'https://www.stolaf.edu/multimedia/play/embed/ksto.html'
88

99
type Props = {
1010
playState: PlayState,
@@ -99,92 +99,98 @@ export class StreamPlayer extends React.PureComponent<Props> {
9999

100100
setRef = (ref: WebView) => (this._webview = ref)
101101

102-
html = (url: string) => `
103-
<style>body {background-color: white;}</style>
104-
105-
<title>KSTO Stream</title>
106-
107-
<audio id="player" webkit-playsinline playsinline>
108-
<source src="${url}" />
109-
</audio>
102+
js = `
103+
function ready(fn) {
104+
if (document.readyState !== 'loading') {
105+
fn();
106+
} else if (document.addEventListener) {
107+
document.addEventListener('DOMContentLoaded', fn);
108+
} else {
109+
document.attachEvent('onreadystatechange', function () {
110+
if (document.readyState !== 'loading') {
111+
fn();
112+
}
113+
});
114+
}
115+
};
110116
111-
<script>
112-
var player = document.getElementById('player')
117+
ready(function () {
118+
var player = document.querySelector('audio');
113119
114-
/////
115-
/////
120+
/*******
121+
*******/
116122
117-
document.addEventListener('message', function(event) {
123+
document.addEventListener('message', function (event) {
118124
switch (event.data) {
119125
case 'play':
120-
player.play()
121-
break
126+
player.muted = false;
127+
player.play().catch(error);
128+
break;
122129
123130
case 'pause':
124-
player.pause()
125-
break
131+
player.pause();
132+
break;
126133
}
127-
})
134+
});
128135
129-
/////
130-
/////
136+
/*******
137+
*******/
131138
132139
function message(data) {
133-
window.postMessage(JSON.stringify(data))
140+
window.postMessage(JSON.stringify(data));
134141
}
135142
136143
function send(event) {
137-
message({type: event.type})
144+
message({type: event.type});
138145
}
139146
140147
function error(event) {
141148
message({
142149
type: event.type,
143-
error: {
144-
code: event.target.error.code,
145-
message: event.target.error.message,
146-
},
147-
})
150+
error: 'error',
151+
});
148152
}
149153
150-
/////
151-
/////
154+
/*******
155+
*******/
152156
153-
// "waiting" is fired when playback has stopped because of a temporary
154-
// lack of data.
155-
player.addEventListener('waiting', send)
157+
/* "waiting" is fired when playback has stopped because of a temporary
158+
* lack of data. */
159+
player.addEventListener('waiting', send);
156160
157-
// "ended" is fired when playback or streaming has stopped because the
158-
// end of the media was reached or because no further data is
159-
// available.
160-
player.addEventListener('ended', send)
161+
/* "ended" is fired when playback or streaming has stopped because the
162+
* end of the media was reached or because no further data is
163+
* available. */
164+
player.addEventListener('ended', send);
161165
162-
// "stalled" is fired when the user agent is trying to fetch media data,
163-
// but data is unexpectedly not forthcoming.
164-
player.addEventListener('stalled', send)
166+
/* "stalled" is fired when the user agent is trying to fetch media data,
167+
* but data is unexpectedly not forthcoming. */
168+
player.addEventListener('stalled', send);
165169
166-
// "playing" is fired when playback is ready to start after having been
167-
// paused or delayed due to lack of data.
168-
player.addEventListener('playing', send)
170+
/* "playing" is fired when playback is ready to start after having been
171+
* paused or delayed due to lack of data. */
172+
player.addEventListener('playing', send);
169173
170-
// "pause" is fired when playback has been paused.
171-
player.addEventListener('pause', send)
174+
/* "pause" is fired when playback has been paused. */
175+
player.addEventListener('pause', send);
172176
173-
// "play" is fired when playback has begun.
174-
player.addEventListener('play', send)
177+
/* "play" is fired when playback has begun. */
178+
player.addEventListener('play', send);
175179
176-
// "error" is fired when an error occurs.
177-
player.addEventListener('error', error)
178-
</script>`
180+
/* "error" is fired when an error occurs. */
181+
player.addEventListener('error', error);
182+
});
183+
`
179184

180185
render() {
181186
return (
182187
<WebView
183188
ref={this.setRef}
184189
allowsInlineMediaPlayback={true}
190+
injectedJavaScript={this.js}
185191
mediaPlaybackRequiresUserAction={false}
186192
onMessage={this.handleMessage}
187-
source={{html: this.html(kstoStream)}}
193+
source={{uri: kstoEmbed}}
188194
style={this.props.style}
189195
/>
190196
)

0 commit comments

Comments
 (0)