Слияние кода завершено, страница обновится автоматически
import sys
import os
import re
import webbrowser
import requests
from langdetect import DetectorFactory
from langdetect import detect
# from langdetect import detect_langs
from mutagen.flac import FLAC
import mutagen.id3
from mainwindow import Ui_MainWindow
from PyQt5 import QtWidgets
from PyQt5.QtCore import QCoreApplication, Qt
from PyQt5 import QtCore
global file_path
now_version = 'v1.1.4'
# ISO 639-1语言编码标准对照字典,根据库取55个,合并简繁中文
LanguageDictionary = {'af': '南非语', 'ar': '阿拉伯语', 'bg': '保加利亚语', 'bn': '孟加拉语', 'ca': '加泰隆语', 'cs': '捷克语',
'cy': '威尔士语', 'da': '丹麦语', 'de': '德语', 'el': '现代希腊语', 'en': '英语', 'es': '西班牙语',
'et': '爱沙尼亚语', 'fa': '波斯语', 'fi': '芬兰语', 'fr': '法语', 'gu': '古吉拉特语', 'he': '希伯来语',
'hi': '印地语', 'hr': '克罗地亚语', 'hu': '匈牙利语', 'id': '印尼语', 'it': '意大利语', 'ja': '日语',
'kn': '卡纳达语', 'ko': '朝鲜语/韩语', 'lt': '立陶宛语', 'lv': '拉脱维亚语', 'mk': '马其顿语',
'ml': '马拉亚拉姆语', 'mr': '马拉提语', 'ne': '尼泊尔语', 'nl': '荷兰语', 'no': '挪威语', 'pa': '旁遮普语',
'pl': '波兰语', 'pt': '葡萄牙语', 'ro': '罗马尼亚语', 'ru': '俄语', 'sk': '斯洛伐克语', 'sl': '斯洛文尼亚语',
'so': '索马里语', 'sq': '阿尔巴尼亚语', 'sv': '瑞典语', 'sw': '斯瓦希里语', 'ta': '泰米尔语', 'te': '泰卢固语',
'th': '泰语', 'tl': '他加禄语', 'tr': '土耳其语', 'uk': '乌克兰语', 'ur': '乌尔都语', 'vi': '越南语',
'zh-cn': '汉语', 'zh-tw': '汉语', 'None': '纯音乐'}
def cleanTimeTag(input_str):
# 去除lrc歌词中的时间戳(如:[00:00.00])及换行符\n
input_str = input_str[2:-2]
func = re.compile("\[.*?]")
output = func.sub('', input_str)
output = output.replace("\\n", "")
output = output.replace("\\r", "")
return output
class Thread(QtCore.QThread): # 子线程,遍历
signal_stop = QtCore.pyqtSignal()
signal_item = QtCore.pyqtSignal(str)
def __init__(self):
super().__init__()
self.stop_flag = 0 # 线程终止信号,主线程通过修改子线程的该属性控制线程终止
def run(self):
# 遍历文件夹音乐
file_count = 0
items_num = 0
for root, dirs, items in os.walk(file_path):
for _ in items:
items_num += 1
for root, dirs, items in os.walk(file_path):
for item in items:
if self.stop_flag:
return 1
path = os.path.join(root, item)
suffix = os.path.splitext(path)[-1]
file_count += 1
state = ui.judgeLanguage(path, suffix)
print(str(file_count) + '/' + str(items_num) + ':' + path + '\n' + state)
self.signal_item.emit(str(file_count) + '/' + str(items_num) + ':' + path + '\n' + state)
self.signal_stop.emit()
class MyWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
# 继承父类
super(MyWindow, self).__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# MainWindow.setFixedSize(730, 210) # 指定窗体大小
self.setWindowFlags(Qt.FramelessWindowHint) # 设置为无标题栏
self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明
# self.setWindowOpacity(0.93) # 设置窗口透明度
self.ui.pushButton_update.setText(now_version) # 设定版本号
self.effect_shadow = QtWidgets.QGraphicsDropShadowEffect(self)
self.effect_shadow.setOffset(0, 0) # 偏移
self.effect_shadow.setBlurRadius(10) # 阴影半径
self.effect_shadow.setColor(Qt.black) # 阴影颜色
self.ui.right_widget.setGraphicsEffect(self.effect_shadow) # 将设置套用到widget窗口
# 按键绑定
self.ui.pushButton_start.clicked.connect(self.searchMusic)
self.ui.pushButton_path.clicked.connect(self.open_file)
self.ui.radioButton_comment.clicked.connect(self.checkBox_genre_save_off)
self.ui.radioButton_genre.clicked.connect(self.checkBox_genre_save_on)
self.ui.pushButton_red.clicked.connect(self.quitMyWindow)
self.ui.pushButton_green.clicked.connect(self.showMinimized)
self.ui.pushButton_about.clicked.connect(self.openMyWeb)
self.ui.pushButton_update.clicked.connect(self.getUpdate)
# self.ui.pushButton_yellow.clicked.connect(self.showMaximized)
# 气泡提示
self.ui.pushButton_red.setToolTip('关闭')
self.ui.pushButton_yellow.setToolTip('最大化')
self.ui.pushButton_green.setToolTip('最小化')
self.ui.pushButton_about.setToolTip('项目地址')
self.ui.pushButton_update.setToolTip('检查更新')
self.ui.label_3.setToolTip('覃世佳(hxd)') # 彩蛋
# 拖动变量初始化
self.move_drag = False
self.move_DragPosition = 0
# 创建线程
self.thread1 = Thread()
self.thread1.signal_item.connect(self.searchMusic_print)
self.thread1.signal_stop.connect(self.searchMusic_stop)
def quitMyWindow(self):
self.thread1.stop_flag = 1 # 结束循环
QCoreApplication.quit()
@staticmethod
def openMyWeb():
webbrowser.open('https://gitee.com/pth2000/MusicGenreWritingTool', new=0, autoraise=True)
def getUpdate(self):
try:
response = requests.get(
"https://gitee.com/api/v5/repos/pth2000/MusicGenreWritingTool/releases/latest")
except requests.exceptions.ConnectionError:
print('获取失败!请检查网络连接')
str_update = '获取失败!请检查网络连接'
QtWidgets.QMessageBox.critical(self, "错误", str_update, QtWidgets.QMessageBox.Ok)
else:
latest_version = response.json()['tag_name']
latest_version_name = response.json()['name']
latest_version_time = response.json()['created_at']
latest_version_download_url = response.json()['assets'][0]['browser_download_url']
if now_version == latest_version:
str_update = '当前版本为最新版' + '\n更新时间:' + latest_version_time
QtWidgets.QMessageBox.information(self, "检查更新", str_update, QtWidgets.QMessageBox.Ok)
else:
str_update = '发现新版本!' + now_version + ' --> ' + latest_version + '\n更新内容:' + latest_version_name + \
'\n更新时间:' + latest_version_time + '\n\n点击 Ok 下载最新版本'
message = QtWidgets.QMessageBox.question(self, "检查更新", str_update, QtWidgets.QMessageBox.Ok
| QtWidgets.QMessageBox.Cancel)
if message == QtWidgets.QMessageBox.Ok:
webbrowser.open(latest_version_download_url, new=0, autoraise=True)
def mouseMoveEvent(self, mouse_event):
if Qt.LeftButton and self.move_drag:
# 标题栏拖放窗口位置
self.move(mouse_event.globalPos() - self.move_DragPosition)
mouse_event.accept()
def mousePressEvent(self, event):
# 重写鼠标点击的事件
if (event.button() == Qt.LeftButton) and (event.x() < self.ui.left_widget.width()):
# 鼠标左键点击标题栏区域
self.move_drag = True
self.move_DragPosition = event.globalPos() - self.pos()
event.accept()
def mouseReleaseEvent(self, mouse_event):
# 鼠标释放后,各扳机复位
self.move_drag = False
def checkBox_genre_save_on(self):
self.ui.checkBox_genre_save.setEnabled(True)
def checkBox_genre_save_off(self):
self.ui.checkBox_genre_save.setChecked(False)
self.ui.checkBox_genre_save.setEnabled(False)
def open_file(self):
global file_path
file_path = QtWidgets.QFileDialog.getExistingDirectory(self, '选择文件夹', '',
options=QtWidgets.QFileDialog.ShowDirsOnly)
if file_path != '':
print("已选择路径:" + file_path)
self.ui.pushButton_start.setEnabled(True)
self.ui.textBrowser.clear()
self.ui.textBrowser.append("已选择路径:" + file_path)
else:
return 1
def searchMusic(self):
# 遍历文件夹音乐
self.ui.textBrowser.clear()
print('正在写入标签……')
self.ui.textBrowser.append('正在写入标签……')
self.ui.pushButton_path.setEnabled(False)
self.ui.pushButton_start.setEnabled(False)
self.ui.groupBox.setEnabled(False)
self.thread1.start() # 开始线程
def searchMusic_print(self, data):
self.ui.textBrowser.append(data)
def searchMusic_stop(self):
print('完毕')
self.ui.textBrowser.append('完毕')
QtWidgets.QMessageBox.information(self, "提示", "标签写入已完成!", QtWidgets.QMessageBox.Ok)
self.ui.pushButton_path.setEnabled(True)
self.ui.pushButton_start.setEnabled(True)
self.ui.groupBox.setEnabled(True)
def judgeLanguage(self, path, filetype):
DetectorFactory.seed = 0
if filetype == '.mp3':
audio = mutagen.id3.ID3(path)
get_lyrics = str(audio.get('USLT::XXX'))
elif filetype == '.flac':
audio = FLAC(path)
get_lyrics = str(audio.get('lyrics'))
else:
return '未写入'
if get_lyrics == 'None':
code_lyrics = "None"
else:
get_lyrics = cleanTimeTag(get_lyrics)
code_lyrics = detect(get_lyrics)
code_lyrics = LanguageDictionary[code_lyrics]
# print(detect_langs(get_lyrics)) # 概率
if filetype == '.mp3':
if self.ui.radioButton_comment.isChecked() is True:
audio.add(mutagen.id3.COMM(lang=u'eng', text=[code_lyrics])) # 写入注释
if self.ui.radioButton_genre.isChecked() is True:
if self.ui.checkBox_genre_save.isChecked() is True:
if audio.get('TCON') is None:
audio.add(mutagen.id3.TCON(text=[code_lyrics]))
else:
audio.add(mutagen.id3.TCON(text=list(audio.get('TCON')) + ['; ' + code_lyrics]))
if self.ui.checkBox_genre_save.isChecked() is False:
# 直接覆盖
audio.add(mutagen.id3.TCON(text=[code_lyrics])) # 写入流派
elif filetype == '.flac':
if self.ui.radioButton_comment.isChecked() is True:
audio['comment'] = code_lyrics # 写入注释
if self.ui.radioButton_genre.isChecked() is True:
if self.ui.checkBox_genre_save.isChecked() is True:
# 提取原流派信息,在后面增添
if audio.get('genre') is None:
audio['genre'] = code_lyrics
else:
audio['genre'] = audio.get('genre') + [code_lyrics]
if self.ui.checkBox_genre_save.isChecked() is False:
# 直接覆盖
audio['genre'] = code_lyrics # 写入流派
audio.save()
return '写入成功'
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv) # 声明应用程序
ui = MyWindow() # 声明窗口
ui.show()
sys.exit(app.exec_()) # 当点击窗口的x时,退出程序
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )