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