Linux 桌面歌词的搞

首先有个这个东西: http://www.sanfanling.cn/read.php?311

最开始找到的时候觉得很好用啊.

但是有几个不爽:

  1. 几个歌词下载源太烂了, 简直哭瞎.
  2. 我用的 amarok, 切换 track 的时候不能自动切歌词

搞 1

作为前虾米后网易新近网易线下用户, 拉歌词当然还是从网易拉比较好. 其实还有一个原因, 是自带的歌词引擎基本算挂完了, 太垃圾

从 https://github.com/cosven/FeelUOwn/blob/master/src/plugin/NetEaseMusic/api.py 拉到别人写的网易云音乐 api.

然后给这个东西加一个 engine (在 engines 目录下) 就行了

比如 cat engines/engine_net_ease.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import engine;
from net_ease_api import NetEase;
import json

class net_ease(engine.engine):
    def __init__(self, proxy=None, locale=None):
        self.api = NetEase( );
        self.netEncoder='utf8';

    def request(self, artist, title):
        song_list = self.api.search(artist+"+"+title);
        # print json.dumps(song_list);
        lrc_list = []
        for each in song_list["result"]["songs"]:
            try:
                lrc = self.api.get_lyric_by_musicid(each["id"])
                lrc_list.append( ("/".join(name["name"] for name in each["artists"]), each["name"], lrc["lrc"]["lyric"].encode('utf8')) )
            except Exception, e:
                pass
        return (lrc_list, False)

然后要对他的 defineThread.py 做各种更改, 比如那个什么 p.downIt 的, 去死好了, 我们不要:

--- defineThread.py     (revision 305)
+++ defineThread.py     (working copy)
@@ -41,7 +41,7 @@
                        #print originalLrc[0][2]
                        if(self.t):
                                if(len(originalLrc)==1):
-                                       originalLrc,timeOut=p.downIt(originalLrc[0][2])
+                                       originalLrc,timeOut=originalLrc[0][2], False
                                        self.sleep(1)
                                        ev=netEvent(originalLrc,timeOut,p.netEncoder)
                                        QApplication.postEvent(self.receiver,ev)
@@ -69,7 +69,7 @@
                else:
                        exec 'p=%s.%s(self.proxy)' %(self.engine,self.engine)

-               originalLrc,timeOut=p.downIt(self.url)
+               originalLrc,timeOut=self.url, False
                ev=netEvent(originalLrc,timeOut,p.netEncoder,self.fromAdvDown)
                QApplication.postEvent(self.receiver,ev)

在 engines/__init__.py 里加上我们的引擎:

import engine_net_ease as net_ease;

搞 2

这好象是 内啥 MPRIS 改接口了或者 amarok 改接口了造成的.

真恶心.

看文档有一个叫做 TrackChange 的事件专门用来表示自动播放下一首歌了.

事件加回去就行.

--- players/amarok.py   (revision 305)
+++ players/amarok.py   (working copy)
@@ -11,6 +11,7 @@
                self.process = "amarok"
                dbusPlayer.__init__(self,"amarok","org.mpris.amarok","/Player","org.freedesktop.MediaPlayer")
                self.iface.connect_to_signal("StatusChange", self.statusChanged)
+               self.iface.connect_to_signal("TrackChange", self.gaoYiXia)

        #TRACK SECTION
        def getTitle(self):
@@ -64,3 +65,7 @@
                        return
                self.callback(self.toStatus(arg))

+       def gaoYiXia(self, arg):
+               if self.callback == None:
+                       return
+               self.callback(Status().Playing)
Index: players/dbusplayer.py

最后有一个小缺憾, 老是让我们选歌词, 很烦, 第一个结果给我不就好了.

defineThread.py 的 netThread class 里有一段代码, 大意是如果只有一个结果, 就直接使用, 否则让用户选择. 把 len(结果数量) == 1 改成 >= 1 就成.

还有一个 transparency 不能穿透, 默认不是 osd+transparency+always top 的问题, 以后再搞搞看

Leave a Reply

Your email address will not be published. Required fields are marked *