commit 7b3d4b794bf6c19227c62edc3561adfde9d664a6 Author: kdxcxs Date: Tue Mar 24 18:00:57 2020 +0800 Init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b29fdc2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/test +/build +/dist +/venv +/icon.png +/.idea +/__pycache__ \ No newline at end of file diff --git a/dumping.py b/dumping.py new file mode 100644 index 0000000..ab9362e --- /dev/null +++ b/dumping.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'dumping.ui' +# +# Created by: PyQt5 UI code generator 5.14.1 +# +# WARNING! All changes made in this file will be lost! + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_dumpingDialog(object): + def setupUi(self, dumpingDialog): + dumpingDialog.setObjectName("dumpingDialog") + dumpingDialog.resize(300, 150) + self.label = QtWidgets.QLabel(dumpingDialog) + self.label.setGeometry(QtCore.QRect(75, 40, 150, 50)) + font = QtGui.QFont() + font.setFamily("幼圆") + font.setPointSize(15) + self.label.setFont(font) + self.label.setAlignment(QtCore.Qt.AlignCenter) + self.label.setObjectName("label") + + self.retranslateUi(dumpingDialog) + QtCore.QMetaObject.connectSlotsByName(dumpingDialog) + + def retranslateUi(self, dumpingDialog): + _translate = QtCore.QCoreApplication.translate + dumpingDialog.setWindowTitle(_translate("dumpingDialog", "转换中")) + self.label.setText(_translate("dumpingDialog", "转换中\n" +"0/0")) diff --git a/dumping.ui b/dumping.ui new file mode 100644 index 0000000..637f9ad --- /dev/null +++ b/dumping.ui @@ -0,0 +1,42 @@ + + + dumpingDialog + + + + 0 + 0 + 300 + 150 + + + + 转换中 + + + + + 75 + 40 + 150 + 50 + + + + + 幼圆 + 15 + + + + 转换中 +0/0 + + + Qt::AlignCenter + + + + + + diff --git a/icon.ico b/icon.ico new file mode 100644 index 0000000..11dab94 Binary files /dev/null and b/icon.ico differ diff --git a/icon.py b/icon.py new file mode 100644 index 0000000..cf423c4 --- /dev/null +++ b/icon.py @@ -0,0 +1,7 @@ +# coding:utf-8 + +''' +author:kdxcxs@github.com +''' + +iconb64 = b'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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAOAAAAH8AAAH/gAAH/gAAD/4AAAf8AAAH/gAAB//gAH//4AB//+AAf//gAH//8AB///AAf//wAH//8AB///gA///8Af///AH///wB///8A////wf///8H////D////////////////////////////8=' \ No newline at end of file diff --git a/icon_32.ico b/icon_32.ico new file mode 100644 index 0000000..2643246 Binary files /dev/null and b/icon_32.ico differ diff --git a/main.py b/main.py new file mode 100644 index 0000000..5734303 --- /dev/null +++ b/main.py @@ -0,0 +1,66 @@ +# coding:utf-8 + +''' +author:kdxcxs@github.com +''' + +import sys,base64 +from PyQt5.QtWidgets import QMainWindow,QFileDialog,QDialog,QApplication +from PyQt5.QtGui import QPixmap,QIcon +from PyQt5.QtCore import QByteArray +from icon import iconb64 +from mainWindow import Ui_MainWindow +from dumping import Ui_dumpingDialog +from ncmdump import dump + +class mainWindow(QMainWindow): + def __init__(self, parent=None): + super(mainWindow, self).__init__(parent) + self.ui = Ui_MainWindow() + self.ui.setupUi(self) + self.setupIcon() + self.dumpingdialog = dumpingDialog(self,self.icon) + self.initSignal() + self.show() + def setupIcon(self): + self.pmap = QPixmap() + self.pmap.loadFromData(QByteArray.fromBase64(iconb64)) + self.icon = QIcon(self.pmap) + self.setWindowIcon(self.icon) + def initSignal(self): + self.ui.commandLinkButton.clicked.connect(self.dumper) + def dumper(self): + files,fileType = QFileDialog.getOpenFileNames(self, + "请选择ncm文件", + "./", + "NeteaseCloudMusic Files (*.ncm)") + if files: + outputPath = QFileDialog.getExistingDirectory(self, + '请选择输出文件夹', + './') + if outputPath: + self.dumpingdialog.show() + filesTotal, filesDumped = len(files), 0 + self.dumpingdialog.ui.label.setText(f'转换中\n{filesDumped}/{filesTotal}') + for file in files: + dump(file,outputPath+'/'+file.split('/')[-1][:-3]+'mp3') + filesDumped += 1 + self.dumpingdialog.ui.label.setText(f'转换中\n{filesDumped}/{filesTotal}') + self.dumpingdialog.setWindowTitle('转换完毕!') + self.dumpingdialog.ui.label.setText('转换完毕!') + +class ncmDumper(object): + def __init__(self): + self.app = QApplication(sys.argv) + self.mainwindow = mainWindow() + +class dumpingDialog(QDialog): + def __init__(self,parent,icon): + super(dumpingDialog, self).__init__(parent) + self.ui = Ui_dumpingDialog() + self.ui.setupUi(self) + self.setWindowIcon(icon) + +if __name__ == '__main__': + dumper = ncmDumper() + sys.exit(dumper.app.exec_()) \ No newline at end of file diff --git a/main.spec b/main.spec new file mode 100644 index 0000000..7db1bbe --- /dev/null +++ b/main.spec @@ -0,0 +1,33 @@ +# -*- mode: python ; coding: utf-8 -*- + +block_cipher = None + + +a = Analysis(['main.py'], + pathex=['D:\\Codes\\pyqt_ncmdump'], + binaries=[], + datas=[], + hiddenimports=[], + hookspath=[], + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + [], + name='main', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=False , version='version_info.txt', icon='icon.ico') diff --git a/mainWindow.py b/mainWindow.py new file mode 100644 index 0000000..a9493f0 --- /dev/null +++ b/mainWindow.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'mainWindow.ui' +# +# Created by: PyQt5 UI code generator 5.14.1 +# +# WARNING! All changes made in this file will be lost! + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.setWindowModality(QtCore.Qt.NonModal) + MainWindow.resize(400, 200) + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + self.label = QtWidgets.QLabel(self.centralwidget) + self.label.setGeometry(QtCore.QRect(40, 20, 320, 40)) + font = QtGui.QFont() + font.setFamily("幼圆") + font.setPointSize(24) + self.label.setFont(font) + self.label.setLayoutDirection(QtCore.Qt.LeftToRight) + self.label.setTextFormat(QtCore.Qt.PlainText) + self.label.setAlignment(QtCore.Qt.AlignCenter) + self.label.setObjectName("label") + self.commandLinkButton = QtWidgets.QCommandLinkButton(self.centralwidget) + self.commandLinkButton.setGeometry(QtCore.QRect(110, 100, 180, 61)) + font = QtGui.QFont() + font.setFamily("Segoe UI") + font.setPointSize(10) + font.setStyleStrategy(QtGui.QFont.PreferDefault) + self.commandLinkButton.setFont(font) + self.commandLinkButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor)) + self.commandLinkButton.setCheckable(False) + self.commandLinkButton.setChecked(False) + self.commandLinkButton.setObjectName("commandLinkButton") + 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", "ncm转换器")) + self.label.setText(_translate("MainWindow", "请选择需要转换的文件")) + self.commandLinkButton.setText(_translate("MainWindow", "选择文件")) + self.commandLinkButton.setDescription(_translate("MainWindow", "可一次选择多个文件")) diff --git a/mainWindow.ui b/mainWindow.ui new file mode 100644 index 0000000..e857e48 --- /dev/null +++ b/mainWindow.ui @@ -0,0 +1,88 @@ + + + MainWindow + + + Qt::NonModal + + + + 0 + 0 + 400 + 200 + + + + ncm转换器 + + + + + + 40 + 20 + 320 + 40 + + + + + 幼圆 + 24 + + + + Qt::LeftToRight + + + 请选择需要转换的文件 + + + Qt::PlainText + + + Qt::AlignCenter + + + + + + + + + 110 + 100 + 180 + 61 + + + + + Segoe UI + 10 + PreferDefault + + + + PointingHandCursor + + + 选择文件 + + + false + + + false + + + 可一次选择多个文件 + + + + + + + + diff --git a/pac.bat b/pac.bat new file mode 100644 index 0000000..c827ab8 --- /dev/null +++ b/pac.bat @@ -0,0 +1 @@ +pyinstaller -F -w -i icon.ico main.py --version-file version_info.txt \ No newline at end of file diff --git a/version_info.txt b/version_info.txt new file mode 100644 index 0000000..008a3af --- /dev/null +++ b/version_info.txt @@ -0,0 +1,42 @@ +# UTF-8 +# +# For more details about fixed file info 'ffi' see: +# http://msdn.microsoft.com/en-us/library/ms646997.aspx +VSVersionInfo( + ffi=FixedFileInfo( + # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4) + # Set not needed items to zero 0. + filevers=(1, 0, 0, 0), + prodvers=(1, 0, 0, 0), + # Contains a bitmask that specifies the valid bits 'flags'r + mask=0x17, + # Contains a bitmask that specifies the Boolean attributes of the file. + flags=0x0, + # The operating system for which this file was designed. + # 0x4 - NT and there is no need to change it. + OS=0x4, + # The general type of file. + # 0x1 - the file is an application. + fileType=0x1, + # The function of the file. + # 0x0 - the function is not defined for this fileType + subtype=0x0, + # Creation date and time stamp. + date=(0, 0) + ), + kids=[ + StringFileInfo( + [ + StringTable( + u'080404b0', + [StringStruct(u'FileDescription', u'ncmDump'), + StringStruct(u'FileVersion', u'1.0.0.0'), + StringStruct(u'InternalName', u'ncmDump'), + StringStruct(u'LegalCopyright', u'cx@kdxcxs.com. All rights reserved.'), + StringStruct(u'OriginalFilename', u'ncmDump.exe'), + StringStruct(u'ProductName', u'ncmDump'), + StringStruct(u'ProductVersion', u'1.0.0.0')]) + ]), + VarFileInfo([VarStruct(u'Translation', [2052, 1200])]) + ] +)