Files
2026-02-21 16:45:37 +08:00

486 lines
10 KiB
C#

using System;
using Crosstales.Radio.Model;
using Crosstales.Radio.Util;
using UnityEngine;
using UnityEngine.UI;
namespace Crosstales.Radio.Demo
{
[HelpURLAttribute("https://www.crosstales.com/media/data/assets/radio/api/class_crosstales_1_1_radio_1_1_demo_1_1_g_u_i_play_random_station.html")]
public class GUIPlayRandomStation : MonoBehaviour
{
[Header("Settings")]
[Tooltip("'SimplePlayer' from the scene.")]
public SimplePlayer Player;
[Tooltip("The color for the Play-mode.")]
public Color32 PlayColor = new Color32(0, byte.MaxValue, 0, 64);
[Header("UI Objects")]
public Button NextButton;
public Button PreviousButton;
public Button PlayButton;
public Button StopButton;
public Image MainImage;
public Text Station;
public Text ElapsedTime;
public Text StationsNumberText;
public Text ErrorText;
public Text ElapsedRecordTime;
public Text RecordTitle;
public Text RecordArtist;
public Text DownloadSizeStation;
public Text ElapsedStationTime;
public Text NextRecordTitle;
public Text NextRecordArtist;
public Text NextRecordDelay;
private Color32 color;
private bool isDirectionNext = true;
private bool isStopped = true;
private int playtime;
private int recordPlaytime;
private RadioFilter filter = new RadioFilter();
private int invokeDelayCounter = 1;
private RecordInfo currentRecord;
private RecordInfo nextRecord;
public void Start()
{
if (MainImage != null)
{
color = MainImage.color;
}
if (ElapsedTime != null)
{
ElapsedTime.text = "Loading...";
}
if (PlayButton != null)
{
PlayButton.interactable = false;
}
if (NextButton != null)
{
NextButton.interactable = false;
}
if (PreviousButton != null)
{
PreviousButton.interactable = false;
}
if (StopButton != null)
{
StopButton.interactable = false;
}
if (Player != null && Player.Player != null)
{
Player.OnPlaybackStart += onPlaybackStart;
Player.OnPlaybackEnd += onPlaybackEnd;
Player.OnAudioPlayTimeUpdate += onAudioPlayTimeUpdate;
Player.OnBufferingProgressUpdate += onBufferingProgressUpdate;
Player.OnErrorInfo += onErrorInfo;
Player.OnProviderReady += onProviderReady;
Player.OnRecordChange += onRecordChange;
Player.OnRecordPlayTimeUpdate += onRecordPlayTimeUpdate;
Player.OnNextRecordChange += onNextRecordChange;
Player.OnNextRecordDelayUpdate += onNextRecordDelayUpdate;
if (ErrorText != null)
{
ErrorText.text = string.Empty;
}
}
else
{
string text = "'Player' is null!";
Debug.LogError(text);
if (ErrorText != null)
{
ErrorText.text = text;
}
}
onPlaybackEnd(null);
}
public void Update()
{
if (Time.frameCount % 20 != 0 || !(Player != null) || !(Player.Manager != null))
{
return;
}
if (StationsNumberText != null)
{
StationsNumberText.text = Player.Manager.CountStations(filter).ToString();
}
if (nextRecord != null && nextRecord.Equals(currentRecord))
{
if (NextRecordTitle != null)
{
NextRecordTitle.text = string.Empty;
}
if (NextRecordArtist != null)
{
NextRecordArtist.text = string.Empty;
}
}
}
private void OnDestroy()
{
if (Player != null && Player.Player != null)
{
Player.OnPlaybackStart -= onPlaybackStart;
Player.OnPlaybackEnd -= onPlaybackEnd;
Player.OnAudioPlayTimeUpdate -= onAudioPlayTimeUpdate;
Player.OnBufferingProgressUpdate -= onBufferingProgressUpdate;
Player.OnErrorInfo -= onErrorInfo;
Player.OnProviderReady -= onProviderReady;
Player.OnRecordChange -= onRecordChange;
Player.OnRecordPlayTimeUpdate -= onRecordPlayTimeUpdate;
Player.OnNextRecordChange -= onNextRecordChange;
Player.OnNextRecordDelayUpdate -= onNextRecordDelayUpdate;
}
}
public void Play()
{
if (Helper.isInternetAvailable)
{
isDirectionNext = true;
if (Player != null)
{
isStopped = false;
Player.Play();
}
}
else
{
Debug.LogError("No internet connection available! Can't play (stream) any stations!");
}
}
public void Next()
{
if (Helper.isInternetAvailable)
{
isDirectionNext = true;
if (Player != null)
{
isStopped = false;
Player.Next(Player.PlayRandom, filter);
}
}
else
{
Debug.LogError("No internet connection available! Can't play (stream) any stations!");
}
}
public void Previous()
{
if (Helper.isInternetAvailable)
{
isDirectionNext = false;
if (Player != null)
{
isStopped = false;
Player.Previous(Player.PlayRandom, filter);
}
}
else
{
Debug.LogError("No internet connection available! Can't play (stream) any stations!");
}
}
public void Stop()
{
isStopped = true;
stop();
}
public void OpenUrl()
{
if (Player != null && Player.Player != null)
{
Application.OpenURL(Player.Player.Station.Station);
}
}
public void OpenSpotifyUrl()
{
if (Player != null && Player.Player != null)
{
Application.OpenURL(Player.Player.RecordInfo.SpotifyUrl);
}
}
public void FilterGenre(string filter)
{
this.filter.Genres = filter;
}
public void FilterRatingMin(string rating)
{
float.TryParse(rating, out filter.RatingMin);
}
public void FilterRatingMax(string rating)
{
float.TryParse(rating, out filter.RatingMax);
}
private void onPlaybackStart(RadioStation station)
{
if (MainImage != null)
{
MainImage.color = PlayColor;
}
if (PlayButton != null)
{
PlayButton.interactable = false;
}
if (StopButton != null)
{
StopButton.interactable = true;
}
if (ErrorText != null)
{
ErrorText.text = string.Empty;
}
if (Player.RadioStation != null)
{
Station.text = station.Name;
}
}
private void onPlaybackEnd(RadioStation station)
{
if (MainImage != null)
{
MainImage.color = color;
}
if (Station != null)
{
Station.text = Constants.TEXT_QUESTIONMARKS;
}
if (PlayButton != null)
{
PlayButton.interactable = true;
}
if (StopButton != null)
{
StopButton.interactable = false;
}
if (ElapsedTime != null)
{
ElapsedTime.text = Constants.TEXT_STOPPED;
}
if (ElapsedRecordTime != null)
{
ElapsedRecordTime.text = Helper.FormatSecondsToHourMinSec(0.0);
}
if (ElapsedStationTime != null)
{
ElapsedStationTime.text = Helper.FormatSecondsToHourMinSec(0.0);
}
if (DownloadSizeStation != null)
{
DownloadSizeStation.text = Helper.FormatBytesToHRF(0L);
}
if (RecordTitle != null)
{
RecordTitle.text = string.Empty;
}
if (RecordArtist != null)
{
RecordArtist.text = string.Empty;
}
if (NextRecordTitle != null)
{
NextRecordTitle.text = string.Empty;
}
if (NextRecordArtist != null)
{
NextRecordArtist.text = string.Empty;
}
if (NextRecordDelay != null)
{
NextRecordDelay.text = string.Empty;
}
}
private void onAudioPlayTimeUpdate(RadioStation station, float playtime)
{
if ((int)playtime != this.playtime)
{
if (ElapsedTime != null)
{
ElapsedTime.text = Helper.FormatSecondsToHourMinSec(playtime);
}
if (DownloadSizeStation != null)
{
DownloadSizeStation.text = Helper.FormatBytesToHRF(station.TotalDataSize);
}
if (ElapsedStationTime != null)
{
ElapsedStationTime.text = Helper.FormatSecondsToHourMinSec(station.TotalPlayTime);
}
if (playtime > 30f)
{
invokeDelayCounter = 1;
}
this.playtime = (int)playtime;
}
}
private void onBufferingProgressUpdate(RadioStation station, float progress)
{
if (ElapsedTime != null)
{
ElapsedTime.text = Constants.TEXT_BUFFER + progress.ToString("0%");
}
}
private void onErrorInfo(RadioStation station, string info)
{
stop();
if (!isStopped && Helper.isInternetAvailable && Player != null && Player.Manager != null && Player.Manager.CountStations(filter) > 1)
{
if (isDirectionNext)
{
Debug.LogError("Error occoured => Playing next random station." + Environment.NewLine + info);
Invoke("next", 0.4f * (float)invokeDelayCounter);
invokeDelayCounter++;
}
else
{
Debug.LogError("Error occoured => Playing previous random station." + Environment.NewLine + info);
Invoke("previous", 0.4f * (float)invokeDelayCounter);
invokeDelayCounter++;
}
}
else if (ErrorText != null)
{
ErrorText.text = info;
}
}
private void onProviderReady()
{
if (NextButton != null)
{
NextButton.interactable = true;
}
if (PreviousButton != null)
{
PreviousButton.interactable = true;
}
if (PlayButton != null)
{
PlayButton.interactable = true;
}
if (ElapsedTime != null)
{
ElapsedTime.text = Constants.TEXT_STOPPED;
}
}
private void onRecordChange(RadioStation station, RecordInfo record)
{
currentRecord = record;
if (RecordTitle != null)
{
RecordTitle.text = record.Title;
}
if (RecordArtist != null)
{
RecordArtist.text = record.Artist;
}
if (NextRecordDelay != null)
{
NextRecordDelay.text = string.Empty;
}
}
private void onRecordPlayTimeUpdate(RadioStation station, RecordInfo record, float playtime)
{
if ((int)playtime != recordPlaytime)
{
recordPlaytime = (int)playtime;
if (ElapsedRecordTime != null)
{
ElapsedRecordTime.text = Helper.FormatSecondsToHourMinSec(playtime);
}
}
}
private void onNextRecordChange(RadioStation station, RecordInfo record, float delay)
{
nextRecord = record;
if (NextRecordTitle != null)
{
NextRecordTitle.text = record.Title;
}
if (NextRecordArtist != null)
{
NextRecordArtist.text = record.Artist;
}
}
private void onNextRecordDelayUpdate(RadioStation station, RecordInfo record, float delay)
{
if (NextRecordDelay != null)
{
NextRecordDelay.text = delay.ToString("#0.0");
}
}
private void stop()
{
if (Player != null)
{
Player.Stop();
}
}
private void next()
{
if (!isStopped)
{
Next();
}
}
private void previous()
{
if (!isStopped)
{
Previous();
}
}
}
}