using KaraokePlayer; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; using System.Windows.Forms; using Herse.Models; using System.IO.Compression; namespace KaraokePlayer { public class PlayerWrapper { private KaraokeVideoPlayer currentPlayer = null; private KaraokeVideoPlayer mp4Player; private KaraokeVideoPlayer cdgPlayer; public Song Song { get; set; } public delegate void SongEndedEventHandler(); public SongEndedEventHandler OnSongEnded { get; set; } public PlayerWrapper(KaraokeVideoPlayer cdgPlayer, KaraokeVideoPlayer mp4Player) { cdgPlayer.setup(true, true); mp4Player.setup(false, true); cdgPlayer.songEndedHandler += new KaraokePlayer.KaraokeVideoPlayer.SongEndedEventHandler(this.karaokePlayerSongEnded); mp4Player.songEndedHandler += new KaraokePlayer.KaraokeVideoPlayer.SongEndedEventHandler(this.karaokePlayerSongEnded); cdgPlayer.Dock = DockStyle.Fill; mp4Player.Dock = DockStyle.Fill; this.mp4Player = mp4Player; this.cdgPlayer = cdgPlayer; } private void karaokePlayerSongEnded(object sender, EventArgs e) { if (OnSongEnded != null) OnSongEnded(); } public void stop() { if (currentPlayer == null) return; currentPlayer.Stop(); } public void pause() { if (currentPlayer == null) return; currentPlayer.Pause(); } public void play() { if (Song == null) return; if (currentPlayer != null && currentPlayer.isPaused) { currentPlayer.Resume(); return; } switch (Song.FileType) { case FileType.CDG: PlayCdg(); break; case FileType.ZIP: PlayZip(); break; case FileType.MP4: PlayM4p(); break; } } private void PlayM4p() { currentPlayer = mp4Player; mp4Player.Play(new Uri(Song.Path)); mp4Player.Visible = true; cdgPlayer.Visible = false; cdgPlayer.Stop(); } private void PlayZip() { string playPath = null; string extractPath = Path.Combine(Directory.GetCurrentDirectory(), "temp"); try { DeleteDirectory(extractPath); } catch(Exception) { // do nothing } Directory.CreateDirectory(extractPath); using (ZipArchive archive = ZipFile.OpenRead(Song.Path)) { foreach (ZipArchiveEntry entry in archive.Entries) { if (entry.FullName.EndsWith(".mp3", StringComparison.OrdinalIgnoreCase)) { playPath = Path.Combine(extractPath, entry.FullName); } entry.ExtractToFile(Path.Combine(extractPath, entry.FullName)); } } if (!string.IsNullOrEmpty(playPath)) { currentPlayer = cdgPlayer; cdgPlayer.Play(new Uri(playPath)); cdgPlayer.Visible = true; mp4Player.Visible = false; mp4Player.Stop(); } } private void PlayCdg() { currentPlayer = cdgPlayer; cdgPlayer.Play(new Uri(Path.ChangeExtension(Song.Path, ".mp3"))); cdgPlayer.Visible = true; mp4Player.Visible = false; mp4Player.Stop(); } private void DeleteDirectory(string target_dir) { if (!Directory.Exists(target_dir)) { return; } string[] files = Directory.GetFiles(target_dir); string[] dirs = Directory.GetDirectories(target_dir); foreach (string file in files) { File.SetAttributes(file, FileAttributes.Normal); File.Delete(file); } foreach (string dir in dirs) { DeleteDirectory(dir); } Directory.Delete(target_dir, false); } } }