using DualScreenDemo; using System; using System.IO; using System.Windows.Markup; namespace DBObj { public class SongData { private Song basic; private Artist A ; private Artist B ; public bool isPublicSong { get; set; } public PlayState state; public SongData() { basic = new("", "", "", "", 0, 1, ""); A = new("", ""); // B = new(null, null); isPublicSong = false; } public SongData(string songNumber, string song, string filename, int humanVoice, bool isPublic) { basic = new(songNumber, song, "", filename, humanVoice, 0, ""); isPublicSong = isPublic; } public SongData(string songNumber, string song, string artistA, string artistB, string filename, string artistASimplified, string artistBSimplified, string songSimplified, int humanVoice,int dbChange,string situation) { basic=new(songNumber,song,songSimplified,filename,humanVoice,dbChange,situation); A = new Artist(artistA, artistASimplified); B = !artistB.Equals("") ? new Artist(artistB, artistBSimplified) : null; isPublicSong = false; } public SongData(SongData value,PlayState s){ basic = value.getBasic(); A = value.getA(); B = value.getB(); state =s; } public Song getBasic() => basic; public Artist getA() => A; public Artist getB() => B; public string getNumber() => basic.getNumber(); public string getName(bool IsSimplified=false) => basic.getName(IsSimplified); public string getName() => basic.getName(); public string getArtist_A(bool IsSimplified) => A.getName(IsSimplified); public string getArtist_A() => A.getName(); public string getArtist_B(bool IsSimplified) => B.getName(IsSimplified); public string getArtist_B() => B.getName(); public int getNameLength() =>basic.getName().Length; public string getFileName() => basic.getFileName(); public string next_song_text() { var str = (state == PlayState.InsertPlayback) ? GetStateTxt(false) : ""; return String.Format("下一首:{0} {1}", basic.getName(false),str); } public string artist_text() { return B!=null ? $"{A.getName(false)} - {B.getName(false)}" : A.getName(false); } public string name_text() { return B!=null ? String.Format("{0} - {1} - {2}", A.getName(false), B.getName(false), basic.getName(false)) : String.Format("{0} - {1}", A.getName(false), basic.getName(false)); } public bool FileExistsInServers() { foreach (var server in Utils.Env.GetSongServers()) { try { string fullPath = Path.Combine(server, basic.getFileName()); if (File.Exists(fullPath)) { Console.WriteLine($"找到檔案: {fullPath}"); return true; } } catch (Exception ex) { Console.WriteLine($"檢查檔案時發生錯誤: {ex.Message}"); } } Console.WriteLine($"全部 server 都找不到檔案: {basic.getFileName()}"); return false; } public string getFile() { return FindExistingPath(basic.getFileName()); } private string FindExistingPath(string filename) { foreach (var server in Utils.Env.GetSongServers()) { string fullPath = Path.Combine(server, filename); if (File.Exists(fullPath)) return fullPath; } return null; // 找不到就回原本的 filename,不加路徑 } public Color GetStateColor() => state switch { PlayState.Played => Color.Gray, PlayState.Skipped => Color.Gray, PlayState.NoFile => Color.Gray, PlayState.Playing => Color.LimeGreen, PlayState.InsertPlayback => Color.Gold, _ => Color.White }; public string GetStateTxt(bool IsSimplified) => (state==PlayState.NotPlayed)?"":$"({state.GetDescription(IsSimplified)})"; public void SetState(PlayState s) => state = s; public PlayState GetState() => state; public int getHumanVoice() => basic.getHumanVoice(); public override string ToString() { return String.Format("{0} {1}", basic.getName(),state.GetDescription() ); } } }