拔除allartist和allsongs,清理不必要函數

This commit is contained in:
jasonchenwork 2025-04-23 11:46:55 +08:00
parent 67c05a122b
commit 924d6229e7
6 changed files with 70 additions and 284 deletions

View File

@ -8,28 +8,11 @@ namespace DBObj
*/ */
public class ArtistManager public class ArtistManager
{ {
private static ArtistManager _instance;
public List<Artist> AllArtists { get; private set; }
public static ArtistManager Instance
{
get
{
if (_instance == null)
{
_instance = new ArtistManager();
}
return _instance;
}
}
public ArtistManager() public ArtistManager()
{ {
AllArtists = new List<Artist>();
//LoadArtists();
} }
// 筆畫問題
public List<Artist> GetArtistsByCategoryAndStrokeCountRange(string category, int minStrokes, int maxStrokes) public List<Artist> GetArtistsByCategoryAndStrokeCountRange(string category, int minStrokes, int maxStrokes)
{ {
if (category == "全部") if (category == "全部")

View File

@ -7,140 +7,14 @@ namespace DBObj
{ {
public class SongListManager public class SongListManager
{ {
private static SongListManager _instance;
public List<SongData> AllSongs { get; private set; }
public static Dictionary<string, List<SongData>> NewSongLists { get; private set; }
public static Dictionary<string, List<SongData>> HotSongLists { get; private set; }
public List<SongData> FavoriteSongs { get; private set; } public List<SongData> FavoriteSongs { get; private set; }
//public const int SongsPerPage = 9; //public bool IsUserLoggedIn { get; set; }
//public string UserPhoneNumber { get; set; }
public bool IsUserLoggedIn { get; set; }
public string UserPhoneNumber { get; set; }
public SongListManager() public SongListManager()
{ {
AllSongs = new List<SongData>();
NewSongLists = new Dictionary<string, List<SongData>>();
HotSongLists = new Dictionary<string, List<SongData>>();
FavoriteSongs = new List<SongData>(); FavoriteSongs = new List<SongData>();
// 尝试更新数据库,但无论结果如何都继续运行
//TryUpdateDatabase();
// 继续使用可用的数据库(可能是更新后的或原本的本地数据库)
//InitializeDatabase();
//LoadSongs();
//InitializeNewSongLists();
//InitializeHotSongLists();
} }
/* /*
private bool TryUpdateDatabase()
{
try
{
// 1. 检查是否能连接到 SVR01
if (!Directory.Exists(@"\\SVR01\SuperstarB"))
{
Console.WriteLine("未連接到SVR使用本地DB");
return true; // 继续使用本地数据库
}
// 2. 比较本地和服务器文件
string localDbPath = Path.Combine(Application.StartupPath,"db" ,"KSongDatabase.db");
string serverDbPath = @"\\SVR01\SuperstarB\KSongDatabase.db";
if (!File.Exists(localDbPath))
{
Console.WriteLine("本地無db");
}
else
{
FileInfo localFile = new FileInfo(localDbPath);
FileInfo serverFile = new FileInfo(serverDbPath);
if (serverFile.LastWriteTime <= localFile.LastWriteTime)
{
Console.WriteLine("歌單已是最新");
return true;
}
}
// 3. 需要更新时,复制新文件
Process copyProcess = new Process();
copyProcess.StartInfo.FileName = "cmd.exe";
copyProcess.StartInfo.Arguments = "/C copy /Y \\\\SVR01\\SuperstarB\\KSongDatabase.db \\db\\KSongDatabase.db";
copyProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
copyProcess.StartInfo.CreateNoWindow = true;
copyProcess.Start();
copyProcess.WaitForExit();
if (copyProcess.ExitCode == 0)
{
Console.WriteLine("歌單更新成功");
}
else
{
Console.WriteLine("歌單複製失敗,使用本地歌單");
}
return true;
}
catch (Exception ex)
{
Console.WriteLine($"更新歌單失敗:{ex.Message}");
return true; // 出错时继续使用本地数据库
}
}
*/
public static SongListManager Instance
{
get
{
if (_instance == null)
{
_instance = new SongListManager();
}
return _instance;
}
}
public List<SongData> GetSongsByArtist(string artistName)
{
return AllSongs.Where(song => song.ArtistA == artistName || song.ArtistB == artistName).ToList();
}
public void InitializeDatabase()
{
string databaseFileName = "KSongDatabase.db";
string databasePath = Path.Combine(Application.StartupPath, "db", databaseFileName);
string connectionString = String.Format("Data Source={0};Version=3;", databasePath);
using (var connection = new SQLiteConnection(connectionString))
{
try
{
connection.Open();
string createTableSql = @"
CREATE TABLE IF NOT EXISTS FavoriteSongs (
PhoneNumber TEXT NOT NULL,
SongNumber TEXT NOT NULL,
PRIMARY KEY (PhoneNumber, SongNumber)
);";
using (var command = new SQLiteCommand(createTableSql, connection))
{
command.ExecuteNonQuery();
}
connection.Close();
}
catch (Exception ex)
{
Console.WriteLine("Failed to initialize SQLite database: " + ex.Message);
}
}
}
public void AddNewUser(string phoneNumber) public void AddNewUser(string phoneNumber)
{ {
string databaseFileName = "KSongDatabase.db"; string databaseFileName = "KSongDatabase.db";
@ -179,100 +53,31 @@ namespace DBObj
} }
} }
} }
*/
public void AddToFavorite(string songNumber) public List<SongData> SearchNewSongs(){
{ string query= $"SELECT * FROM song_library_cache WHERE language_name = '國語' ORDER BY add_date DESC LIMIT {PrimaryForm.ReadNewSongLimit()}";
if (!IsUserLoggedIn || string.IsNullOrEmpty(UserPhoneNumber)) return PrimaryForm.Instance.SearchSongs_Mysql(query);
{ }
Console.WriteLine("User is not logged in."); public List<SongData> SearchHotSongs(){
return; string query= $"SELECT * FROM song_library_cache WHERE language_name = '國語' ORDER BY add_date DESC LIMIT {PrimaryForm.ReadHotSongLimit()}";
} return PrimaryForm.Instance.SearchSongs_Mysql(query);
string databaseFileName = "KSongDatabase.db";
string databasePath = Path.Combine(Application.StartupPath, "db", databaseFileName);
string connectionString = String.Format("Data Source={0};Version=3;", databasePath);
using (var connection = new SQLiteConnection(connectionString))
{
try
{
connection.Open();
string checkSql = "SELECT COUNT(*) FROM FavoriteSongs WHERE PhoneNumber = @PhoneNumber AND SongNumber = @SongNumber";
using (var checkCommand = new SQLiteCommand(checkSql, connection))
{
checkCommand.Parameters.AddWithValue("@PhoneNumber", UserPhoneNumber);
checkCommand.Parameters.AddWithValue("@SongNumber", songNumber);
long count = (long)checkCommand.ExecuteScalar();
if (count > 0)
{
Console.WriteLine(String.Format("Song {0} is already in favorites.", songNumber));
return;
}
}
string sql = "INSERT INTO FavoriteSongs (PhoneNumber, SongNumber) VALUES (@PhoneNumber, @SongNumber)";
using (var command = new SQLiteCommand(sql, connection))
{
command.Parameters.AddWithValue("@PhoneNumber", UserPhoneNumber);
command.Parameters.AddWithValue("@SongNumber", songNumber);
command.ExecuteNonQuery();
}
connection.Close();
var song = AllSongs.FirstOrDefault(s => s.SongNumber == songNumber);
if (song != null)
{
FavoriteSongs.Add(song);
Console.WriteLine(String.Format("Added song {0} to favorites.", songNumber));
}
else
{
Console.WriteLine(String.Format("Song {0} not found in AllSongs.", songNumber));
}
}
catch (Exception ex)
{
Console.WriteLine("Failed to add song to favorites: " + ex.Message);
}
}
} }
public List<SongData> SearchSongsBySinger(string keyword) public List<SongData> SearchSongsBySinger(string keyword)
{ {
var keywordLower = keyword.ToLower(); var keywordLower = keyword.ToLower();
return AllSongs.Where(song => song.ArtistA.ToLower().Contains(keywordLower) string query = $"SELECT * FROM song_library_cache WHERE artistA ='{keywordLower}' OR artistB='{keywordLower}'";
|| song.ArtistB.ToLower().Contains(keywordLower)) return PrimaryForm.Instance.SearchSongs_Mysql(query);
.ToList();
} }
public List<SongData> SearchSongsByName(string keyword) public List<SongData> SearchSongsByName(string keyword)
{ {
string query = $"SELECT * FROM song_library_cache WHERE LOWER(song_name) LIKE CONCAT('%', LOWER('{keyword}'), '%')";
return PrimaryForm.Instance.SearchSongs_Mysql(query);
var keywordLower = keyword.ToLower(); }
return AllSongs.Where(song => song.Song.ToLower().Contains(keywordLower)).ToList();
}
public SongData SearchSongByNumber(string songNumber) public SongData SearchSongByNumber(string songNumber)
{ {
string query = $"SELECT * FROM song_library_cache WHERE song_id = {songNumber}";
foreach (var song in AllSongs) var searchResults =PrimaryForm.Instance.SearchSongs_Mysql(query);
{ return searchResults.FirstOrDefault();
if (song.SongNumber == songNumber)
{
return song;
}
}
return null;
} }
} }

View File

@ -348,15 +348,14 @@ namespace DualScreenDemo
{ {
string requestBody = await ReadRequestBodyAsync(context.Request); string requestBody = await ReadRequestBodyAsync(context.Request);
var searchRequest = JsonConvert.DeserializeObject<SearchRequest>(requestBody); var searchRequest = JsonConvert.DeserializeObject<SearchRequest>(requestBody);
List<SongData> searchResults; List<SongData> searchResults;
switch (searchRequest.Type) switch (searchRequest.Type)
{ {
case "new-songs": case "new-songs":
searchResults = SongListManager.NewSongLists["國語"]; searchResults = songListManager.SearchNewSongs();
break; break;
case "top-ranking": case "top-ranking":
searchResults = SongListManager.HotSongLists["國語"]; searchResults = songListManager.SearchHotSongs();
break; break;
case "singer": case "singer":
searchResults = songListManager.SearchSongsBySinger(searchRequest.Query); searchResults = songListManager.SearchSongsBySinger(searchRequest.Query);

View File

@ -1095,7 +1095,9 @@ private static void SongDisplayTimer_Elapsed(object sender, EventArgs e)
selectedArtist = currentArtistList[artistIndex]; selectedArtist = currentArtistList[artistIndex];
currentLanguage = selectedArtist.Name; currentLanguage = selectedArtist.Name;
SetUIState(UIState.SelectingSong); SetUIState(UIState.SelectingSong);
LanguageSongList = SongListManager.Instance.GetSongsByArtist(selectedArtist.Name); string query = $"SELECT * FROM song_library_cache WHERE artistA ='{selectedArtist.Name}' OR artistB='{selectedArtist.Name}' ";
LanguageSongList = PrimaryForm.Instance.SearchSongs_Mysql(query);
//LanguageSongList = SongListManager.Instance.GetSongsByArtist(selectedArtist.Name);
currentPage = 1; currentPage = 1;
totalSongs = LanguageSongList.Count; totalSongs = LanguageSongList.Count;
DisplaySongs(currentPage); DisplaySongs(currentPage);
@ -1303,26 +1305,27 @@ public void UpdateHistoryLabel(List<SongData> historySongs, List<PlayState> play
private void ProcessStrokeCountSelection(int number) private void ProcessStrokeCountSelection(int number)
{ {
List<Artist> selectedArtists = null; List<Artist> selectedArtists = null;
var manager =new ArtistManager();
switch (number) switch (number)
{ {
case 1: case 1:
selectedArtists = ArtistManager.Instance.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory ,0, 3); selectedArtists = manager.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory ,0, 3);
strokeRange = "00~03"; strokeRange = "00~03";
break; break;
case 2: case 2:
selectedArtists = ArtistManager.Instance.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 4, 7); selectedArtists = manager.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 4, 7);
strokeRange = "04~07"; strokeRange = "04~07";
break; break;
case 3: case 3:
selectedArtists = ArtistManager.Instance.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 8, 11); selectedArtists = manager.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 8, 11);
strokeRange = "08~11"; strokeRange = "08~11";
break; break;
case 4: case 4:
selectedArtists = ArtistManager.Instance.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 12, 15); selectedArtists = manager.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 12, 15);
strokeRange = "12~15"; strokeRange = "12~15";
break; break;
case 5: case 5:
selectedArtists = ArtistManager.Instance.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 16, int.MaxValue); selectedArtists = manager.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 16, int.MaxValue);
strokeRange = "16以上"; strokeRange = "16以上";
break; break;
default: default:
@ -1437,42 +1440,43 @@ private void DisplayArtists(List<Artist> artists, int page)//歌星點進去後
UpdateDisplayLabels(messages); UpdateDisplayLabels(messages);
} }
private void DisplaySongsInLanguage(string language, Category category) private void DisplaySongsInLanguage(string language, Category category)
{ {
Dictionary<string, List<SongData>> selectedSongList; string sqlQuery;
// 確定類別 if (category == Category.NewSongs)
if (category == Category.NewSongs) {
{ sqlQuery = $"SELECT * FROM song_library_cache WHERE language_name = '{language}' ORDER BY add_date DESC LIMIT {PrimaryForm.ReadNewSongLimit()}";
selectedSongList = SongListManager.NewSongLists; }
} else if (category == Category.HotSongs)
else if (category == Category.HotSongs) {
{ sqlQuery = $"SELECT * FROM song_library_cache WHERE language_name = '{language}' ORDER BY add_date DESC LIMIT {PrimaryForm.ReadHotSongLimit()}";
selectedSongList = SongListManager.HotSongLists; }
} else
else {
{ ClearDisplay();
ClearDisplay(); displayLabel.Text = "無效的類別";
displayLabel.Text = "無效的類別"; return;
return; }
}
if (!selectedSongList.TryGetValue(language, out var songsInLanguage) || songsInLanguage == null || songsInLanguage.Count == 0) var songsInLanguage = PrimaryForm.Instance.SearchSongs_Mysql(sqlQuery);
{
ClearDisplay();
displayLabel.Text = $"{language} - 熱門中未找到歌曲";
LanguageSongList = null;
totalSongs = 0;
currentPage = 0;
return;
}
LanguageSongList = songsInLanguage;
totalSongs = songsInLanguage.Count;
currentPage = 1;
ClearDisplay(); if (songsInLanguage == null || songsInLanguage.Count == 0)
DisplaySongs(currentPage); {
} ClearDisplay();
displayLabel.Text = $"{language} - 熱門中未找到歌曲";
LanguageSongList = null;
totalSongs = 0;
currentPage = 0;
return;
}
LanguageSongList = songsInLanguage;
totalSongs = songsInLanguage.Count;
currentPage = 1;
ClearDisplay();
DisplaySongs(currentPage);
}
public void AddSongToPlaylist(SongData songData) public void AddSongToPlaylist(SongData songData)
{ {
@ -1483,6 +1487,7 @@ private void DisplaySongsInLanguage(string language, Category category)
if (!File.Exists(filePath1) && !File.Exists(filePath2)) if (!File.Exists(filePath1) && !File.Exists(filePath2))
{ {
// 點播失敗時寫LOG至logfile.txt
PrimaryForm.WriteLog(String.Format("File not found on both hosts: {0} and {1}", filePath1, filePath2)); PrimaryForm.WriteLog(String.Format("File not found on both hosts: {0} and {1}", filePath1, filePath2));
} }
else else
@ -1519,7 +1524,7 @@ private void DisplaySongsInLanguage(string language, Category category)
{ {
var filePath1 = songData.SongFilePathHost1; var filePath1 = songData.SongFilePathHost1;
var filePath2 = songData.SongFilePathHost2; var filePath2 = songData.SongFilePathHost2;
if (!File.Exists(filePath1) && !File.Exists(filePath2)) if (!File.Exists(filePath1) && !File.Exists(filePath2))
{ {
PrimaryForm.WriteLog(String.Format("File not found on both hosts: {0} and {1}", filePath1, filePath2)); PrimaryForm.WriteLog(String.Format("File not found on both hosts: {0} and {1}", filePath1, filePath2));
@ -1527,7 +1532,7 @@ private void DisplaySongsInLanguage(string language, Category category)
else else
{ {
var pathToPlay = File.Exists(filePath1) ? filePath1 : filePath2; var pathToPlay = File.Exists(filePath1) ? filePath1 : filePath2;
Console.WriteLine("path to play"+pathToPlay);
bool wasEmpty = PrimaryForm.userRequestedSongs.Count == 0; bool wasEmpty = PrimaryForm.userRequestedSongs.Count == 0;
if (wasEmpty) if (wasEmpty)

View File

@ -118,7 +118,6 @@ namespace DualScreenDemo
private void VodButton_Click(object sender, EventArgs e) private void VodButton_Click(object sender, EventArgs e)
{ {
OverlayForm.MainForm.AddSongToPlaylist(currentSelectedSong); OverlayForm.MainForm.AddSongToPlaylist(currentSelectedSong);
SetVodScreenPictureBoxAndButtonsVisibility(false); SetVodScreenPictureBoxAndButtonsVisibility(false);
} }
@ -167,11 +166,6 @@ namespace DualScreenDemo
} }
private bool IsUserLoggedIn()
{
return SongListManager.Instance.IsUserLoggedIn;
}
private void SetVodScreenPictureBoxAndButtonsVisibility(bool isVisible) private void SetVodScreenPictureBoxAndButtonsVisibility(bool isVisible)
{ {

View File

@ -9,7 +9,7 @@ namespace DualScreenDemo
{ {
// 定义全局变量 // 定义全局变量
internal static SongListManager songListManager; internal static SongListManager songListManager;
internal static ArtistManager artistManager; //internal static ArtistManager artistManager;
internal static SerialPortManager serialPortManager; internal static SerialPortManager serialPortManager;
private static PrimaryForm primaryForm; // 儲存實例的參考 private static PrimaryForm primaryForm; // 儲存實例的參考
@ -27,8 +27,8 @@ static void Main()
} }
// 初始化管理器 // 初始化管理器
songListManager = SongListManager.Instance; // 使用单例 songListManager = new SongListManager(); // 使用单例
artistManager = new ArtistManager(); //artistManager = new ArtistManager();
var commandHandler = new CommandHandler(songListManager); var commandHandler = new CommandHandler(songListManager);
serialPortManager = new SerialPortManager(commandHandler); serialPortManager = new SerialPortManager(commandHandler);