superstar_v2/DBObj/SongData.cs

192 lines
7.2 KiB
C#
Raw Normal View History

2025-07-08 13:37:12 +08:00
using DualScreenDemo;
using System;
using System.IO;
using System.Net;
using System.Windows.Markup;
2025-04-07 16:54:10 +08:00
namespace DBObj
{
public class SongData
{
private Song basic;
private Artist A;
private Artist B;
2025-07-08 13:37:12 +08:00
public bool isPublicSong { get; set; }
public PlayState state;
public SongData()
{
basic = new("", "", "", "", 0, 1, "");
A = new("", "");
// B = new(null, null);
isPublicSong = false;
}
2025-07-08 13:37:12 +08:00
public SongData(string songNumber, string song, string filename, int humanVoice, bool isPublic)
{
basic = new(songNumber, song, "", filename, humanVoice, 0, "");
2025-07-08 13:37:12 +08:00
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)
2025-04-21 11:33:31 +08:00
{
basic = new(songNumber, song, songSimplified, filename, humanVoice, dbChange, situation);
A = new Artist(artistA, artistASimplified);
B = !artistB.Equals("") ? new Artist(artistB, artistBSimplified) : null;
isPublicSong = false;
2025-07-08 13:37:12 +08:00
}
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();
2025-07-17 18:08:22 +08:00
public string next_song_text()
2025-07-08 18:13:36 +08:00
{
2025-07-17 18:08:22 +08:00
var str = (state == PlayState.InsertPlayback) ? GetStateTxt(false) : "";
return String.Format("下一首:{0} {1}", basic.getName(false), str);
2025-07-08 18:13:36 +08:00
}
public string artist_text()
{
return B != null
? $"{A.getName(false)} - {B.getName(false)}"
: A.getName(false);
2025-07-08 18:13:36 +08:00
}
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));
2025-07-08 18:13:36 +08:00
}
public bool FileExistsInServers()
{
foreach (var server in Utils.Env.GetSongServers())
{
try
{
// string fullPath = Path.Combine(server, basic.getFileName());
Uri fullUri = new Uri(new Uri(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;
}
2025-07-08 18:13:36 +08:00
public string getFile()
{
return FindExistingPath(basic.getFileName());
2025-07-08 18:13:36 +08:00
}
2025-07-08 13:37:12 +08:00
private string FindExistingPath(string filename)
{
foreach (var server in Utils.Env.GetSongServers())
2025-07-08 18:13:36 +08:00
{
2025-07-08 13:37:12 +08:00
string fullPath = Path.Combine(server, filename);
if (File.Exists(fullPath)) return fullPath;
}
2025-07-08 18:13:36 +08:00
return null; // 找不到就回原本的 filename不加路徑
2025-07-08 13:37:12 +08:00
}
public Uri getFileUrl()
{
if (!isPublicSong)
{
return GetUri(basic.getFileName());
}
return null;
}
private Uri GetUri(string filename)
{
foreach (var server in Utils.Env.GetSongServers())
{
2025-09-03 17:57:57 +08:00
var check = IsFtpUriReachable(new Uri(new Uri(server), filename).ToString());
if (!string.IsNullOrWhiteSpace(server) && check != false)
{
2025-09-03 17:34:33 +08:00
// Console.WriteLine(new Uri(new Uri(server), filename));
2025-09-03 17:57:57 +08:00
return new Uri(new Uri(server), filename);
}
}
// throw new InvalidOperationException("No valid server found.");
2025-09-03 17:57:57 +08:00
if (!isPublicSong) Console.WriteLine("No valid server or file not found.");
return null;
}
public Color GetStateColor() => state switch
2025-07-08 13:37:12 +08:00
{
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;
2025-04-07 16:54:10 +08:00
public PlayState GetState() => state;
public int getHumanVoice() => basic.getHumanVoice();
2025-04-07 16:54:10 +08:00
public override string ToString()
{
return String.Format("{0} {1}", basic.getName(), state.GetDescription());
}
public bool IsFtpUriReachable(string ftpUri)
{
try
{
#pragma warning disable SYSLIB0014 // 類型或成員已經過時
var request = (FtpWebRequest)WebRequest.Create(ftpUri);
#pragma warning restore SYSLIB0014 // 類型或成員已經過時
request.Method = WebRequestMethods.Ftp.ListDirectory; // Lightweight check
// request.Credentials = new NetworkCredential("svr", "svr"); // Replace with actual username/password
request.Timeout = 5000;
using var response = (FtpWebResponse)request.GetResponse();
return response.StatusCode == FtpStatusCode.OpeningData || response.StatusCode == FtpStatusCode.DataAlreadyOpen;
}
catch (WebException ex)
{
if (ex.Response is FtpWebResponse ftpResponse)
{
Console.WriteLine($"FTP error: {ftpResponse.StatusDescription}");
return false;
}
Console.WriteLine($"Connection error: {ex.Message}");
return false;
}
catch (Exception ex)
{
Console.WriteLine($"Unexpected error: {ex.Message}");
return false;
}
2025-04-07 16:54:10 +08:00
}
public static bool IsFtpUri(Uri uri)
{
return uri != null && uri.Scheme == Uri.UriSchemeFtp;
}
2025-04-07 16:54:10 +08:00
}
}