Last active
August 13, 2017 09:20
-
-
Save zhaobenx/d914fc87c57cf0cdc535059bd2fdda1c to your computer and use it in GitHub Desktop.
python3.6 requested
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
""" | |
Created on Fri Jun 30 13:59:19 2017 | |
@author: 凌丰 | |
""" | |
import sys | |
import os | |
from urllib.parse import unquote, quote | |
import urllib.request | |
import json | |
# import requests | |
def caesar(location): | |
num = int(location[0]) | |
avg_len = len(location[1:]) // num | |
remainder = len(location[1:]) % num | |
result = [] | |
for i in range(remainder): | |
line = location[i * (avg_len + 1) + 1: (i + 1) * (avg_len + 1) + 1] | |
result.append(line) | |
for i in range(num - remainder): | |
line = location[(avg_len + 1) * remainder:][i * | |
avg_len + 1: (i + 1) * avg_len + 1] | |
result.append(line) | |
s = [] | |
for i in range(avg_len): | |
for j in range(num): | |
s.append(result[j][i]) | |
for i in range(remainder): | |
s.append(result[i][-1]) | |
return unquote(''.join(s)).replace('^', '0') | |
def get_url(id): | |
target_url = 'http://www.xiami.com/song/playlist/id/' + \ | |
str(id) + '/object_name/default/object_id/0/cat/json' | |
# print(target_url) | |
request = urllib.request.Request(target_url) | |
request.add_header('content-type', 'application/json') | |
request.add_header( | |
'User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0') | |
response = urllib.request.urlopen(request).read().decode('utf8') | |
json_content = json.loads(response) | |
# print(json_content) | |
# print(json_content.json()['data']['trackList'][0]['location']) | |
name = json_content['data']['trackList'][0]['songName'] + '-' + \ | |
json_content['data']['trackList'][0]['singers'] + '.mp3' | |
encoded_url = json_content['data']['trackList'][0]['location'] | |
return name, encoded_url | |
def reporthook(blocknum, blocksize, totalsize, filename): | |
readsofar = blocknum * blocksize | |
if totalsize > 0: | |
percent = readsofar * 1e2 / totalsize | |
s = "\rDownloading " + filename + "%5.1f%% %*d / %d" % ( | |
percent, len(str(totalsize)), readsofar, totalsize) | |
sys.stderr.write(s) | |
if readsofar >= totalsize: # near the end | |
sys.stderr.write("\n") | |
else: # total size is unknown | |
sys.stderr.write("read %d\n" % (readsofar,)) | |
def download(url, name): | |
# with open('mp3/' + name, 'wb') as f: | |
# f.write(urllib.request.urlopen(url).read()) | |
urllib.request.urlretrieve( | |
url, 'mp3/' + name, lambda x, y, z: reporthook(x, y, z, name)) | |
print(name + " successful") | |
def search(name): | |
url = 'http://api.xiami.com/web?v=2.0&app_key=1&key={}&page=1&limit=5&r=search/songs'.format( | |
quote(name)) | |
request = urllib.request.Request(url) | |
request.add_header('content-type', 'application/json, text/plain, */*') | |
request.add_header( | |
'User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0') | |
request.add_header('Referer', 'http://m.xiami.com/') | |
response = urllib.request.urlopen(request).read().decode('utf8') | |
json_content = json.loads(response) | |
# print(json_content) | |
# print(response.read()) | |
return json_content['data']['songs'][0]['listen_file'],\ | |
json_content['data']['songs'][0]['song_name'] + '-' +\ | |
json_content['data']['songs'][0]['artist_name'] + '.mp3' | |
def download_by_id(song_id): | |
# TODO: fix encode error below | |
name, encoded_url = get_url(song_id) | |
download(caesar(encoded_url), name) | |
print(name.encode('utf-8').decode('utf-8') + " successful") | |
def download_by_name(name_list): | |
for i in name_list: | |
download(*search(i)) | |
from PyQt5 import QtCore, QtGui, QtWidgets | |
class Ui_MainWindow(object): | |
def setupUi(self, MainWindow): | |
MainWindow.setObjectName("MainWindow") | |
MainWindow.resize(373, 352) | |
self.centralwidget = QtWidgets.QWidget(MainWindow) | |
self.centralwidget.setObjectName("centralwidget") | |
self.gridLayoutWidget = QtWidgets.QWidget(self.centralwidget) | |
self.gridLayoutWidget.setGeometry(QtCore.QRect(50, 100, 261, 146)) | |
self.gridLayoutWidget.setObjectName("gridLayoutWidget") | |
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) | |
self.gridLayout.setContentsMargins(0, 0, 0, 0) | |
self.gridLayout.setObjectName("gridLayout") | |
self.plainTextEdit = QtWidgets.QPlainTextEdit(self.gridLayoutWidget) | |
self.plainTextEdit.setObjectName("plainTextEdit") | |
self.gridLayout.addWidget(self.plainTextEdit, 0, 0, 1, 1) | |
self.pushButton = QtWidgets.QPushButton(self.gridLayoutWidget) | |
self.pushButton.setObjectName("pushButton") | |
self.gridLayout.addWidget(self.pushButton, 1, 0, 1, 1) | |
self.label = QtWidgets.QLabel(self.gridLayoutWidget) | |
self.label.setText("") | |
self.label.setObjectName("label") | |
self.gridLayout.addWidget(self.label, 2, 0, 1, 1) | |
self.progressBar = QtWidgets.QProgressBar(self.gridLayoutWidget) | |
self.progressBar.setProperty("value", 0) | |
self.progressBar.setObjectName("progressBar") | |
self.gridLayout.addWidget(self.progressBar, 3, 0, 1, 1) | |
MainWindow.setCentralWidget(self.centralwidget) | |
self.statusbar = QtWidgets.QStatusBar(MainWindow) | |
self.statusbar.setObjectName("statusbar") | |
MainWindow.setStatusBar(self.statusbar) | |
self.retranslateUi(MainWindow) | |
QtCore.QMetaObject.connectSlotsByName(MainWindow) | |
def retranslateUi(self, MainWindow): | |
_translate = QtCore.QCoreApplication.translate | |
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) | |
self.plainTextEdit.setPlaceholderText(_translate("MainWindow", "请输入下载歌曲 每个歌曲占一行")) | |
self.pushButton.setText(_translate("MainWindow", "搜索下载")) | |
class Window(QtWidgets.QMainWindow, Ui_MainWindow): | |
def __init__(self): | |
QtWidgets.QMainWindow.__init__(self) | |
Ui_MainWindow.__init__(self) | |
self.setupUi(self) | |
self.init_connect() | |
def init_connect(self): | |
self.pushButton.clicked.connect(self.download_button) | |
def download_button(self): | |
# for line in self.plainTextEdit.toPlainText(): | |
# self.download(*search(line)) | |
for i in self.plainTextEdit.toPlainText().split('\n'): | |
self.download(*search(i)) | |
def download(self, url, name): | |
self.label.setText("Downloading {}".format(name)) | |
urllib.request.urlretrieve( | |
url, 'mp3/' + name, self.reporthook) | |
def reporthook(self, blocknum, blocksize, totalsize): | |
readsofar = blocknum * blocksize | |
if totalsize > 0: | |
percent = readsofar * 1e2 / totalsize | |
self.progressBar.setValue(percent) | |
else: # total size is unknown | |
self.progressBar.setDisabled() | |
if __name__ == '__main__': | |
if not os.path.exists('mp3'): | |
os.makedirs('mp3') | |
app = QtWidgets.QApplication(sys.argv) | |
window = Window() | |
window.show() | |
sys.exit(app.exec_()) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
""" | |
Created on Fri Jun 30 13:59:19 2017 | |
@author: 凌丰 | |
""" | |
import sys | |
import os | |
from urllib.parse import unquote, quote | |
import urllib.request | |
import json | |
# import requests | |
def caesar(location): | |
num = int(location[0]) | |
avg_len = len(location[1:]) // num | |
remainder = len(location[1:]) % num | |
result = [] | |
for i in range(remainder): | |
line = location[i * (avg_len + 1) + 1: (i + 1) * (avg_len + 1) + 1] | |
result.append(line) | |
for i in range(num - remainder): | |
line = location[(avg_len + 1) * remainder:][i * | |
avg_len + 1: (i + 1) * avg_len + 1] | |
result.append(line) | |
s = [] | |
for i in range(avg_len): | |
for j in range(num): | |
s.append(result[j][i]) | |
for i in range(remainder): | |
s.append(result[i][-1]) | |
return unquote(''.join(s)).replace('^', '0') | |
def get_url(id): | |
target_url = 'http://www.xiami.com/song/playlist/id/' + \ | |
str(id) + '/object_name/default/object_id/0/cat/json' | |
# print(target_url) | |
request = urllib.request.Request(target_url) | |
request.add_header('content-type', 'application/json') | |
request.add_header( | |
'User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0') | |
response = urllib.request.urlopen(request).read().decode('utf8') | |
json_content = json.loads(response) | |
# print(json_content) | |
# print(json_content.json()['data']['trackList'][0]['location']) | |
name = json_content['data']['trackList'][0]['songName'] + '-' + \ | |
json_content['data']['trackList'][0]['singers'] + '.mp3' | |
encoded_url = json_content['data']['trackList'][0]['location'] | |
return name, encoded_url | |
def reporthook(blocknum, blocksize, totalsize, filename): | |
readsofar = blocknum * blocksize | |
if totalsize > 0: | |
percent = readsofar * 1e2 / totalsize | |
s = "\rDownloading " + filename + "%5.1f%% %*d / %d" % ( | |
percent, len(str(totalsize)), readsofar, totalsize) | |
sys.stderr.write(s) | |
if readsofar >= totalsize: # near the end | |
sys.stderr.write("\n") | |
else: # total size is unknown | |
sys.stderr.write("read %d\n" % (readsofar,)) | |
def download(url, name): | |
# with open('mp3/' + name, 'wb') as f: | |
# f.write(urllib.request.urlopen(url).read()) | |
urllib.request.urlretrieve( | |
url, 'mp3/' + name, lambda x, y, z: reporthook(x, y, z, name)) | |
print(name + " successful") | |
def search(name): | |
url = 'http://api.xiami.com/web?v=2.0&app_key=1&key={}&page=1&limit=5&r=search/songs'.format( | |
quote(name)) | |
request = urllib.request.Request(url) | |
request.add_header('content-type', 'application/json, text/plain, */*') | |
request.add_header( | |
'User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0') | |
request.add_header('Referer', 'http://m.xiami.com/') | |
response = urllib.request.urlopen(request).read().decode('utf8') | |
json_content = json.loads(response) | |
# print(json_content) | |
# print(response.read()) | |
return json_content['data']['songs'][0]['listen_file'],\ | |
json_content['data']['songs'][0]['song_name'] + '-' +\ | |
json_content['data']['songs'][0]['artist_name'] + '.mp3' | |
def download_by_id(song_id): | |
# TODO: fix encode error below | |
name, encoded_url = get_url(song_id) | |
download(caesar(encoded_url), name) | |
print(name.encode('utf-8').decode('utf-8') + " successful") | |
def download_by_name(name_list): | |
for i in name_list: | |
download(*search(i)) | |
from PyQt5 import QtCore, QtGui, QtWidgets | |
class Ui_MainWindow(object): | |
def setupUi(self, MainWindow): | |
MainWindow.setObjectName("MainWindow") | |
MainWindow.resize(373, 352) | |
self.centralwidget = QtWidgets.QWidget(MainWindow) | |
self.centralwidget.setObjectName("centralwidget") | |
self.gridLayoutWidget = QtWidgets.QWidget(self.centralwidget) | |
self.gridLayoutWidget.setGeometry(QtCore.QRect(50, 100, 261, 146)) | |
self.gridLayoutWidget.setObjectName("gridLayoutWidget") | |
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) | |
self.gridLayout.setContentsMargins(0, 0, 0, 0) | |
self.gridLayout.setObjectName("gridLayout") | |
self.plainTextEdit = QtWidgets.QPlainTextEdit(self.gridLayoutWidget) | |
self.plainTextEdit.setObjectName("plainTextEdit") | |
self.gridLayout.addWidget(self.plainTextEdit, 0, 0, 1, 1) | |
self.pushButton = QtWidgets.QPushButton(self.gridLayoutWidget) | |
self.pushButton.setObjectName("pushButton") | |
self.gridLayout.addWidget(self.pushButton, 1, 0, 1, 1) | |
self.label = QtWidgets.QLabel(self.gridLayoutWidget) | |
self.label.setText("") | |
self.label.setObjectName("label") | |
self.gridLayout.addWidget(self.label, 2, 0, 1, 1) | |
self.progressBar = QtWidgets.QProgressBar(self.gridLayoutWidget) | |
self.progressBar.setProperty("value", 0) | |
self.progressBar.setObjectName("progressBar") | |
self.gridLayout.addWidget(self.progressBar, 3, 0, 1, 1) | |
MainWindow.setCentralWidget(self.centralwidget) | |
self.statusbar = QtWidgets.QStatusBar(MainWindow) | |
self.statusbar.setObjectName("statusbar") | |
MainWindow.setStatusBar(self.statusbar) | |
self.retranslateUi(MainWindow) | |
QtCore.QMetaObject.connectSlotsByName(MainWindow) | |
def retranslateUi(self, MainWindow): | |
_translate = QtCore.QCoreApplication.translate | |
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) | |
self.plainTextEdit.setPlaceholderText(_translate("MainWindow", "请输入下载歌曲 每个歌曲占一行")) | |
self.pushButton.setText(_translate("MainWindow", "搜索下载")) | |
class Window(QtWidgets.QMainWindow, Ui_MainWindow): | |
def __init__(self): | |
QtWidgets.QMainWindow.__init__(self) | |
Ui_MainWindow.__init__(self) | |
self.setupUi(self) | |
self.init_connect() | |
def init_connect(self): | |
self.pushButton.clicked.connect(self.download_button) | |
def download_button(self): | |
# for line in self.plainTextEdit.toPlainText(): | |
# self.download(*search(line)) | |
for i in self.plainTextEdit.toPlainText().split('\n'): | |
self.download(*search(i)) | |
def download(self, url, name): | |
self.label.setText("Downloading {}".format(name)) | |
urllib.request.urlretrieve( | |
url, 'mp3/' + name, self.reporthook) | |
def reporthook(self, blocknum, blocksize, totalsize): | |
readsofar = blocknum * blocksize | |
if totalsize > 0: | |
percent = readsofar * 1e2 / totalsize | |
self.progressBar.setValue(percent) | |
else: # total size is unknown | |
self.progressBar.setDisabled() | |
if __name__ == '__main__': | |
if not os.path.exists('mp3'): | |
os.makedirs('mp3') | |
app = QtWidgets.QApplication(sys.argv) | |
window = Window() | |
window.show() | |
sys.exit(app.exec_()) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
""" | |
Created on Fri Jun 30 13:59:19 2017 | |
@author: 凌丰 | |
""" | |
import sys | |
import os | |
from urllib.parse import unquote, quote | |
import urllib.request | |
import argparse | |
import json | |
# import requests | |
def caesar(location): | |
num = int(location[0]) | |
avg_len = len(location[1:]) // num | |
remainder = len(location[1:]) % num | |
result = [] | |
for i in range(remainder): | |
line = location[i * (avg_len + 1) + 1: (i + 1) * (avg_len + 1) + 1] | |
result.append(line) | |
for i in range(num - remainder): | |
line = location[(avg_len + 1) * remainder:][i * | |
avg_len + 1: (i + 1) * avg_len + 1] | |
result.append(line) | |
s = [] | |
for i in range(avg_len): | |
for j in range(num): | |
s.append(result[j][i]) | |
for i in range(remainder): | |
s.append(result[i][-1]) | |
return unquote(''.join(s)).replace('^', '0') | |
def get_url(id): | |
target_url = 'http://www.xiami.com/song/playlist/id/' + \ | |
str(id) + '/object_name/default/object_id/0/cat/json' | |
# print(target_url) | |
request = urllib.request.Request(target_url) | |
request.add_header('content-type', 'application/json') | |
request.add_header( | |
'User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0') | |
response = urllib.request.urlopen(request).read().decode('utf8') | |
json_content = json.loads(response) | |
# print(json_content) | |
# print(json_content.json()['data']['trackList'][0]['location']) | |
name = json_content['data']['trackList'][0]['songName'] + '-' + \ | |
json_content['data']['trackList'][0]['singers'] + '.mp3' | |
encoded_url = json_content['data']['trackList'][0]['location'] | |
return name, encoded_url | |
def reporthook(blocknum, blocksize, totalsize, filename): | |
readsofar = blocknum * blocksize | |
if totalsize > 0: | |
percent = readsofar * 1e2 / totalsize | |
s = "\rDownloading " + filename + "%5.1f%% %*d / %d" % ( | |
percent, len(str(totalsize)), readsofar, totalsize) | |
sys.stderr.write(s) | |
if readsofar >= totalsize: # near the end | |
sys.stderr.write("\n") | |
else: # total size is unknown | |
sys.stderr.write("read %d\n" % (readsofar,)) | |
def download(url, name): | |
# with open('mp3/' + name, 'wb') as f: | |
# f.write(urllib.request.urlopen(url).read()) | |
urllib.request.urlretrieve( | |
url, 'mp3/' + name, lambda x, y, z: reporthook(x, y, z, name)) | |
print(name + " successful") | |
def search(name): | |
url = 'http://api.xiami.com/web?v=2.0&app_key=1&key={}&page=1&limit=5&r=search/songs'.format( | |
quote(name)) | |
request = urllib.request.Request(url) | |
request.add_header('content-type', 'application/json, text/plain, */*') | |
request.add_header( | |
'User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0') | |
request.add_header('Referer', 'http://m.xiami.com/') | |
response = urllib.request.urlopen(request).read().decode('utf8') | |
json_content = json.loads(response) | |
# print(json_content) | |
# print(response.read()) | |
return json_content['data']['songs'][0]['listen_file'],\ | |
json_content['data']['songs'][0]['song_name'] + '-' +\ | |
json_content['data']['songs'][0]['artist_name'] + '.mp3' | |
def download_by_id(song_id): | |
# TODO: fix encode error below | |
name, encoded_url = get_url(song_id) | |
download(caesar(encoded_url), name) | |
print(name.encode('utf-8').decode('utf-8') + " successful") | |
def download_by_name(name_list): | |
for i in name_list: | |
download(*search(i)) | |
if __name__ == '__main__': | |
parser = argparse.ArgumentParser(description='请输入歌名或id') | |
parser.add_argument('-d', type=int, dest='song_id', | |
help='根据id下载') | |
parser.add_argument('-n', '--name', dest='name_list', default=[], action='append', | |
help='输入歌曲名, 如 --name "hello world",如有空格请以引号括开,可输入多个name') | |
args = parser.parse_args() | |
if len(sys.argv) == 1: | |
parser.print_help() | |
sys.exit(1) | |
if not os.path.exists('mp3'): | |
os.makedirs('mp3') | |
if args.song_id: | |
download_by_id(args.song_id) | |
if args.name_list: | |
download_by_name(args.name_list) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment