Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse code

initial comment

  • Loading branch information...
commit 4c474cc18c73247b719ea16328577894c78a4e5d 1 parent fe9dbe2
Martian Z authored

Showing 36 changed files with 2,913 additions and 1 deletion. Show diff stats Hide diff stats

  1. +1 0  .gitignore
  2. +23 1 README.md
  3. +95 0 blog.py
  4. +50 0 posts/2010-12-05-musicdownloader.markdown
  5. +55 0 posts/2011-01-03-lrc-is-a-must.markdown
  6. +229 0 posts/2011-02-11-delphi-lrc-one.markdown
  7. +14 0 posts/2011-02-11-pureplayer.markdown
  8. +18 0 posts/2011-02-11-thunder7skin.markdown
  9. +287 0 posts/2011-02-17-wpf-button.markdown
  10. +65 0 posts/2011-03-05-musicseeker.markdown
  11. +72 0 posts/2011-04-05-musicsorter-faq.markdown
  12. +78 0 posts/2011-04-08-musicsorter-musicnamer.markdown
  13. +47 0 posts/2011-05-07-kissxiami.markdown
  14. +85 0 posts/2011-05-07-musicseeker2.markdown
  15. +41 0 posts/2011-08-09-iyy-qqmusic.markdown
  16. +71 0 posts/2011-08-13-dynamiclyrics.markdown
  17. +62 0 posts/2011-08-28-musicseekerx.markdown
  18. +45 0 posts/2011-12-08-project-lolilu.markdown
  19. +114 0 posts/2011-12-10-lolilu-aria2c.markdown
  20. +18 0 posts/2012-01-01-opensource-dynamiclyrics.markdown
  21. +39 0 posts/2012-01-22-hello-octopress.markdown
  22. +22 0 posts/2012-01-24-donate.markdown
  23. +117 0 posts/2012-01-25-macbook-pro-ssd-optimize.markdown
  24. +98 0 posts/2012-01-25-set-up-octopress.markdown
  25. +206 0 posts/2012-01-27-use-applescript-to-set-itunes-lyrics.markdown
  26. +43 0 posts/2012-02-02-matritunes.markdown
  27. +77 0 posts/2012-02-12-use-sae-to-setup-uploading-system.markdown
  28. +40 0 posts/2012-05-26-dynamiclyrics-2-dot-0.markdown
  29. +66 0 posts/2012-05-26-use-sparkle-to-set-up-check-update-system.markdown
  30. +192 0 posts/2012-05-27-ubuntu-apache.markdown
  31. +31 0 posts/2012-06-10-buy-books-activity-first.markdown
  32. +63 0 posts/2012-06-11-dynamiclyrics-2-dot-0-release.markdown
  33. BIN  static/background.png
  34. +310 0 static/style.css
  35. +69 0 template/article.html
  36. +70 0 template/index.html
1  .gitignore
... ... @@ -1,4 +1,5 @@
1 1 *.py[co]
  2 +.DS_Store
2 3
3 4 # Packages
4 5 *.egg
24 README.md
Source Rendered
... ... @@ -1,2 +1,24 @@
1 1 MartianZ-BLOG
2   -=============
  2 +=============
  3 +
  4 +MartianZ - BLOG 是 MartianZ 同学在折腾过程中学习Python的产物,是一款轻量级的博客系统。演示:<http://blog.4321.la>
  5 +
  6 +依赖:
  7 +
  8 + python 2.6 +
  9 +
  10 + easy_install tornado
  11 + easy_install markdown
  12 +
  13 +使用:
  14 +
  15 +1. 将Markdown放在posts文件夹下,保证每个Markdown文件的开头有下面的标志区域
  16 +
  17 + ---
  18 + title: "[320kbps MusicDownloader]高清音乐下载助手 1.4"
  19 + date: 2010-12-05 22:16
  20 + ---
  21 +2. python blog.py 即可,默认端口8888
  22 +
  23 +详情请查看程序源代码即可
  24 +
95 blog.py
... ... @@ -0,0 +1,95 @@
  1 +import tornado.ioloop
  2 +import tornado.web
  3 +import string, os, sys
  4 +import markdown
  5 +import codecs
  6 +
  7 +site_config = {
  8 + "title" : "MartianZ!",
  9 + "url" : """http://blog.4321.la""",
  10 + "post_dir": os.getcwd() + os.sep + 'posts',
  11 +}
  12 +
  13 +settings = {
  14 + "static_path": os.path.join(os.path.dirname(__file__), "static")
  15 +}
  16 +
  17 +def SingleFileHandler(file_path):
  18 + f = codecs.open(file_path, mode='r', encoding='utf8')
  19 + lines = []
  20 + try:
  21 + lines = f.readlines()
  22 + except:
  23 + pass
  24 + f.close()
  25 +
  26 + ret = {}
  27 + title = ''
  28 + date = ''
  29 + index = 1
  30 +
  31 + for line in lines[1:]:
  32 + index += 1
  33 + if line.find('title: ') == 0:
  34 + title = line.replace('title: "','')[0:-2]
  35 + if line.find('date: ') == 0:
  36 + date = line.replace('date: ','')[0:-1]
  37 + if line.find('---') == 0:
  38 + break
  39 +
  40 + content = u'';
  41 + for line in lines[index:]:
  42 + content += line
  43 +
  44 + if title:
  45 + ret['title'] = title
  46 + ret['date'] = date
  47 + ret['content'] = markdown.markdown(content)
  48 + ret['name'] = file_path.split(os.sep)[-1].split('.')[0]
  49 + return ret
  50 +
  51 +class MainHandler(tornado.web.RequestHandler):
  52 + def get(self):
  53 + articles = []
  54 + post_dir = site_config["post_dir"]
  55 + file_list = []
  56 + files = os.listdir(post_dir)
  57 +
  58 + p = int(self.get_argument('p','0'))
  59 +
  60 + for f in files:
  61 + file_list.append(post_dir + os.sep + f)
  62 + file_list.sort(reverse=True)
  63 + for single_file in file_list[p:p+3]:
  64 + article = SingleFileHandler(single_file)
  65 + if article: articles.append(article)
  66 +
  67 + if p > 2:
  68 + prev = True
  69 + else:
  70 + prev = False
  71 +
  72 + if p + 4 < len(file_list):
  73 + pnext = True
  74 + else:
  75 + pnext = False
  76 +
  77 +
  78 + self.render("template/index.html", title=site_config['title'], url=site_config["url"], articles = articles, prev=prev, pnext=pnext, prevnum=p-3, nextnum=p+3)
  79 +
  80 +class ArticleHandler(tornado.web.RequestHandler):
  81 + def get(self, article_id):
  82 + post_path = site_config["post_dir"] + os.sep + article_id.replace('.','') + '.markdown'
  83 + article = SingleFileHandler(post_path)
  84 +
  85 + self.render("template/article.html", title=site_config['title'], url=site_config["url"], article = article)
  86 +
  87 +application = tornado.web.Application([
  88 + (r"/", MainHandler),
  89 + (r"/article/(.*)", ArticleHandler),
  90 +], **settings)
  91 +
  92 +if __name__ == "__main__":
  93 + application.listen(8888)
  94 + print "MartianZ Burogu Sutato!"
  95 + tornado.ioloop.IOLoop.instance().start()
50 posts/2010-12-05-musicdownloader.markdown
Source Rendered
... ... @@ -0,0 +1,50 @@
  1 +---
  2 +layout: post
  3 +title: "[320kbps MusicDownloader]高清音乐下载助手 1.4"
  4 +date: 2010-12-05 22:16
  5 +comments: true
  6 +categories: ideas
  7 +---
  8 +![MusicDownloader](http://i.imgur.com/bDcY0.png)
  9 +
  10 +软件名称:[320kbps MusicDownloader]高清音乐下载助手
  11 +
  12 +软件版本:1.4
  13 +
  14 +最后更新:2010年12月5日
  15 +
  16 +####**MusicDownloader已经被MusicSeeker所替代,目前MusicDownloader已经停止开发,请下载更加完善的MusicSeeker!**
  17 +
  18 +<!-- more -->
  19 +版本更新内容:
  20 +
  21 +1、修正搜索算法,完美运行
  22 +
  23 +2、添加试听功能,打开下载目录功能
  24 +
  25 +软件说明:
  26 +
  27 +1、程序采用众所周知的接口开发,下载高清320kbpsMP3音乐。
  28 +
  29 +2、采用豆瓣音乐API,自动获取专辑图片并保存在音乐的ID3标签中。
  30 +
  31 +截图与功能一览:
  32 +
  33 +![MusicDownloader](http://i.imgur.com/h8AYa.png)
  34 +
  35 +由于搜索算法问题,无法搜索除中文、英文之外的关键字。所以如果您搜索其他语言(如日文),可以尝试输入歌名中的中文字符而忽略假名等,同时输入歌手来精确定位,或者仅输入歌手。(如上图所示)
  36 +
  37 +![MusicDownloader](http://i.imgur.com/6iC8l.png)
  38 +
  39 +![MusicDownloader](http://i.imgur.com/ohftM.png)
  40 +
  41 +
  42 +**下载地址:(支持迅雷等下载工具)**
  43 +
  44 +<http://down.4321.la/320kbps-MusicDownloader-1.4.rar>
  45 +
  46 +MusicDownloader已经被MusicSeeker所替代,目前MusicDownloader已经停止开发,请下载更加完善的MusicSeeker!
  47 +
  48 +软件基于.Net FrameWork3.5平台,如果您的系统是Windows7/Vista,则已经自带,如果是XP,您可以先下载软件试一下,如果不能运行,请到http://www.crsky.com/soft/21819.html下载.Net FrameWork3.5后安装!
  49 +
  50 +如果您觉得软件不错的话,希望您能推荐给您的朋友,这对我们来说是最大的支持!
55 posts/2011-01-03-lrc-is-a-must.markdown
Source Rendered
... ... @@ -0,0 +1,55 @@
  1 +---
  2 +layout: post
  3 +title: "LRC IS A MUST! —— LRC歌词下载器"
  4 +date: 2011-01-03 22:23
  5 +comments: true
  6 +categories: ideas
  7 +---
  8 +![LRC](http://i.imgur.com/dP4p5.png)
  9 +
  10 +软件名称:Lrc is a must!
  11 +软件版本:1.0
  12 +最后更新:2011年1月3日10:58:56
  13 +
  14 +**优点:相对于其它同类软件,方便易用不敢说,但是歌词库相当全!**
  15 +
  16 +<!-- more -->
  17 +
  18 +最近从某知名听歌软件换到了华丽的AirPlay……但是AirPlay的LRC歌词下载部分非常的不给力。
  19 +
  20 +所以就分析了之前那个软件的LRC下载算法,然后开发了这款软件。
  21 +
  22 +使用方法:
  23 +
  24 +第一步:下载并启动软件
  25 +第二步:找到需要下载的歌曲所在目录,然后把歌曲选中,支持多选,拖拽到软件界面中。
  26 +(仅支持MP3格式)
  27 +![LRC](http://i.imgur.com/nHnab.png)
  28 +
  29 +软件的三个区域分别是:
  30 +
  31 +① 你拖拽进来的歌曲列表
  32 +② 双击一个歌曲,出来的搜索结果
  33 +③ 双击一个搜索结果,出来的歌词
  34 +
  35 +拖拽进去歌曲后,软件会自动读取ID3标签,如果没有问题的话,双击歌曲就可以搜索
  36 +
  37 +如果读取失败的话,可以在下面的Search区域进行相关修改后单击[Click]按钮
  38 +
  39 +![LRC](http://i.imgur.com/zxhW0.png)
  40 +
  41 +找到中意的歌词后,就可以单击SaveToFile按钮,LRC歌词将自动保存到与歌曲同文件夹的位置,并且与歌曲文件同文件名。效果如下:
  42 +
  43 +![LRC](http://i.imgur.com/dtSjW.png)
  44 +
  45 +**下载地址:**
  46 +
  47 +<http://down.4321.la/LRC-Downloader.rar>
  48 +
  49 +软件采用Delphi XE开发,所以不用装什么.net库了,软件制作的时候比较仓促,因为我还有其他的项目,所以界面比较搓,希望大家谅解。
  50 +
  51 +有任何意见建议请在下面提出,您的支持是我们最大的鼓励
  52 +
  53 +免责声明:
  54 +所有的代码、程序仅供研究学习用,没有任何盈利目的,请各位用户下载后及时删除。
  55 +开发者对软件的使用产生的任何法律问题及连带责任概不负责。
229 posts/2011-02-11-delphi-lrc-one.markdown
Source Rendered
... ... @@ -0,0 +1,229 @@
  1 +---
  2 +layout: post
  3 +title: "[Delphi]Lrc歌词模块实现 Part1——格式化Lrc歌词文件"
  4 +date: 2011-02-11 22:29
  5 +comments: true
  6 +categories: notes
  7 +---
  8 +最近闲来无事,于是准备开发适合一款播放器,必不可少的就是Lrc歌词显示部分
  9 +
  10 +从网上找了一些现成的算法,不是做得很搓,就是做得太霸气,一点都看不懂,于是自己想了一个思路。
  11 +
  12 +1、按行读取LRC歌词,分析每一行的标签 procedure Anylize(s:string)
  13 +2、将所有标签整理出来,歌词的时间标签换算成Longint (ToTime),存到一个动态数组中
  14 +
  15 + Lyric=record
  16 + Time:Longint; //时间
  17 + Content:string; //内容
  18 + Line:Integer; //第几行,为以后的GDI+滚动显示做准备
  19 + end;
  20 + var
  21 + Lrc:array of Lyric;
  22 +
  23 +3、进行快速排序,按照Time升序排序。
  24 +
  25 +4、播放时不停进行二分查找,将查找出来的结果显示即可。
  26 +
  27 +<!-- more -->
  28 +
  29 +根据这个思路,我们来编写代码
  30 +
  31 +首先来看一段LRC歌词,了解一下LRC歌词的结构:
  32 +[ti:Crawling]
  33 +
  34 +[ar:Linkin Park]
  35 +
  36 +[al:Hybrid Theory]
  37 +
  38 +[00:00.00]Linkin Park – Crawling
  39 +
  40 +[00:11.50]
  41 +
  42 +[02:23.74][01:26.89][00:23.40]Crawling in my skin
  43 +
  44 +[02:28.11][01:31.31][00:27.74]These wounds they will not heal
  45 +
  46 +[02:32.58][01:35.70][00:32.35]Fear is how I fall
  47 +
  48 +[02:37.11][01:40.27][00:36.60]Confusing what is real
  49 +
  50 +[00:41.90]
  51 +
  52 +………………
  53 +
  54 +[03:00.99]There’s something inside me that pulls beneath the surface
  55 +
  56 +[03:05.49]Consuming, confusing what is real
  57 +
  58 +[03:09.78]This lack of self control I fear is never ending
  59 +
  60 +[03:14.42]Controlling, confusing what is real
  61 +
  62 +[03:22.93][03:21.08]
  63 +
  64 +[03:26.09]****END****
  65 +
  66 +上面的[ti:Crawling]等等是标识标签(ID-Tags),用来标示艺人名、歌曲名、专辑名、LRC编者、时间补偿等,对我们来说最有用的是时间补偿,处理也相对简单,不过经过我的测试这个东西实际应用起来不是很多,尤其是从网上下载的歌词,所以暂时不考虑,有兴趣的朋友可以在算法上加上这个时间补偿的处理。
  67 +
  68 +形式为"[mm:ss.ff]"或"[mm:ss.fff]"的标签为时间标签(Time-Tags),数字都是非负整数,形式也很简单,但是需要注意的是后面毫秒的位数,如果是小于三位的话需要从后面补零。
  69 +
  70 +准备工作完毕,开工!
  71 +
  72 +
  73 +第一步:
  74 +
  75 +读入Lrc歌词文件。
  76 +
  77 +这个毫无技术含量,与普通文本文件读取方式一样,放到String里即可。
  78 +
  79 +我使用的是TFileStream类读入的文件,不再赘述,大家可以直接谷歌搜索delphi读取文本文件的例子就可以。
  80 +
  81 +第二步:
  82 +
  83 +使用正则表达式,每行每行的分析Lrc文件。
  84 +
  85 +参考正则表达式的手册(- – 每次写正则必须看,那语法简直……),写了一个正则表达式
  86 +
  87 +
  88 + ^((\[\d+:\d+\.\d+\])+)(.*?)$
  89 +
  90 +
  91 +这个正则表达式能够一行一行(preMultiLine)的(^$)的匹配含有时间标签的Lrc歌词,同时将正则匹配结果的分组[1]和分组[3]即时时间标签的内容和当前行的歌词内容提取出来,非常方便。需要注意的是每行歌词中可能含有多个时间标签,在正则中使用+限定符即可正常匹配。
  92 +
  93 +实现代码如下:
  94 +
  95 + procedure Anylize(s:string); //通过正则表达式解析歌词
  96 + const
  97 +  RegEx:string='^((\[\d+:\d+\.\d+\])+)(.*?);' //正则表达式
  98 + var
  99 +  Reg:TPerlRegEx;
  100 +  a,b:String;
  101 +  I,ACount:Integer;
  102 +  AStrings: TStringList;
  103 + begin 
  104 + Reg:=TPerlRegEx.Create();
  105 + Reg.Options:=[preMultiLine,preCaseLess]; //重要:设置匹配模式:多行
  106 + Reg.Subject:=s;
  107 + Reg.RegEx:=RegEx;
  108 +  try
  109 +    while Reg.MatchAgain do
  110 +    begin
  111 +     a:=Reg.Groups[1]; //时间标签
  112 +     b:=Reg.Groups[3]; //歌词内容
  113 +      AStrings:=TStringList.Create;
  114 +     try
  115 +       ACount:=ExtractStrings(['[',']'], [], PChar(a), AStrings);
  116 +       //将时间标签的[]括号替换掉,同时进行文本分割,将多个时间标签分分割成TStringList
  117 +       for I := 0 to ACount-1 do
  118 +       begin
  119 +         SetLength(Lrc,Length(Lrc)+1);
  120 +         //加入成员
  121 +         Lrc[Length(Lrc)-1].Time:=ToTime(AStrings[I]);
  122 +         Lrc[Length(Lrc)-1].Content:=b;
  123 +         //对于单行多个时间标签的情况 自动拆开处理
  124 +         //例如:[02:37.11][01:40.27][00:36.60]Confusing what is real
  125 +         //将识别为三句 即每句分别是
  126 +         //[02:37.11]Confusing what is real
  127 +         //[01:40.27]Confusing what is real
  128 +         //[00:36.60]Confusing what is real
  129 +       end;
  130 +     finally
  131 +       AStrings.Free;
  132 +     end;
  133 +    end;
  134 +  finally
  135 +    Reg.Free;
  136 +  end;
  137 +
  138 + QuickSort(0, Length(Lrc)-1); //快排
  139 + //Lrc歌词大多数已经局部有序,除非是单行多标签情况或者编写者故意找事,所以使用快排时间复杂度不会很高
  140 + Lrc[0].Line:=3;
  141 + //设置首行为第三行 这样进行滚动显示时 第一行歌词显示在中间,在以后的篇章中会详细说明
  142 +  LrcInAll:=Lrc[0].Content;
  143 +  for I := 1 to Length(LRC) - 1 do
  144 +  begin
  145 +   Lrc[I].Line:=Lrc[I-1].Line+CalculateLines(I-1);
  146 +   LrcInAll:=LrcInAll+ #13#10 + Lrc[I].Content;
  147 +  end; //将所有歌词都保存一遍
  148 + end;
  149 +
  150 +第三步:
  151 +
  152 +关于将时间标签转换成Longint,只需要将各个部分做乘法然后想加即可
  153 +
  154 +具体实现代码:
  155 +
  156 + function ToTime(s:string):Longint;
  157 + const
  158 +  RegEx:string='^(\d+):(\d+)(\.(\d+))?;'
  159 +  //使用正则表达式将每部分分别取出来,当然也可以进行字符串分割,我这里比较懒就直接用正则了
  160 + var
  161 +  Reg:TPerlRegEx;
  162 +  ans:Integer;
  163 +  ms:string;
  164 + begin
  165 +  Reg:=TPerlRegEx.Create();
  166 +  try
  167 +    Reg.Options:=[preCaseLess];
  168 +    Reg.Subject:=s;
  169 +    Reg.RegEx:=RegEx;
  170 +    if Reg.Match then
  171 +    begin
  172 +      ms:=Reg.Groups[4];
  173 +      if Length(ms)=1 then ms:=ms+'00';
  174 +      if Length(ms)=2 then ms:=ms+'0'; //对于毫秒,进行补零操作
  175 +      ans:=(StrToInt(Reg.Groups[1]) * 60 * 1000)+(StrToInt(Reg.Groups[2])*1000)+StrToInt(ms);
  176 +    end;
  177 +  finally
  178 +    Reg.Free;
  179 +    Result:=ans;
  180 +  end;
  181 + end;
  182 +
  183 +第四步:
  184 +
  185 +快速排序算法,这个实在是没有什么好说的,排序的目的是为了将歌词按正常顺序全部输出,方便做滚动字幕,同时也方便二分查找。
  186 +
  187 + procedure QuickSort(const left, right: Integer);
  188 + //QSort 不解释
  189 +   procedure swap(const i, j: Integer);
  190 +   var
  191 +     vT: Integer;
  192 +     vS: String;
  193 +   begin
  194 +     if i = j then Exit;
  195 +     vT := Lrc[i].Time;
  196 +     Lrc[i].Time := Lrc[j].Time;
  197 +     Lrc[j].Time := vT; 
  198 +     vS := Lrc[i].Content;
  199 +     Lrc[i].Content := Lrc[j].Content;
  200 +     Lrc[j].Content := vS;
  201 +   end;
  202 + var
  203 +   vL, vR: Integer;
  204 + begin
  205 +   if left >= right then Exit;
  206 +   vL := left;
  207 +   vR := right + 1;
  208 +   while True do
  209 +   begin
  210 +     while vL + 1 < Length(Lrc) do
  211 +     begin
  212 +       Inc(vL);
  213 +       if Lrc[vL].Time >= Lrc[left].Time then Break;
  214 +     end;
  215 +     while vR - 1 < Length(Lrc) do
  216 +     begin
  217 +       Dec(vR);
  218 +       if Lrc[vR].Time <= Lrc[left].Time then Break;
  219 +     end;
  220 +     if vL >= vR then Break;
  221 +     swap(vL, vR);
  222 +   end;
  223 +   swap(left, vR);
  224 +   QuickSort(left, vR - 1);
  225 +   QuickSort(vR + 1, right);
  226 + end;
  227 +
  228 +
  229 +这样,我们就已经成功地解析了Lrc歌词,并将它存放在内存(动态数组)里
14 posts/2011-02-11-pureplayer.markdown
Source Rendered
... ... @@ -0,0 +1,14 @@
  1 +---
  2 +layout: post
  3 +title: "蛋疼的开发了一个PurePlayer音乐播放器"
  4 +date: 2011-02-11 22:48
  5 +comments: true
  6 +categories: notes
  7 +---
  8 +![PurePlayer](http://i.imgur.com/TVlzw.png)
  9 +
  10 +<!-- more -->
  11 +
  12 +如图所示,基于基于Win32控制台,基本实现了LRC歌词等功能,当然了,不准备发布出来,自己用用就可以了
  13 +
  14 +准备将歌词部分整理出来,将思路写下来
18 posts/2011-02-11-thunder7skin.markdown
Source Rendered
... ... @@ -0,0 +1,18 @@
  1 +---
  2 +layout: post
  3 +title: "WPF仿迅雷7简易文本框焦点移动特效"
  4 +date: 2011-02-11 22:45
  5 +comments: true
  6 +categories: notes
  7 +---
  8 +![Thunder7](http://i.imgur.com/QLV64.png)
  9 +
  10 +
  11 +实现原理:
  12 +
  13 +在主窗体上绘制一个Border,然后每次文本框获得或者失去焦点的时候启动一个StoryBoard来移动Border。
  14 +<!-- more -->
  15 +
  16 +源代码下载:
  17 +
  18 +<http://down.4321.la/Thunder7Textbox.rar>
287 posts/2011-02-17-wpf-button.markdown
Source Rendered
... ... @@ -0,0 +1,287 @@
  1 +---
  2 +layout: post
  3 +title: "使用WPF创建具有渐变效果的按钮特效"
  4 +date: 2011-02-17 22:50
  5 +comments: true
  6 +categories: notes
  7 +---
  8 +对于我这样的不会C++,不会GDI+,不精通Photoshop的悲催人士来说,想实现华丽的界面,唯有使用WPF,虽然它属于托管平台,运行效率也非常低,但是在UI设计上确实是非常的给力。
  9 +
  10 +先放一张效果图:
  11 +
  12 +正常状态效果:![WPF](http://i.imgur.com/ubqSI.png)
  13 +
  14 +鼠标悬停效果:![WPF](http://i.imgur.com/eBe4B.png)
  15 +
  16 +<!-- more -->
  17 +
  18 +同时这期间含有的渐变外发光特效,图片上看不出来效果,大家可以下载我的320Kbps音乐下载助手即可看到效果,或者将下文的代码自己调试出来即可。
  19 +
  20 +{% blockquote %}
  21 +转载请注明 http://www.4321.la
  22 +{% endblockquote %}
  23 +
  24 +第一步,使用Microsoft Expression Blend 4新建一个WPF 3.5工程,如下图所示:
  25 +
  26 +![WPF](http://i.imgur.com/eBe4B.png)
  27 +
  28 +第二步,使用左侧工具栏添加一个Button到客户区中
  29 +![image](http://i.imgur.com/XX26G.png)
  30 +
  31 +![image](http://i.imgur.com/SFaaS.png)
  32 +
  33 +第三步,选中按钮,以此单击菜单对象 – 编辑样式 – 编辑副本
  34 +
  35 +![image](http://i.imgur.com/vMyRj.png)
  36 +
  37 +为了方便以后将相同的样式应用到别的按钮中,推荐选择定义位置为“应用程序”,同时起一个好记的名字:
  38 +
  39 +![image](http://i.imgur.com/pSMiG.png)
  40 +
  41 +单击确定按钮以后,程序会自动打开App.xaml文件,如下图所示:
  42 +
  43 +![image](http://i.imgur.com/anP8m.png)
  44 +
  45 +第四步,切换到XAML编辑模式,通过敲代码来实现一个绚丽的按钮,先实现更改默认的颜色
  46 +
  47 +![image](http://i.imgur.com/DNKaf.png)
  48 +
  49 +切换到XAML模式,顿时就会出现很多的代码(如图),不过微软还是比较仗义的,刷子、属性的名称都是用的比较通俗的英语……没有什么mov啊pop啊push啊什么的……
  50 +
  51 +![image](http://i.imgur.com/4YnYm.png)
  52 +
  53 +首先,先修改ButtonNormalBackground这个LinearGradientBrush(线性渐变刷子,更多信息参考MSDN,传送门),把Windows7/Vista自带的那种灰黑渐变的按钮改成白灰渐变。
  54 +
  55 +系统自动生成的代码是:
  56 +
  57 + <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
  58 +   <GradientStop Color="#F3F3F3" Offset="0"/>
  59 +   <GradientStop Color="#EBEBEB" Offset="0.5"/>
  60 +   <GradientStop Color="#DDDDDD" Offset="0.5"/>
  61 +   <GradientStop Color="#CDCDCD" Offset="1"/>
  62 + </LinearGradientBrush>
  63 +
  64 +将他修改成:
  65 +
  66 +
  67 + <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
  68 +    <GradientStop Color="#fefefe" Offset="0"/> <!--非鼠标Hover的背景颜色-->
  69 +    <GradientStop Color="#fefefe" Offset="0.5"/>
  70 +    <GradientStop Color="#efefef" Offset="0.5"/>
  71 +    <GradientStop Color="#efefef" Offset="1"/>
  72 + </LinearGradientBrush>
  73 +
  74 +(当然如果有自己喜欢的颜色也可以更改上去,或者也可以多加几个颜色渐变,Color是颜色,Offset是位置)
  75 +
  76 +到这里可以F5运行一下,非鼠标Hover的时候,就已经生效了!
  77 +
  78 +第五步,修改鼠标Hover时候的颜色以及渐变效果
  79 +
  80 +这时候发现下面的代码不给力了,微软没有Hover啊什么的这样的敏感关键词在里面,只能自己原创了……
  81 +
  82 +首先在
  83 +
  84 + <Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
  85 +
  86 +里面添加
  87 +
  88 + <Style.Resources>
  89 +
  90 +再添加两个Storyboard,用来显示渐变效果(这种时候还是敲代码最好,不推荐用什么可视化设计器):
  91 +
  92 +![image](http://i.imgur.com/b6K9I.png)
  93 +
  94 + <Style.Resources>
  95 +   <Storyboard x:Key="ButtonHover">
  96 +     <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)">
  97 +     <SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="5" />
  98 +     </DoubleAnimationUsingKeyFrames>
  99 +   </Storyboard>
  100 +   <Storyboard x:Key="ButtonWithoutHover">
  101 +     <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)">
  102 +     <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="0" />
  103 +     </DoubleAnimationUsingKeyFrames>
  104 +   </Storyboard>
  105 + </Style.Resources>
  106 +
  107 +关于上面的代码的作用,大家可以对照MSDN理解一下,<http://www.microsoft.com/china/MSDN/library/windev/longhorn/storyboardstory.mspx?mfr=true>
  108 +
  109 +然后我们在下面添加两个触发器(Style.Triggers),第一个触发器同时实现两个功能:启动Storyboard,修改按钮颜色;第二个触发器绑定的是IsPressed事件,让按钮按住的时候修改背景颜色为灰色,这样就有按下的感觉。
  110 +
  111 +![image](http://i.imgur.com/a3nO9.png)
  112 +
  113 +
  114 + <Style.Triggers>
  115 + <Trigger Property="IsMouseOver" Value="True">
  116 + <Trigger.ExitActions>
  117 + <BeginStoryboard x:Name="ButtonWithoutHover_BeginStoryboard" Storyboard="{StaticResource ButtonWithoutHover}"/>
  118 + </Trigger.ExitActions>
  119 + <Trigger.EnterActions>
  120 + <BeginStoryboard Storyboard="{StaticResource ButtonHover}"/>
  121 + </Trigger.EnterActions>
  122 + <Setter Property="Background">
  123 + <Setter.Value>
  124 + <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
  125 + <GradientStop Color="White" Offset="0"/> <!--鼠标Hover的背景颜色-->
  126 + <GradientStop Color="#fbfcfe" Offset="0.5"/>
  127 + <GradientStop Color="#d4e8fe" Offset="0.5"/>
  128 + <GradientStop Color="#fbfcfe" Offset="1"/>
  129 + </LinearGradientBrush>
  130 + </Setter.Value>
  131 + </Setter>
  132 + <Setter Property="Foreground" Value="#FF34AFF6"/>
  133 + </Trigger>
  134 + <Trigger Property="IsPressed" Value="True">
  135 + <Trigger.ExitActions>
  136 + <StopStoryboard BeginStoryboardName="ButtonWithoutHover_BeginStoryboard"/>
  137 + </Trigger.ExitActions>
  138 + <Trigger.EnterActions>
  139 + <BeginStoryboard x:Name="ButtonWithoutHover_BeginStoryboard1" Storyboard="{StaticResource ButtonWithoutHover}"/>
  140 + </Trigger.EnterActions>
  141 + <Setter Property="Background" Value="#eaeaea" />
  142 + <Setter Property="Foreground" Value="Gray"/>
  143 + </Trigger>
  144 + </Style.Triggers>
  145 +
  146 +再回头看看两个Storyboard,修改了按钮的OuterGlowBitmapEffect(外发光)特性,注意是修改,所以如果原来不存在这个属性的话,会出错,所以再在Triggers后面添加一个Setter
  147 +
  148 +![image](http://i.imgur.com/0VIsb.png)
  149 +
  150 + <Setter Property="BitmapEffect">
  151 +   <Setter.Value>
  152 +     <OuterGlowBitmapEffect GlowColor="#9ecaf4" GlowSize="0" />
  153 +   </Setter.Value>
  154 + </Setter>
  155 +
  156 +这时候可以按下F5运行一下看一下效果了。
  157 +
  158 +第六步,修复BUG
  159 +
  160 +这时大家会发现,辛苦自己写的外发光、渐变、背景修改等特效全部又被Windows自带的效果给覆盖了。
  161 +
  162 +其实正是因为我们之前选择编辑样式的时候选择了编辑副本,微软自动把默认的按钮样式给Copy进来了,方便进一步修改,所以新建样式的同时也需要删除掉不需要的样式。
  163 +
  164 +首先将<Setter Property="Template">中的<ControlTemplate.Triggers>删掉,删掉默认的触发器。
  165 +
  166 +![image](http://i.imgur.com/LgBpr.png)
  167 +
  168 +再将Microsoft_Windows_Themes:ButtonChrome里的RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" RenderDefaulted="{TemplateBinding IsDefaulted}"这部分删掉即可。
  169 +
  170 +此时整个
  171 +
  172 + <Setter Property="Template">
  173 +
  174 +的代码为
  175 +
  176 + <Setter Property="Template">
  177 + <Setter.Value>
  178 + <ControlTemplate TargetType="{x:Type Button}">
  179 + <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
  180 + <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
  181 + </Microsoft_Windows_Themes:ButtonChrome>
  182 + </ControlTemplate>
  183 + </Setter.Value>
  184 + </Setter>
  185 +
  186 +
  187 +完成!
  188 +
  189 +这样我们就实现了一个比较漂亮的按钮的样式,F5运行一下,已经没有BUG了。
  190 +
  191 +扩展,将已有的样式应用到新添加的按钮中
  192 +
  193 +如果需要把新建按钮同时应用这个样式的话,很简单,只需要设置Button的Style="{DynamicResource ButtonStyle}"
  194 +
  195 +如下图所示:
  196 +
  197 +![image](http://i.imgur.com/zO3z0.png)
  198 +
  199 +至此就全部完成了,没手工写API,不用自己搞神马HDC,连Photoshop也没开,敲代码就可以实现非常漂亮的按钮样式。
  200 +
  201 +附录 完工后的XAML按钮样式部分代码:
  202 +
  203 + <Style x:Key="ButtonFocusVisual">
  204 + <Setter Property="Control.Template">
  205 + <Setter.Value>
  206 + <ControlTemplate>
  207 + <Rectangle Stroke="Black" StrokeDashArray="1 2" StrokeThickness="1" Margin="2" SnapsToDevicePixels="true"/>
  208 + </ControlTemplate>
  209 + </Setter.Value>
  210 + </Setter>
  211 + </Style>
  212 + <LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
  213 + <GradientStop Color="#fefefe" Offset="0"/> <!--非鼠标Hover的背景颜色-->
  214 + <GradientStop Color="#fefefe" Offset="0.5"/>
  215 + <GradientStop Color="#efefef" Offset="0.5"/>
  216 + <GradientStop Color="#efefef" Offset="1"/>
  217 + </LinearGradientBrush>
  218 + <SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/>
  219 + <Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
  220 + <Style.Resources>
  221 + <Storyboard x:Key="ButtonHover">
  222 + <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)">
  223 + <SplineDoubleKeyFrame KeyTime="00:00:00.2000000" Value="5" />
  224 + </DoubleAnimationUsingKeyFrames>
  225 + </Storyboard>
  226 +
  227 + <Storyboard x:Key="ButtonWithoutHover">
  228 + <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.BitmapEffect).(OuterGlowBitmapEffect.GlowSize)">
  229 + <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="0" />
  230 + </DoubleAnimationUsingKeyFrames>
  231 + </Storyboard>
  232 + </Style.Resources>
  233 + <Style.Triggers>
  234 + <Trigger Property="IsMouseOver" Value="True">
  235 + <Trigger.ExitActions>
  236 + <BeginStoryboard x:Name="ButtonWithoutHover_BeginStoryboard" Storyboard="{StaticResource ButtonWithoutHover}"/>
  237 + </Trigger.ExitActions>
  238 + <Trigger.EnterActions>
  239 + <BeginStoryboard Storyboard="{StaticResource ButtonHover}"/>
  240 + </Trigger.EnterActions>
  241 + <Setter Property="Background">
  242 + <Setter.Value>
  243 + <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
  244 + <GradientStop Color="White" Offset="0"/> <!--鼠标Hover的背景颜色-->
  245 + <GradientStop Color="#fbfcfe" Offset="0.5"/>
  246 + <GradientStop Color="#d4e8fe" Offset="0.5"/>
  247 + <GradientStop Color="#fbfcfe" Offset="1"/>
  248 + </LinearGradientBrush>
  249 + </Setter.Value>
  250 + </Setter>
  251 + <Setter Property="Foreground" Value="#FF34AFF6"/>
  252 + </Trigger>
  253 + <Trigger Property="IsPressed" Value="True">
  254 + <Trigger.ExitActions>
  255 + <StopStoryboard BeginStoryboardName="ButtonWithoutHover_BeginStoryboard"/>
  256 + </Trigger.ExitActions>
  257 + <Trigger.EnterActions>
  258 + <BeginStoryboard x:Name="ButtonWithoutHover_BeginStoryboard1" Storyboard="{StaticResource ButtonWithoutHover}"/>
  259 + </Trigger.EnterActions>
  260 + <Setter Property="Background" Value="#eaeaea" />
  261 + <Setter Property="Foreground" Value="Gray"/>
  262 + </Trigger>
  263 + </Style.Triggers>
  264 + <Setter Property="BitmapEffect">
  265 + <Setter.Value>
  266 + <OuterGlowBitmapEffect GlowColor="#9ecaf4" GlowSize="0" />
  267 + </Setter.Value>
  268 + </Setter>
  269 + <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
  270 + <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
  271 + <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/>
  272 + <Setter Property="BorderThickness" Value="1"/>
  273 + <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
  274 + <Setter Property="FontFamily" Value="微软雅黑" />
  275 + <Setter Property="HorizontalContentAlignment" Value="Center"/>
  276 + <Setter Property="VerticalContentAlignment" Value="Center"/>
  277 + <Setter Property="Padding" Value="1"/>
  278 + <Setter Property="Template">
  279 + <Setter.Value>
  280 + <ControlTemplate TargetType="{x:Type Button}">
  281 + <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" >
  282 + <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True"/>
  283 + </Microsoft_Windows_Themes:ButtonChrome>
  284 + </ControlTemplate>
  285 + </Setter.Value>
  286 + </Setter>
  287 + </Style>
65 posts/2011-03-05-musicseeker.markdown
Source Rendered
... ... @@ -0,0 +1,65 @@
  1 +---
  2 +layout: post
  3 +title: "MusicSeeker——歌曲、专辑图片、歌词全自动下载工具"
  4 +date: 2011-03-05 23:08
  5 +comments: false
  6 +categories: ideas
  7 +---
  8 +
  9 +MusicSeeker是一款基于MusicDonwloader设计思想的,为iPhone、iPod Touch、Android等大屏幕触摸手机、MP4开发的音乐下载软件。
  10 +
  11 +软件名称:MusicSeeker
  12 +
  13 +软件特性:自动选择最高码率(320Kbps)、自动下载导入专辑图片、自动下载LRC歌词、自动下载支持iTunes的静态歌词、自动添加到iTunes音乐库。
  14 +
  15 +最后更新:2011年3月20日13:30:04
  16 +
  17 +![image](http://i.imgur.com/M8LbA.png)
  18 +
  19 +<!-- more -->
  20 +
  21 +软件介绍:介于很多朋友对我的MusicDownloader的支持,以及旧版遗留的诸多问题,这次我专门抽时间进行了全新的开发,旨在解决问题和更好的给大家提供服务。新版MusicSeeker在MusicDownloader的基础上添加了码率显示、低码率文件下载支持、LRC歌词及静态歌词下载支持。
  22 +
  23 +全新设计的UI: 皮肤设计 – 恋星(<http://yistring.com/ifun/>),感谢恋星对软件的开发提供界面设计。
  24 +
  25 +![image](http://i.imgur.com/FAvLo.png)
  26 +
  27 +新版的MusicSeeker添加了对歌曲信息的编辑功能的支持,如果您想要下载的歌曲的名称过于繁冗,或者专辑名称错误导致无法找到正确的专辑图片,均可以在添加下载任务的时候进行修改。PS:单击“应用”的同时程序会重新根据专辑来获取专辑图片。
  28 +
  29 +![image](http://i.imgur.com/ZTIDI.png)
  30 +
  31 +歌曲会自动下载到 我的文档 – 我的音乐 目录,当然您也可以通过双击下载列表来迅速定位到文件
  32 +
  33 +LRC歌词自动下载,并保存到音乐所在目录,与音乐文件同文件名:
  34 +
  35 +![image](http://i.imgur.com/m6Pff.png)
  36 +
  37 +如果勾选了“自动下载专辑图片”“自动下载歌词”等功能,下载下来的图片是完全兼容iTunes的:
  38 +
  39 +![image](http://i.imgur.com/UFico.png)
  40 +
  41 +在我的iPod Touch里面的播放效果:
  42 +
  43 +![image](http://i.imgur.com/qr3lU.png)
  44 +
  45 +最重要的是,歌词、专辑图片全部都是一键下载,完全不需要手动再去搜索资源!
  46 +
  47 +要运行MusicSeeker,您的PC必须安装有Microsoft .Net Framework 3.5 SP1以及微软雅黑字体,如果您使用的Windows 7/Vista系统,则系统已经自带,无需再次安装,如果您用的是Windows Xp系统,则也请下载我们的软件进行运行,如果缺少以上组件,程序会给出提示,同时给出具体的解决方案。
  48 +
  49 +下载地址:
  50 +
  51 +直接下载 – <http://down.4321.la/MusicSeeker20110320.zip> (支持迅雷等下载工具)
  52 +
  53 +最后更新:2011年3月20日13:30:37
  54 +
  55 +更新版本:0.11
  56 +
  57 +更新内容:
  58 +
  59 +1、修复已知崩溃问题、歌词匹配不准的问题
  60 +
  61 +2、增加韩文搜索支持
  62 +
  63 +
  64 +
  65 +**(MusicSeeker目前仅是从MusicDownloader上继续开发而来的第一个版本,在停止MusicDownloader项目的同时,MusicSeeker后续版本将会给大家带来更全的歌曲曲库、试听等更加实用的功能,敬请期待。)**
72 posts/2011-04-05-musicsorter-faq.markdown
Source Rendered
... ... @@ -0,0 +1,72 @@
  1 +---
  2 +layout: post
  3 +title: "MusicSorter使用教程"
  4 +date: 2011-04-05 23:15
  5 +comments: false
  6 +categories: ideas
  7 +---
  8 +首先,感谢您选用MusicSorter作为您的音乐整理软件,推荐您仔细阅读下面的教程,以获得更加的用户体验。
  9 +
  10 +<!-- more -->
  11 +
  12 +教程一:添加歌曲
  13 +
  14 +启动软件,等待Loading画面结束,单击软件左下角的“![image](http://i.imgur.com/1XHS8.png)”按钮即可
  15 +
  16 +在添加对话框中,您可以多选文件,或者按Ctrl+A全选一个文件夹内的所有文件
  17 +
  18 +![image](http://i.imgur.com/b1sqP.png)
  19 +
  20 +当前版本仅支持MP3类型的文件,其它类型的文件会自动忽略,无需手动排除
  21 +
  22 +教程二:选中歌曲、自动下载专辑图片、歌曲歌词
  23 +
  24 +![image](http://i.imgur.com/s7DLX.png)
  25 +
  26 +添加歌曲之后,如果歌曲本身已经带有专辑图片、歌词的话,软件右面就会有![image](http://i.imgur.com/Xl4vC.png)的提示
  27 +
  28 +选中一款不含专辑图片或者歌词的歌曲,程序就会自动开始搜索,并在右边显示出来搜索出来的专辑封面的结果
  29 +
  30 +![image](http://i.imgur.com/U9uRD.png)
  31 +
  32 +
  33 +专辑封面的两侧有时候有“<“”>”的按钮,意味着有多个专辑图片供您选择。
  34 +
  35 +如果搜索不到结果,请在下面的”歌曲信息“里面进行修改,然后按回车键重新调用软件自动搜索
  36 +
  37 +对于专辑图片错误的歌曲,也可以通过对歌曲信息修改并按回车键的方法来重新激活软件搜索
  38 +
  39 +![image](http://i.imgur.com/qjLI5.png)
  40 +
  41 +当歌曲专辑图片OK后,就可以单击“保存”按钮保存修改到歌曲了!
  42 +
  43 +这时歌曲列表的左边对应的歌曲也会显示出歌曲已经包含专辑图片了。
  44 +
  45 +![image](http://i.imgur.com/iB6vu.png)
  46 +
  47 +教程三:手动编辑歌词、删除歌词或专辑图片
  48 +
  49 +右键单击歌曲项目,会弹出快捷菜单,支持编辑、删除歌曲歌词,删除专辑图片。
  50 +
  51 +方便在专辑图片或歌曲歌词错误的时候进行人工修改。
  52 +
  53 +![image](http://i.imgur.com/6i8De.png)
  54 +
  55 +![image](http://i.imgur.com/h99Zk.png)
  56 +
  57 +教程四:批量下载
  58 +
  59 +批量下载适用于歌曲较多、歌曲ID3已经比较整齐的情况,如果您的歌曲大多都是百度下载的,ID3标签并不是非常准确,则批量下载的体验会因此大大折扣。
  60 +
  61 +另外软件处于测试阶段,强烈推荐您在批量下载之前备份您的歌曲,如果遇到任何批量下载过程中软件崩溃、歌曲损坏的问题,请及时联系我们。
  62 +
  63 +批量下载的方法非常简单,添加歌曲、单击”下载全部歌曲歌词“即可!
  64 +
  65 +下载前推荐您关闭迅雷等占用带宽的软件,以加快软件下载专辑图片的速度。
  66 +
  67 +![image](http://i.imgur.com/Tcwmu.png)
  68 +
  69 +
  70 +软件的大概使用方法就是这样了,有任何的问题请从软件发布帖内留言回复或者通过E-Mail、微博联系我,这篇文章关闭回复,不然实在是忙不过来,呵呵。
  71 +
  72 +再次感谢您的支持
78 posts/2011-04-08-musicsorter-musicnamer.markdown
Source Rendered
... ... @@ -0,0 +1,78 @@
  1 +---
  2 +layout: post
  3 +title: "MusicSorter + MusicNamer – 整理音乐?No Problem!"
  4 +date: 2011-04-08 23:18
  5 +comments: true
  6 +categories: ideas
  7 +---
  8 +MusicSeeker发布以后有很多的朋友支持我,同时有很多人提出开发一款整理现有音乐的软件,断断续续的开发了一个月,基本完工了,就是您现在正在看的软件——MusicSorter。
  9 +
  10 +MusicSorter是一款整理已有音乐、自动下载专辑图片、下载静态歌词保存到iTunes等软件可以识别的标签中的软件,非常适合iPhone、iPod Touch等大屏幕等支持专辑图片显示的手机、MP4。
  11 +
  12 +<!-- more -->
  13 +
  14 +最后更新:2011年6月7日 16:01:54
  15 +
  16 +更新内容:1、修复歌词算法的一处BUG 2、添加手动选择歌词 手动搜索歌词的功能
  17 +
  18 +![image](http://i.imgur.com/aNNoS.png)
  19 +
  20 +
  21 +首先感谢恋星同学(http://yistring.com/ifun/)软件开发提供的皮肤设计,超赞!
  22 +
  23 +软件启动界面如下:
  24 +
  25 +![image](http://i.imgur.com/2Eap1.png)
  26 +
  27 +批量下载截图:
  28 +
  29 +![image](http://i.imgur.com/rUo4p.png)
  30 +
  31 +整理效果截图:
  32 +
  33 +歌曲的专辑图片已经井然有序,这时候导入iTunes等软件就非常方便省事了。
  34 +
  35 +![image](http://i.imgur.com/ifskJ.png)
  36 +
  37 +
  38 +
  39 +2011年6月7日 更新内容说明:
  40 +
  41 +
  42 +![image](http://i.imgur.com/fnX0S.jpg)
  43 +
  44 +
  45 +歌曲右键 – 编辑歌曲歌词中,添加功能,方便手动搜索歌词。
  46 +
  47 +————————————————————————————————————
  48 +
  49 +补充说明:
  50 +
  51 +1、要运行MusicSorter,您的PC必须安装有Microsoft .Net Framework 3.5 SP1以及微软雅黑字体,如果您使用的Windows 7/Vista系统,则系统已经自带,无需再次安装,如果您用的是Windows XP系统,则也请下载我们的软件进行运行,如果缺少以上组件,程序会给出提示,同时给出具体的解决方案。
  52 +
  53 +(如果您的电脑已经成功运行MusicSeeker,则运行MusicSorter就不会有任何问题,同时MusicSorter针对64位系统进行了专门优化,支持原生64位模式下运行!)
  54 +
  55 +2、软件当前处于测试阶段,强烈推荐您在开启批量下载前备份您的歌曲!
  56 +
  57 +3、关于软件的使用教程,请查看MusicSorter的软件使用教程,因为我对UI交互不是很在行,希望大家多多谅解,耐心读一下教程,有任何使用上的问题请直接回复该文章或者给我发E-Mail,收到邮件的第一时间会回复大家的!
  58 +
  59 +教程传送门:http://blog.4321.la/2011/04/318.html
  60 +
  61 +————————————————————————————————————
  62 +
  63 +MusicNamer:
  64 +
  65 +MusicSorter的开发离不开Shindo同学的支持,本次发布中联合发布MusicSorter与MusicNamer这两款软件,MusicNamer是一款根据歌曲ID3标签自动重命名软件的轻量级工具,基于Windows SDK开发:
  66 +
  67 +![image](http://i.imgur.com/D3Ddq.jpg)
  68 +
  69 +更多信息,请访问MusicNamer发布页:<http://sdou.net/2011/04/133.html>
  70 +
  71 +
  72 +————————————————————————————————————
  73 +
  74 +下载地址(MusicSorter + MusicNamer)
  75 +
  76 +直接下载地址:<http://down.4321.la/MusicSorterNamer20110607.zip>
  77 +
  78 +感谢各位的支持,欢迎大家提出意见建议,您的支持是我们最大的动力!
47 posts/2011-05-07-kissxiami.markdown
Source Rendered
... ... @@ -0,0 +1,47 @@
  1 +---
  2 +layout: post
  3 +title: "KissXiami – 轻量级在线虾米音乐下载网站上线"
  4 +date: 2011-05-07 23:31
  5 +comments: true
  6 +categories: ideas
  7 +---
  8 +KissXiami.com是我在开发MusicSeeker和MusicSorter这样的.NET WPF架构的东西时的业余作品,主要是想练练PHP,网站非盈利,无广告,简洁的界面……
  9 +
  10 +如果你直接打开KissXiami.com的话,估计会失望……是的,网站简陋到连个首页都木有……
  11 +
  12 +那如何使用呢?
  13 +
  14 +方法很简单:
  15 +
  16 +第一步:上虾米网站上找到自己中意的单曲、专辑、歌手页面、精选集页面。
  17 +
  18 +第二步:从浏览器打开页面。
  19 +
  20 +以上两步做不好的人请自觉去书店买一本老年人学电脑……
  21 +
  22 +例如此时打开的页面的网址是:http://www.xiami.com/song/1769196206
  23 +
  24 +然后,把鼠标放在地址栏上,对,就是显示地址的那东西(据说有一个O开头的浏览器会把地址后面部分隐藏,点一下就可以了……)
  25 +
  26 +![image](http://i.imgur.com/TBsO2.png)
  27 +
  28 +然后更改网址,把www.xiami.com改成www.kissxiami.com,其实说明白了,就是在xiami前面加上一个kiss
  29 +
  30 +![image](http://i.imgur.com/jlaRL.png)
  31 +
  32 +然后,按下亲爱的回车键,就是键盘上标有Enter的那个按键
  33 +
  34 +![image](http://i.imgur.com/9ywms.png)
  35 +
  36 +
  37 +网页载入完毕以后就会自动探测歌曲的下载地址,音质是虾米的试听音质,很搓,但是总比没有好……
  38 +
  39 +如果你想追求更完美的音质,还是推荐您看看我老早就发布了的那一款软件:MusicSeeker
  40 +
  41 +至于下载,虽然说迅雷也不是不可以,但是我测试还是用目标另存为下载的效果最好,迅雷有时候有速度有时候没有的挺麻烦的……
  42 +
  43 +就写这么多吧,目前KissXiami支持单曲、专辑、歌手页面、精选集,使用的方法都一样,都是把网址里的xiami.com前面加上kiss即可
  44 +
  45 +
  46 +
  47 +感谢您的支持,有任何问题或者意见建议请从下面评论,或者给我发E-Mail。
85 posts/2011-05-07-musicseeker2.markdown
Source Rendered
... ... @@ -0,0 +1,85 @@
  1 +---
  2 +layout: post
  3 +title: "MusicSeeker – 歌曲、专辑图片、歌词全自动下载工具 Version 2.0"
  4 +date: 2011-05-07 23:27
  5 +comments: true
  6 +categories: ideas
  7 +---
  8 +MusicSeeker 2.0 是一款基于MusicDonwloader设计思想的,为iPhone、iPod Touch、Android等大屏幕触摸手机、MP4开发的音乐下载软件,基于MusicSeeker第一个版本完善改进而来。
  9 +
  10 +
  11 +
  12 +MusicSeeker 2.0软件特性:
  13 +
  14 +0 自动选择最高码率MP3音质(320Kbps)、自动下载导入专辑图片、自动下载LRC歌词、自动下载支持iTunes的静态歌词
  15 +
  16 +1 采用全新的UI设计,基于Windows Aero思想。
  17 +
  18 +2 添加无损音乐(FLAC\APE)源(仅支持部分歌曲)。
  19 +
  20 +3 添加对Windows-64Bit的原生支持(非WOW64)。
  21 +
  22 +4 添加音乐视听功能、音乐分享功能。
  23 +
  24 +5 添加下载目录设置功能。
  25 +
  26 +6 添加全局异常捕获,一定程度防止软件崩溃。
  27 +
  28 +7 修复歌曲下载歌词混乱的BUG。
  29 +
  30 +8 修复下载歌曲重名的BUG,采用“歌曲名 – 歌手名.扩展名”的命名方式。
  31 +
  32 +9 去除部分繁冗的选项,删除自动添加到iTunes的功能(多占用磁盘空间)。
  33 +
  34 +10 删除部分软件特效动画,增加软件运行流畅度。
  35 +
  36 +11 添加对低码率音乐的搜索支持,完善搜索算法,音乐库资源更加全面!
  37 +
  38 +12 进一步完善对日文、韩文搜索优化
  39 +
  40 +![image](http://i.imgur.com/Z4htO.png)
  41 +
  42 +
  43 +软件介绍:MusicSeeker第一版发布以来,着实解决了许多网友下载音乐的问题,虽然软件是从MusicDownloader上完善而来,但是仍然存在着一些问题,这个版本在修复问题的同时,也进一步的加强了软件的易用性。
  44 +
  45 +<!-- more -->
  46 +
  47 +