import React, { Component } from "react"; import { Container, Header, Icon, Grid, Segment, List, Message, Dropdown, Loader } from "semantic-ui-react"; import "fomantic-ui-css/semantic.min.css"; import "./App.css"; import StreamInfo from "./StreamInfo"; import Chat from "./Chat"; class App extends Component { constructor(props) { super(props); this.state = { ready: false, response: {}, history: [], infoUpdate: {}, currentSong: "", streamsAvailable: [], multipleSources: false, selectedStream: 0 }; this.streamCount = 0; this.streamName = ""; } checkStream(source) { const prevCount = this.streamCount; if (source !== undefined) { if (Array.isArray(source)) { this.streamCount = source.length; } else { this.streamCount = 1; } } else { this.streamCount = 0; } return prevCount === this.streamCount; } debug(object) { if (process.env.NODE_ENV === "development") { console.log(object); } } refreshPlayer() { let audio = document.getElementById("player"); if (audio !== null) { audio.pause(); audio.load(); audio.play(); } } addToHistory(song) { this.setState(prevState => ({ history: [...prevState.history, song] })); let historyContainer = document.getElementById("historyContainer"); if (historyContainer != null) { historyContainer.scrollTop = historyContainer.scrollHeight; } } compareSongs() { const { currentSong, multipleSources, selectedStream, response } = this.state; const currentStream = multipleSources ? response.source[selectedStream] : response.source; if (`${currentStream.artist} - ${currentStream.title}` !== currentSong) { this.addToHistory(currentSong); this.setState({ currentSong: `${currentStream.artist} - ${currentStream.title}` }); } } updateInfo() { const { currentSong, multipleSources, selectedStream, response } = this.state; const currentStream = multipleSources ? response.source[selectedStream] : response.source; if (currentSong === "") { this.setState({ currentSong: `${currentStream.artist} - ${currentStream.title}` }); } fetch("https://bienvenidoainternet.org:8443/status-json.xsl") .then(response => response.json()) .then(result => { this.debug(result); const source = result.icestats.source; const countChanged = !this.checkStream(source); if (source !== undefined) { let multipleStreams = Array.isArray(source); if (!multipleStreams && Array.isArray(this.state.response.source)) { this.setState( { response: result.icestats, streamsAvailable: [], multipleSources: multipleStreams, selectedStream: 0 }, () => this.compareSongs() ); this.refreshPlayer(); } else { let streams = []; if (Array.isArray(source)) { source.map((stream, index) => streams.push({ key: index, value: index, text: `[${stream.listeners}] ${stream.server_name} - ${stream.server_description}` }) ); } let prevSelectedStream = this.state.selectedStream; if (countChanged) { let prevStream = source.find( s => s.server_name === this.streamName ); prevSelectedStream = source.indexOf(prevStream); if (prevSelectedStream === -1) { prevSelectedStream = 0; // TODO: Mostrar mensaje } if (this.state.selectedStream !== prevSelectedStream) { this.refreshPlayer(); } } this.setState( { response: result.icestats, streamsAvailable: streams, multipleSources: multipleStreams, selectedStream: prevSelectedStream }, () => { this.compareSongs(); } ); } } else { // No hay streams disponibles this.setState( { response: result.icestats, multipleSources: true, streamsAvailable: {}, selectedStream: 0 }, () => this.compareSongs() ); } }); } componentDidMount() { fetch("https://bienvenidoainternet.org:8443/status-json.xsl") .then(response => response.json()) .then(result => this.setState( { response: result.icestats, infoUpdate: setInterval(() => this.updateInfo(), 10000) }, () => { const { source } = this.state.response; this.checkStream(source); if (source !== undefined && Array.isArray(source)) { let streams = []; source.map((stream, index) => streams.push({ key: index, value: index, text: `[${stream.listeners}] ${stream.server_name} - ${stream.server_description}` }) ); this.debug(streams); this.setState({ multipleSources: true, streamsAvailable: streams, ready: true }); this.streamName = source[0].server_name; } else if (source !== undefined) { this.setState({ multipleSources: false, selectedStream: 0, ready: true }); this.streamName = source.server_name; } } ) ); } render() { const { ready, response, history, streamsAvailable, multipleSources, selectedStream } = this.state; const isOnline = response.source !== undefined; if (!ready) { return ( Obteniendo información del servidor de IceCast ... ); } const currentStream = multipleSources ? response.source[selectedStream] : response.source; const currentStreamURL = currentStream.listenurl.replace( "http://bienvenidoainternet.org:8000", "https://bienvenidoainternet.org:8443" ); return (
BaiRadio {ready ? response.server_id : "Sin información"}
{isOnline ? ( <> {multipleSources && ( <> this.setState({ selectedStream: d.value }, () => { this.streamName = this.state.response.source[ d.value ].server_name; let audio = document.getElementById("player"); if (audio !== null) { audio.pause(); audio.load(); audio.play(); } }) } /> )}
Información de la transmisión
) : ( Oops Actualmente no hay nadie transmitiendo en Bai Radio )}
Historial de canciones
{history.map((song, i) => ( {song} ))}
Bienvenido a Internet 2010 - 2020
); } } export default App;