using GanjooRazor.Models.BeepTunes; using GanjooRazor.Utils; using GSpotifyProxy.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using RMuseum.Models.Ganjoor; using RMuseum.Models.Ganjoor.ViewModels; using System.Collections.Generic; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace GanjooRazor.Pages { [IgnoreAntiforgeryToken(Order = 1001)] public class BpModel : PageModel { /// /// HttpClient instance /// private readonly HttpClient _httpClient; /// /// configuration /// private readonly IConfiguration Configuration; /// /// constructor /// /// /// public BpModel(HttpClient httpClient, IConfiguration configuration) { _httpClient = httpClient; Configuration = configuration; } /// /// is logged on /// public bool LoggedIn { get; set; } /// /// PoemId /// public int PoemId { get; set; } /// /// Last Error /// public string LastError { get; set; } /// /// Post Success /// public bool PostSuccess { get; set; } /// /// Inserted song Id /// public int InsertedSongId { get; set; } /// /// readonly mode /// public bool ReadOnlyMode { get { return bool.Parse(Configuration["ReadOnlyMode"]); } } /// /// suggested (unapproved) songs /// public PoemMusicTrackViewModel[] SuggestedSongs { get; set; } /// /// api model /// [BindProperty] public PoemMusicTrackViewModel PoemMusicTrackViewModel { get; set; } private async Task _GetSuggestedSongs() { var response = await _httpClient.GetAsync($"{APIRoot.Url}/api/ganjoor/poem/{PoemId}/songs/?approved=false&trackType={(int)PoemMusicTrackType.BeepTunesOrKhosousi}"); if (response.StatusCode == HttpStatusCode.OK) { SuggestedSongs = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); } else { SuggestedSongs = new PoemMusicTrackViewModel[] { }; } } public async Task OnGetAsync() { PostSuccess = false; LastError = ""; InsertedSongId = 0; LoggedIn = !string.IsNullOrEmpty(Request.Cookies["Token"]); if (!string.IsNullOrEmpty(Request.Query["p"])) { PoemId = int.Parse(Request.Query["p"]); } else { PoemMusicTrackViewModel.PoemId = 0; } await _GetSuggestedSongs(); } public async Task OnPostAsync() { PostSuccess = false; LastError = ""; LoggedIn = !string.IsNullOrEmpty(Request.Cookies["Token"]); PoemId = PoemMusicTrackViewModel.PoemId = int.Parse(Request.Query["p"]); PoemMusicTrackViewModel.TrackType = PoemMusicTrackType.BeepTunesOrKhosousi; InsertedSongId = 0; using (HttpClient secureClient = new HttpClient(new GanjoorReloginHandler(Request, Response))) { if (await GanjoorSessionChecker.PrepareClient(secureClient, Request, Response)) { var stringContent = new StringContent(JsonConvert.SerializeObject(PoemMusicTrackViewModel), Encoding.UTF8, "application/json"); var methodUrl = $"{APIRoot.Url}/api/ganjoor/song"; var response = await secureClient.PostAsync(methodUrl, stringContent); if (!response.IsSuccessStatusCode) { LastError = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); } else { InsertedSongId = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()).Id; PostSuccess = true; } } else { LastError = "لطفاً از گنجور خارج و مجددا به آن وارد شوید."; } } await _GetSuggestedSongs(); return Page(); } /// /// search by artists name /// /// /// public async Task OnPostSearchByArtistNameAsync(string search) { var response = await _httpClient.GetAsync($"https://newapi.beeptunes.com/public/search?albumCount=0&artistCount=100&text={search}&trackCount=0"); List artists = new List(); if (response.StatusCode == HttpStatusCode.OK) { BpSearchResponseModel bpResponse = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); foreach (var artist in bpResponse.Artists) { artists.Add ( new NameIdUrlImage() { Id = artist.Id, Name = artist.ArtisticName, Url = artist.Url, Image = artist.Picture } ); } } return new PartialViewResult() { ViewName = "_SpotifySearchPartial", ViewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary()) { Model = new _SpotifySearchPartialModel() { Artists = artists.ToArray() } } }; } /// /// fill artist albums /// /// is an ID /// public async Task OnPostFillAlbumsAsync(string artist) { var response = await _httpClient.GetAsync($"https://newapi.beeptunes.com/public/artist/albums?artistId={artist}&begin=0&size=1000"); NameIdUrlImage[] albums = new NameIdUrlImage[] { }; if (response.StatusCode == HttpStatusCode.OK) { albums = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); foreach (var album in albums) { album.Url = $"https://beeptunes.com/album/{album.Id}"; } } return new OkObjectResult(albums); } /// /// fill album tracks /// /// is an ID /// public async Task OnPostFillTracksAsync(string album) { var response = await _httpClient.GetAsync($"https://newapi.beeptunes.com/public/album/list-tracks/?albumId={album}"); NameIdUrlImage[] tracks = new NameIdUrlImage[] { }; if (response.StatusCode == HttpStatusCode.OK) { tracks = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); foreach (var track in tracks) { track.Url = $"https://beeptunes.com/track/{track.Id}"; } } return new OkObjectResult(tracks); } /// /// search by track title /// /// /// public async Task OnPostSearchByTrackTitleAsync(string search) { var response = await _httpClient.GetAsync($"https://newapi.beeptunes.com/public/search?albumCount=0&artistCount=0&text={search}&trackCount=100"); List tracks = new List(); if (response.StatusCode == HttpStatusCode.OK) { BpSearchResponseModel bpResponse = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync()); foreach (var track in bpResponse.Tracks) { if (track.FirstArtists != null && track.FirstArtists.Length > 0) { string albumName = ""; var responseAlbum = await _httpClient.GetAsync($"https://newapi.beeptunes.com/public/album/info/?albumId={track.Album_Id}"); if (responseAlbum.StatusCode == HttpStatusCode.OK) { NameIdUrlImage nameIdUrl = JsonConvert.DeserializeObject(await responseAlbum.Content.ReadAsStringAsync()); albumName = nameIdUrl.Name; } tracks.Add ( new TrackQueryResult() { Id = track.Id, Name = track.Name, Url = track.Url, AlbumId = track.Album_Id, AlbumName = albumName, AlbunUrl = $"https://beeptunes.com/album/{track.Album_Id}", ArtistId = track.FirstArtists[0].Id, ArtistName = track.FirstArtists[0].ArtisticName, ArtistUrl = track.FirstArtists[0].Url, Image = track.PrimaryImage } ); } } } return new PartialViewResult() { ViewName = "_SpotifySearchPartial", ViewData = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary()) { Model = new _SpotifySearchPartialModel() { Tracks = tracks.ToArray() } } }; } } }