superstar_v2/DBObj/SongListManager.cs

279 lines
10 KiB
C#
Raw Normal View History

2025-04-07 16:54:10 +08:00
using System.Data.SQLite;
using System.IO;
using System.Globalization;
using System.Diagnostics;
using DualScreenDemo;
namespace DBObj
{
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; }
2025-04-22 15:25:58 +08:00
//public const int SongsPerPage = 9;
2025-04-07 16:54:10 +08:00
public bool IsUserLoggedIn { get; set; }
public string UserPhoneNumber { get; set; }
public SongListManager()
{
AllSongs = new List<SongData>();
NewSongLists = new Dictionary<string, List<SongData>>();
HotSongLists = new Dictionary<string, List<SongData>>();
FavoriteSongs = new List<SongData>();
// 尝试更新数据库,但无论结果如何都继续运行
2025-04-22 15:25:58 +08:00
//TryUpdateDatabase();
2025-04-07 16:54:10 +08:00
// 继续使用可用的数据库(可能是更新后的或原本的本地数据库)
2025-04-22 15:25:58 +08:00
//InitializeDatabase();
2025-04-14 16:54:40 +08:00
//LoadSongs();
2025-04-22 15:25:58 +08:00
//InitializeNewSongLists();
//InitializeHotSongLists();
2025-04-07 16:54:10 +08:00
}
2025-04-22 15:25:58 +08:00
/*
private bool TryUpdateDatabase()
2025-04-07 16:54:10 +08:00
{
2025-04-22 15:25:58 +08:00
try
2025-04-07 16:54:10 +08:00
{
2025-04-22 15:25:58 +08:00
// 1. 检查是否能连接到 SVR01
if (!Directory.Exists(@"\\SVR01\SuperstarB"))
{
Console.WriteLine("未連接到SVR使用本地DB");
return true; // 继续使用本地数据库
}
2025-04-07 16:54:10 +08:00
2025-04-22 15:25:58 +08:00
// 2. 比较本地和服务器文件
string localDbPath = Path.Combine(Application.StartupPath,"db" ,"KSongDatabase.db");
string serverDbPath = @"\\SVR01\SuperstarB\KSongDatabase.db";
2025-04-07 16:54:10 +08:00
2025-04-22 15:25:58 +08:00
if (!File.Exists(localDbPath))
2025-04-07 16:54:10 +08:00
{
2025-04-22 15:25:58 +08:00
Console.WriteLine("本地無db");
2025-04-07 16:54:10 +08:00
}
2025-04-22 15:25:58 +08:00
else
{
FileInfo localFile = new FileInfo(localDbPath);
FileInfo serverFile = new FileInfo(serverDbPath);
2025-04-07 16:54:10 +08:00
2025-04-22 15:25:58 +08:00
if (serverFile.LastWriteTime <= localFile.LastWriteTime)
{
Console.WriteLine("歌單已是最新");
return true;
}
}
2025-04-07 16:54:10 +08:00
2025-04-22 15:25:58 +08:00
// 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;
2025-04-07 16:54:10 +08:00
}
2025-04-22 15:25:58 +08:00
catch (Exception ex)
2025-04-07 16:54:10 +08:00
{
2025-04-22 15:25:58 +08:00
Console.WriteLine($"更新歌單失敗:{ex.Message}");
return true; // 出错时继续使用本地数据库
2025-04-07 16:54:10 +08:00
}
}
2025-04-22 15:25:58 +08:00
*/
2025-04-07 16:54:10 +08:00
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";
2025-04-10 11:54:12 +08:00
string databasePath = Path.Combine(Application.StartupPath, "db", databaseFileName);
2025-04-07 16:54:10 +08:00
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";
2025-04-10 11:54:12 +08:00
string databasePath = Path.Combine(Application.StartupPath, "db", databaseFileName);
2025-04-07 16:54:10 +08:00
string connectionString = String.Format("Data Source={0};Version=3;", databasePath);
using (var connection = new SQLiteConnection(connectionString))
{
try
{
connection.Open();
string checkTableSql = "SELECT name FROM sqlite_master WHERE type='table' AND name='FavoriteSongs';";
using (var checkCommand = new SQLiteCommand(checkTableSql, connection))
{
var result = checkCommand.ExecuteScalar();
if (result == null)
{
throw new Exception("Table 'FavoriteSongs' does not exist.");
}
}
string sql = "INSERT INTO FavoriteSongs (PhoneNumber, SongNumber) VALUES (@PhoneNumber, @SongNumber)";
using (var command = new SQLiteCommand(sql, connection))
{
command.Parameters.AddWithValue("@PhoneNumber", phoneNumber);
command.Parameters.AddWithValue("@SongNumber", "000000");
command.ExecuteNonQuery();
}
connection.Close();
}
catch (Exception ex)
{
Console.WriteLine("Failed to add new user to SQLite database: " + ex.Message);
}
}
}
2025-04-21 11:33:31 +08:00
2025-04-07 16:54:10 +08:00
public void AddToFavorite(string songNumber)
{
if (!IsUserLoggedIn || string.IsNullOrEmpty(UserPhoneNumber))
{
Console.WriteLine("User is not logged in.");
return;
}
string databaseFileName = "KSongDatabase.db";
2025-04-10 11:54:12 +08:00
string databasePath = Path.Combine(Application.StartupPath, "db", databaseFileName);
2025-04-07 16:54:10 +08:00
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)
{
var keywordLower = keyword.ToLower();
return AllSongs.Where(song => song.ArtistA.ToLower().Contains(keywordLower)
|| song.ArtistB.ToLower().Contains(keywordLower))
.ToList();
}
public List<SongData> SearchSongsByName(string keyword)
{
var keywordLower = keyword.ToLower();
return AllSongs.Where(song => song.Song.ToLower().Contains(keywordLower)).ToList();
}
public SongData SearchSongByNumber(string songNumber)
{
foreach (var song in AllSongs)
{
if (song.SongNumber == songNumber)
{
return song;
}
}
return null;
}
}
}