kdxcxs
5 years ago
commit
7b3d4b794b
12 changed files with 373 additions and 0 deletions
@ -0,0 +1,7 @@ |
|||
/test |
|||
/build |
|||
/dist |
|||
/venv |
|||
/icon.png |
|||
/.idea |
|||
/__pycache__ |
@ -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")) |
@ -0,0 +1,42 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<ui version="4.0"> |
|||
<class>dumpingDialog</class> |
|||
<widget class="QDialog" name="dumpingDialog"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>0</x> |
|||
<y>0</y> |
|||
<width>300</width> |
|||
<height>150</height> |
|||
</rect> |
|||
</property> |
|||
<property name="windowTitle"> |
|||
<string>转换中</string> |
|||
</property> |
|||
<widget class="QLabel" name="label"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>75</x> |
|||
<y>40</y> |
|||
<width>150</width> |
|||
<height>50</height> |
|||
</rect> |
|||
</property> |
|||
<property name="font"> |
|||
<font> |
|||
<family>幼圆</family> |
|||
<pointsize>15</pointsize> |
|||
</font> |
|||
</property> |
|||
<property name="text"> |
|||
<string>转换中 |
|||
0/0</string> |
|||
</property> |
|||
<property name="alignment"> |
|||
<set>Qt::AlignCenter</set> |
|||
</property> |
|||
</widget> |
|||
</widget> |
|||
<resources/> |
|||
<connections/> |
|||
</ui> |
After Width: | Height: | Size: 1.1 KiB |
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 4.2 KiB |
@ -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_()) |
@ -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') |
@ -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", "可一次选择多个文件")) |
@ -0,0 +1,88 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<ui version="4.0"> |
|||
<class>MainWindow</class> |
|||
<widget class="QMainWindow" name="MainWindow"> |
|||
<property name="windowModality"> |
|||
<enum>Qt::NonModal</enum> |
|||
</property> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>0</x> |
|||
<y>0</y> |
|||
<width>400</width> |
|||
<height>200</height> |
|||
</rect> |
|||
</property> |
|||
<property name="windowTitle"> |
|||
<string>ncm转换器</string> |
|||
</property> |
|||
<widget class="QWidget" name="centralwidget"> |
|||
<widget class="QLabel" name="label"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>40</x> |
|||
<y>20</y> |
|||
<width>320</width> |
|||
<height>40</height> |
|||
</rect> |
|||
</property> |
|||
<property name="font"> |
|||
<font> |
|||
<family>幼圆</family> |
|||
<pointsize>24</pointsize> |
|||
</font> |
|||
</property> |
|||
<property name="layoutDirection"> |
|||
<enum>Qt::LeftToRight</enum> |
|||
</property> |
|||
<property name="text"> |
|||
<string>请选择需要转换的文件</string> |
|||
</property> |
|||
<property name="textFormat"> |
|||
<enum>Qt::PlainText</enum> |
|||
</property> |
|||
<property name="alignment"> |
|||
<set>Qt::AlignCenter</set> |
|||
</property> |
|||
<property name="buddy"> |
|||
<cstring></cstring> |
|||
</property> |
|||
</widget> |
|||
<widget class="QCommandLinkButton" name="commandLinkButton"> |
|||
<property name="geometry"> |
|||
<rect> |
|||
<x>110</x> |
|||
<y>100</y> |
|||
<width>180</width> |
|||
<height>61</height> |
|||
</rect> |
|||
</property> |
|||
<property name="font"> |
|||
<font> |
|||
<family>Segoe UI</family> |
|||
<pointsize>10</pointsize> |
|||
<stylestrategy>PreferDefault</stylestrategy> |
|||
</font> |
|||
</property> |
|||
<property name="cursor"> |
|||
<cursorShape>PointingHandCursor</cursorShape> |
|||
</property> |
|||
<property name="text"> |
|||
<string>选择文件</string> |
|||
</property> |
|||
<property name="checkable"> |
|||
<bool>false</bool> |
|||
</property> |
|||
<property name="checked"> |
|||
<bool>false</bool> |
|||
</property> |
|||
<property name="description"> |
|||
<string>可一次选择多个文件</string> |
|||
</property> |
|||
</widget> |
|||
</widget> |
|||
<widget class="QStatusBar" name="statusbar"/> |
|||
</widget> |
|||
<resources/> |
|||
<connections/> |
|||
</ui> |
@ -0,0 +1 @@ |
|||
pyinstaller -F -w -i icon.ico main.py --version-file 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])]) |
|||
] |
|||
) |
Loading…
Reference in new issue