Exaile-cn开发小组

2 views
Skip to first unread message

润良 马

unread,
Aug 2, 2009, 6:37:17 AM8/2/09
to Exaile-cn开发小组
这个主要用来记录一些开发动态和相关的信息,其实目前看来用途还不算特别的大,因为我的开发速度、时间、精力、能力实在有限,这个项目也是只有
我一个人知道,基本等于无人问津……
不管怎么样,希望这个项目以后能够做好、做大,给中国Linuxer提供一个好的播放器,从而增加Linux在中国的普及程度!

润良 马

unread,
Aug 2, 2009, 8:36:13 AM8/2/09
to Exaile-cn开发小组
这个帖子可以用来专门写一些动态......现在微博客比较靠不住,干脆用这个

On 8月2日, 下午6时37分, 润良 马 <billno...@gmail.com> wrote:
> 这个主要用来记录一些开发动态和相关的信息,其实目前看来用途还不算特别的大,因为我的开发速度、时间、精力、能力实在有限,这个项目也是只有

> 我一个人知道,基本等于无人问津......

润良 马

unread,
Aug 2, 2009, 8:38:03 AM8/2/09
to Exaile-cn开发小组
不过感觉google的论坛反应速度严重值得怀疑

BillMa

unread,
Aug 3, 2009, 4:37:22 AM8/3/09
to Exaile-cn开发小组
今天没怎么写这玩意,说一下下一步的计划:
1.用glade做一个显示歌词的界面,需要有4-5行,其中突出显示一行,作为同步使用,这个是字体方面的功夫,具体要用的,应该是
pango.FontDescription()这个东西和textView.modify_font()
2.还要做一个歌词选择的界面,当初先多个歌词时,用来选择(现在默认是选择一个)……这个应该不难实现
3.存储歌词的功能,就是一个保存吧,从最简单的直接保存做起就可以了
4.安装功能,目前这个先不考虑,具体的安装功能,实际上现在看来,就是将歌词插件拷贝到插件目录下,让exaile支持中文……
5.错误处理,有很多的try,expect没有写,这是个大问题,主要是我不太会使用这个……以后再写的时候,工作量会很大,现在写又没有精力……苦
恼啊

详细的说一下计划1:
界面上要有五行歌词,自动载入(当没有歌词时,可以直接弹出一个框显示没有歌词……)一行结束换一行,其中一行的字体设置与别的不同,使得这一
行可以突出显示,作为当前行,所以要有一个时间工具,不断的获取播放的歌词的时间,用来同步歌词
On 8月2日, 下午8时38分, 润良 马 <billno...@gmail.com> wrote:
> 不过感觉google的论坛反应速度严重值得怀疑

BillMa

unread,
Aug 3, 2009, 4:38:23 AM8/3/09
to Exaile-cn开发小组
实在不行就把现在的成果发出去,找别人做……不过还是有点舍不得,不到最后一个,不用这个计划!

BillMa

unread,
Aug 3, 2009, 4:40:36 AM8/3/09
to Exaile-cn开发小组
知识不足,还得回去看python tutorial……,另外还有一个顾虑,就是一旦exaile到3,那么2的很多东西的可能被改掉,这个可能会很
恐怖!

BillMa

unread,
Aug 3, 2009, 10:53:58 AM8/3/09
to Exaile-cn开发小组
一点对lrc文件的成果,主要就是使用正则表达式,抓出所有的时间来……之前看了些代码跟lrc文件,发现并不是所有的lrc都是一行一个时间的,例如
我去2000年里面,就是一行有两个时间,这个据我猜测,应该是那种repeat……,用findall()列举所有的时间
[04:20.00][01:57.00]泥锅泥碗你滚蛋
[04:20.00][01:57.00]sdfsdga
bill@bill-desktop:~$ python
Python 2.6.2 (release26-maint, Apr 19 2009, 01:56:41)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import re
>>> part = r'\[[0-9]+:[0-9]+\.[0-9]+\]'
>>> parOb = re.compile(part)
>>> m = parOb.findall('[04:20.00][01:57.00]sdfsdga')
>>> m
['[04:20.00]', '[01:57.00]']
>>> m = parOb.match('[04:20.00]')
>>> m
<_sre.SRE_Match object at 0xb7d5e218>
>>> m.group()
'[04:20.00]'
>>> m.group(0)
'[04:20.00]'
>>> m.span()
(0, 10)
>>> part = r'\[[0-9]+:[0-9]+\.[0-9]+\]'
>>> part = r"^\[[0-9][0-9][:.][0-5][0-9][:.][0-9][0-9]\]"
>>> parOb = re.compile(part)
>>> m = parOb.findall('[04:20.00][01:57.00]sdfsdga')
>>> m
['[04:20.00]']
>>> part = r"\[[0-9][0-9][:.][0-5][0-9][:.][0-9][0-9]\]"
>>> m = parOb.findall('[04:20.00][01:57.00]sdfsdga')
>>> m
['[04:20.00]']
>>> parOb = re.compile(part)
>>> m = parOb.findall('[04:20.00][01:57.00]sdfsdga')
>>> m
['[04:20.00]', '[01:57.00]']
下一步,应该继续用正则表达式,抓出时间来,然后加起来,得出毫秒的时间(因为ms记得exaile里面的时间都是毫秒的)
稍候,再写这段

BillMa

unread,
Aug 5, 2009, 3:12:29 AM8/5/09
to Exaile-cn开发小组
准备转投exaile3,刚刚看到了launchpad里面的exaile项目(https://launchpad.net/exaile),上面有
张路线图,看来到今年9月份,3就要正式替代2了,https://launchpad.net/exaile/+series。ms8月20号就有
3.0出来了……,所以,现在,必须放弃2了!

BillMa

unread,
Aug 5, 2009, 3:29:19 AM8/5/09
to Exaile-cn开发小组
exaile3 乱码的处理,刚刚看了一下exaile3的代码,基本上跟2一样,但是结构更加清晰了,很好!
乱码的处理,跟2一样
def _get_tag(self, raw, t):
if not raw.tags: return []
if t not in self.tag_mapping.itervalues():
t = "TXXX:" + t
field = raw.tags.getall(t)
if len(field) <= 0:
return []
ret = []
if t == 'TDRC' or t == 'TDOR': # values are ID3TimeStamps
for value in field:
ret.extend([unicode(x.encode('iso-8859-1').decode
('gb2312')) for x in value.text])
elif t == 'USLT': # Lyrics are stored in plain old strings
for value in field:
ret.append(unicode(value.text.encode
('iso-8859-1').decode('gb2312')))
elif t == 'WOAR': # URLS are stored in url not text
for value in field:
ret.extend([unicode(x.replace('\n','').replace
('\r','').encode('iso-8859-1').decode('gb2312')) \
for x in value.url])
else:
for value in field:
try:
ret.extend([unicode(x.replace('\n','').replace
('\r','').encode('iso-8859-1').decode('gb2312')) \
for x in value.text])
except:
logger.warning("Can't parse ID3 field")
common.log_exception(logger)
return ret

BillMa

unread,
Aug 5, 2009, 3:35:26 AM8/5/09
to Exaile-cn开发小组
值得称赞的,在exaile3中,对id3 tags的读取的操作是通过一个统一的文件进行的,这样就方便了许多
exaile2中是把不同的文件类型的音乐用不同的文件操作的,这样比较混乱!哈哈,2to3,进步不小

BillMa

unread,
Aug 5, 2009, 4:55:45 AM8/5/09
to Exaile-cn开发小组
收集一些有用的网址
ExaileAPI http://exaile.org/wiki/ExaileAPI
官网 http://exaile.org
LaunchPad https://bugs.launchpad.net/exaile

BillMa

unread,
Aug 5, 2009, 5:03:20 AM8/5/09
to Exaile-cn开发小组
D-Bus_interface http://exaile.org/wiki/D-Bus_interface
Plugin_events http://exaile.org/wiki/Plugin_events


wiki这东西,我到现在也没真正搞懂……

On 8月5日, 下午4时55分, BillMa <billno...@gmail.com> wrote:
> 收集一些有用的网址
> ExaileAPIhttp://exaile.org/wiki/ExaileAPI
> 官网http://exaile.org
> LaunchPadhttps://bugs.launchpad.net/exaile

Bill Ma

unread,
Aug 5, 2009, 5:20:53 AM8/5/09
to exai...@googlegroups.com
测试一下用邮箱发贴

Bill Ma

unread,
Aug 6, 2009, 6:59:11 AM8/6/09
to exai...@googlegroups.com
不知道该做什么了……有点晕,这几天都没有什么动作,有点消极怠工……
想把这个项目送出去,可是还是觉得有点拿不出手……

Bill Ma

unread,
Aug 6, 2009, 8:57:34 AM8/6/09
to exai...@googlegroups.com
开始收集一些有用的数据
xl.event.add_callback(self.progress_update, 'progress_update', thread)

BillMa

unread,
Aug 6, 2009, 8:59:22 AM8/6/09
to Exaile-cn开发小组
exaile-devel还很不完整,很多的功能都还没有……真的很无奈……

Bill Ma

unread,
Aug 7, 2009, 10:05:55 AM8/7/09
to exai...@googlegroups.com
在xlmisc中有这个类,ms很好使,是用来构造时间器的
class MiscTimer(object):
"""
Creates a timer that executes a function
"""
def __init__(self, func, time, runonce=False):
"""
Expects the function to call. If runonce is True, the
timer only runs one time
"""
self.func = func
self.time = time
self.runonce = runonce
self.connect_id = None

def start(self):
"""
Starts the timer
"""
self.connect_id = gobject.timeout_add(self.time, self.notify)

def stop(self):
"""
Stops the timer
"""
if not self.connect_id: return
gobject.source_remove(self.connect_id)
self.connect_id = None

def notify(self):
"""
Called when the timer time has elapsed
"""
self.func()
if self.runonce: return False
else: return True
gui.main中有使用self.timer = xlmisc.MiscTimer(self.timer_update, 1000)
def timer_update(self, event=None):
"""
Fired every half second.
Updates the seeker position, the "now playing" title, and
submits the track to last.fm when appropriate
"""
status_text = ""
track_count = len(self.songs)

if track_count:
#TRANSLATORS: Number of tracks in the playlist
status_text += _("%d showing") % track_count

total_time = self.songs.get_total_length()
if total_time:
status_text += " (" + total_time + ")"

status_text += ", "

#TRANSLATORS: Number of tracks in the collection
status_text += _("%d in collection") % len(self.all_songs)
self.status.set_track_count(status_text)

track = self.player.current

self.rewind_track += 1

if track is None:
return True
duration = track.duration

# update the progress bar/label
value = self.player.get_current_position()
if duration == -1:
real = 0
else:
real = value * duration / 100
seconds = real

if not self.seeking and not self.player.is_paused():
self.new_progressbar =
self.xml.get_widget('new_progressbar')
fraction = value / 100
if fraction > 1: fraction = 1
self.new_progressbar.set_fraction(fraction)

if track.type == 'stream':
if track.start_time and self.player.is_playing():
seconds = time.time() - track.start_time
self.new_progressbar.set_text("%d:%02d" % # TODO:
i18n
(seconds // 60, seconds % 60))

else:
remaining_seconds = duration - seconds
self.new_progressbar.set_text("%d:%02d / %d:%02d" % #
TODO: i18n
(seconds // 60, seconds % 60,
remaining_seconds // 60, remaining_seconds % 60))

if not self.player.is_paused():
self.submit_time_played += 1

self.emit('timer_update')

return True

Bill Ma

unread,
Aug 7, 2009, 10:06:56 AM8/7/09
to exai...@googlegroups.com
很好,可以通过gobject.add_timeout来不断获得播放的时间已经成功了,下一
步,是对歌词文件的进一步分析……

Bill Ma

unread,
Aug 8, 2009, 2:10:35 AM8/8/09
to exai...@googlegroups.com
更新了Google Code,现在的这个plugin适用于exaile 2,可以在终端同步显示歌
词了

BillMa

unread,
Aug 8, 2009, 2:53:00 AM8/8/09
to Exaile-cn开发小组
下一步该写一个歌词显示的界面了,天,最讨厌的东西最终还是来了

Bill Ma

unread,
Aug 10, 2009, 4:23:52 AM8/10/09
to exai...@googlegroups.com
实现同步显示歌词的功能,已知Bug:在调整进度条后,歌词显示不能及时跟进

BillMa

unread,
Aug 11, 2009, 10:32:47 AM8/11/09
to Exaile-cn开发小组
进一步实现了一定的功能……

BillMa

unread,
Aug 11, 2009, 10:34:54 AM8/11/09
to Exaile-cn开发小组
在GUI上做了很多工作……这样一来,以后的行动就比较有计划性了,不错……

Bill Ma

unread,
Aug 12, 2009, 5:47:04 AM8/12/09
to exai...@googlegroups.com
真个的插件已经完成了很多内容,下一步想停下来,整理一下代码,因为发现代码
太乱了,在设计的开始并没有考虑到一些使用中与exaile配合的实际问题,再往下
做很困难了,需要不停的改……所以还不如停下来整理一下,看了一些别人写的插件
的代码,知道该怎么与exaile配合了

BillMa

unread,
Aug 13, 2009, 9:11:57 AM8/13/09
to Exaile-cn开发小组
整理工作暂时到此为止,现在基本上大部分功能都已经实现了,只剩下三个要做的功能:字体选择、手动搜索、对手动调整时间的反应(这个问题最重要,不太好
解决,主要是不想使代码太复杂)
歌词插件一直是尽量减少对CPU的使用,从而增大反应速度的所以,不想让它太大了

下一步想增加一些Mp3文件改名功能(这个在千千静听里也有)

BillMa

unread,
Aug 19, 2009, 1:21:42 AM8/19/09
to Exaile-cn开发小组
没办法,现在实在不知道该做些什么了……

BillMa

unread,
Aug 20, 2009, 6:48:24 AM8/20/09
to Exaile-cn开发小组
现在exaile0.2的插件已经基本定型了,大的改动应该不会再有了,功能上也不会在增加了,今天又看了一些exaile0.2的代码,想要继续的
化,这个版本实在太老了,有很多东西都没发往里面硬加上去:比如单曲循环……
那么,对0.2版本的开发,先暂时结束吧,反正至今也没人报什么大的bug,以后应该也不会有了……

BillMa

unread,
Aug 21, 2009, 9:11:17 AM8/21/09
to Exaile-cn开发小组
一切都已静止,等待新的爆发

BillMa

unread,
Aug 24, 2009, 10:43:24 AM8/24/09
to Exaile-cn开发小组
迟早会有的功能:根据歌词宽度改变窗口大小

On 8月21日, 下午9时11分, BillMa <billno...@gmail.com> wrote:
> 一切都已静止,等待新的爆发

BillMa

unread,
Aug 25, 2009, 10:53:35 AM8/25/09
to Exaile-cn开发小组
收到了careone制作的deb包,非常激动,很感谢啊

BillMa

unread,
Sep 30, 2009, 11:10:32 AM9/30/09
to Exaile-cn开发小组
很久没碰这玩意了,实在没时间

BillMa

unread,
Oct 1, 2009, 9:51:13 AM10/1/09
to Exaile-cn开发小组
歌词功能复活

BillMa

unread,
Oct 2, 2009, 10:52:08 AM10/2/09
to Exaile-cn开发小组
今天又改了些代码,程序仍然是不完整的,缺少太多想要的功能,离目标还很遥远……
现在看到的缺陷:
1.代码混乱、臃肿,如果继续写下去还会不断变得跟臃肿
2.效率极低
3.功能增加速度慢

再这样自己写下去可能永远写不出理想的程序,我的技术实在有点次了……而且也没有时间……

Exaile0.3发布很久了,昨天正式的用了一下,发现连个插件的选项都没有……突然更有一种无从下手的感觉……看来马上开发0.3上的插件是不太好
办了……

有几个计划:歌词功能的设置、更多的歌词源、可读性更强的代码

今天最大的进步是放弃用0.n方式来标记版本,改用日期,0.n实在没法控制……

润良 马

unread,
Nov 6, 2009, 4:45:36 AM11/6/09
to Exaile-cn开发小组
欣喜发现0.3x的插件开发指南wiki终于写出来了!!

润良 马

unread,
Nov 6, 2009, 9:54:58 AM11/6/09
to Exaile-cn开发小组
正在努力重写,for 0.3x
挺累的

润良 马

unread,
Nov 7, 2009, 1:12:03 AM11/7/09
to Exaile-cn开发小组
晕死,忙了一上午,写了不少,seek不能用,看了半天代码发现一行关于seek的都没有

马润良

unread,
Feb 26, 2010, 8:04:51 AM2/26/10
to Exaile-cn开发小组
Exaile-cn在一步步的成长中,慢慢变得强大起来了
Reply all
Reply to author
Forward
0 new messages