128 lines
4.5 KiB
Dart
128 lines
4.5 KiB
Dart
// lib/repositories/playlist_repository.dart
|
|
import 'dart:math';
|
|
import '../database/song_database.dart';
|
|
import '../models/playlist.dart';
|
|
import '../services/audio_service.dart';
|
|
|
|
class PlaylistRepository {
|
|
final SongDatabase _db = SongDatabase();
|
|
|
|
String _generateId() {
|
|
const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
|
|
final random = Random();
|
|
return String.fromCharCodes(
|
|
Iterable.generate(
|
|
16, (_) => chars.codeUnitAt(random.nextInt(chars.length))),
|
|
);
|
|
}
|
|
|
|
// ════════════════════════════════════════════════════════════
|
|
// 歌单操作
|
|
// ════════════════════════════════════════════════════════════
|
|
|
|
Future<List<Playlist>> getAllPlaylists() async {
|
|
final data = await _db.getAllPlaylists();
|
|
return data.map((e) => Playlist.fromJson(e)).toList();
|
|
}
|
|
|
|
Future<Playlist?> getPlaylist(String id) async {
|
|
final data = await _db.getPlaylist(id);
|
|
if (data == null) return null;
|
|
return Playlist.fromJson(data);
|
|
}
|
|
|
|
Future<Playlist> createPlaylist(String name) async {
|
|
final playlist = Playlist(id: _generateId(), name: name);
|
|
await _db.insertPlaylist(playlist.toJson());
|
|
return playlist;
|
|
}
|
|
|
|
Future<void> updatePlaylistName(String id, String newName) async {
|
|
await _db.updatePlaylist(id, {
|
|
'name': newName,
|
|
'updated_at': DateTime.now().millisecondsSinceEpoch,
|
|
});
|
|
}
|
|
|
|
// ⭐ 新增:更新播放模式
|
|
Future<void> updatePlaylistPlayMode(String id, PlayMode playMode) async {
|
|
await _db.updatePlaylist(id, {
|
|
// ⭐ 修改前:_playModeToString
|
|
// 'play_mode': _playModeToString(playMode),
|
|
|
|
// ⭐ 修改后:用公开静态方法
|
|
'play_mode': Playlist.playModeToString(playMode),
|
|
'updated_at': DateTime.now().millisecondsSinceEpoch,
|
|
});
|
|
}
|
|
|
|
Future<void> deletePlaylist(String id) async {
|
|
await _db.deletePlaylist(id);
|
|
}
|
|
|
|
// ════════════════════════════════════════════════════════════
|
|
// 歌单歌曲操作
|
|
// ════════════════════════════════════════════════════════════
|
|
|
|
Future<List<String>> getPlaylistSongIds(String playlistId) async {
|
|
final data = await _db.getPlaylistSongs(playlistId);
|
|
return data.map((e) => e['song_id'] as String).toList();
|
|
}
|
|
|
|
Future<void> addSong(String playlistId, String songId) async {
|
|
await _db.addSongToPlaylist(playlistId, songId);
|
|
}
|
|
|
|
Future<void> removeSong(String playlistId, String songId) async {
|
|
await _db.removeSongFromPlaylist(playlistId, songId);
|
|
}
|
|
|
|
Future<void> reorderSongs(
|
|
String playlistId, int oldIndex, int newIndex) async {
|
|
if (oldIndex == newIndex) return;
|
|
final songs = await _db.getPlaylistSongs(playlistId);
|
|
if (oldIndex < 0 ||
|
|
oldIndex >= songs.length ||
|
|
newIndex < 0 ||
|
|
newIndex >= songs.length) {
|
|
return;
|
|
}
|
|
final items = songs.map((e) => e['song_id'] as String).toList();
|
|
final item = items.removeAt(oldIndex);
|
|
items.insert(newIndex, item);
|
|
for (int i = 0; i < items.length; i++) {
|
|
await _db.removeSongFromPlaylist(playlistId, items[i]);
|
|
await _db.addSongToPlaylist(playlistId, items[i], orderIndex: i);
|
|
}
|
|
}
|
|
|
|
Future<void> clearPlaylist(String playlistId) async {
|
|
await _db.clearPlaylist(playlistId);
|
|
}
|
|
|
|
// ════════════════════════════════════════════════════════════
|
|
// 收藏操作
|
|
// ════════════════════════════════════════════════════════════
|
|
|
|
Future<List<String>> getFavorites() async {
|
|
final data = await _db.getFavorites();
|
|
return data.map((e) => e['song_id'] as String).toList();
|
|
}
|
|
|
|
Future<bool> isFavorite(String songId) async {
|
|
return await _db.isFavorite(songId);
|
|
}
|
|
|
|
Future<void> addFavorite(String songId) async {
|
|
await _db.addFavorite(songId);
|
|
}
|
|
|
|
Future<void> removeFavorite(String songId) async {
|
|
await _db.removeFavorite(songId);
|
|
}
|
|
|
|
Future<void> toggleFavorite(String songId) async {
|
|
await _db.toggleFavorite(songId);
|
|
}
|
|
}
|