2024-07-04 16:32:27 +08:00
using cfg.ActorCfg ;
2024-07-05 18:25:44 +08:00
using cfg.AudioCfg ;
using Cysharp.Threading.Tasks ;
2024-07-04 16:32:27 +08:00
using Framework ;
using PhxhSDK ;
using System.Collections.Generic ;
using System.Linq ;
public class AlbumManager : Singlenton < AlbumManager >
{
public enum PlayMode
{
Order ,
Random ,
Single
}
PlayMode curPlayMode = PlayMode . Order ;
public PlayMode CurPlayMode = > curPlayMode ;
List < int > playOrderList = new ( ) ;
private int curOrderIndex = 0 ;
bool initialized = false ;
public string curMusicKey ;
Dictionary < int , DataAlbum > albumDic = new Dictionary < int , DataAlbum > ( ) ;
List < DataAlbum > albumList = new List < DataAlbum > ( ) ;
public readonly bool loadFromLocal = true ;
AlbumLocalData _saveData ;
public Timer playTimer = new ( ) ;
void loadOrInit ( )
{
if ( ! initialized )
{
Init ( ) ;
initialized = true ;
2024-07-05 18:25:44 +08:00
playTimer . onPlayEnd + = NextAudio ;
2024-07-04 16:32:27 +08:00
}
}
public void Init ( )
{
albumDic . Clear ( ) ;
var albumCfg = TableManager . Instance . Tables . AlbumConfig ;
foreach ( var item in albumCfg . DataList )
{
albumDic . Add ( item . Id , item ) ;
albumList . Add ( item ) ;
}
if ( loadFromLocal )
{
_saveData = StorageMgr . Instance . GetStorage < AlbumLocalData > ( "ALBUM_LOCAL_DATA" ) ;
if ( _saveData = = null )
{
_saveData = new AlbumLocalData ( ) ;
}
2024-07-09 16:56:40 +08:00
2024-07-09 17:01:15 +08:00
//if (AlbumUnlocked(_saveData.curAlbumId))//<2F> 籣<EFBFBD> <E7B1A3> <EFBFBD> <EFBFBD> ר<EFBFBD> <D7A8> δ<EFBFBD> <CEB4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ĭ<EFBFBD> ϲ <EFBFBD> <CFB2> ŵ<EFBFBD> һ <EFBFBD> <D2BB> ר<EFBFBD> <D7A8>
//{
// _saveData.curAlbumId = 1;
// _saveData.curPlayAudioIndex = 0;
//}
//if (_saveData.themeAlbumID != 0 && AlbumUnlocked(_saveData.themeAlbumID))//<2F> 籣<EFBFBD> <E7B1A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ר<EFBFBD> <D7A8> δ<EFBFBD> <CEB4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> <CEAA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ר<EFBFBD> <D7A8>
//{
// _saveData.themeAlbumID = 0;
//}
2024-07-04 16:32:27 +08:00
curPlayMode = ( PlayMode ) _saveData . curOrderMode ;
SetPlayMode ( curPlayMode ) ;
2024-07-05 18:25:44 +08:00
SetPlayList ( ) ;
2024-07-04 16:32:27 +08:00
var curAudio = CurPlayAudio ( ) ;
if ( curAudio ! = null )
{
curMusicKey = curAudio . Key ;
}
else
{
DebugUtil . LogError ( "CurAudio is null" ) ;
}
}
else
{
//TODO <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
}
public void Release ( )
{
albumDic . Clear ( ) ;
albumList . Clear ( ) ;
}
public Dictionary < int , DataAlbum > AlbumsDic = > albumDic ;
public List < DataAlbum > AlbumsLst = > albumList ;
public bool AlbumUnlocked ( int albumId )
{
loadOrInit ( ) ;
if ( albumDic . ContainsKey ( albumId ) )
{
if ( albumDic [ albumId ] . DefaultUnlock ) //Ĭ<> Ͻ<EFBFBD> <CFBD> <EFBFBD> ר<EFBFBD> <D7A8>
{
return true ;
}
else
{
int itemID = albumDic [ albumId ] . ItemID ;
if ( CategoryManager . Instance . GetItemCount ( itemID ) > 0 )
{
return true ;
}
else
{
return false ;
}
}
}
else
{
//int ItemID=
DebugUtil . LogError ( albumId + " not found in album config" ) ;
return false ;
}
}
2024-07-05 18:25:44 +08:00
public List < cfg . item . ItemCounts > AlbumUnlockCost ( int albumId )
{
if ( albumDic . ContainsKey ( albumId ) )
{
return albumDic [ albumId ] . CostItems ;
}
else
{
DebugUtil . LogError ( albumId + " not found in album config" ) ;
return null ;
}
}
2024-07-09 15:25:28 +08:00
/// <summary>
/// <20> <> ǰר<C7B0> <D7A8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/// </summary>
/// <returns></returns>
2024-07-04 16:32:27 +08:00
public DataAlbum GetCurAlbum ( )
{
loadOrInit ( ) ;
if ( loadFromLocal )
{
2024-07-09 15:25:28 +08:00
loadSaveData ( ) ;
//if (_saveData == null)
//{
// _saveData = StorageMgr.Instance.GetStorage<AlbumLocalData>("ALBUM_LOCAL_DATA");
// if (_saveData != null && _saveData.curAlbumId > 0)
// {
// if (AlbumUnlocked(_saveData.curAlbumId))//<2F> 籣<EFBFBD> <E7B1A3> <EFBFBD> <EFBFBD> ר<EFBFBD> <D7A8> δ<EFBFBD> <CEB4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ĭ<EFBFBD> ϲ <EFBFBD> <CFB2> ŵ<EFBFBD> һ <EFBFBD> <D2BB> ר<EFBFBD> <D7A8>
// {
// SetCurAlbum(1, 0);
// }
// return albumDic[_saveData.curAlbumId];
// }
// else
// {
// return albumList[0];
// }
//}
//else
//{
2024-07-04 16:32:27 +08:00
return albumDic [ _saveData . curAlbumId ] ;
2024-07-09 15:25:28 +08:00
//}
2024-07-04 16:32:27 +08:00
}
else
{
DebugUtil . Log ( "<22> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ȡ" ) ;
return null ;
//TODO <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
}
}
2024-07-09 15:25:28 +08:00
/// <summary>
/// <20> <> ȡ<EFBFBD> <C8A1> ǰ<EFBFBD> <C7B0> <EFBFBD> ŵ<EFBFBD> <C5B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ר<EFBFBD> <D7A8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
/// </summary>
/// <returns></returns>
2024-07-04 16:32:27 +08:00
public int GetCurAudioIndex ( )
{
loadOrInit ( ) ;
2024-07-09 15:25:28 +08:00
loadSaveData ( ) ;
2024-07-04 16:32:27 +08:00
return _saveData . curPlayAudioIndex ;
}
2024-07-09 15:25:28 +08:00
/// <summary>
/// <20> <> <EFBFBD> õ<EFBFBD> ǰ<EFBFBD> <C7B0> <EFBFBD> ŵ<EFBFBD> ר<EFBFBD> <D7A8>
/// </summary>
/// <param name="albumId"></param>
/// <param name="audioIndex"></param>
2024-07-04 16:32:27 +08:00
public void SetCurAlbum ( int albumId , int audioIndex )
{
loadOrInit ( ) ;
if ( albumDic . ContainsKey ( albumId ) )
{
2024-07-09 15:25:28 +08:00
loadSaveData ( ) ;
2024-07-04 16:32:27 +08:00
_saveData . curAlbumId = albumId ;
_saveData . curPlayAudioIndex = audioIndex ;
StorageMgr . Instance . SyncForce = true ;
}
else
{
DebugUtil . LogError ( albumId + " not found in album config" ) ;
}
}
2024-07-09 15:25:28 +08:00
/// <summary>
/// <20> <> Ϊbgm<67> <6D> <EFBFBD> ŵ<EFBFBD> <C5B5> <EFBFBD> <EFBFBD> <EFBFBD> ר<EFBFBD> <D7A8>
/// </summary>
/// <returns></returns>
2024-07-08 19:25:45 +08:00
public int GetCurThemeAlbum ( )
{
loadOrInit ( ) ;
2024-07-09 15:25:28 +08:00
loadSaveData ( ) ;
2024-07-08 19:25:45 +08:00
return _saveData . themeAlbumID ;
}
public void SetCurThemeAlbum ( int albumId )
{
loadOrInit ( ) ;
2024-07-09 15:25:28 +08:00
loadSaveData ( ) ;
2024-07-08 19:25:45 +08:00
if ( albumDic . ContainsKey ( albumId ) )
{
_saveData . themeAlbumID = albumId ;
}
else //ȡ<> <C8A1> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ר<EFBFBD> <D7A8>
{
_saveData . themeAlbumID = 0 ;
}
StorageMgr . Instance . SyncForce = true ;
}
2024-07-04 16:32:27 +08:00
/// <summary>
/// ר<> <D7A8> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> б <EFBFBD>
/// </summary>
/// <returns></returns>
public List < int > AlbumPlayList ( int albumID )
{
if ( albumDic . ContainsKey ( albumID ) )
{
return albumDic [ albumID ] . PlayList . ToList ( ) ;
}
else
{
DebugUtil . LogError ( albumID + " not found in album config" ) ;
return null ;
}
}
public List < int > CurAlbumPlayList ( )
{
2024-07-09 15:25:28 +08:00
loadSaveData ( ) ;
2024-07-04 16:32:27 +08:00
return AlbumPlayList ( _saveData . curAlbumId ) ;
}
public DataAudio CurPlayAudio ( )
{
2024-07-09 15:25:28 +08:00
loadSaveData ( ) ;
2024-07-04 16:32:27 +08:00
var playList = CurAlbumPlayList ( ) ;
if ( playList ! = null & & playList . Count > 0 )
{
return TableManager . Instance . Tables . Audios . GetByID ( playList [ _saveData . curPlayAudioIndex ] ) ;
}
else
{
return null ;
}
}
public int CurPlayAudioIndex ( )
{
2024-07-09 15:25:28 +08:00
loadSaveData ( ) ;
2024-07-04 16:32:27 +08:00
return _saveData . curPlayAudioIndex ;
}
public void SetPlayMode ( PlayMode mode )
{
curPlayMode = mode ;
2024-07-05 18:25:44 +08:00
SetPlayList ( ) ;
}
public void SetPlayList ( )
{
2024-07-04 16:32:27 +08:00
playOrderList . Clear ( ) ;
2024-07-09 15:25:28 +08:00
loadSaveData ( ) ;
2024-07-04 16:32:27 +08:00
for ( int i = 0 ; i < AlbumPlayList ( _saveData . curAlbumId ) . Count ; i + + )
{
playOrderList . Add ( i ) ;
}
2024-07-05 18:25:44 +08:00
switch ( curPlayMode )
2024-07-04 16:32:27 +08:00
{
case PlayMode . Order :
break ;
case PlayMode . Random :
2024-07-09 15:25:28 +08:00
ShuffleOderLst ( playOrderList ) ;
for ( int i = 0 ; i < playOrderList . Count ; i + + )
{
if ( playOrderList [ i ] = = _saveData . curPlayAudioIndex )
{
playOrderList . RemoveAt ( i ) ;
playOrderList . Insert ( 0 , _saveData . curPlayAudioIndex ) ;
curOrderIndex = 0 ;
break ;
}
}
2024-07-04 16:32:27 +08:00
break ;
case PlayMode . Single :
int curIndex = _saveData . curPlayAudioIndex ;
for ( int i = 0 ; i < playOrderList . Count ; i + + )
{
playOrderList [ i ] = curIndex ;
}
break ;
default :
break ;
}
for ( int i = 0 ; i < playOrderList . Count ; i + + )
{
if ( playOrderList [ i ] = = _saveData . curPlayAudioIndex )
{
curOrderIndex = i ;
break ;
}
}
}
2024-07-09 15:04:35 +08:00
public bool CheckIsFavor ( int audioID )
{
2024-07-09 15:25:28 +08:00
loadSaveData ( ) ;
2024-07-09 15:04:35 +08:00
return _saveData . FavorAudioLst . Contains ( audioID ) ;
}
public void AddFavorAudio ( int audio )
{
2024-07-09 15:25:28 +08:00
loadSaveData ( ) ;
2024-07-09 15:04:35 +08:00
if ( ! _saveData . FavorAudioLst . Contains ( audio ) )
{
_saveData . FavorAudioLst . Add ( audio ) ;
StorageMgr . Instance . SyncForce = true ;
}
}
public void RemoveFavorAudio ( int audio )
{
2024-07-09 15:25:28 +08:00
loadSaveData ( ) ;
2024-07-09 15:04:35 +08:00
if ( _saveData . FavorAudioLst . Contains ( audio ) )
{
_saveData . FavorAudioLst . Remove ( audio ) ;
StorageMgr . Instance . SyncForce = true ;
}
}
2024-07-09 15:25:28 +08:00
void ShuffleOderLst ( List < int > ts )
2024-07-05 18:25:44 +08:00
{
2024-07-09 15:25:28 +08:00
int favoriteIndex = 0 ;
2024-07-05 18:25:44 +08:00
for ( int i = 0 ; i < ts . Count ; i + + )
2024-07-09 15:25:28 +08:00
{
if ( CheckIsFavor ( AlbumPlayList ( _saveData . curAlbumId ) [ i ] ) )
{
( ts [ favoriteIndex ] , ts [ i ] ) = ( ts [ i ] , ts [ favoriteIndex ] ) ;
favoriteIndex + + ;
}
} //<2F> <> ϲ <EFBFBD> <CFB2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ƶ<EFBFBD> <C6B5> <EFBFBD> <EFBFBD> ǰ<EFBFBD> <C7B0>
for ( int i = 0 ; i < favoriteIndex ; i + + )
{
int randomIndex = UnityEngine . Random . Range ( i , favoriteIndex ) ;
( ts [ randomIndex ] , ts [ i ] ) = ( ts [ i ] , ts [ randomIndex ] ) ;
} //<2F> <> ϲ <EFBFBD> <CFB2> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ƶ<EFBFBD> <C6B5> <EFBFBD> <EFBFBD>
for ( int i = favoriteIndex ; i < ts . Count ; i + + )
2024-07-05 18:25:44 +08:00
{
int randomIndex = UnityEngine . Random . Range ( i , ts . Count ) ;
( ts [ randomIndex ] , ts [ i ] ) = ( ts [ i ] , ts [ randomIndex ] ) ;
2024-07-09 15:25:28 +08:00
} //<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> 벿<EFBFBD> ִ<EFBFBD> <D6B4> <EFBFBD>
2024-07-05 18:25:44 +08:00
}
2024-07-04 16:32:27 +08:00
2024-07-11 13:46:58 +08:00
/// <summary>
/// <20> <> ר<EFBFBD> <D7A8> <EFBFBD> <EFBFBD> <DFBC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ƶ<EFBFBD> <C6B5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ز<EFBFBD> <D8B2> <EFBFBD> <EFBFBD> <EFBFBD> <DFBC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ŀ<EFBFBD> <C4BF> ˳<EFBFBD> <CBB3>
/// </summary>
/// <param name="albumID"></param>
/// <param name="audioIndex"></param>
2024-07-04 16:32:27 +08:00
public async void PlayAlbumAudio ( int albumID , int audioIndex )
{
if ( albumDic . ContainsKey ( albumID ) )
{
var playList = AlbumPlayList ( albumID ) ;
if ( playList ! = null & & playList . Count > 0 )
{
if ( audioIndex > = playList . Count )
{
audioIndex = 0 ;
}
await AudioManager . Instance . PlayAlbum ( playList [ audioIndex ] ) ;
curMusicKey = TableManager . Instance . Tables . Audios . GetByID ( playList [ audioIndex ] ) . Key ;
SetCurAlbum ( albumID , audioIndex ) ;
var totalSeconds = AudioManager . Instance . GetAlbumLength ( playList [ audioIndex ] ) ;
playTimer . Start ( totalSeconds ) ;
}
else
{
DebugUtil . LogError ( "PlayList is empty" ) ;
}
}
else
{
DebugUtil . LogError ( albumID + " not found in album config" ) ;
}
}
public void PlayPreAudio ( )
{
var playList = CurAlbumPlayList ( ) ;
if ( playList ! = null & & playList . Count > 0 )
2024-07-05 18:25:44 +08:00
{
if ( curPlayMode = = PlayMode . Single )
{
curOrderIndex = _saveData . curPlayAudioIndex ;
}
2024-07-04 16:32:27 +08:00
curOrderIndex - - ;
if ( curOrderIndex < 0 )
{
curOrderIndex = playList . Count - 1 ;
}
2024-07-05 18:25:44 +08:00
if ( curPlayMode = = PlayMode . Single )
{
for ( int i = 0 ; i < playOrderList . Count ; i + + )
{
playOrderList [ i ] = curOrderIndex ;
}
curOrderIndex = 0 ;
}
2024-07-04 16:32:27 +08:00
PlayAlbumAudio ( GetCurAlbum ( ) . Id , playOrderList [ curOrderIndex ] ) ;
}
}
public void PlayNextAudio ( )
{
var playList = CurAlbumPlayList ( ) ;
if ( playList ! = null & & playList . Count > 0 )
2024-07-05 18:25:44 +08:00
{
if ( curPlayMode = = PlayMode . Single )
{
curOrderIndex = _saveData . curPlayAudioIndex ;
}
curOrderIndex + + ;
if ( curOrderIndex > = playList . Count )
{
curOrderIndex = 0 ;
}
if ( curPlayMode = = PlayMode . Single )
{
for ( int i = 0 ; i < playOrderList . Count ; i + + )
{
playOrderList [ i ] = curOrderIndex ;
}
curOrderIndex = 0 ;
}
PlayAlbumAudio ( GetCurAlbum ( ) . Id , playOrderList [ curOrderIndex ] ) ;
}
}
/// <summary>
/// <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ɻص<C9BB>
/// </summary>
public void NextAudio ( )
{
var playList = CurAlbumPlayList ( ) ;
if ( playList ! = null & & playList . Count > 0 )
2024-07-04 16:32:27 +08:00
{
curOrderIndex + + ;
if ( curOrderIndex > = playList . Count )
{
curOrderIndex = 0 ;
}
PlayAlbumAudio ( GetCurAlbum ( ) . Id , playOrderList [ curOrderIndex ] ) ;
}
}
/// <summary>
/// <20> <> <EFBFBD> Ž<EFBFBD> <C5BD> ȼ<EFBFBD> ʱ<EFBFBD> <CAB1>
/// </summary>
public class Timer
{
bool isPlaying ;
float audioLength = - 1 ;
public delegate void OnSecondChange ( ) ;
public event OnSecondChange onSecondChange ;
public delegate void OnPlayEnd ( ) ;
public event OnPlayEnd onPlayEnd ;
async UniTask AudioTimer ( )
{
while ( isPlaying )
{
float totalSeconds = AudioManager . Instance . GetAlbumProgress ( ) ;
if ( totalSeconds < 0 )
{
isPlaying = false ;
break ;
}
if ( totalSeconds > = audioLength & & audioLength > 0 )
{
isPlaying = false ;
//AudioManager.Instance.StopMusicById(CurPlayAudio().ID);
onPlayEnd ? . Invoke ( ) ;
break ;
}
onSecondChange ? . Invoke ( ) ;
await UniTask . Delay ( 100 ) ; //0.1s
}
}
public void Start ( float audiolen )
{
audioLength = audiolen ;
2024-07-09 16:56:40 +08:00
if ( audiolen < = 0 )
{
DebugUtil . LogWarning ( "<22> <> ǰ<EFBFBD> <C7B0> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ƶ<EFBFBD> <C6B5> <EFBFBD> ȷ<EFBFBD> <C8B7> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ǹ<EFBFBD> <C7B8> ´ <EFBFBD> <C2B4> <EFBFBD> " ) ;
}
2024-07-04 16:32:27 +08:00
if ( isPlaying )
{
return ;
}
isPlaying = true ;
AudioTimer ( ) . Forget ( ) ;
}
public void Start ( )
{
if ( isPlaying )
{
return ;
}
isPlaying = true ;
AudioTimer ( ) . Forget ( ) ;
}
public void Stop ( )
{
isPlaying = false ;
}
}
2024-07-09 15:25:28 +08:00
/// <summary>
/// _saveDataδ<61> <CEB4> ȡʱ<C8A1> Ĵ<EFBFBD> <C4B4> <EFBFBD>
/// </summary>
void loadSaveData ( )
{
if ( _saveData = = null )
{
_saveData = StorageMgr . Instance . GetStorage < AlbumLocalData > ( "ALBUM_LOCAL_DATA" ) ;
if ( AlbumUnlocked ( _saveData . curAlbumId ) ) //<2F> 籣<EFBFBD> <E7B1A3> <EFBFBD> <EFBFBD> ר<EFBFBD> <D7A8> δ<EFBFBD> <CEB4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ĭ<EFBFBD> ϲ <EFBFBD> <CFB2> ŵ<EFBFBD> һ <EFBFBD> <D2BB> ר<EFBFBD> <D7A8>
{
SetCurAlbum ( 1 , 0 ) ;
}
if ( _saveData . themeAlbumID ! = 0 & & AlbumUnlocked ( _saveData . themeAlbumID ) ) //<2F> 籣<EFBFBD> <E7B1A3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ר<EFBFBD> <D7A8> δ<EFBFBD> <CEB4> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ϊ<EFBFBD> <CEAA> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ר<EFBFBD> <D7A8>
{
SetCurThemeAlbum ( 0 ) ;
}
}
}
2024-07-04 16:32:27 +08:00
}
public class AlbumLocalData
{
public int curAlbumId = 1 ;
public int curPlayAudioIndex = 0 ;
public int curOrderMode = 0 ;
2024-07-08 19:25:45 +08:00
public int themeAlbumID = 0 ; //<2F> <> <EFBFBD> <EFBFBD> Ϊ0<CEAA> <30> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ʾ û<CABE> <C3BB> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ר<EFBFBD> <D7A8>
2024-07-09 15:04:35 +08:00
public List < int > FavorAudioLst = new List < int > ( ) ;
2024-07-04 16:32:27 +08:00
}