using Newtonsoft.Json;
using SimpleJSON;
using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using Logger = SongBrowser.Logging.Logger;
using Sprites = SongBrowser.UI.Base64Sprites;
///
/// Only here to support migration of favorites playlist to.
/// TODO - replace with PlaylistCore when available.
///
namespace SongBrowser.DataAccess
{
public class PlaylistSong
{
public string key { get; set; }
public string songName { get; set; }
public string hash { get; set; }
[NonSerialized]
public string levelId;
[NonSerialized]
public CustomPreviewBeatmapLevel level;
[NonSerialized]
public bool oneSaber;
[NonSerialized]
public string path;
}
public class Playlist
{
public string playlistTitle { get; set; }
public string playlistAuthor { get; set; }
public string image { get; set; }
public int playlistSongCount { get; set; }
public List songs { get; set; }
public string fileLoc { get; set; }
public string customDetailUrl { get; set; }
public string customArchiveUrl { get; set; }
[NonSerialized]
public Sprite icon;
public Playlist()
{
}
public Playlist(JSONNode playlistNode)
{
string image = playlistNode["image"].Value;
// If we cannot find an image or parse the provided one correctly, fall back to anything.
// It will never be displayed by SongBrowser.
if (!string.IsNullOrEmpty(image))
{
try
{
icon = Sprites.Base64ToSprite(image.Substring(image.IndexOf(",") + 1));
}
catch
{
Logger.Exception("Unable to convert playlist image to sprite!");
icon = Sprites.StarFullIcon;
}
}
else
{
icon = Sprites.StarFullIcon;
}
playlistTitle = playlistNode["playlistTitle"];
playlistAuthor = playlistNode["playlistAuthor"];
customDetailUrl = playlistNode["customDetailUrl"];
customArchiveUrl = playlistNode["customArchiveUrl"];
if (!string.IsNullOrEmpty(customDetailUrl))
{
if (!customDetailUrl.EndsWith("/"))
customDetailUrl += "/";
Logger.Log("Found playlist with customDetailUrl! Name: " + playlistTitle + ", CustomDetailUrl: " + customDetailUrl);
}
if (!string.IsNullOrEmpty(customArchiveUrl) && customArchiveUrl.Contains("[KEY]"))
{
Logger.Log("Found playlist with customArchiveUrl! Name: " + playlistTitle + ", CustomArchiveUrl: " + customArchiveUrl);
}
songs = new List();
foreach (JSONNode node in playlistNode["songs"].AsArray)
{
PlaylistSong song = new PlaylistSong();
song.key = node["key"];
song.songName = node["songName"];
song.hash = node["hash"];
song.levelId = node["levelId"];
songs.Add(song);
}
if (playlistNode["playlistSongCount"] != null)
{
playlistSongCount = playlistNode["playlistSongCount"].AsInt;
}
if (playlistNode["fileLoc"] != null)
fileLoc = playlistNode["fileLoc"];
if (playlistNode["playlistURL"] != null)
fileLoc = playlistNode["playlistURL"];
}
public static Playlist LoadPlaylist(string path)
{
Playlist playlist = new Playlist(JSON.Parse(File.ReadAllText(path)));
playlist.fileLoc = path;
return playlist;
}
public bool PlaylistEqual(object obj)
{
if (obj == null) return false;
var playlist = obj as Playlist;
if (playlist == null) return false;
int songCountThis = (songs != null ? (songs.Count > 0 ? songs.Count : playlistSongCount) : playlistSongCount);
int songCountObj = (playlist.songs != null ? (playlist.songs.Count > 0 ? playlist.songs.Count : playlist.playlistSongCount) : playlist.playlistSongCount);
return playlistTitle == playlist.playlistTitle &&
playlistAuthor == playlist.playlistAuthor &&
songCountThis == songCountObj;
}
public void CreateNew(String fileLoc)
{
File.WriteAllText(fileLoc, JsonConvert.SerializeObject(this, Formatting.Indented));
}
}
}