一个播放列表创建软件,从而实现在电脑上管理手机的音乐
最近买了个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("请输入音乐路径(""):");
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\n将music文件夹中的文件拖到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的播放列表转换为手机播放列表。这个实现起来也很简单,但这要求手机上的音乐和电脑上是同步的。由于我的手机上的音乐和电脑并不同步,因此暂时就没有这么做。有兴趣的朋友可以自己去实现一下。