zoukankan      html  css  js  c++  java
  • 一个创建手机音乐播放列表的小程序

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

    最近买了个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的播放列表转换为手机播放列表。这个实现起来也很简单,但这要求手机上的音乐和电脑上是同步的。由于我的手机上的音乐和电脑并不同步,因此暂时就没有这么做。有兴趣的朋友可以自己去实现一下。

  • 相关阅读:
    Docker
    CTF各种资源:题目、工具、资料
    Android工具集合
    Android相关资源
    命令注入新玩法:巧借环境攻击目标
    分库分表
    数据库读写分离
    Insomni'hack teaser 2019
    Insomni'hack teaser 2019
    35C3 CTF
  • 原文地址:https://www.cnblogs.com/TianFang/p/949038.html
Copyright © 2011-2022 走看看