Skip to content

Commit

Permalink
Merge branch 'master' of github.com:cosven/FeelUOwn
Browse files Browse the repository at this point in the history
  • Loading branch information
cosven committed Mar 1, 2016
2 parents 121bc78 + cb8e964 commit 6bf6621
Show file tree
Hide file tree
Showing 16 changed files with 133 additions and 39 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ sudo dnf install feeluown
```

### archlinux安装
感谢 @wenLiangcan
<https://aur.archlinux.org/packages/feeluown-git/>

```sh
yaourt -S feeluown-git
Expand Down
12 changes: 10 additions & 2 deletions feeluown/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,18 @@


class Config(MutableMapping):
"""load default config and user config
user config can override default config
"""
def __init__(self):
self._data = dict()

def load(self, path=CONFIG_FILE_PATH):
# load default config first, there may be some new key field which not
# exists in user config
with open(DEFAULT_CONFIG_FILE_PATH, 'r') as f:
self._data.update(yaml.load(f))
try:
with open(path, 'r') as f:
self._data.update(yaml.load(f))
Expand All @@ -30,8 +38,8 @@ def save(self, path=CONFIG_FILE_PATH):
def __getitem__(self, key):
return self._data[self.__keytransform__(key)]

def __setitem__(self, key):
return self._data[self.__keytransform__(key)]
def __setitem__(self, key, value):
self._data[self.__keytransform__(key)] = value

def __keytransform__(self, key):
return key
Expand Down
2 changes: 1 addition & 1 deletion feeluown/controller_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ def toggle_desktop_mini(cls):
else:
ControllerApi.desktop_mini.show()
ControllerApi.notify_widget.show_message(
"Tips", "按ESC可以退出mini模式哦 ~")
"Tips", "按ESC可以退出mini模式哦 ~")

@classmethod
@pyqtSlot(int)
Expand Down
3 changes: 3 additions & 0 deletions feeluown/default_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,7 @@ lyric:
songs:
dirs: [~/Music]
download: ~/Music

width: 960
height: 600
...
62 changes: 35 additions & 27 deletions feeluown/glue.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ def __init__(self, parent=None):
self.setAttribute(Qt.WA_MacShowFocusRect, False)
self.setWindowIcon(QIcon(WINDOW_ICON))
self.setWindowTitle('FeelUOwn')
self.resize(1000, 608)

self.mode_manager = ModesManger()
self._init_signal_binding()
Expand Down Expand Up @@ -103,33 +102,34 @@ def _init_signal_binding(self):
ViewOp.ui.QUIT_ACTION.triggered.connect(sys.exit)
ViewOp.ui.SONG_PROGRESS_SLIDER.sliderMoved.connect(ControllerApi.seek)
ViewOp.ui.SHOW_CURRENT_SONGS.clicked.connect(
self._show_current_playlist)
self._show_current_playlist)

ViewOp.ui.SEARCH_BOX.returnPressed.connect(self._search_music)
ViewOp.ui.LOVE_SONG_BTN.clicked.connect(
ViewOp.on_set_favorite_btn_clicked)
ViewOp.on_set_favorite_btn_clicked)
ViewOp.ui.SIMI_SONGS_BTN.clicked.connect(
self.mode_manager.change_to_simi)
self.mode_manager.change_to_simi)

ViewOp.ui.SHOW_DESKTOP_MINI.clicked.connect(self.switch_desktop_mini)

ViewOp.ui.PLAY_OR_PAUSE.clicked.connect(
ViewOp.on_play_or_pause_clicked)
ViewOp.on_play_or_pause_clicked)

ViewOp.ui.WEBVIEW.signal_play.connect(self.on_play_song_clicked)
ViewOp.ui.WEBVIEW.signal_play_songs.connect(self.on_play_songs)
ViewOp.ui.WEBVIEW.signal_play_song_ids.connect(self.on_play_song_ids)
ViewOp.ui.WEBVIEW.signal_play_mv.connect(ControllerApi.play_mv_by_mvid)
ViewOp.ui.WEBVIEW.signal_search_album.connect(self.search_album)
ViewOp.ui.WEBVIEW.signal_search_artist.connect(self.search_artist)

ViewOp.ui.PLAY_PREVIOUS_SONG_BTN.clicked.connect(
ControllerApi.player.play_last)
ControllerApi.player.play_last)
ViewOp.ui.PLAY_NEXT_SONG_BTN.clicked.connect(
ControllerApi.player.play_next)
ControllerApi.player.play_next)
ViewOp.ui.PLAY_MV_BTN.clicked.connect(
ViewOp.on_play_current_song_mv_clicked)
ViewOp.on_play_current_song_mv_clicked)
ViewOp.ui.SHOW_LYRIC_BTN.clicked.connect(
ControllerApi.toggle_lyric_widget)
ControllerApi.toggle_lyric_widget)

ViewOp.ui.SPREAD_BTN_FOR_MY_LIST.clicked.connect(
ViewOp.ui.MY_LIST_WIDGET.fold_spread_with_animation)
Expand All @@ -140,38 +140,38 @@ def _init_signal_binding(self):
ViewOp.ui.NEW_PLAYLIST_BTN.clicked.connect(ViewOp.new_playlist)

ControllerApi.player.signal_player_media_changed.connect(
ViewOp.on_player_media_changed)
ViewOp.on_player_media_changed)
ControllerApi.player.stateChanged.connect(
ViewOp.on_player_state_changed)
ViewOp.on_player_state_changed)
ControllerApi.player.positionChanged.connect(
ViewOp.on_player_position_changed)
ViewOp.on_player_position_changed)
ControllerApi.player.durationChanged.connect(
ViewOp.on_player_duration_changed)
ViewOp.on_player_duration_changed)
ControllerApi.player.signal_playlist_is_empty.connect(
self.on_playlist_empty)
self.on_playlist_empty)
ControllerApi.player.signal_playback_mode_changed.connect(
ViewOp.ui.STATUS_BAR.playmode_switch_label.on_mode_changed)
ControllerApi.player.signal_playback_mode_changed.connect(
feeluown.config.on_playback_mode_change)

ControllerApi.network_manager.finished.connect(
ControllerApi.network_manager.access_network_queue)
ControllerApi.network_manager.access_network_queue)

ControllerApi.desktop_mini.content.set_song_like_signal.connect(
ViewOp.on_set_favorite_btn_clicked)
ViewOp.on_set_favorite_btn_clicked)
ControllerApi.desktop_mini.content.play_last_music_signal.connect(
ControllerApi.player.play_last)
ControllerApi.player.play_last)
ControllerApi.desktop_mini.content.play_next_music_signal.connect(
ControllerApi.player.play_next)
ControllerApi.player.play_next)
ControllerApi.desktop_mini.close_signal.connect(self.show)

ViewOp.ui.FM_ITEM.signal_text_btn_clicked.connect(
self.mode_manager.change_to_fm)
self.mode_manager.change_to_fm)
ViewOp.ui.RECOMMEND_ITEM.signal_text_btn_clicked.connect(
ViewOp.on_recommend_item_clicked)
ViewOp.on_recommend_item_clicked)

ControllerApi.current_playlist_widget.signal_play_music.connect(
self.on_play_song_clicked)
self.on_play_song_clicked)
ControllerApi.current_playlist_widget.signal_remove_music_from_list.\
connect(self.remove_music_from_list)

Expand All @@ -180,7 +180,7 @@ def _init_signal_binding(self):
ViewOp.ui.PROGRESS.setRange(0, 100)

ControllerApi.player.signal_download_progress.connect(
ViewOp.ui.PROGRESS.setValue)
ViewOp.ui.PROGRESS.setValue)

self._search_shortcut.activated.connect(ViewOp.ui.SEARCH_BOX.setFocus)
self._pre_focus.activated.connect(FocusManager.change_focus)
Expand Down Expand Up @@ -209,7 +209,9 @@ def _show_current_playlist(self):
def load_config(self):
LOG.info('load user config')
ControllerApi.player.set_play_mode(
feeluown.config['player']['playback_mode'])
feeluown.config['player']['playback_mode'])
self.resize(feeluown.config['width'],
feeluown.config['height'])

@pyqtSlot()
def pop_login(self):
Expand Down Expand Up @@ -238,15 +240,17 @@ def switch_desktop_mini(self):
self.hide()
ControllerApi.toggle_desktop_mini()

@pyqtSlot(int)
@pyqtSlot(list)
def on_play_songs(self, songs):
self.mode_manager.change_to_normal()
if len(songs) == 0:
ViewOp.ui.STATUS_BAR.showMessage(u'该列表没有歌曲', 2000)
return
ControllerApi.current_playlist_widget.set_songs(songs)
ControllerApi.player.set_music_list(songs)

@pyqtSlot(list)
def on_play_song_ids(self, song_ids):
songs = ControllerApi.api.get_songs_detail(song_ids)
self.on_play_songs(songs)

@pyqtSlot(int)
def remove_music_from_list(self, mid):
ControllerApi.player.remove_music(mid)
Expand Down Expand Up @@ -307,5 +311,9 @@ def paintEvent(self, event):
style = self.style()
style.drawPrimitive(QStyle.PE_Widget, option, painter, self)

def resizeEvent(self, event):
feeluown.config.update({'width': self.width(),
'height': self.height()})

def closeEvent(self, event):
ControllerApi.ready_to_quit()
7 changes: 7 additions & 0 deletions feeluown/plugin/NetEaseMusic/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,13 @@ def song_detail(self, music_id):
data = self.http_request('GET', action)
return data

def songs_detail(self, music_ids):
music_ids = [str(music_id) for music_id in music_ids]
action = 'http://music.163.com/api/song/detail?ids=[' +\
','.join(music_ids) + ']'
data = self.http_request('GET', action)
return data

# DJchannel ( id, channel_name ) ids --> song urls ( details )
# 将 channels 整理为 songs 类型
def channel_detail(self, channelids, offset=0):
Expand Down
10 changes: 10 additions & 0 deletions feeluown/plugin/NetEaseMusic/normalize.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,16 @@ def get_song_detail(self, mid):

return model

def get_songs_detail(self, mids):
data = self.ne.songs_detail(mids)
if not self.is_response_avaible(data):
return data
songs = []
for each in data['songs']:
song = self.access_music(each)
songs.append(song)
return songs

def update_playlist_detail(self, pid, data=None):
data = self.ne.playlist_detail(pid) if data is None else data
if not self.is_response_avaible(data):
Expand Down
7 changes: 5 additions & 2 deletions feeluown/themes/default.qss
Original file line number Diff line number Diff line change
Expand Up @@ -371,8 +371,11 @@ QLabel#album_img_label {
}

QLabel#remove_music {
border-image: url(../icons/trash_btn.png);
background-color: transparent;
color: #CCC;
}

QLabel#remove_music:hover {
color: #993333;
}

/* ****************************** */
Expand Down
19 changes: 18 additions & 1 deletion feeluown/web_assets/js/common.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,17 @@ SongTable.bind_music_play = function(){

$('.song').keydown(function(e){
var index = $('.song').index(this);
var total_songs = $('.song').length;
var sid = $(this).attr('id');

switch(e.which){
case 74: // key: j
$('.song').eq(index + 1).focus();
if (index == (total_songs-1)){
$('.song').eq(0).focus();
}
else{
$('.song').eq(index + 1).focus();
}
break;
case 75: // key: k
$('.song').eq(index - 1).focus()
Expand Down Expand Up @@ -121,6 +127,17 @@ SongTable.bind_music_play = function(){
var songsStr = JSON.stringify(songs);
js_python.play_songs(songsStr);
});

$('#play_all_ids').on('click', function(){
var songs = {};
var track_ids = [];
for (var i=0; i<window.songs.length; i++){
track_ids.push(window.songs[i].id);
}
songs.track_ids = track_ids;
var songsStr = JSON.stringify(songs);
js_python.play_song_ids(songsStr);
});
}

SongTable.tmpSaveSongsInfo = function(songs){
Expand Down
4 changes: 2 additions & 2 deletions feeluown/web_assets/playlist.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<!DOCTYPE>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
Expand Down Expand Up @@ -61,4 +61,4 @@
</div>
</div>
</body>
</html>
</html>
22 changes: 22 additions & 0 deletions feeluown/web_assets/public/recommend.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
.vcenter-wrapper {
text-align: center;
display: block;
}

#play_all_ids {
width: 80px;
height: 80px;
border-radius: 50px;
display: inline-block;
margin: 10px 0;
transition: 0.5s;
color: #993333;
line-height: 80px;
font-size: 15px;
color: #CCC;
background: #993333;
}

#play_all_ids:hover {
cursor: pointer;
}
7 changes: 6 additions & 1 deletion feeluown/web_assets/recommend.html
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<!DOCTYPE>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
Expand All @@ -7,12 +7,17 @@
<link rel="stylesheet" href="public/base_playlist.css">
<link rel="stylesheet" href="public/base.css">
<link rel="stylesheet" href="public/theme/base_default.css">
<link rel="stylesheet" href="public/recommend.css">
<script src="js/jquery.min.js"></script>
<script src="js/angular.min.js"></script>
<script src="js/bootstrap.min.js" ></script>
<script src="js/common.js"></script>
</head>
<body>

<div class="vcenter-wrapper">
<div id="play_all_ids">播放全部</div>
</div>
<div class="col-sm-12" ng-app="app_table" ng-controller="SongTable.initData" id="songs_table">
<table class="table table-condensed">
<thead>
Expand Down
2 changes: 1 addition & 1 deletion feeluown/widgets/desktop_mini.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ def __init__(self, parent=None):

self._layout.setContentsMargins(0, 0, 0, 0)
# self.setMask(QRegion(0, 0, self.width(), self.height(), QRegion.Ellipse))
self.setMask(QBitmap(ICON_PATH + "mask.bmp"))
self.setMask(QBitmap(ICON_PATH + "/mask.bmp"))
self.setMouseTracking(True)

self._init_position()
Expand Down
1 change: 1 addition & 0 deletions feeluown/widgets/music_table.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ def add_item_from_model(self, music_model):
btn = QLabel()
btn.setToolTip(u'从当前播放列表中移除')
btn.setObjectName('remove_music') # 为了应用QSS,不知道这种实现好不好
btn.setText('✖')
self.setCellWidget(row, 3, btn)
self.setRowHeight(row, 30)
self.setColumnWidth(3, 30)
Expand Down
8 changes: 8 additions & 0 deletions feeluown/widgets/webview.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
class WebView(QWebView):
signal_play = pyqtSignal([int])
signal_play_songs = pyqtSignal([list])
signal_play_song_ids = pyqtSignal([list])
signal_search_artist = pyqtSignal([int])
signal_search_album = pyqtSignal([int])
signal_play_mv = pyqtSignal([int])
Expand Down Expand Up @@ -73,6 +74,13 @@ def play_songs(self, songs_str):
tracks = songs['tracks']
self.signal_play_songs.emit(tracks)

@pyqtSlot(str)
def play_song_ids(self, songs_str):
LOG.debug('play songs by ids')
songs = json.loads(songs_str)
song_ids = songs['track_ids']
self.signal_play_song_ids.emit(song_ids)

@pyqtSlot(int)
def search_artist(self, aid):
LOG.debug("search artist info, the artist id is: " + str(aid))
Expand Down

0 comments on commit 6bf6621

Please sign in to comment.