예제 #1
0
 def init_doubanfm(self):
     self.doubanfm = Doubanfm()
     self.play_count = 0
     self.song = {'sid': None}
     self.channel = self.config['channel']
     if self.config['email'] and self.config['password']:
         self.login(self.config['email'], self.config['password'])
예제 #2
0
class DoubanfmPlayer:
    def __init__(self):
        self.init_path()
        self.init_builder()
        self.init_widget()
        self.init_doubanfm()
        self.init_player()
        self.init_notify()
        self.init_indicator()

    def init_path(self):
        self.__dir__ = os.path.abspath(os.path.dirname(__file__))
        self.data_dir = os.path.expanduser('~/.pydoubanfm/')
        self.album_cover_dir = self.data_dir + 'albumcover/'
        self.config_path = self.data_dir + 'config.json'

        if not os.path.isdir(self.data_dir):
            os.mkdir(self.data_dir)

        if not os.path.isdir(self.album_cover_dir):
            os.mkdir(self.album_cover_dir)

        if os.path.isfile(self.config_path):
            self.config = json.load(open(self.config_path))
        else:
            self.config = {
                'channel': 0,
                'email': '',
                'password': ''}

    def init_builder(self):
        self.builder = Gtk.Builder()
        self.builder.add_from_file(self.__dir__ + '/doubanfm.glade')
        self.builder.connect_signals(self)
        self.builder.get_object('window-player').show_all()

    def init_widget(self):
        self.button_playback = self.builder.get_object('button-playback')
        self.button_rate = self.builder.get_object('button-rate')
        self.image_play = self.builder.get_object('image-play')
        self.image_pause = self.builder.get_object('image-pause')
        self.image_album_cover = self.builder.get_object('image-album-cover')
        self.indicator_menu = self.builder.get_object('indicator-menu')
        self.menuitem_playback = self.builder.get_object('menuitem-playback')
        self.menuitem_rate = self.builder.get_object('menuitem-rate')
        self.menuitem_title = self.builder.get_object('menuitem-title')

    def init_doubanfm(self):
        self.doubanfm = Doubanfm()
        self.play_count = 0
        self.song = {'sid': None}
        self.channel = self.config['channel']
        if self.config['email'] and self.config['password']:
            self.login(self.config['email'], self.config['password'])

    def init_player(self):
        self.player = Player()
        self.player.on_eos = self.on_eos

    def init_notify(self):
        Notify.init('pydoubanfm')
        self.notify = Notify.Notification.new('', '', '')

    def init_indicator(self):
        self.indicator = AppIndicator3.Indicator.new(
            'pydoubanfm', 'applications-multimedia',
            AppIndicator3.IndicatorCategory.APPLICATION_STATUS)
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
        self.indicator.set_icon(self.__dir__ + '/icon.png')
        self.indicator.set_menu(self.indicator_menu)

    def update_notify(self):
        self.notify.update(
            self.song['title'], self.song['artist'], self.album_cover_path)
        self.notify.show()

    def update_title(self):
        self.menuitem_title.set_label(
            self.song['title'] + ' - ' + self.song['artist'])

    def login(self, email, password):
        try:
            self.doubanfm.login(email, password)
        except Exception as error:
            dialog = Gtk.MessageDialog(
                None, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, '登录失败')
            dialog.format_secondary_text(error)
            dialog.run()
            dialog.destroy()

    def run(self):
        self.update_playlist('n')
        self.play()
        Gtk.main()

    def on_eos(self):
        if len(self.playlist) == self.play_count + 1:
            self.update_playlist('p')
            self.play_count = 0
        else:
            self.play_count += 1

        self.end_report()
        self.play()

    def play(self):
        self.song = self.playlist[self.play_count]
        self.player.set_uri(self.song['url'])
        self.player.play()
        self.set_album_cover()
        self.set_rate_state()
        self.update_notify()
        self.update_title()

    def end_report(self):
        self.doubanfm.get_playlist(self.channel, 'e', self.song['sid'])

    def update_playlist(self, type):
        self.playlist = self.doubanfm.get_playlist(
            self.channel, type, self.song['sid'])['song']

    def on_exit(self, *args):
        Gtk.main_quit(*args)
        self.config['channel'] = self.channel
        json.dump(self.config, open(self.config_path, 'w'), indent=2)

    def on_playback(self, widget):
        if self.player.get_state() == STATE_PLAYING:
            self.player.pause()
            self.button_playback.set_image(self.image_play)
            self.button_playback.set_tooltip_text('播放')
            self.menuitem_playback.set_label('播放')
        else:
            self.player.play()
            self.button_playback.set_image(self.image_pause)
            self.button_playback.set_tooltip_text('暂停')
            self.menuitem_playback.set_label('暂停')

    def on_rate(self, widget):
        if (type(widget) == Gtk.ToggleButton and self.button_rate.get_active()) or \
           (type(widget) == Gtk.MenuItem and not self.button_rate.get_active()):
            self.button_rate.set_tooltip_text('取消喜欢')
            self.menuitem_rate.set_label('取消喜欢')
            if self.song['like'] == 0:
                self.update_playlist('r')
                self.song['like'] = True
                self.play_count = 0
                self.button_rate.set_active(True)
        else:
            self.button_rate.set_tooltip_text('喜欢')
            self.menuitem_rate.set_label('喜欢')
            if self.song['like'] == 1:
                self.update_playlist('u')
                self.song['like'] = False
                self.play_count = 0
                self.button_rate.set_active(False)

    def on_delete(self, widget):
        self.next('b')

    def on_skip(self, widget):
        self.next('s')

    def on_volume_changed(self, widget, value):
        self.player.set_volume(value)

    def next(self, type):
        self.update_playlist(type)
        self.play_count = 0
        self.player.stop()
        self.play()

    def on_open_album(self, widget):
        os.system('sensible-browser http://music.douban.com' + self.song['album'])

    def set_album_cover(self):
        self.album_cover_path = \
            self.album_cover_dir + self.song['picture'].split('/')[-1]
        open(self.album_cover_path, 'wb') \
            .write(requests.get(self.song['picture']).content)
        self.image_album_cover.set_from_pixbuf(
            GdkPixbuf.Pixbuf.new_from_file_at_scale(
                self.album_cover_path, 240, -1, True))
        self.image_album_cover.set_tooltip_text(
            '标题:%s\n艺术家:%s\n专辑:%s' % (
                self.song['title'],
                self.song['artist'],
                self.song['albumtitle']))

    def set_rate_state(self):
        if self.song['like']:
            self.button_rate.set_active(True)
        else:
            self.button_rate.set_active(False)
예제 #3
0
class DoubanfmPlayer:
    def __init__(self):
        self.initPath()
        self.initBuilder()
        self.initWidget()
        self.initDoubanfm()
        self.initPlayer()
        self.initNotify()

    def initPath(self):
        self.__dir__ = os.path.abspath(os.path.dirname(__file__))
        self.dataDir = os.path.expanduser('~/.pydoubanfm/')
        self.albumCoverDir = self.dataDir + 'albumCover/'
        self.configPath = self.dataDir + 'config.json'

        if not os.path.isdir(self.dataDir):
            os.mkdir(self.dataDir)

        if not os.path.isdir(self.albumCoverDir):
            os.mkdir(self.albumCoverDir)

        if os.path.isfile(self.configPath):
            self.config = json.load(open(self.configPath))
        else:
            self.config = {
                'channel': 0,
                'email': '',
                'password': ''}

    def initBuilder(self):
        self.builder = Gtk.Builder()
        self.builder.add_from_file(self.__dir__ + '/doubanfm.glade')
        self.builder.connect_signals(self)
        self.builder.get_object('window-player').show_all()

    def initWidget(self):
        self.buttonPalyback = self.builder.get_object('button-playback')
        self.buttonRate = self.builder.get_object('button-rate')
        self.imagePlay = self.builder.get_object('image-play')
        self.imagePause = self.builder.get_object('image-pause')
        self.imageAlbumCover = self.builder.get_object('image-album-cover')

    def initDoubanfm(self):
        self.doubanfm = Doubanfm()
        self.playCount = 0
        self.song = {'sid': None}
        self.channel = self.config['channel']

        if self.config['email'] and self.config['password']:
            self.login(self.config['email'], self.config['password'])

    def initPlayer(self):
        self.player = Player()
        self.player.onEos = self.onEos

    def initNotify(self):
        Notify.init('pydoubanfm')
        self.notify = Notify.Notification.new('', '', '')

    def updateNotify(self):
        self.notify.update(
            self.song['title'], self.song['artist'], self.albumCoverPath)
        self.notify.show()

    def login(self, email, password):
        try:
            self.doubanfm.login(email, password)
        except Exception, error:
            dialog = Gtk.MessageDialog(None, 0,
                Gtk.MessageType.WARNING, Gtk.ButtonsType.OK, '登录失败')
            dialog.format_secondary_text(error)
            dialog.run()
            dialog.destroy()