From 924d6229e7f83e9556eb35f02c13f9c7077c0560 Mon Sep 17 00:00:00 2001 From: jasonchenwork Date: Wed, 23 Apr 2025 11:46:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=94=E9=99=A4allartist=E5=92=8Callsongs?= =?UTF-8?q?=EF=BC=8C=E6=B8=85=E7=90=86=E4=B8=8D=E5=BF=85=E8=A6=81=E5=87=BD?= =?UTF-8?q?=E6=95=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DBObj/ArtistManager.cs | 19 +- DBObj/SongListManager.cs | 231 ++-------------------- HttpServer.cs | 5 +- OverlayFormObj/OverlayForm.cs | 87 ++++---- PrimaryFormParts/PrimaryForm.VodScreen.cs | 6 - Program.cs | 6 +- 6 files changed, 70 insertions(+), 284 deletions(-) diff --git a/DBObj/ArtistManager.cs b/DBObj/ArtistManager.cs index 89555d6..601bd0a 100644 --- a/DBObj/ArtistManager.cs +++ b/DBObj/ArtistManager.cs @@ -8,28 +8,11 @@ namespace DBObj */ public class ArtistManager { - private static ArtistManager _instance; - public List AllArtists { get; private set; } - - public static ArtistManager Instance - { - get - { - if (_instance == null) - { - _instance = new ArtistManager(); - } - return _instance; - } - } - public ArtistManager() { - AllArtists = new List(); - //LoadArtists(); } - + // 筆畫問題 public List GetArtistsByCategoryAndStrokeCountRange(string category, int minStrokes, int maxStrokes) { if (category == "全部") diff --git a/DBObj/SongListManager.cs b/DBObj/SongListManager.cs index 546f2a7..2d5ed8b 100644 --- a/DBObj/SongListManager.cs +++ b/DBObj/SongListManager.cs @@ -7,140 +7,14 @@ namespace DBObj { public class SongListManager { - private static SongListManager _instance; - public List AllSongs { get; private set; } - public static Dictionary> NewSongLists { get; private set; } - public static Dictionary> HotSongLists { get; private set; } public List 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() { - AllSongs = new List(); - NewSongLists = new Dictionary>(); - HotSongLists = new Dictionary>(); FavoriteSongs = new List(); - - // 尝试更新数据库,但无论结果如何都继续运行 - //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 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) { string databaseFileName = "KSongDatabase.db"; @@ -179,100 +53,31 @@ namespace DBObj } } } - - public void AddToFavorite(string songNumber) - { - if (!IsUserLoggedIn || string.IsNullOrEmpty(UserPhoneNumber)) - { - Console.WriteLine("User is not logged in."); - return; - } - - 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 SearchNewSongs(){ + string query= $"SELECT * FROM song_library_cache WHERE language_name = '國語' ORDER BY add_date DESC LIMIT {PrimaryForm.ReadNewSongLimit()}"; + return PrimaryForm.Instance.SearchSongs_Mysql(query); + } + public List SearchHotSongs(){ + string query= $"SELECT * FROM song_library_cache WHERE language_name = '國語' ORDER BY add_date DESC LIMIT {PrimaryForm.ReadHotSongLimit()}"; + return PrimaryForm.Instance.SearchSongs_Mysql(query); } - public List SearchSongsBySinger(string keyword) { - - var keywordLower = keyword.ToLower(); - return AllSongs.Where(song => song.ArtistA.ToLower().Contains(keywordLower) - || song.ArtistB.ToLower().Contains(keywordLower)) - .ToList(); + string query = $"SELECT * FROM song_library_cache WHERE artistA ='{keywordLower}' OR artistB='{keywordLower}'"; + return PrimaryForm.Instance.SearchSongs_Mysql(query); } - public List SearchSongsByName(string keyword) { - - - var keywordLower = keyword.ToLower(); - return AllSongs.Where(song => song.Song.ToLower().Contains(keywordLower)).ToList(); - } - - + string query = $"SELECT * FROM song_library_cache WHERE LOWER(song_name) LIKE CONCAT('%', LOWER('{keyword}'), '%')"; + return PrimaryForm.Instance.SearchSongs_Mysql(query); + } public SongData SearchSongByNumber(string songNumber) { - - foreach (var song in AllSongs) - { - if (song.SongNumber == songNumber) - { - return song; - } - } - return null; + string query = $"SELECT * FROM song_library_cache WHERE song_id = {songNumber}"; + var searchResults =PrimaryForm.Instance.SearchSongs_Mysql(query); + return searchResults.FirstOrDefault(); } } diff --git a/HttpServer.cs b/HttpServer.cs index 79ad3e1..a4bc583 100644 --- a/HttpServer.cs +++ b/HttpServer.cs @@ -348,15 +348,14 @@ namespace DualScreenDemo { string requestBody = await ReadRequestBodyAsync(context.Request); var searchRequest = JsonConvert.DeserializeObject(requestBody); - List searchResults; switch (searchRequest.Type) { case "new-songs": - searchResults = SongListManager.NewSongLists["國語"]; + searchResults = songListManager.SearchNewSongs(); break; case "top-ranking": - searchResults = SongListManager.HotSongLists["國語"]; + searchResults = songListManager.SearchHotSongs(); break; case "singer": searchResults = songListManager.SearchSongsBySinger(searchRequest.Query); diff --git a/OverlayFormObj/OverlayForm.cs b/OverlayFormObj/OverlayForm.cs index 3bcdbef..293f0df 100644 --- a/OverlayFormObj/OverlayForm.cs +++ b/OverlayFormObj/OverlayForm.cs @@ -1095,7 +1095,9 @@ private static void SongDisplayTimer_Elapsed(object sender, EventArgs e) selectedArtist = currentArtistList[artistIndex]; currentLanguage = selectedArtist.Name; 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; totalSongs = LanguageSongList.Count; DisplaySongs(currentPage); @@ -1303,26 +1305,27 @@ public void UpdateHistoryLabel(List historySongs, List play private void ProcessStrokeCountSelection(int number) { List selectedArtists = null; + var manager =new ArtistManager(); switch (number) { case 1: - selectedArtists = ArtistManager.Instance.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory ,0, 3); + selectedArtists = manager.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory ,0, 3); strokeRange = "00~03"; break; case 2: - selectedArtists = ArtistManager.Instance.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 4, 7); + selectedArtists = manager.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 4, 7); strokeRange = "04~07"; break; case 3: - selectedArtists = ArtistManager.Instance.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 8, 11); + selectedArtists = manager.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 8, 11); strokeRange = "08~11"; break; case 4: - selectedArtists = ArtistManager.Instance.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 12, 15); + selectedArtists = manager.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 12, 15); strokeRange = "12~15"; break; case 5: - selectedArtists = ArtistManager.Instance.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 16, int.MaxValue); + selectedArtists = manager.GetArtistsByCategoryAndStrokeCountRange(currentArtistCategory, 16, int.MaxValue); strokeRange = "16以上"; break; default: @@ -1437,42 +1440,43 @@ private void DisplayArtists(List artists, int page)//歌星點進去後 UpdateDisplayLabels(messages); } -private void DisplaySongsInLanguage(string language, Category category) -{ - Dictionary> selectedSongList; + private void DisplaySongsInLanguage(string language, Category category) + { + string sqlQuery; - // 確定類別 - if (category == Category.NewSongs) - { - selectedSongList = SongListManager.NewSongLists; - } - else if (category == Category.HotSongs) - { - selectedSongList = SongListManager.HotSongLists; - } - else - { - ClearDisplay(); - displayLabel.Text = "無效的類別"; - return; - } + if (category == Category.NewSongs) + { + sqlQuery = $"SELECT * FROM song_library_cache WHERE language_name = '{language}' ORDER BY add_date DESC LIMIT {PrimaryForm.ReadNewSongLimit()}"; + } + else if (category == Category.HotSongs) + { + sqlQuery = $"SELECT * FROM song_library_cache WHERE language_name = '{language}' ORDER BY add_date DESC LIMIT {PrimaryForm.ReadHotSongLimit()}"; + } + else + { + ClearDisplay(); + displayLabel.Text = "無效的類別"; + return; + } - if (!selectedSongList.TryGetValue(language, out var songsInLanguage) || songsInLanguage == null || songsInLanguage.Count == 0) - { - ClearDisplay(); - displayLabel.Text = $"{language} - 熱門中未找到歌曲"; - LanguageSongList = null; - totalSongs = 0; - currentPage = 0; - return; - } - LanguageSongList = songsInLanguage; - totalSongs = songsInLanguage.Count; - currentPage = 1; + var songsInLanguage = PrimaryForm.Instance.SearchSongs_Mysql(sqlQuery); - ClearDisplay(); - DisplaySongs(currentPage); -} + if (songsInLanguage == null || songsInLanguage.Count == 0) + { + 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) { @@ -1483,6 +1487,7 @@ private void DisplaySongsInLanguage(string language, Category category) 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)); } else @@ -1519,7 +1524,7 @@ private void DisplaySongsInLanguage(string language, Category category) { var filePath1 = songData.SongFilePathHost1; var filePath2 = songData.SongFilePathHost2; - + if (!File.Exists(filePath1) && !File.Exists(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 { var pathToPlay = File.Exists(filePath1) ? filePath1 : filePath2; - + Console.WriteLine("path to play"+pathToPlay); bool wasEmpty = PrimaryForm.userRequestedSongs.Count == 0; if (wasEmpty) diff --git a/PrimaryFormParts/PrimaryForm.VodScreen.cs b/PrimaryFormParts/PrimaryForm.VodScreen.cs index f1b9c9e..3000ad0 100644 --- a/PrimaryFormParts/PrimaryForm.VodScreen.cs +++ b/PrimaryFormParts/PrimaryForm.VodScreen.cs @@ -118,7 +118,6 @@ namespace DualScreenDemo private void VodButton_Click(object sender, EventArgs e) { - OverlayForm.MainForm.AddSongToPlaylist(currentSelectedSong); SetVodScreenPictureBoxAndButtonsVisibility(false); } @@ -167,11 +166,6 @@ namespace DualScreenDemo } - private bool IsUserLoggedIn() - { - - return SongListManager.Instance.IsUserLoggedIn; - } private void SetVodScreenPictureBoxAndButtonsVisibility(bool isVisible) { diff --git a/Program.cs b/Program.cs index cf1a596..c4712d3 100644 --- a/Program.cs +++ b/Program.cs @@ -9,7 +9,7 @@ namespace DualScreenDemo { // 定义全局变量 internal static SongListManager songListManager; - internal static ArtistManager artistManager; + //internal static ArtistManager artistManager; internal static SerialPortManager serialPortManager; private static PrimaryForm primaryForm; // 儲存實例的參考 @@ -27,8 +27,8 @@ static void Main() } // 初始化管理器 - songListManager = SongListManager.Instance; // 使用单例 - artistManager = new ArtistManager(); + songListManager = new SongListManager(); // 使用单例 + //artistManager = new ArtistManager(); var commandHandler = new CommandHandler(songListManager); serialPortManager = new SerialPortManager(commandHandler);