分类: 'gmbox' 的归档
gmbox发布0.2.4版本
自gmbox 0.2.4 beta以来,功能上基本没啥变化,主要是给windows完成打包。不过貌似在win7下跑依然会有问题,先发布0.2.4好了。下载以后,建议在设置里选一下自动下载歌词和自动下载专辑封面。注意专辑封面只在下载整个专辑的时候有效,下普通榜单里的歌,是不会有的。
另外,播放功能,暂时是用了mpg123实现的,windows版本也已经集成了mpg123的命令行二进制版本,可以放心使用。
下载地址:windows版本(6.3MB) linux版本(31.4KB)
gmbox发布0.2版本
gmbox自0.1版本发布以来,反映还算良好,一共也有2000多了下载量了。今天,0.2版本发布了,希望大家继续支持,嘿嘿。
其实,最近没怎么有时间写gmbox,所以这个版本和0.1比,差别并不是非常大,一些bug可能还是会继续有,不好意思啊。
导致我发布这个版本的直接原因是,今天google把音乐搜索的结果页面做了一点小小地改动,所以gmbox也得小小地改一下下。所以还是建议大家升级。
为了让这文章看起来更加像个“release note”,还是折腾个“ChangeLog”吧~
- 修改音乐搜索,适应google的页面改动
- 优化下载文件名的规则,可以按歌手建目录,加上专辑的Track No等。(可配置)
- 改进交互式CLI的命令名称和批处理CLI的参数名称,更加好记了。
- 搜索音乐和专辑的时候,支持主动翻页,搜索“周杰伦”不会只有20首歌了,顺便在搜索页面加上下载所选的按钮。
- 改进了windows版本的打包程序,windows下应该不会再出现运行不了的问题了。
- 完成了CLI指南的wiki页
差不多了,安装和运行方法之类,还是和0.1版本的一样,大家参考之前的文章好了。
下载地址:windows版本(6.2MB) linux版本(33.3KB)
gmbox发布0.1版本
好吧~ 今天发布gmbox V0.1版本了.
看看之前的日志,发现离我发第一篇博文的都已经过了近4个月了.
其实,离之前预想的发布日期不知道迟了多少,好在也没对外公布过发布计划,看来我对自己的”懒”还是有自知之明的,哈哈..
呃..还是说说gmbox吧,基本特性是:
- 支持谷歌音乐的”榜单下载”和”搜索下载”,而且,这两者都包含歌曲和专辑.
- 简单的可配置性
- linux系统可以调用mid3iconv自动修改歌曲的ID3信息编码
- 跨平台性,使用python做为核心,可以运行于大部分linux和windows操作系统,理论上mac也可以,没条件测试
- 界面和核心分离,默认有一个使用pygtk的界面,也可以使用命令行方式操作
安装方法:
- linux版本安装法:下载源码包后,解压,可以 sudo ./install -i 安装至系统目录,就可以在菜单选择”应用程序”-“影音”-“google music box”打开GUI界面,或者运行gmbox打开CLI界面. (-u可以卸载干净的.)
- linux版本不安装法: 下载源码包后,解压,直接运行 gmbox/src/mainwin.py 打开GUI界面; 直接运行 gmbox/src/cli.py 打开CLI界面.
- windows版本: 下载自解压包后,解压至任意目录,运行 mainwin.exe 打开GUI界面,运行 cli.exe 打开CLI界面.
使用方法:超简单,谁用谁知道…
已知bug:还蛮多的,比如试听不支持,歌词下载不支持,还有界面太丑等….哦,现在关闭主窗口,后台的下载进程还不会自动关掉的…以后慢慢完善吧.
再来个截图:
gmbox支持整个专辑下载了
由于我太懒了(LAZY bones嘛…),gmbox的开发进度一直很慢很慢…不过幸好还没有完全停滞下来,这段时间都在陆陆续续零零星星地增加些新的功能.
现在,gmbox的专辑下载功能已经基本可用了.包括几个专辑榜单的获取以及专辑搜索,然后新增了一个”专辑下载到各自目录”的配置项,如果勾选了,下载专辑时,就会在下载目录下新增”专辑名-歌手名”的目录,并把此专辑下的所有歌曲放到这个目录.
但是,目前并没有下载某专辑里面的特定几首歌曲的功能,不知道是否有这个必要…
源码仍然只能从SVN获取,大家说是时候放出下载链接了么?
折腾py2exe
序: 恩,这个确实挺折腾的,几乎一个下午都在搞py2exe,加上晚上又搞了一会儿,总算勉强让gmbox的exe可执行文件运行起来了…
首先,为什么要折腾py2exe呢? 其实就是为了那个gmbox,在设计之初,我就让它打算跨平台支持windows的.为此我也折腾过windows的python运行环境.但是如果那样的话,有windows的朋友要用gmbox,就必须安装python、GTK+库、PyCairo、PyGObject和PyGTK,这可不是一般的烦.所以有市场就会有需求,像我这样的问题我肯定不是第一个遇到的.于是就有了py2exe.
py2exe实际上是python distutils的一个扩展,使用py2exe,你必需有一个windows的环境,安装了python和你程序用到的依赖包(例如gmbox的pygtk等),也就是说,在这个”开发环境”你要能够运行起你的程序,然后下载py2exe,安装到python的lib目录下,就可以用来生成目标exe文件了,以后你只要把生成的东西复制到其他windows的机器,就可以脱离python运行环境和库的依赖了.是不是很爽呢?
虽说网上都说py2exe用起来很简单,但是我还是折腾了不少时间,可能是因为gmbox比较特殊:同时有CLI和GUI,有图标和数据文件,有自己的lib库等,当然更可能是因为我太菜了…嘿嘿..
不管怎么说,在这里记一下折腾的步骤,也许可以让后人少走点弯路:
- 打包文件(gmbox的打包文件在这里,建议边参考代码,边看下面的内容)最好要和你的主程序文件放在同一目录下.我曾经试着把打包文件放在上级目录,结果在搜索依赖库的时候遇到了很多麻烦.
- 打包文件本身其实也是一个python的程序,虽然一般只有一个setup函数.此函数可以有 name,description,version,console,windows,options,data_files 等参数.
- 要生成一个或多个命令行的exe,setup需要一个List型的名为console参数,指名源py文件.
- 要生成一个或多个GUI的exe,setup需要一个List型的名为windows参数,指名源py文件.List的每项都可以有图标等选项,就是icon_resources哪里,图标也是个Tuple的List,但是windows一般只会显示出第一个图标,所以一个就够了.
- 如果你想用png文件直接当图标,那很可能会在生成exe的时候,引起python崩溃,所以还是赶紧转成ico吧
- 如果你和我一样,生成的GUI的exe文件,在执行的时候,报 ImportError: No module named cairo ,那最好在setup函数里加上options,里面有include cairo的选项.
- 如果你也有数据文件(比如glade文件,图片文件等),py2exe默认并不会帮你一起打包,你需要在setup函数中加传data_files参数.data_files需要是一个List,每项可以是直接指向数据文件的字符串,也可以是一个Tuple;如果是前者,数据文件会直接在生成的dist目录下面,如果是后者,Tuple的第一个元素是目标目录,第二个元素是是个源文件名的List,效果是把所有的源文件存放在dist下的指定的目标目录下.(呃,好长好拗口…)
- 在py2exe生成的环境中,__file__这个应用将失效,这个问题的解决方法可以参看这里.个人觉得Alternate Solution更加靠谱.
- 好了,现在如果你已经写好了打包文件(win_packer.py),也对源代码进行了应有的修改,你就可以执行 python win_packer.py py2exe 来生成exe了,执行此命令会在当前目录下多出一个 dist 目录,你只要把dist目录复制出来,运行里面的exe,就可以了
- 最后,如果你的GUI程序还是运行不了,你还需要手工将你的GTK+安装安装目录(默认是C:\GTK)下的etc和lib目录复制到dist目录
当然,由于包含了一堆的运行环境,生成的dist目录将会是比较巨大的,现在的gmbox的exe居然有18M多,嘿嘿,应该还有优化和压缩的空间,改天再研究了~
python用着太顺手了
(此文纯属自言自语,基本可以忽略,呵呵.)
python用着太顺手了,其实是很久以前就有这种感觉,最近印象比较深的一次就是在做Project Euler的第一题的时候,那题比较简单,要求1000以内所有能被3或5整除的自然数之和.这题其实用什么语言都不复杂,但是用python的话,只需要一行:
sum([n for n in range(1000) if n%3==0 or n%5==0]) |
接近自然语言的表达看起来好舒服,而且也相当简洁.
然后今天,我又更新了一下gmbox,基本上把CLI重新写了一遍,又有同样的感觉了.gmbox的命令行,分交互式和非交互式两种,刚好用cmd和optparse两个内置模块轻松搞定.而且cmd模块支持欢迎界面/自定义提示符/readline库;optparse支持长短选项和混杂无序的选项,并自动生成帮助界面.真是太爽了.这两种模式加起来才140行左右的代码.去掉文件头,只有120行…
以后继续学习python.哈…
由gmbox发现了一个python文档的bug
今天lerosua还是说gmbox在他电脑上运行不了,我终于觉得不对劲了,因为在我机器上,已经是没有问题的了.
稍微分析了一下,发现错误是这样的:
File "/home/leros/work/gmbox/src/lib/parser.py", line 49, in handle_starttag if v[n.index('title')]==u'下载': AttributeError: 'tuple' object has no attribute 'index' |
这附近的代码是这样的:
(n,v)=zip(*attrs) if v[n.index('title')]==u'下载': |
所以,首先想到的自然是zip这个自建函数,它返回的n和v到底是什么呢?tuple还是list?
于是去查了下官方文档,就发现不对劲了,文档中的例子:
>>> x = [1, 2, 3] >>> y = [4, 5, 6] >>> zipped = zip(x, y) >>> zipped [(1, 4), (2, 5), (3, 6)] >>> x2, y2 = zip(*zipped) >>> x == x2, y == y2 True |
按这样的描述,返回的x2和x应该都是list,但是实践了一下,发现返回的却是tuple…这不乱了吗?于是又跑了一下这个例子,最后一行却不是True,而是(False, False)…就这样发现了文档的一个小错误.
可怜我之前一直非常崇拜python的文档,认为它简直就是文档的典范,详细,可读性也好.现在,突然发现一点瑕疵,不免有些失望呢,TX说也有相同的感觉,哈哈.不过,想想自己能给最喜欢的文档提个bug倒也蛮有成就感的.
python开发也很是活跃,这个bug提交上去以后,仅仅用了15分钟,Georg Brandl就已经把它给干掉了~哈哈,新的文档,最后那里改成了:
>>> x == list(x2) and y == list(y2) True |
于是我也学者这个样子,给我的gmbox加了一行:
n,v=list(n),list(v) |
问题就解决了.
最后,还有一个疑问,为什么之前那样,在python2.5下不行,但是在python2.6下却又不报错呢?
呵呵,答案就是:python2.6给tuple也加了个类似list的index方法…于是歪打正着,在py2.6下,就正确了.
python 跨平台运行笔记
最近在折腾gmbox,这个东东我设想是要让它跨平台运行的,原本想跨平台可能会比较麻烦,但是试了一下才知道,确实非常简单.这都得益于python本身的跨平台特性.
纯python程序要在win下运行,只要简单地下载并安装python运行环境,就会自动做好.py文件和python的关联,要运行一个python程序,只需简单地双击即可.
如果是用pygtk的图选界面程序的画,会稍微麻烦一点点,在如上安装了python运行环境以后,还需要分别安装GTK+库、PyCairo、PyGObject和PyGTK才行.安装路径最好都是用默认的.
另外,我还发现,如果是在vbox的虚拟XP里运行py程序,程序所在目录又是vbox分配的”数据空间”的话,在import自己写的模块的(也就是把.py转成.pyc)时候,就会产生
OverflowError: modification time overflows a 4 byte field
这样的错误…
再另外,对于中文的处理,在纯python下,只要在所有字符串常量前加u,表示是unicode字符串,就完全没有问题的.但是到了pygtk,就会有些麻烦,也许可以参考这里.还要再研究研究.
谷歌音乐下载器
之前有很多下载baidu mp3的程序,有bash的,java的,python的,其中也包括我这个.
但是baidu的歌曲都是用程序收集自网络的,所以排行榜的歌曲质量就没有保障了,下载下来的歌曲ID3信息可谓一塌糊涂,而且还可能下载到网友自己翻唱的歌或者其他杂七杂八的东西,严重影响我们的听觉神经.
而谷歌(不是google)最近推出了谷歌音乐搜索,联合top100,也推出了类似百度榜单的音乐排行榜.但不同于百度的是,谷歌里的歌曲都是收集整理过的,不会有死链,质量也很不错,而且,对于最终非商业用途的个人用户而言,是不存在版权问题的(但我不确定批量下载下来的有没有版权问题.请用户自行考虑.).
所以我顺势就推出了这个谷歌音乐下载器 .
目前程序还很简陋,没有图形界面,也没有很多可以设置的地方.运行程序只会把”华语新歌”这个榜单的100首歌下载到本地当前目录.所以仅供有兴趣尝鲜的同学测试使用.但是以后,我打算把这个程序做成有图形界面的,可以试听/下载/播放的一个整合工具,哈哈.请大家多多关注吧.
PS:有人说这类工具还是不要发布出来,小范围流传下比较好,因为发布出来以后,很可能遭到google的封杀.这说法其实也有些道理,但是我想想,如果谷歌真的因为这个来封杀我,我也够有面子的,嘿嘿.所以我还是按照Google的Project hosting页面所说的做了: Release early, release often