清除大量已點歌曲BUG+優化部分操作UI

This commit is contained in:
jasonchenwork 2025-05-08 10:09:14 +08:00
parent 643df70feb
commit d49a99822e
12 changed files with 319 additions and 150 deletions

View File

@ -566,54 +566,65 @@ namespace DualScreenDemo
private static void DisplaySongHistory()
{
// 清除畫面上現有的顯示內容
ClearDisplay();
// 設定總歌曲數量
// 設定歌曲數為已播放歌曲數量
OverlayForm.MainForm.totalSongs = PrimaryForm.playedSongsHistory.Count;
// 如果播放歷史為空
// 若無任何播放紀錄,直接顯示訊息並返回,不執行後續動作
if (OverlayForm.MainForm.totalSongs == 0)
{
Console.WriteLine("No song history available.");
return;
}
// 計算總頁數
// 計算總頁數,每頁顯示 songsPerPage 首歌,使用天花板函數確保不足一頁也算一頁
int totalPages = (int)Math.Ceiling(OverlayForm.MainForm.totalSongs / (double)OverlayForm.MainForm.songsPerPage);
// 計算當前頁面要顯示的歌的起始與結束索引
int startIndex = (OverlayForm.MainForm.currentPage - 1) * OverlayForm.MainForm.songsPerPage;
int endIndex = Math.Min(startIndex + OverlayForm.MainForm.songsPerPage, OverlayForm.MainForm.totalSongs);
// 準備傳遞給 UpdateHistoryLabel 的數據
// 準備要傳給 UpdateHistoryLabel 的兩個清單:歌曲資料與播放狀態
List<SongData> historySongs = new List<SongData>();
List<PlayState> playStates = new List<PlayState>();
// 從播放紀錄中取出當前頁面應顯示的歌曲與狀態
for (int i = startIndex; i < endIndex; i++)
{
historySongs.Add(PrimaryForm.playedSongsHistory[i]);
playStates.Add(PrimaryForm.playStates[i]);
historySongs.Add(PrimaryForm.playedSongsHistory[i]); // 加入歌曲
playStates.Add(PrimaryForm.playStates[i]); // 加入狀態 (已播、播放中、未播)
}
// 調用 UpdateHistoryLabel 顯示數據
// 安全更新 UI若非 UI 執行緒則使用 Invoke 切換
if (OverlayForm.MainForm.InvokeRequired)
{
OverlayForm.MainForm.Invoke(new System.Action(() =>
{
// 更新主畫面的歷史播放顯示區
OverlayForm.MainForm.UpdateHistoryLabel(historySongs, playStates, OverlayForm.MainForm.currentPage, totalPages);
// 隱藏下一首提示
OverlayForm.MainForm.nextSongLabel.Visible = false;
}));
}
else
{
// 若已在 UI 執行緒,直接操作
OverlayForm.MainForm.UpdateHistoryLabel(historySongs, playStates, OverlayForm.MainForm.currentPage, totalPages);
OverlayForm.MainForm.nextSongLabel.Visible = false;
}
// 設定 UI 狀態
// 切換 UI 狀態為播放歷史模式(可做為內部狀態管理用途)
OverlayForm.SetUIState(OverlayForm.UIState.PlayHistory);
}
private static void PreviousPage()
{
if (OverlayForm.CurrentUIState == OverlayForm.UIState.SelectingSong)

View File

@ -440,29 +440,38 @@ private static void DisplayTimer_Tick(object sender, EventArgs e)
displayTimer.Stop(); // 停止计时器
}
// 當 songDisplayTimer 計時完成時會呼叫此函式
private static void SongDisplayTimer_Elapsed(object sender, EventArgs e)
{
// 檢查是否需要跨執行緒操作 UI 控制項
if (MainForm.InvokeRequired)
{
// 如果目前不在 UI 執行緒上,必須透過 Invoke 安全執行 UI 更新邏輯
Console.WriteLine("SongDisplayTimer_Tick invoked on UI thread.");
MainForm.Invoke(new System.Action(() =>
{
// 清除目前歌曲的顯示標籤文字
MainForm.songDisplayLabel.Text = "";
MainForm.nextSongLabel.Visible = true; // 恢复显示 nextSongLabel
// 顯示下一首歌的標籤
MainForm.nextSongLabel.Visible = true;
}));
}
else
{
// 如果已經在 UI 執行緒,就直接更新 UI 控制項
Console.WriteLine("SongDisplayTimer_Tick invoked on background thread.");
MainForm.songDisplayLabel.Text = "";
MainForm.nextSongLabel.Visible = true; // 恢复显示 nextSongLabel
MainForm.nextSongLabel.Visible = true;
}
// 停止計時器,避免重複觸發
songDisplayTimer.Stop();
}
private readonly object _lockObject = new object();
private async void UnifiedTimer_Elapsed(object sender, EventArgs e)
@ -1199,54 +1208,83 @@ private static void SongDisplayTimer_Elapsed(object sender, EventArgs e)
}
public void UpdateHistoryLabel(List<SongData> historySongs, List<PlayState> playStates, int currentPage, int totalPages)
{
// 移除畫面上所有現有的 PictureBox用於刷新內容
this.Controls.OfType<PictureBox>().ToList().ForEach(p => this.Controls.Remove(p));
// 建立標題文字,例如 "已點歌曲 (1 / 3)"
string headerText = $"已點歌曲 ({currentPage} / {totalPages})";
Font headerFont = new Font("Microsoft JhengHei", 50, FontStyle.Bold);
// 將標題文字轉為圖片
Bitmap headerBitmap = GenerateTextImage(headerText, headerFont, Color.White, Color.Transparent);
// 將標題圖片置中顯示在 Y=150 的位置
AddCenteredPicture(headerBitmap, 150);
// 設定歌名顯示的起始 Y 座標
int startY = 230;
// 歌名之間的垂直間距
int verticalSpacing = 6;
// 左右邊界,用來對齊歌名與狀態文字的位置
int leftMargin = 100;
int rightMargin = this.Width - 100;
// 逐一繪製歷史歌曲列表
for (int i = 0; i < historySongs.Count; i++)
{
var song = historySongs[i];
var state = playStates[i];
string status;
Color textColor;
var song = historySongs[i]; // 歌曲資料
var state = playStates[i]; // 對應的播放狀態
string status; // 播放狀態文字(如「播放中」)
Color textColor; // 對應的顏色
// 根據播放狀態決定狀態文字與顏色
switch (state)
{
case PlayState.Played:
status = "(播畢)";
textColor = Color.FromArgb(200, 75, 125); // RGB: (200, 75, 125)
textColor = Color.FromArgb(200, 75, 125); // 播畢顏色:紫紅色
break;
case PlayState.Playing:
status = "(播放中)";
textColor = Color.LimeGreen;
textColor = Color.LimeGreen; // 播放中顏色:亮綠
break;
case PlayState.NotPlayed:
status = "";
textColor = Color.White;
textColor = Color.White; // 尚未播放:白色
break;
default:
status = "";
textColor = Color.White;
break;
}
// 建立顯示的歌曲文字,例如 "1. 我的歌"
string songText = $"{i + 1}. {song.Song}";
Font songFont = new Font("Microsoft JhengHei", 50, FontStyle.Bold);
// 將歌名轉成圖片
Bitmap songBitmap = GenerateTextImage(songText, songFont, textColor, Color.Transparent);
Bitmap statusBitmap = null;
// 如果有狀態文字,則也轉成圖片
if (!string.IsNullOrEmpty(status))
{
Font statusFont = new Font("Microsoft JhengHei", 50, FontStyle.Bold);
statusBitmap = GenerateTextImage(status, statusFont, textColor, Color.Transparent);
}
// 計算目前這首歌的 Y 座標位置
int y = startY + i * (songBitmap.Height + verticalSpacing);
// 加入歌名圖片到畫面左側
AddPicture(songBitmap, leftMargin, y);
// 若有狀態圖片,則加入到畫面右側
if (statusBitmap != null)
{
int statusX = rightMargin - statusBitmap.Width;
@ -1254,9 +1292,6 @@ public void UpdateHistoryLabel(List<SongData> historySongs, List<PlayState> play
}
}
}
public void UpdateDisplayLabels(string[] messages)//新歌歌星排行首頁
{
// 清除舊的圖片控件
@ -1499,6 +1534,9 @@ private void DisplayArtists(List<Artist> artists, int page)//歌星點進去後
PrimaryForm.userRequestedSongs.Add(songData);
PrimaryForm.playedSongsHistory.Add(songData);
PrimaryForm.playStates.Add(wasEmpty ? PlayState.Playing : PlayState.NotPlayed);
// 刷新頁面
if(PrimaryForm.Instance.multiPagePanel.get_currentSongList() == PrimaryForm.playedSongsHistory)
PrimaryForm.Instance.multiPagePanel.LoadSongs(PrimaryForm.Instance.currentSongList);
if (wasEmpty)
{
@ -1522,51 +1560,65 @@ private void DisplayArtists(List<Artist> artists, int page)//歌星點進去後
{
try
{
// 從 songData 中取得兩個可能的檔案路徑主機1與主機2
var filePath1 = songData.SongFilePathHost1;
var filePath2 = songData.SongFilePathHost2;
// 檢查兩個主機上的檔案是否皆不存在
if (!File.Exists(filePath1) && !File.Exists(filePath2))
{
// 若兩個都找不到,寫入 Log 並不加入歌單
PrimaryForm.WriteLog(String.Format("File not found on both hosts: {0} and {1}", filePath1, filePath2));
}
else
{
// 若其中一個存在,就用第一個存在的那個檔案
var pathToPlay = File.Exists(filePath1) ? filePath1 : filePath2;
Console.WriteLine("path to play" + pathToPlay);
// 檢查目前使用者歌單是否為空
bool wasEmpty = PrimaryForm.userRequestedSongs.Count == 0;
if (wasEmpty)
{
PrimaryForm.userRequestedSongs.Add(songData);
VideoPlayerForm.Instance.SetPlayingSongList(PrimaryForm.userRequestedSongs);
PrimaryForm.playedSongsHistory.Add(songData);
PrimaryForm.playStates.Add(PlayState.Playing);
PrimaryForm.currentSongIndexInHistory += 1;
// 若是空的,代表是第一首歌,直接加入並設為正在播放
PrimaryForm.userRequestedSongs.Add(songData); // 加入播放清單
VideoPlayerForm.Instance.SetPlayingSongList(PrimaryForm.userRequestedSongs); // 傳給播放器
PrimaryForm.playedSongsHistory.Add(songData); // 加入播放歷史
PrimaryForm.playStates.Add(PlayState.Playing); // 設定狀態為正在播放
PrimaryForm.currentSongIndexInHistory += 1; // 歷史索引 +1
}
else if (PrimaryForm.userRequestedSongs.Count == 1)
{
// 若清單中已有一首,插入新歌在 index 1 (即目前播放之後的位置)
PrimaryForm.userRequestedSongs.Insert(1, songData);
PrimaryForm.playedSongsHistory.Insert(PrimaryForm.currentSongIndexInHistory + 1, songData);
PrimaryForm.playStates.Insert(PrimaryForm.currentSongIndexInHistory + 1, PlayState.NotPlayed);
PrimaryForm.playStates.Insert(PrimaryForm.currentSongIndexInHistory + 1, PlayState.NotPlayed); // 尚未播放
}
else
{
// 若清單中超過一首,同樣插入在 index 1也是在當前歌曲之後的位置
PrimaryForm.userRequestedSongs.Insert(1, songData);
PrimaryForm.playedSongsHistory.Insert(PrimaryForm.currentSongIndexInHistory + 1, songData);
PrimaryForm.playStates.Insert(PrimaryForm.currentSongIndexInHistory + 1, PlayState.NotPlayed);
}
// 更新下一首即將播放的資訊(畫面或播放器邏輯用)
VideoPlayerForm.Instance.UpdateNextSongFromPlaylist();
// 印出目前播放清單資訊到畫面或 console
PrimaryForm.PrintPlayingSongList();
}
}
catch (Exception ex)
{
// 捕捉所有例外並印出錯誤訊息(避免整個流程當掉)
Console.WriteLine("Error occurred: " + ex.Message);
}
}
public int currentPage = 1;
public int songsPerPage = 5;
public int totalSongs = 0;

View File

@ -55,7 +55,7 @@ namespace DualScreenDemo
}
}
private void HotPlayButton_Click(object sender, EventArgs e)
public void HotPlayButton_Click(object sender, EventArgs e)
{
UpdateButtonBackgrounds(hotPlayButton, hotPlayActiveBackground);
UpdateHotSongButtons(guoYuButtonHotSong, guoYuHotSongActiveBackground);
@ -147,6 +147,8 @@ namespace DualScreenDemo
if (pictureBoxQRCode != null)
{
pictureBoxQRCode.Visible = false;
}
if(closeQRCodeButton != null){
closeQRCodeButton.Visible = false;
}
}

View File

@ -300,14 +300,19 @@ namespace DualScreenDemo
FavoritePictureBox.Invalidate();
FavoritePictureBox.Refresh();
//SongListManager.Instance.IsUserLoggedIn = false;
//SongListManager.Instance.UserPhoneNumber = string.Empty;
}
private void CloseFavoriteButton_Click(object sender, EventArgs e)
{
mobileNumber = string.Empty;
showError = false;
FavoritePictureBox.Invalidate();
FavoritePictureBox.Refresh();
ToggleFavoritePictureBoxButtonsVisibility();
}

View File

@ -53,6 +53,9 @@ namespace DualScreenDemo
}
}
private List<SongData> currentSongList = new List<SongData>();
public List<SongData> get_currentSongList(){
return currentSongList;
}
private List<Artist> currentArtistList = new List<Artist>();
private int _totalPages = 0;
private Point mouseDownLocation; // 新增字段
@ -182,7 +185,7 @@ namespace DualScreenDemo
public void LoadSingers(List<Artist> artists)
{
currentArtistList = artists;
currentSongList.Clear();
//currentSongList.Clear();
currentPageIndex = 0;
totalPages = (int)Math.Ceiling(artists.Count / (double)itemsPerPage);
RefreshDisplayBase_Singer();
@ -382,14 +385,15 @@ namespace DualScreenDemo
// 若播放公播歌單,代表已點歌曲皆已播放完畢
hasBeenPlayed = true;
songLabel.ForeColor = Color.Gray;
statusText = IsSimplified ? "(播毕)" : "(播畢)";
statusText = IsSimplified ? "(播毕)" : "(播畢播畢)";
}
else
{
// 計算已完成播放的歌曲數量
int completedCount = 0;
int completedCount = currentSongIndexInHistory;
Console.WriteLine("currentSongIndexInHistory:" + currentSongIndexInHistory);
// 遍歷已點歌曲歷史
for (int i = 0; i <= currentSongIndexInHistory && i < playedSongsHistory.Count; i++) {
/*for (int i = 0; i <= currentSongIndexInHistory && i < playedSongsHistory.Count; i++) {
if (i == currentSongIndexInHistory) {
completedCount = i + 1; // 当前播放的歌曲
break;
@ -401,24 +405,23 @@ namespace DualScreenDemo
}
// 如果是切歌状态,不增加计数
}
}
}*/
// 計算歌曲在歷史中的位置
int songPosition = pageOffset + index;
// 判斷歌曲狀態
if (songPosition < completedCount - 1)
if (songPosition < completedCount)
{
// 已播放完成
hasBeenPlayed = true;
songLabel.ForeColor = Color.Gray;
statusText = IsSimplified ? "(播毕)" : "(播畢)";
statusText = IsSimplified ? "(播毕)" : "(播畢播畢)";
}
else if (songPosition == completedCount - 1)
else if (songPosition == completedCount)
{
// 正在播放
isCurrentlyPlaying = true;
songLabel.ForeColor = Color.LimeGreen;
statusText = IsSimplified ? "(播放中)" : "(播放中)";
statusText = IsSimplified ? "(播放中)" : "(播放中播放中)";
}
else
{

View File

@ -163,6 +163,10 @@ namespace DualScreenDemo{
}
return exists;
}
public void logout(){
isLoggedIn=false;
userPhone=string.Empty;
}
private static int countforSearch = 0;
private static void writeLogforSearchTime(long elapsedMs){

View File

@ -118,6 +118,7 @@ namespace DualScreenDemo
private void VodButton_Click(object sender, EventArgs e)
{
OverlayForm.MainForm.AddSongToPlaylist(currentSelectedSong);
SetVodScreenPictureBoxAndButtonsVisibility(false);
}

View File

@ -2011,8 +2011,15 @@ namespace DualScreenDemo
/// <param name="sender"></param>
/// <param name="e"></param>
private void ShouYeButton_Click(object sender, EventArgs e)
{
if(currentSongList == playedSongsHistory)
{ /*Console.WriteLine("playedSongsHistory");
foreach(var song in playedSongsHistory){
Console.WriteLine(song.ToString());
}
Console.WriteLine("userRequestedSongs");
foreach(var song in userRequestedSongs){
Console.WriteLine(song.ToString());
}*/
if( multiPagePanel.get_currentSongList() == playedSongsHistory)
return;
autoRefreshTimer.Stop(); // 停止自动刷新
FindFirstNonEmptyText(inputBoxZhuYinSingers

View File

@ -35,8 +35,18 @@ namespace DualScreenDemo
promotionsButton.BackgroundImage = promotionsNormalBackground;
deliciousFoodButton.BackgroundImage = deliciousFoodNormalBackground;
isOnOrderedSongsPage = false;
/* 清空搜尋欄 */
ResetinputBox();
string query = $"SELECT * FROM artists WHERE category = '男' LIMIT 100";
var searchResult = SearchSingers_Mysql(query);
currentPage = 0;
currentArtistList = searchResult;
totalPages = (int)Math.Ceiling((double)searchResult.Count / itemsPerPage);
multiPagePanel.currentPageIndex = 0;
multiPagePanel.LoadSingers(currentArtistList);
SetHotSongButtonsVisibility(false);
SetNewSongButtonsVisibility(false);
SetSongSearchButtonsVisibility(false);

View File

@ -48,6 +48,17 @@ namespace DualScreenDemo
deliciousFoodButton.BackgroundImage = deliciousFoodNormalBackground;
isOnOrderedSongsPage = false;
ResetinputBox();
string query = $"SELECT * FROM song_library_cache WHERE language_name = '國語' LIMIT 100";
var searchResult = SearchSongs_Mysql(query);
currentPage = 0;
currentSongList = searchResult;
totalPages = (int)Math.Ceiling((double)searchResult.Count / itemsPerPage);
multiPagePanel.currentPageIndex = 0;
multiPagePanel.LoadSongs(currentSongList);
// 隱藏其他 UI
SetHotSongButtonsVisibility(false);
SetNewSongButtonsVisibility(false);

View File

@ -4,6 +4,7 @@ using System.Text;
using System.Text.RegularExpressions;
using System.IO; // 為 Path 和 File 提供支持
using DBObj;
using System.Diagnostics;
using OverlayFormObj;
namespace DualScreenDemo
{
@ -169,8 +170,9 @@ namespace DualScreenDemo
}
VideoPlayerForm.Instance.PlayNextSong();
PrimaryForm.Instance.logout();
Console.WriteLine("已設置新的播放列表,包含當前歌曲和 CLOSE.MPG");
}
else
{
@ -181,6 +183,7 @@ namespace DualScreenDemo
});
UpdateStateFile(stateFilePath, "CLOSE");
continue;
}
@ -190,10 +193,13 @@ namespace DualScreenDemo
{
PrimaryForm.Instance.HideSendOffScreen();
});
// 開台時跳至首頁
PrimaryForm.Instance.HotPlayButton_Click(null, EventArgs.Empty);
VideoPlayerForm.publicPlaylist = new List<SongData>();
VideoPlayerForm.playingSongList = new List<SongData>();
VideoPlayerForm.Instance.PlayPublicPlaylist();
UpdateStateFile(stateFilePath, "OPEN");
continue;
}
}

View File

@ -517,24 +517,38 @@ namespace DualScreenDemo
public async Task SetPlayingSongList(List<SongData> songList)
{
// [1] 輸出 debug 訊息,方便開發時追蹤是否有呼叫此方法
Console.WriteLine("SetPlayingSongList called");
// [2] 停止當前播放,釋放資源(例如關閉影片播放器、清除緩衝)
StopAndReleaseResources();
// [3] 將新的播放清單指派給 `playingSongList`
playingSongList = songList;
isUserPlaylistPlaying = playingSongList != null && playingSongList.Any();
IsPlayingPublicSong = false; // 设置为不在播放公播
// [4] 根據是否有歌,設定旗標為是否播放使用者點播清單
isUserPlaylistPlaying = playingSongList != null && playingSongList.Any();
// [5] 強制關閉公播狀態(意即現在進入點歌模式)
IsPlayingPublicSong = false;
// [6] 若使用者點播清單有歌,就開始播放
if (isUserPlaylistPlaying)
{
// [6.1] 設定當前歌曲索引為 -1意味著即將播放第一首從 `PlayNextSong` 開始)
currentSongIndex = -1;
// [6.2] 播放下一首歌(實際會遞增 index 為 0並播放該首歌
await PlayNextSong();
}
else
{
// [7] 如果清單為空,回退播放預設的公播清單(通常是背景播放用)
await InitializeAndPlayPublicPlaylist();
}
}
public async Task PlayPublicPlaylist()
{
Console.WriteLine("開始播放公播清單...");
@ -686,43 +700,63 @@ namespace DualScreenDemo
public async Task PlayNextSong()
{
// 等待初始化完成(例如播放器、串口等資源尚未就緒時)
while (!isInitializationComplete)
{
await Task.Delay(100);
}
Console.WriteLine("開始播放下一首歌曲...");
// 根據目前播放模式(點歌 or 公播)決定要播放的清單
List<SongData> currentPlaylist = isUserPlaylistPlaying ? playingSongList : publicPlaylist;
// 若播放清單是空的,直接返回(不執行播放)
if (!currentPlaylist.Any()) return;
if (!isUserPlaylistPlaying)
{
// 公播模式下,正常循環播放(用 % 保證不會超出陣列界限)
currentSongIndex = (currentSongIndex + 1) % currentPlaylist.Count;
Console.WriteLine($"順序播放: currentSongIndex = {currentSongIndex}, currentPlaylist.Count = {currentPlaylist.Count}");
}
else
{
// 若是使用者點播模式先送出升Key的串口指令
if (SerialPortManager.mySerialPort != null && SerialPortManager.mySerialPort.IsOpen)
{
byte[] commandBytesIncreasePitch1 = new byte[] { 0xA2, 0x7F, 0xA4 };
SerialPortManager.mySerialPort.Write(commandBytesIncreasePitch1, 0, commandBytesIncreasePitch1.Length);
}
// 同樣遞增 index 來播放下一首
currentSongIndex = (currentSongIndex + 1) % currentPlaylist.Count;
}
var songToPlay = currentPlaylist[currentSongIndex];
var pathToPlay = File.Exists(songToPlay.SongFilePathHost1) ? songToPlay.SongFilePathHost1 : songToPlay.SongFilePathHost2;
// 若兩個 host 上都找不到檔案就直接結束
if (!File.Exists(pathToPlay))
{
Console.WriteLine($"文件不存在:{pathToPlay}");
return;
}
// 更新目前正在播放的歌曲
currentPlayingSong = songToPlay;
// 更新畫面上顯示的下一首歌資訊
UpdateNextSongFromPlaylist();
// 顯示 QRCode可能是點歌頁用
overlayForm.DisplayQRCodeOnOverlay(HttpServer.randomFolderPath);
// 隱藏「暫停中」標籤
overlayForm.HidePauseLabel();
try
{
// 確保在UI線程上執行COM對象操作
@ -813,54 +847,77 @@ namespace DualScreenDemo
}
}
/// <summary>
/// 跳至下一首歌曲的方法,會根據目前播放清單(使用者清單或公播清單)做切換與播放邏輯控制。
/// </summary>
public async Task SkipToNextSong()
{
try
{
// 停止當前播放並釋放資源(如播放器、影片檔等)
StopAndReleaseResources();
// 稍作延遲,確保資源已被釋放
await Task.Delay(100);
// 如果目前正在播放使用者點播清單,且清單還有歌曲
if (isUserPlaylistPlaying && playingSongList != null && playingSongList.Count > 0)
{
// 还有用户歌曲要播放
// 移除目前播放的第一首歌(已經播放過的)
playingSongList.RemoveAt(0);
if (playingSongList.Count == 0)
{
// 用户歌单播完,切换到公播
// 使用者點播清單播完了,切換回公播清單
Console.WriteLine("用戶播放列表已清空,切換至公播清單");
isUserPlaylistPlaying = false;
lastPlayedIndex = -1;
currentSongIndex = -1;
// 初始化並開始播放公播清單
await InitializeAndPlayPublicPlaylist();
}
else
{
// 继续播放用户歌单
// 還有歌曲可播,繼續播放下一首使用者歌曲
currentSongIndex = -1;
await PlayNextSong();
}
}
else
{
// 当前是公播状态,重新初始化公播列表
// 如果不是在播放使用者清單(或清單為空),直接初始化並播放公播清單
await InitializeAndPlayPublicPlaylist();
}
if (PrimaryForm.currentSongIndexInHistory >= 0 && PrimaryForm.currentSongIndexInHistory < PrimaryForm.playedSongsHistory.Count) {
// 如果目前歌曲在播放歷史列表的索引是合法的(防呆)
if (PrimaryForm.currentSongIndexInHistory >= 0 && PrimaryForm.currentSongIndexInHistory < PrimaryForm.playedSongsHistory.Count)
{
var currentSong = PrimaryForm.playedSongsHistory[PrimaryForm.currentSongIndexInHistory];
if (playingSongList.Count > 0 && currentSong == playingSongList[0]) {
// 如果新的播放清單還有歌曲,並且當前歷史記錄中的歌曲與播放清單的第一首一致,則標記為已播畢
if (playingSongList.Count > 0 && currentSong == playingSongList[0])
{
PrimaryForm.playStates[PrimaryForm.currentSongIndexInHistory] = PlayState.Played;
}
}
/*如果當前為公播,不可以+1*/
bool isPlayingPublicList = PrimaryForm.userRequestedSongs.Count == 0 ||
(PrimaryForm.currentSongIndexInHistory >= PrimaryForm.userRequestedSongs.Count - 1 && PrimaryForm.Instance.videoPlayerForm.IsPlayingPublicSong);
if(!isPlayingPublicList){
PrimaryForm.currentSongIndexInHistory+=1;
}
Console.WriteLine("currentSongIndexInHistory : " + PrimaryForm.currentSongIndexInHistory);
}
catch (Exception ex)
{
// 若有例外錯誤,列印錯誤訊息並切回公播模式
Console.WriteLine($"切換歌曲時發生錯誤: {ex.Message}");
await InitializeAndPlayPublicPlaylist();
}
}
// 新增一个方法来处理公播列表的初始化和播放
private async Task InitializeAndPlayPublicPlaylist()
{