Skip to content

Instantly share code, notes, and snippets.

@zhaobenx
Last active August 13, 2017 09:20
Show Gist options
  • Save zhaobenx/d914fc87c57cf0cdc535059bd2fdda1c to your computer and use it in GitHub Desktop.
Save zhaobenx/d914fc87c57cf0cdc535059bd2fdda1c to your computer and use it in GitHub Desktop.
python3.6 requested
# -*- 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_())
# -*- 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_())
# -*- 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