115 lines
3.5 KiB
C#
115 lines
3.5 KiB
C#
using System;
|
|
using System.Net.Http;
|
|
using Newtonsoft.Json;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace libplaza {
|
|
internal class PlazaApi {
|
|
internal const string ApiBase="https://api.plaza.one/";
|
|
internal const string ArtworkBase="https://plaza.one/";
|
|
internal const string RadioBase="https://radio.plaza.one/";
|
|
}
|
|
public class PlazaPlayback {
|
|
public string artist;
|
|
public string title;
|
|
public string album;
|
|
public int length;
|
|
public int position;
|
|
public long updated;
|
|
public string artwork;
|
|
public string artwork_s;
|
|
public int likes;
|
|
public int hates;
|
|
}
|
|
public class PlazaJson {
|
|
public bool maintenance;
|
|
public int listeners;
|
|
[JsonProperty]
|
|
public PlazaPlayback playback;
|
|
}
|
|
internal class PlazaInMaintenanceException : Exception { }
|
|
internal class PlazaUnavailableException : Exception { }
|
|
public class Nightwave {
|
|
public int MinRefreshTime=10;
|
|
private long tsLastRefresh=0;
|
|
private static HttpClient _hcl=new HttpClient();
|
|
public enum BroadcastStatus {
|
|
OffAir,
|
|
OnAir
|
|
}
|
|
public struct Status {
|
|
public string Title;
|
|
public string Artist;
|
|
public string Album;
|
|
public string ArtworkUri;
|
|
public int Elapsed;
|
|
public int Duration;
|
|
public long Since;
|
|
public int CalculatedElapsed;
|
|
public int Likes;
|
|
public int Dislikes;
|
|
public int Listeners;
|
|
}
|
|
private Status _bc;
|
|
public BroadcastStatus Broadcasting=BroadcastStatus.OffAir;
|
|
public Nightwave() {
|
|
_hcl.BaseAddress = new Uri(PlazaApi.ApiBase);
|
|
_hcl.DefaultRequestHeaders.Accept.Clear();
|
|
_hcl.DefaultRequestHeaders.Accept.Add(
|
|
new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
|
|
}
|
|
public async Task<Status> Broadcast() {
|
|
_bc.CalculatedElapsed = (int)(DateTimeOffset.Now.ToUnixTimeSeconds() - _bc.Since) + _bc.Elapsed;
|
|
if(tsLastRefresh+MinRefreshTime >= DateTimeOffset.Now.ToUnixTimeSeconds() && _bc.CalculatedElapsed < _bc.Duration)
|
|
return _bc;
|
|
try {
|
|
Status _=await GetNightwaveAsync();
|
|
Broadcasting = BroadcastStatus.OnAir;
|
|
_bc = _;
|
|
} catch(PlazaInMaintenanceException) {
|
|
Broadcasting = BroadcastStatus.OffAir;
|
|
} catch(PlazaUnavailableException) {
|
|
Broadcasting = BroadcastStatus.OffAir;
|
|
}
|
|
tsLastRefresh = DateTimeOffset.Now.ToUnixTimeSeconds();
|
|
return _bc;
|
|
}
|
|
|
|
public async void Update() {
|
|
try {
|
|
Status _=await GetNightwaveAsync();
|
|
Broadcasting = BroadcastStatus.OnAir;
|
|
_bc = _;
|
|
} catch(PlazaInMaintenanceException) {
|
|
Broadcasting = BroadcastStatus.OffAir;
|
|
} catch(PlazaUnavailableException) {
|
|
Broadcasting = BroadcastStatus.OffAir;
|
|
}
|
|
}
|
|
public async Task<Status> GetNightwaveAsync() {
|
|
Status status;
|
|
HttpResponseMessage _r=await _hcl.GetAsync("/status");
|
|
if(!_r.IsSuccessStatusCode)
|
|
throw new PlazaUnavailableException();
|
|
//string _=await _r.Content.ReadAsStringAsync();
|
|
PlazaJson j=JsonConvert.DeserializeObject<PlazaJson>(await _r.Content.ReadAsStringAsync());
|
|
if(j.maintenance)
|
|
throw new PlazaInMaintenanceException();
|
|
status = new Status {
|
|
Title = j.playback.title,
|
|
Album = j.playback.album,
|
|
Artist = j.playback.artist,
|
|
Elapsed = j.playback.position,
|
|
Duration = j.playback.length,
|
|
CalculatedElapsed = (int)(DateTimeOffset.Now.ToUnixTimeSeconds() - j.playback.updated) + j.playback.position,
|
|
Since = j.playback.updated,
|
|
Likes = j.playback.likes,
|
|
Dislikes = j.playback.hates,
|
|
Listeners = j.listeners,
|
|
ArtworkUri = $"{PlazaApi.ArtworkBase}{j.playback.artwork}"
|
|
};
|
|
return status;
|
|
}
|
|
}
|
|
}
|