PlazaSharp/libplaza/Main.cs

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;
}
}
}