# Đồ án MediaPlayer - Class definition
## Media
Bài hát hoặc video
```dart=
class Media {
String id;
String name;
int duration;
String filePath;
bool get isMusic =>
bool get isVideo =>
}
```
## Playlist
Danh sách phát
```dart=
class Playlist {
String id;
String name;
List<Media> medias;
}
```
## GLOBAL
```dart=
static class GLOBAL {
PlayerController player;
List<Playlist> allPlaylists;
String currPlaylistId;
String nowPlaylistId;
// thêm playlist
addPlaylist()
// thêm media vào playlist theo id
addMedia(Media media, String playlistId)
{
// thêm vào cuối
// + allPlaylists
// + player.playlist
}
// xóa media
removeMedia(String mediaId, String playlistId)
{
// xóa trong allPlaylists
// xóa trong player.playlist (nếu là playlist đang phát)
// nếu là bài đang phát thì playNext hoặc playRandom rồi mới xóa
}
}
```
## PlayerState
```dart=
enum PlayerState {
STOPPED, // chưa phát bài nào (hoặc khi xảy ra lỗi phát nhạc)
PLAYING, // đang phát
PAUSED, // đang tạm dừng
COMPLETE, // đã phát hết playlist
}
```
## PlayerController
- PlayerController không liên quan đến Playlist, chỉ phát Media
- Cơ chế Shuffle:
- Bật/tắt trạng thái isShuffle
- Dựa vào isShuffle để PlayNext()
- Không tạo mảng random Media
```dart=
class PlayerController {
// Thư viện của WPF
MediaPlayer player;
// List id các bài đã phát (từ lúc setPlaylist)
List<String> history;
// danh sách Media đang chơi
// lí do là List<Media> mà không phải Playlist:
// + không phụ thuộc vào lớp Playlist
// + ý nghĩa của PlayerController: phát danh sách bài hát
List<Media> playlist;
// id bài hiện tại đang phát
String nowId;
// trạng thái hiện tại
PlayerState state;
// shuffle mode
bool isShuffle;
//=======================
// Trả về bài đang phát
Media get nowMedia =>
// Trả về vị trí của bài đang phát
int get position =>
//=======================
// gán playlist sẽ chơi
setPlaylist()
// phát bài đầu tiên: clear history
playAll()
// dùng player để chơi bài: now = index
// tại thời điểm position (optional, not required)
playMedia(int index, [int position = 0])
// phát bài tiếp theo (kiểm tra isShuffle)
playNext()
// phát bài trước đó (dựa trên history): xóa history.last
playPrevious()
// Lấy index bài tiếp theo ngẫu nhiên
// loại trừ những bài gần đây (dựa trên history)
int getNextRandom()
// đảo isShuffleMode
toggleShuffle() { isShuffleMode = !isShuffleMode; }
// Lấy index media theo id
getIndexById()
// Lấy id media theo index
getIdByIndex()
}
```