一个创建手机音乐播放列表的小程序

一个播放列表创建软件,从而实现在电脑上管理手机的音乐

最近买了个w958,为了充分利用它那4G空间,我往里面放了大量的歌曲。平时我的音乐下载都是没有怎么系统的管理,都是往电脑的音乐文件夹里一丢就完了,得益于wmp的强大的音乐管理功能,听起来还是比较方便,但在手机上就不是那么回事了,Walkman的音乐管理功能虽然在手机音乐管理方面确实算首屈一指,但音乐多了,你要找个音乐确实不容易。

我平时听音乐习惯按播放列表听,而手机中却只能一个个的文件添加,确实够麻烦。在一次上传文件的过程中,打开了手机自建的一个播放列表,发现只是一个个的m3u文件,打开看了一下,只是很简单的文本格式。于是便想写一个播放列表的创建软件,实现在电脑上对手机中的音乐的管理。

该软件原理十分简单:首先将手机上的音乐文件的快捷方式映射到电脑上来,然后在电脑上根据手机的音乐创建播放列表,最后将创建好的播放列表上传会手机。

代码如下:

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var driver = DriveInfo.GetDrives().Last();
                string defaultPath = Path.Combine(driver.ToString(), "music");


                Console.WriteLine("
请输入音乐路径(" + defaultPath + ")");
                string path = Console.ReadLine();
                if (string.IsNullOrEmpty(path))
                    path = defaultPath;

                var p = new PlayListCreater(path);
            }
            catch (Exception e)
            {

                Console.WriteLine(e.Message);
            }    
        }
    }

    class PlayListCreater
    {
        const string musicDir = "music";
        const string playListDir = "playlist";

        string root;

        public PlayListCreater(string root)
        {
            this.root = root;
            if (!root.EndsWith(@"\"))
                this.root += @"\";

            CreateDir();

            ScanFile(root);

            Console.ReadLine();

            CreatePlayList();
        }

        private void ScanFile(string root)
        {
            Console.WriteLine(string.Format("
开始扫描'{0}'目录中的音乐文件。\n",root));
            new FileTraveler(root, "*.mp3", visitMusicDir, visitMusic);

            Console.WriteLine("\n\n
文件扫描已经完成。");
            Console.WriteLine("
请在playlist文件夹中创建播放列表。\n\nmusic文件夹中的文件拖到playlist的子文件夹中,playlist文件夹中每个子文件夹都将作为一个播放列表。\n\n");

            Console.WriteLine("
创建完成后,按回车键将生产播放列表。");

            System.Diagnostics.Process.Start("explorer", playListDir);
            System.Diagnostics.Process.Start("explorer", musicDir);

            
        }

        void CreatePlayList()
        {
            byte[] buffer = new byte[1024];
            foreach (var item in Directory.GetDirectories(playListDir))
            {
                //
这里的播放列表必须用unicode编码,否则手机不认
                StreamWriter writer = new StreamWriter(
                    Path.Combine(playListDir, Path.GetFileName(item) + ".m3u")
                    , false, Encoding.Unicode);

                writer.WriteLine("#M3U");
                var fileList = new List<string>();
                new FileTraveler(item, "*.mp3", null,
                    x =>{
                        var fs = File.OpenRead(x);
                        int count = fs.Read(buffer, 0, buffer.Length);
                        string file = Encoding.Default.GetString(buffer, 0, count);
                        fileList.Add(file);
                        fs.Close();
                    });

                foreach (var mp3 in fileList)
                {
                    writer.WriteLine("D"+ mp3.Substring(1));
                }

                writer.Close();
            }
        }

        private static void CreateDir()
        {
            Directory.CreateDirectory(musicDir);
            Directory.CreateDirectory(playListDir);

            Directory.Delete(musicDir, true);
            Directory.Delete(playListDir, true);

            Directory.CreateDirectory(musicDir);
            Directory.CreateDirectory(playListDir);
        }

        void visitMusicDir(string dir)
        {
            string ndir = Path.Combine(musicDir, dir.Replace(root, ""));

            Directory.CreateDirectory(ndir);
        }

        void visitMusic(string file)
        {
            Console.WriteLine(Path.GetFileName(file));
            string nfile = Path.Combine(Path.GetFullPath(musicDir), file.Replace(root, ""));
            FileStream fs= File.Create(nfile);

            byte[] data = Encoding.Default.GetBytes(file);
            fs.Write(data, 0, data.Length);
            fs.Close();
        }
    }

    /// <summary>
    ///
文件遍历类(递归算法实现)
    /// </summary>
    class FileTraveler
    {
        string filePatten;

        Action<string> visitDireHanlder;
        Action<string> visitFileHanlder;

        public FileTraveler(string root, string filePatten, Action<string> visitDireHanlder, Action<string> visitFileHanlder)
        {
            this.filePatten = filePatten;

            this.visitDireHanlder = visitDireHanlder;
            this.visitFileHanlder = visitFileHanlder;

            VisitDir(root);
        }


        void VisitDir(string dir)
        {
            if (visitDireHanlder != null)
                visitDireHanlder(dir);

            if (visitFileHanlder != null)
            {
                foreach (var file in Directory.GetFiles(dir, filePatten))
                {
                    visitFileHanlder(file);
                }
            }

            foreach (var subdir in Directory.GetDirectories(dir))
            {
                VisitDir(subdir);
            }
        }
    }

程序的代码比较简单,也没什么技术含量,就不介绍了。一个注意的地方是我的w958的m3u文件只认识unicode编码格式,因此播放列表要保存为unicode格式,否则中文乱码。

本来我最初打算写一个类似mediaplayer的媒体库类似的管理软件,写了一会儿就发现,要实现像mediaplayer那么友好的gui并不是那么容易。便想到通过windows的文件系统模拟这个gui,首先将手机上的音乐文件的快捷方式映射到电脑上来,然后只要将这些音乐文件快捷方式放入新建的播放列表的文件夹中,最后根据播放列表文件夹中的文件创建播放列表。十分简单易用。

这个程序创建的播放列表也可用于mediaplayer,但和mediaplayer的强大管理功能比起来,还不如直接用mediaplayer。如果要实现完善的电脑上管理手机音乐,最好的方式是将mediaplayer的播放列表转换为手机播放列表。这个实现起来也很简单,但这要求手机上的音乐和电脑上是同步的。由于我的手机上的音乐和电脑并不同步,因此暂时就没有这么做。有兴趣的朋友可以自己去实现一下。

原文地址:https://www.cnblogs.com/TianFang/p/949038.html