diff --git a/NGAudioDownloader.py b/NGAudioDownloader.py
index 42b83fd..ea5ca99 100644
--- a/NGAudioDownloader.py
+++ b/NGAudioDownloader.py
@@ -14,161 +14,183 @@ 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 __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 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(f'https://www.newgrounds.com/audio/listen/{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 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_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(f'https://github.com/H1K0/NGAudioDownloader/blob/master/README-{config["lang"].upper()}.md#newgrounds-audio-downloader--',new=2)
+ 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()
+ 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()
+ 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)
+ got_chunk = pyqtSignal(object)
- def __init__(self): super().__init__()
+ 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 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()
+ 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 __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()
+ 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 __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 chlang(self, newlang):
+ if newlang != config["lang"]:
+ self.newlang = newlang
- def updlang(self):
- config["lang"]=self.newlang
- ngad.applylang()
+ def updlang(self):
+ config["lang"] = self.newlang
+ ngad.applylang()
-def chfont(unit,font): unit.setStyleSheet(f'font-family:{font}')
+def chfont(unit, font): unit.setStyleSheet(f'font-family:{font}')
if __name__ == '__main__':
from sys import argv
- app=QApplication(argv)
- ngad=GUI()
+ app = QApplication(argv)
+ ngad = GUI()
ngad.show()
- sys.exit(app.exec_())
\ No newline at end of file
+ sys.exit(app.exec_())
diff --git a/configer.py b/configer.py
index fb50218..da4b451 100644
--- a/configer.py
+++ b/configer.py
@@ -1,31 +1,31 @@
-from json import load,dump
-from os import access,F_OK
+from json import load, dump
+from os import access, F_OK
-default={
- "lang":"en"
+default = {
+ "lang": "en"
}
class Config:
- def __init__(self):
- if access('config.json',F_OK):
- with open('config.json',encoding='utf-8') as file:
- self.data=load(file)
- else:
- self.data=default
- self.update()
+ def __init__(self):
+ if access('config.json', F_OK):
+ with open('config.json', encoding='utf-8') as file:
+ self.data = load(file)
+ else:
+ self.data = default
+ self.update()
- def __getitem__(self,key):
- return self.data[key]
+ def __getitem__(self, key):
+ return self.data[key]
- def __setitem__(self,key,value):
- self.data[key]=value
- self.update()
+ def __setitem__(self, key, value):
+ self.data[key] = value
+ self.update()
- def update(self):
- with open('config.json','w',encoding='utf-8') as file:
- dump(self.data,file)
+ def update(self):
+ with open('config.json', 'w', encoding='utf-8') as file:
+ dump(self.data, file)
-config=Config()
\ No newline at end of file
+config = Config()
diff --git a/langswitch.py b/langswitch.py
index 564f5a3..7128cef 100644
--- a/langswitch.py
+++ b/langswitch.py
@@ -1,90 +1,90 @@
-switch={
- "title":{
- "en":"Newgrounds Audio Downloader by H1K0",
- "ru":"Newgrounds Audio Downloader от H1K0",
- "jp":"H1K0 の Newgrounds Audio Downloader",
- "font_en":"Comic Sans MS",
- "font_ru":"Comic Sans MS",
- "font_jp":"UD Digi Kyokasho N-R"
- },
- "placeholder":{
- "en":"Enter Newgrounds song ID.",
- "ru":"Введи айдишник трека на Newgrounds.",
- "jp":"NSIを入力しよう!",
- "font_en":"Maiandra GD",
- "font_ru":"Courier New",
- "font_jp":"Rounded Mplus 1c"
- },
- "btn":{
- "en":"Download!",
- "ru":"Скачать!",
- "jp":"ダウンロード!",
- "font_en":"Cooper Black",
- "font_ru":"851CHIKARA-DZUYOKU-KANA-A",
- "font_jp":"Nagurigaki Crayon"
- },
- "ntf":{
- "font_en":"Maiandra GD",
- "font_ru":"Courier New",
- "font_jp":"Rounded Mplus 1c"
- },
- "empinp":{
- "en":"Hey-hey, don't leave the input empty!",
- "ru":"Эй, ну хоть что-нибудь напиши!",
- "jp":"おいおい、何も入力してねえんじゃねえかよ!"
- },
- "typerr":{
- "en":"Newgrounds song ID consists of digits only!",
- "ru":"Айдишник трека состоит только из цифр!",
- "jp":"NSIは数字だけだ!"
- },
- "404":{
- "en":"And there's no song with this ID!",
- "ru":"А нет песенки с таким айдишником!",
- "jp":"そのNSIの曲は存在してないな!"
- },
- "savefile":{
- "en":"Save file",
- "ru":"Сохранить файл",
- "jp":"ファイル保存"
- },
- "downloading":{
- "en":lambda songTitle:f'Downloading «{songTitle}»...',
- "ru":lambda songTitle:f'Скачивание трека «{songTitle}»...',
- "jp":lambda songTitle:f'「{songTitle}」ダウンロード中・・・',
- "font_en":"Maiandra GD",
- "font_ru":"Courier New",
- "font_jp":"Rounded Mplus 1c"
- },
- "success":{
- "en":lambda songTitle:f'«{songTitle}» has been downloaded successfully!',
- "ru":lambda songTitle:f'«{songTitle}»: скачано!',
- "jp":lambda songTitle:f'「{songTitle}」ダウンロード完了!'
- },
- "menu":{
- "en":"MENU",
- "ru":"МЕНЮ",
- "jp":"メニュー",
- "font_en":"Century Gothic",
- "font_ru":"Century Gothic",
- "font_jp":"Rounded Mplus 1c"
- },
- "settings":{
- "en":"Settings",
- "ru":"Настройки",
- "jp":"設定"
- },
- "helpbtn":{
- "en":"Help",
- "ru":"Помощь",
- "jp":"ヘルプ"
- },
- "lang":{
- "en":"Language",
- "ru":"Язык",
- "jp":"言語",
- "font_en":"Century Gothic",
- "font_ru":"Century Gothic",
- "font_jp":"Rounded Mplus 1c"
- }
-}
\ No newline at end of file
+switch = {
+ "title": {
+ "en": "Newgrounds Audio Downloader by H1K0",
+ "ru": "Newgrounds Audio Downloader от H1K0",
+ "jp": "H1K0 の Newgrounds Audio Downloader",
+ "font_en": "Comic Sans MS",
+ "font_ru": "Comic Sans MS",
+ "font_jp": "UD Digi Kyokasho N-R"
+ },
+ "placeholder": {
+ "en": "Enter Newgrounds song ID.",
+ "ru": "Введи айдишник трека на Newgrounds.",
+ "jp": "NSIを入力しよう!",
+ "font_en": "Maiandra GD",
+ "font_ru": "Courier New",
+ "font_jp": "Rounded Mplus 1c"
+ },
+ "btn": {
+ "en": "Download!",
+ "ru": "Скачать!",
+ "jp": "ダウンロード!",
+ "font_en": "Cooper Black",
+ "font_ru": "851CHIKARA-DZUYOKU-KANA-A",
+ "font_jp": "Nagurigaki Crayon"
+ },
+ "ntf": {
+ "font_en": "Maiandra GD",
+ "font_ru": "Courier New",
+ "font_jp": "Rounded Mplus 1c"
+ },
+ "empinp": {
+ "en": "Hey-hey, don't leave the input empty!",
+ "ru": "Эй, ну хоть что-нибудь напиши!",
+ "jp": "おいおい、何も入力してねえんじゃねえかよ!"
+ },
+ "typerr": {
+ "en": "Newgrounds song ID consists of digits only!",
+ "ru": "Айдишник трека состоит только из цифр!",
+ "jp": "NSIは数字だけだ!"
+ },
+ "404": {
+ "en": "And there's no song with this ID!",
+ "ru": "А нет песенки с таким айдишником!",
+ "jp": "そのNSIの曲は存在してないな!"
+ },
+ "savefile": {
+ "en": "Save file",
+ "ru": "Сохранить файл",
+ "jp": "ファイル保存"
+ },
+ "downloading": {
+ "en": lambda songTitle: f'Downloading «{songTitle}»...',
+ "ru": lambda songTitle: f'Скачивание трека «{songTitle}»...',
+ "jp": lambda songTitle: f'「{songTitle}」ダウンロード中・・・',
+ "font_en": "Maiandra GD",
+ "font_ru": "Courier New",
+ "font_jp": "Rounded Mplus 1c"
+ },
+ "success": {
+ "en": lambda songTitle: f'«{songTitle}» has been downloaded successfully!',
+ "ru": lambda songTitle: f'«{songTitle}»: скачано!',
+ "jp": lambda songTitle: f'「{songTitle}」ダウンロード完了!'
+ },
+ "menu": {
+ "en": "MENU",
+ "ru": "МЕНЮ",
+ "jp": "メニュー",
+ "font_en": "Century Gothic",
+ "font_ru": "Century Gothic",
+ "font_jp": "Rounded Mplus 1c"
+ },
+ "settings": {
+ "en": "Settings",
+ "ru": "Настройки",
+ "jp": "設定"
+ },
+ "helpbtn": {
+ "en": "Help",
+ "ru": "Помощь",
+ "jp": "ヘルプ"
+ },
+ "lang": {
+ "en": "Language",
+ "ru": "Язык",
+ "jp": "言語",
+ "font_en": "Century Gothic",
+ "font_ru": "Century Gothic",
+ "font_jp": "Rounded Mplus 1c"
+ }
+}