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":"H1K0Newgrounds 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": "H1K0Newgrounds 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" + } +}