197 lines
6.9 KiB
Python
197 lines
6.9 KiB
Python
import sys
|
|
from PyQt5.uic import loadUi
|
|
from PyQt5.QtWidgets import (
|
|
QApplication, QMainWindow, QWidget,
|
|
QDialog, QFileDialog, QInputDialog
|
|
)
|
|
from PyQt5.Qt import QThread, pyqtSignal
|
|
from PyQt5 import QtCore
|
|
from requests import get as load
|
|
from bs4 import BeautifulSoup as parse
|
|
from langswitch import switch
|
|
import webbrowser as web
|
|
from configer import config
|
|
|
|
|
|
class GUI(QMainWindow):
|
|
def __init__(self):
|
|
super().__init__()
|
|
loadUi('GUI/MainWindow.ui', self)
|
|
self.applylang()
|
|
self.btn.clicked.connect(self.download)
|
|
self.actionSettings.triggered.connect(self.show_settings)
|
|
self.actionHelp.triggered.connect(self.show_help)
|
|
|
|
def applylang(self):
|
|
self.title.setText(switch['title'][config["lang"]])
|
|
chfont(self.title, switch['title'][f'font_{config["lang"]}'])
|
|
self.input.setPlaceholderText(switch['placeholder'][config["lang"]])
|
|
chfont(self.input, switch['placeholder'][f'font_{config["lang"]}'])
|
|
self.btn.setText(switch['btn'][config["lang"]])
|
|
chfont(self.btn, switch['btn'][f'font_{config["lang"]}'])
|
|
self.menu.setTitle(switch['menu'][config["lang"]])
|
|
chfont(self.menubar, switch['menu'][f'font_{config["lang"]}'])
|
|
self.actionSettings.setText(switch['settings'][config["lang"]])
|
|
self.actionHelp.setText(switch['helpbtn'][config["lang"]])
|
|
|
|
def download(self):
|
|
# Validating input
|
|
songID = self.input.text()
|
|
if not songID:
|
|
self.notification = NotificationDialog(
|
|
switch['empinp'][config["lang"]])
|
|
self.notification.exec()
|
|
return
|
|
elif not songID.isdigit():
|
|
self.notification = NotificationDialog(
|
|
switch['typerr'][config["lang"]])
|
|
self.notification.exec()
|
|
return
|
|
page = parse(load('https://www.newgrounds.com/audio/listen/'
|
|
f'{songID}').text, 'html.parser')
|
|
if page.find(id='pageerror') is not None:
|
|
self.notification = NotificationDialog(
|
|
switch['404'][config["lang"]])
|
|
self.notification.exec()
|
|
return
|
|
self.songTitle = page.find('title').text
|
|
# Getting download link
|
|
link = 'http://audio.ngfiles.com/'
|
|
page = str(page)
|
|
i = page.find('audio.ngfiles.com')+len('audio.ngfiles.com/')
|
|
while not link.endswith('.mp3'):
|
|
if page[i] != '\\':
|
|
link += page[i]
|
|
i += 1
|
|
# Locating file
|
|
self.dist = (QFileDialog.
|
|
getSaveFileName(self, switch['savefile'][config["lang"]],
|
|
link.split('/')[-1],
|
|
'MP3 Audio File (*.mp3)')[0])
|
|
if not self.dist:
|
|
return
|
|
# Downloading
|
|
self.file = load(link, stream=True)
|
|
self.progress = ProgressDialog()
|
|
self.progress.label.setText(
|
|
switch['downloading'][config["lang"]](self.songTitle))
|
|
self.progress.setWindowTitle(
|
|
switch['downloading'][config["lang"]](self.songTitle))
|
|
self.progress.bar.setValue(0)
|
|
self.progress.exec()
|
|
|
|
def show_settings(self):
|
|
self.settings = SettingsDialog()
|
|
self.settings.exec()
|
|
|
|
def show_help(self):
|
|
if config["lang"] == 'en':
|
|
web.open('https://github.com/H1K0/NGAudioDownloader/blob/master/'
|
|
'README.md#newgrounds-audio-downloader--', new=2)
|
|
else:
|
|
web.open('https://github.com/H1K0/NGAudioDownloader/blob/master/'
|
|
f'README-{config["lang"].upper()}.md#'
|
|
'newgrounds-audio-downloader--', new=2)
|
|
|
|
def keyPressEvent(self, event):
|
|
if event.key() == 16777216:
|
|
self.close()
|
|
elif event.key() == 16777220:
|
|
self.download()
|
|
|
|
|
|
class ProgressDialog(QDialog):
|
|
def __init__(self):
|
|
super().__init__()
|
|
loadUi('GUI/ProgressDialog.ui', self)
|
|
chfont(self.label, switch['downloading'][f'font_{config["lang"]}'])
|
|
self.setWindowFlags(self.windowFlags() & ~
|
|
QtCore.Qt.WindowCloseButtonHint)
|
|
self.thread = DownloadThread()
|
|
self.thread.got_chunk.connect(lambda done: self.bar.setValue(done))
|
|
self.thread.finished.connect(self.thread.finish)
|
|
self.thread.start()
|
|
|
|
|
|
class DownloadThread(QThread):
|
|
got_chunk = pyqtSignal(object)
|
|
|
|
def __init__(self): super().__init__()
|
|
|
|
def run(self):
|
|
total = ngad.file.headers.get('content-length')
|
|
if total is None:
|
|
total = -1
|
|
else:
|
|
total = int(total)
|
|
downloaded = 0
|
|
with open(ngad.dist, 'wb') as out:
|
|
for data in (ngad.file.
|
|
iter_content(chunk_size=max(total//100, 1024))):
|
|
downloaded += len(data)
|
|
out.write(data)
|
|
self.got_chunk.emit(100*downloaded//total)
|
|
|
|
def finish(self):
|
|
global ngad
|
|
ngad.progress.hide()
|
|
ngad.notification = NotificationDialog(
|
|
switch['success'][config["lang"]](ngad.songTitle))
|
|
ngad.notification.exec()
|
|
self.deleteLater()
|
|
|
|
|
|
class NotificationDialog(QDialog):
|
|
def __init__(self, msg):
|
|
super().__init__()
|
|
loadUi('GUI/NotificationDialog.ui', self)
|
|
self.label.setText(msg)
|
|
chfont(self.label, switch['ntf'][f'font_{config["lang"]}'])
|
|
self.setWindowFlags(self.windowFlags() & ~
|
|
QtCore.Qt.WindowCloseButtonHint)
|
|
ngad.input.clear()
|
|
self.btn.clicked.connect(self.accept)
|
|
|
|
def accept(self):
|
|
self.close()
|
|
|
|
|
|
class SettingsDialog(QDialog):
|
|
def __init__(self):
|
|
super().__init__()
|
|
loadUi('GUI/SettingsDialog.ui', self)
|
|
self.setWindowTitle(switch['settings'][config["lang"]])
|
|
self.title.setText(switch['settings'][config["lang"]])
|
|
self.label_lang.setText(switch['lang'][config["lang"]])
|
|
chfont(self.label_lang, switch['lang'][f'font_{config["lang"]}'])
|
|
if config["lang"] == 'en':
|
|
self.rbtn_en.setChecked(True)
|
|
elif config["lang"] == 'ru':
|
|
self.rbtn_ru.setChecked(True)
|
|
elif config["lang"] == 'jp':
|
|
self.rbtn_jp.setChecked(True)
|
|
self.newlang = config["lang"]
|
|
self.rbtn_en.toggled.connect(lambda: self.chlang('en'))
|
|
self.rbtn_ru.toggled.connect(lambda: self.chlang('ru'))
|
|
self.rbtn_jp.toggled.connect(lambda: self.chlang('jp'))
|
|
self.accepted.connect(self.updlang)
|
|
|
|
def chlang(self, newlang):
|
|
if newlang != config["lang"]:
|
|
self.newlang = newlang
|
|
|
|
def updlang(self):
|
|
config["lang"] = self.newlang
|
|
ngad.applylang()
|
|
|
|
|
|
def chfont(unit, font): unit.setStyleSheet(f'font-family:{font}')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
from sys import argv
|
|
app = QApplication(argv)
|
|
ngad = GUI()
|
|
ngad.show()
|
|
sys.exit(app.exec_())
|