diff --git a/Build/build.bat b/Build/build.bat index c673713..f47b2c6 100644 --- a/Build/build.bat +++ b/Build/build.bat @@ -2,7 +2,7 @@ cd ..\ :: Сборка приложения. -pyinstaller --distpath %~dp0\Release --i icon.ico --version-file Build\metadata.txt --onefile "PornHub Downloader.py" +pyinstaller --distpath %~dp0\Release --i icon.ico --version-file Build\metadata.txt --onefile main.py :: Копирование в директорию сборки необходимых компонентов приложения. xcopy /Y /I yt-dlp Build\Release\yt-dlp @@ -11,4 +11,4 @@ xcopy /Y Settings.json Build\Release xcopy /Y icon.ico Build\Release :: Удаление файлов сборки приложения. -rmdir /q /s "Build\PornHub Downloader" \ No newline at end of file +rmdir /q /s Build\main \ No newline at end of file diff --git a/Build/metadata.txt b/Build/metadata.txt index 29ee6da..98d5602 100644 --- a/Build/metadata.txt +++ b/Build/metadata.txt @@ -1,7 +1,7 @@ VSVersionInfo( ffi=FixedFileInfo( - filevers=(1, 3, 1, 0), - prodvers=(1, 3, 1, 0), + filevers=(1, 3, 2, 0), + prodvers=(1, 3, 2, 0), mask=0x3f, flags=0x0, OS=0x40004, @@ -16,11 +16,11 @@ VSVersionInfo( u'040904B0', [StringStruct(u'CompanyName', u'DUB1401'), StringStruct(u'FileDescription', u'PornHub video downloader.'), - StringStruct(u'FileVersion', u'1.3.1'), - StringStruct(u'LegalCopyright', u'Copyright © DUB1401. 2023.'), + StringStruct(u'FileVersion', u'1.3.2'), + StringStruct(u'LegalCopyright', u'Copyright © DUB1401. 2023-2024.'), StringStruct(u'OriginalFilename', u'PornHub Downloader.exe'), StringStruct(u'ProductName', u'PornHub Downloader'), - StringStruct(u'ProductVersion', u'1.3.1')]) + StringStruct(u'ProductVersion', u'1.3.2')]) ]) ] ) \ No newline at end of file diff --git a/LICENSE b/LICENSE index da52f53..35ae720 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright © 2023. DUB1401. + Copyright © 2023-2024. DUB1401. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 815eb8a..cce6c91 100644 --- a/README.md +++ b/README.md @@ -3,15 +3,16 @@ ## Порядок установки и использования | Исполняемый файл Windows 1. Загрузить последний релиз исполняемой версии. Распаковать. -2. Запустить _PornHub Downloader.exe_. Вставить в поле ввода список ссылок на видео и нажать кнопку загрузки. +2. Запустить _main.exe_. Вставить в поле ввода список ссылок на видео и нажать кнопку загрузки. 3. Дождаться скачивания видео в папку _Downloads_, в директории скрипта. ## Порядок установки и использования | Скрипт Python 1. Загрузить последний релиз скрипта. Распаковать. 2. Установить Python версии не старше 3.10. Рекомендуется добавить в PATH. -3. В среду исполнения установить следующие пакеты: [pyinstaller](https://github.com/pyinstaller/pyinstaller), [requests](https://github.com/psf/requests), [pyqt6](https://www.riverbankcomputing.com/software/pyqt/). +3. В среду исполнения установить следующие пакеты: [pyinstaller](https://github.com/pyinstaller/pyinstaller), [pyperclip](https://github.com/asweigart/pyperclip), [requests](https://github.com/psf/requests), [pyqt6](https://www.riverbankcomputing.com/software/pyqt/). ``` pip install pyinstaller +pip install pyperclip pip install requests pip install pyqt6 ``` @@ -19,7 +20,7 @@ pip install pyqt6 ``` pip install -r requirements.txt ``` -4. Запустить _PornHub Downloader.py_. Вставить в поле ввода список ссылок на видео и нажать кнопку загрузки. +4. Запустить _main.py_. Вставить в поле ввода список ссылок на видео и нажать кнопку загрузки. 5. Дождаться скачивания видео в папку _Downloads_, в директории скрипта. # Скриншот @@ -37,11 +38,11 @@ pip install -r requirements.txt Доступные локализации: `EN`, `DE`, `PL`, `RU`, `UK`. ## Версии поставляемых бинарных файлов -| Файл | Версия | Источник | -|---------|-------------------------------|--------------------------------------------------------------------| -| yt-dlp | _2023.07.06_ | [ссылка](https://github.com/yt-dlp/yt-dlp/releases/tag/2023.07.06) | -| ffmpeg | _6.0 2023-03-04 (essentials)_ | [ссылка](https://github.com/GyanD/codexffmpeg/releases/tag/6.0) | -| ffprobe | _6.0 2023-03-04 (essentials)_ | [ссылка](https://github.com/GyanD/codexffmpeg/releases/tag/6.0) | +| Файл | Версия | Источник | +|-------------|-------------------------------|--------------------------------------------------------------------| +| yt-dlp | _2023.12.30_ | [ссылка](https://github.com/yt-dlp/yt-dlp/releases/tag/2023.12.30) | +| ffmpeg.exe | _6.0 2023-03-04 (essentials)_ | [ссылка](https://github.com/GyanD/codexffmpeg/releases/tag/6.0) | +| ffprobe.exe | _6.0 2023-03-04 (essentials)_ | [ссылка](https://github.com/GyanD/codexffmpeg/releases/tag/6.0) | # Благодарность * [@yt-dlp](https://github.com/yt-dlp) – библиотека загрузки потокового видео. diff --git a/Settings.json b/Settings.json index 6af3423..8a156f4 100644 --- a/Settings.json +++ b/Settings.json @@ -1,8 +1,7 @@ { "sort-by-models": false, "save-directory": "", - "theme": 2, "cuality": 2, - "debug": false, + "debug": true, "advertisement": "https://xn--80aaalhzvfe9b4a.xn--80asehdb/" } \ No newline at end of file diff --git a/Source/Locale.py b/Source/Locale.py index e59ba57..a7438e8 100644 --- a/Source/Locale.py +++ b/Source/Locale.py @@ -62,7 +62,7 @@ "Разрешение загружаемого видео.", "Тема", "Стиль окна программы.", - "Сортировать по моделям" + "По моделям" ], "UK": [ "Реклама", @@ -77,7 +77,7 @@ "Роздільна здатність завантажуваного відео.", "Тема", "Стиль вікна програми.", - "Сортувати за моделями" + "За моделями" ] } @@ -89,7 +89,7 @@ # Если устройство работает под управлением ОС семейства Linux. if sys.platform in ["linux", "linux2"]: # Получение тега текущего языка. - LanguageTag = locale.getlocale().split('_')[0].upper() + LanguageTag = locale.getlocale()[0].split('_')[0].upper() # Если устройство работает под управлением ОС семейства Windows. elif sys.platform == "win32": diff --git a/Source/MainWindow.py b/Source/MainWindow.py index eff4439..e7e754f 100644 --- a/Source/MainWindow.py +++ b/Source/MainWindow.py @@ -51,11 +51,6 @@ class MainWindow(QMainWindow): # >>>>> ОБРАБОТЧИКИ СИГНАЛОВ <<<<< # #==========================================================================================# - # Изменяет тему оформления. - def __ChangeTheme(self): - # Установка системного стиля и цветовой схемы. - self.__Application.setStyle(QStyleFactory.keys()[self.__Settings["theme"]]) - # Очищает все данные процесса. def __Clear(self): self.Input.clear() @@ -157,7 +152,7 @@ def __SaveSetting(self, Key: str, Value): Bufer = self.__Settings.copy() # Удаление пути к стандартной папке загрузок. - if Bufer["save-directory"] == os.getcwd() + "\\Downloads": + if Bufer["save-directory"] == os.getcwd() + "/Downloads": Bufer["save-directory"] = "" # Сохранение настройки. @@ -241,9 +236,9 @@ def __CreateBasicUI(self): # Создание объекта GUI: ссылка на GitHub. self.Link = QLabel(self) self.Link.linkActivated.connect(self.__OpenGitHub) - self.Link.move(1030, 690) self.Link.setText("GitHub") self.Link.adjustSize() + self.Link.move(1080 - self.Link.size().width() - 10, 690) # Создание объекта GUI: поле псевдоконсольного вывода. self.Output = QTextEdit(self) @@ -297,20 +292,6 @@ def __CreateSettingsGroupUI(self): CualitySelecter.resize(180, 40) CualitySelecter.setToolTip(CURRENT_LOCALE[9]) - # Создание объекта GUI: заголовок выбора темы. - ThemeTitle = QLabel(self) - ThemeTitle.setText(f"{CURRENT_LOCALE[10]}:") - ThemeTitle.adjustSize() - - # Создание объекта GUI: селектор темы. - ThemeSelecter = QComboBox(self) - ThemeSelecter.addItems(QStyleFactory.keys()) - ThemeSelecter.setCurrentIndex(self.__Settings["theme"]) - ThemeSelecter.currentIndexChanged.connect(lambda: self.__SaveSetting("theme", ThemeSelecter.currentIndex())) - ThemeSelecter.currentIndexChanged.connect(self.__ChangeTheme) - ThemeSelecter.resize(180, 20) - ThemeSelecter.setToolTip(CURRENT_LOCALE[11]) - # Создание объекта GUI: флаговая кнопка включения сортировки по моделям. SortByModel = QCheckBox(self) SortByModel.clicked.connect(lambda: self.__SaveSetting("sort-by-models", SortByModel.isChecked())) @@ -322,8 +303,6 @@ def __CreateSettingsGroupUI(self): #---> Добавление объектов GUI в слой. #==========================================================================================# SettingsLayout.addWidget(SortByModel) - SettingsLayout.addWidget(ThemeTitle) - SettingsLayout.addWidget(ThemeSelecter) SettingsLayout.addWidget(CualityTitle) SettingsLayout.addWidget(CualitySelecter) SettingsLayout.addStretch() @@ -340,7 +319,7 @@ def __EndDownloading(self, ExitCode: int): self.Print("Done! (" + self.__FormatExecutionTime(round(float(time.time() - self.__StartTime), 2)) + ")", True) else: - self.Print("Error! See CMD output for more information.", True) + self.Print("Error! See CLI output for more information.", True) # Удаление первого в очереди URL. self.Input.setText('\n'.join(self.Input.toPlainText().split('\n')[1:])) diff --git a/Source/yt_dlp.py b/Source/yt_dlp.py index 1668864..912b5c5 100644 --- a/Source/yt_dlp.py +++ b/Source/yt_dlp.py @@ -45,25 +45,37 @@ def __init__(self, SaveDirectory: str, Link: str, SortByUploader: bool, Cuality: # Возвращает словарь описания предварительного процессирования yt-dlp. def dump(self) -> dict: - # Получение дампа через вывод yt-dlp. - self.__Dump = json.loads(subprocess.getoutput(f"{self.__CurrentDirectory}\\yt-dlp\\yt-dlp --dump-json {self.__Link}")) + # Дампирование видео. + Result = subprocess.getoutput(f"{self.__CurrentDirectory}/yt-dlp/yt-dlp --dump-json {self.__Link}") + + # Если нет ошибки дампирования. + if Result.startswith("ERROR") == False: + print(Result) + # Получение дампа через вывод yt-dlp. + self.__Dump = json.loads(Result) return self.__Dump # Запускает выполнение команды. def run(self): # Дампирование видео. - self.dump() - # Получение имени файла и расширения. - Filename = self.__Dump["filename"] - # Получение имени загрузившего для сортировки. - Uploader = "\\" + self.__Dump["uploader"] + Result = self.dump() + # Код выполнения. + ExitCode = 1 + + # Если дампирование успешно. + if Result != None: + # Получение имени файла и расширения. + Filename = self.__Dump["filename"] + # Получение имени загрузившего для сортировки. + Uploader = "/" + self.__Dump["uploader"] - # Если сортировка отключена, обнулить загрузившего. - if self.__SortByUploader == False: - Uploader = "" + # Если сортировка отключена, обнулить загрузившего. + if self.__SortByUploader == False: + Uploader = "" - # Выполнение команды. - ExitCode = os.system(f"{self.__CurrentDirectory}\\yt-dlp\\yt-dlp -f \"bv*[height<={self.__Cuality}]+ba/b[height<={self.__Cuality}]\" -o \"{self.__SaveDirectory}{Uploader}\\{Filename}\" {self.__Link}") + # Выполнение команды. + ExitCode = os.system(f"{self.__CurrentDirectory}/yt-dlp/yt-dlp -f \"bv*[height<={self.__Cuality}]+ba/b[height<={self.__Cuality}]\" -o \"{self.__SaveDirectory}{Uploader}/{Filename}\" {self.__Link}") + # Генерация сигнала с завершающим кодом приложения. self.finished.emit(ExitCode) \ No newline at end of file diff --git a/PornHub Downloader.py b/main.py similarity index 86% rename from PornHub Downloader.py rename to main.py index 67098c4..8c6b861 100644 --- a/PornHub Downloader.py +++ b/main.py @@ -14,8 +14,7 @@ # Минимальная требуемая версия Python. PythonMinimalVersion = (3, 10) # Проверка соответствия. -if sys.version_info < PythonMinimalVersion: - sys.exit("Python %s.%s or later is required.\n" % PythonMinimalVersion) +if sys.version_info < PythonMinimalVersion: sys.exit("Python %s.%s or later is required.\n" % PythonMinimalVersion) #==========================================================================================# # >>>>> ЧТЕНИЕ НАСТРОЕК <<<<< # @@ -30,8 +29,8 @@ } # Словарь важных значений. ComData = { - "version": "1.3.1", - "copyright": "Copyright © 2023. DUB1401." + "version": "1.3.2", + "copyright": "Copyright © 2023-2024. DUB1401." } # Проверка доступности файла настроек. @@ -45,7 +44,7 @@ # Если директория для загрузки не указана. if Settings["save-directory"] == "": # Формирование пути. - Settings["save-directory"] = os.getcwd() + "\\Downloads" + Settings["save-directory"] = os.getcwd() + "/Downloads" # Если стандартной папки не существует, то создать. if os.path.exists("Downloads") == False: @@ -56,7 +55,7 @@ raise Exception("Settings.json file not found.") # Если не включён режим отладки, то свернуть консоль при запуске. -if Settings["debug"] == False: +if Settings["debug"] == False and sys.platform == "win32": ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 6) #==========================================================================================# @@ -65,8 +64,6 @@ # Создание экземпляра приложения. Application = QApplication(sys.argv) -# Установка системного стиля и цветовой схемы. -Application.setStyle(QStyleFactory.keys()[Settings["theme"]]) # Установка икноки. Application.setWindowIcon(QtGui.QIcon("icon.ico")) # Открытие главного окна. diff --git a/requirements.txt b/requirements.txt index 7780b97..60f5ba3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ pyinstaller +pyperclip requests pyqt6 \ No newline at end of file diff --git a/yt-dlp/yt-dlp b/yt-dlp/yt-dlp new file mode 100755 index 0000000..112634b Binary files /dev/null and b/yt-dlp/yt-dlp differ diff --git a/yt-dlp/yt-dlp.exe b/yt-dlp/yt-dlp.exe deleted file mode 100644 index 0899fb1..0000000 Binary files a/yt-dlp/yt-dlp.exe and /dev/null differ