Skip to content

Commit b8d92b8

Browse files
authored
Version 6.1.0 (#721)
* Adding #717 Output Naming settings tab with template editor, clickable variable chips, live preview, and validation for customizing output filenames with 23 pre-encode variables (thanks to roxerqermik) * Adding #660 Data & Attachments tab for per-track control of data streams (timecodes, navigation) and non-image attachments (fonts) (thanks to techguru0) * Adding #706 language and disposition metadata parsing from auto-detected external subtitle filenames (e.g., video.forced.deu.srt) (thanks to mpek) * Adding #706 auto-detection of external subtitle files (.srt, .ass, .ssa, .vtt, .sup, .sub, .idx) when loading a video, configurable in Settings (thanks to mpek) * Adding #698 external subtitle support for Rigaya encoders (NVEncC, QSVEncC, VCEEncC) via --sub-source (thanks to Augusto7743) * Adding always-on ffprobe validation of output files after every encode to catch silent failures * Adding Visual Crop window for dragging crop edges directly on a video frame preview, with live overlay and divisible-by-8 snapping on save * Adding bottom status bar with animated icon showing encoding state, progress bar, and status messages * Adding startup tasks (FFmpeg config, GPU detect, HDR10+ download) running through the status bar with main window visible * Adding Terms and Agreements dialog shown on first startup requiring user acceptance before proceeding * Fixing #719 Unable to save/load film grain setting for SVT-AV1 (thanks to gabriel101x) * Fixing #716 Maximize button not working (thanks to roxerqermik and 19Battlestar65) * Fixing #349 NVEncC audio conversion losing multichannel layout for EAC3 (thanks to Wontell) * Fixing #384 Remove HDR leaving Dolby Vision metadata traces in Rigaya encoder output (thanks to end2endzone) * Fixing #511 UI labels and buttons truncated in non-English translations by auto-shrinking text to fit (thanks to PegHorse) * Fixing #514 excessive memory usage when adding directory of files (thanks to gxcreator) * Fixing #548 incorrect aspect ratio for DVD sources with non-square pixels on auto resolution (thanks to DCNerds) * Fixing #600 anime subtitle size increasing during burn-in encoding (thanks to TinderboxUK) * Fixing #693 subtitle tracks losing title metadata during encoding (thanks to mpissarello) * Fixing #715 WINDOWS_BUILD.md needed updated to show Python 3.13 (thanks to Jack L) * Fixing #720 custom profile resolution settings (Height, Width, Long Edge, Custom, explicit like 640x480) being ignored when loading a video, defaulting to source resolution instead of profile resolution (thanks to Xoanon88) * Fixing UI scaling for Source/Folder/Filename text boxes, file extension dropdown, Resolution label, Start/End Time controls, and Crop input fields being too small * Fixing profile load/save for VVC period and threads, VP9 auto alt ref, lag in frames, AQ mode, and sharpness, rav1e photon noise, and AOM-AV1 denoise settings using integer as combo box index instead of matching by value * Fixing VCEEncC pre-analysis lookahead setting reading from wrong widget (pa_initqpsc instead of pa_lookahead) in HEVC, AV1, and AVC encoders * Fixing Settings window staying on top and freezing when notification dialogs appeared behind it * Fixing tab bar scroll arrows being too small and both stuck on the right side - now larger with left arrow on far left
1 parent 56f62ac commit b8d92b8

File tree

110 files changed

+6966
-748
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

110 files changed

+6966
-748
lines changed

.pre-commit-config.yaml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
repos:
22
- repo: https://github.com/pre-commit/pre-commit-hooks
3-
rev: v5.0.0
3+
rev: v6.0.0
44
hooks:
55
- id: mixed-line-ending
66
- id: trailing-whitespace
77
exclude: README.md
88
- id: requirements-txt-fixer
99
- id: check-yaml
1010
- id: check-json
11-
- id: fix-encoding-pragma
12-
- id: check-byte-order-marker
11+
- id: fix-byte-order-marker
1312
- id: debug-statements
1413
- id: check-added-large-files
1514
exclude: |
@@ -24,7 +23,7 @@ repos:
2423
- id: end-of-file-fixer
2524
- repo: https://github.com/astral-sh/ruff-pre-commit
2625
# Ruff version.
27-
rev: v0.12.1
26+
rev: v0.15.1
2827
hooks:
2928
# Run the linter.
3029
- id: ruff-check

CHANGES

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,34 @@
11
# Changelog
22

3+
## Version 6.1.0
4+
5+
* Adding #717 Output Naming settings tab with template editor, clickable variable chips, live preview, and validation for customizing output filenames with 23 pre-encode variables (thanks to roxerqermik)
6+
* Adding #660 Data & Attachments tab for per-track control of data streams (timecodes, navigation) and non-image attachments (fonts) (thanks to techguru0)
7+
* Adding #706 language and disposition metadata parsing from auto-detected external subtitle filenames (e.g., video.forced.deu.srt) (thanks to mpek)
8+
* Adding #706 auto-detection of external subtitle files (.srt, .ass, .ssa, .vtt, .sup, .sub, .idx) when loading a video, configurable in Settings (thanks to mpek)
9+
* Adding #698 external subtitle support for Rigaya encoders (NVEncC, QSVEncC, VCEEncC) via --sub-source (thanks to Augusto7743)
10+
* Adding always-on ffprobe validation of output files after every encode to catch silent failures
11+
* Adding Visual Crop window for dragging crop edges directly on a video frame preview, with live overlay and divisible-by-8 snapping on save
12+
* Adding bottom status bar with animated icon showing encoding state, progress bar, and status messages
13+
* Adding startup tasks (FFmpeg config, GPU detect, HDR10+ download) running through the status bar with main window visible
14+
* Adding Terms and Agreements dialog shown on first startup requiring user acceptance before proceeding
15+
* Fixing #719 Unable to save/load film grain setting for SVT-AV1 (thanks to gabriel101x)
16+
* Fixing #716 Maximize button not working (thanks to roxerqermik and 19Battlestar65)
17+
* Fixing #349 NVEncC audio conversion losing multichannel layout for EAC3 (thanks to Wontell)
18+
* Fixing #384 Remove HDR leaving Dolby Vision metadata traces in Rigaya encoder output (thanks to end2endzone)
19+
* Fixing #511 UI labels and buttons truncated in non-English translations by auto-shrinking text to fit (thanks to PegHorse)
20+
* Fixing #514 excessive memory usage when adding directory of files (thanks to gxcreator)
21+
* Fixing #548 incorrect aspect ratio for DVD sources with non-square pixels on auto resolution (thanks to DCNerds)
22+
* Fixing #600 anime subtitle size increasing during burn-in encoding (thanks to TinderboxUK)
23+
* Fixing #693 subtitle tracks losing title metadata during encoding (thanks to mpissarello)
24+
* Fixing #715 WINDOWS_BUILD.md needed updated to show Python 3.13 (thanks to Jack L)
25+
* Fixing #720 custom profile resolution settings (Height, Width, Long Edge, Custom, explicit like 640x480) being ignored when loading a video, defaulting to source resolution instead of profile resolution (thanks to Xoanon88)
26+
* Fixing UI scaling for Source/Folder/Filename text boxes, file extension dropdown, Resolution label, Start/End Time controls, and Crop input fields being too small
27+
* Fixing profile load/save for VVC period and threads, VP9 auto alt ref, lag in frames, AQ mode, and sharpness, rav1e photon noise, and AOM-AV1 denoise settings using integer as combo box index instead of matching by value
28+
* Fixing VCEEncC pre-analysis lookahead setting reading from wrong widget (pa_initqpsc instead of pa_lookahead) in HEVC, AV1, and AVC encoders
29+
* Fixing Settings window staying on top and freezing when notification dialogs appeared behind it
30+
* Fixing tab bar scroll arrows being too small and both stuck on the right side - now larger with left arrow on far left
31+
332
## Version 6.0.1
433

534
* Fixing Dolby Vision copy for Rigaya encoders (NVEncC, QSVEncC, VCEEncC) by adding --dolby-vision-profile copy alongside --dolby-vision-rpu copy

WINDOWS_BUILD.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ This guide explains how to build FastFlix executables on Windows.
44

55
## Prerequisites
66

7-
1. **Python 3.12 or higher**
7+
1. **Python 3.13 or higher**
88
- Download from [python.org](https://www.python.org/downloads/)
99
- Make sure to check "Add Python to PATH" during installation
1010

fastflix/application.py

Lines changed: 98 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@
1515
from fastflix.program_downloads import ask_for_ffmpeg, grab_stable_ffmpeg, download_hdr10plus_tool
1616
from fastflix.resources import main_icon, breeze_styles_path
1717
from fastflix.shared import file_date, message, latest_fastflix, DEVMODE, yes_no_message
18+
from fastflix.ui_constants import FONTS
1819
from fastflix.widgets.container import Container
19-
from fastflix.widgets.progress_bar import ProgressBar, Task
20+
from fastflix.widgets.status_bar import Task, STATE_IDLE, STATE_ERROR
2021
from fastflix.gpu_detect import automatic_rigaya_download
2122

2223
logger = logging.getLogger("fastflix")
@@ -41,10 +42,14 @@ def create_app(enable_scaling):
4142
main_app = FastFlixApp(sys.argv)
4243
main_app.allWindows()
4344
main_app.setApplicationDisplayName("FastFlix")
45+
46+
# On Linux, ensure an icon theme is set so QFileDialog toolbar icons appear
47+
if sys.platform == "linux" and not QtGui.QIcon.themeName():
48+
QtGui.QIcon.setThemeName("breeze")
4449
available_fonts = QtGui.QFontDatabase().families()
4550
font_preference = ["Roboto", "Segoe UI", "Ubuntu", "Open Sans", "Sans Serif"]
4651
selected_font = next((f for f in font_preference if f in available_fonts), "Sans Serif")
47-
my_font = QtGui.QFont(selected_font, 9)
52+
my_font = QtGui.QFont(selected_font, FONTS.SMALL)
4853
main_app.setFont(my_font)
4954
icon = QtGui.QIcon()
5055
icon.addFile(main_icon, QtCore.QSize(16, 16))
@@ -203,24 +208,30 @@ def app_setup(
203208
f"{app.fastflix.config.config_path}",
204209
title="Upgraded",
205210
)
211+
missing_ff = False
206212
try:
207213
app.fastflix.config.load(portable_mode=portable_mode)
208214
except MissingFF as err:
209215
if reusables.win_based and ask_for_ffmpeg():
210-
try:
211-
ProgressBar(app, [Task(t("Downloading FFmpeg"), grab_stable_ffmpeg)], signal_task=True)
212-
app.fastflix.config.load()
213-
except Exception as err:
214-
logger.exception(str(err))
215-
sys.exit(1)
216+
# User wants to download FFmpeg — will be handled after Container is shown
217+
missing_ff = "download"
216218
else:
217-
logger.error(f"Could not find {err} location, please manually set in {app.fastflix.config.config_path}")
218-
sys.exit(1)
219+
missing_ff = str(err)
220+
logger.warning(f"FFmpeg not found during config load: {err}")
219221
except Exception:
220-
# TODO give edit / delete options
221222
logger.exception(t("Could not load config file!"))
222223
sys.exit(1)
223224

225+
if not app.fastflix.config.terms_accepted:
226+
from fastflix.widgets.terms_agreement import TermsAgreementDialog
227+
228+
dialog = TermsAgreementDialog()
229+
if dialog.exec() == QtWidgets.QDialog.Accepted:
230+
app.fastflix.config.terms_accepted = True
231+
app.fastflix.config.save()
232+
else:
233+
sys.exit(0)
234+
224235
if app.fastflix.config.theme != "system":
225236
file = QtCore.QFile(str(breeze_styles_path / app.fastflix.config.theme / "stylesheet.qss"))
226237
file.open(QtCore.QFile.OpenModeFlag.ReadOnly | QtCore.QFile.OpenModeFlag.Text)
@@ -239,8 +250,65 @@ def app_setup(
239250

240251
app.setStyleSheet(data)
241252

253+
# On Linux/KDE, applying a custom stylesheet can disrupt the platform
254+
# icon theme for standard dialog icons (e.g., QFileDialog toolbar).
255+
# Re-asserting the icon theme after stylesheet application restores them.
256+
if sys.platform == "linux":
257+
theme_name = QtGui.QIcon.themeName() or "breeze"
258+
QtGui.QIcon.setThemeName(theme_name)
259+
242260
logger.setLevel(app.fastflix.config.logging_level)
243261

262+
# Initialize empty encoder/audio lists so Container can be created before startup tasks
263+
if app.fastflix.encoders is None:
264+
app.fastflix.encoders = {}
265+
if app.fastflix.audio_encoders is None:
266+
app.fastflix.audio_encoders = []
267+
268+
# Create and show Container immediately (UI starts disabled via Main.__init__)
269+
container = Container(app)
270+
container.show()
271+
272+
cursor_pos = QtGui.QCursor.pos()
273+
screen = QtGui.QGuiApplication.screenAt(cursor_pos) or QtGui.QGuiApplication.primaryScreen()
274+
screen_geometry = screen.availableGeometry()
275+
container.move(screen_geometry.center() - container.rect().center())
276+
277+
# Disable entire window during startup tasks
278+
container.setEnabled(False)
279+
app.processEvents()
280+
281+
# Handle missing FFmpeg
282+
if missing_ff:
283+
if missing_ff == "download":
284+
# Download FFmpeg through status bar
285+
try:
286+
container.status_bar.run_tasks(
287+
[Task(t("Downloading FFmpeg"), grab_stable_ffmpeg)],
288+
signal_task=True,
289+
persist_complete=True,
290+
)
291+
app.fastflix.config.load()
292+
except Exception as err:
293+
logger.exception(str(err))
294+
container.status_bar.set_state(
295+
STATE_ERROR,
296+
t("FFmpeg not found") + " — " + t("configure in Settings") + " (Ctrl+S)",
297+
)
298+
container.setEnabled(True)
299+
return app
300+
else:
301+
logger.error(
302+
f"Could not find {missing_ff} location, please manually set in {app.fastflix.config.config_path}"
303+
)
304+
container.status_bar.set_state(
305+
STATE_ERROR,
306+
t("FFmpeg not found") + " — " + t("configure in Settings") + " (Ctrl+S)",
307+
)
308+
container.setEnabled(True)
309+
return app
310+
311+
# GPU detect and HDR10+ download (Windows only, with user permission dialogs)
244312
if platform.system() == "Windows":
245313
if app.fastflix.config.auto_gpu_check is None:
246314
app.fastflix.config.auto_gpu_check = yes_no_message(
@@ -250,9 +318,14 @@ def app_setup(
250318
title="Allow Optional Downloads",
251319
)
252320
if app.fastflix.config.auto_gpu_check:
253-
ProgressBar(
254-
app, [Task(name=t("Detect GPUs"), command=automatic_rigaya_download)], signal_task=True, can_cancel=True
255-
)
321+
try:
322+
container.status_bar.run_tasks(
323+
[Task(name=t("Detect GPUs"), command=automatic_rigaya_download)],
324+
signal_task=True,
325+
can_cancel=True,
326+
)
327+
except Exception:
328+
logger.exception("Failed to detect GPUs")
256329

257330
if app.fastflix.config.auto_hdr10plus_check is None and not app.fastflix.config.hdr10plus_parser:
258331
app.fastflix.config.auto_hdr10plus_check = yes_no_message(
@@ -263,8 +336,7 @@ def app_setup(
263336
)
264337
if app.fastflix.config.auto_hdr10plus_check:
265338
try:
266-
ProgressBar(
267-
app,
339+
container.status_bar.run_tasks(
268340
[Task(t("Downloading HDR10+ Tool"), download_hdr10plus_tool)],
269341
signal_task=True,
270342
can_cancel=True,
@@ -277,6 +349,7 @@ def app_setup(
277349

278350
app.fastflix.config.save()
279351

352+
# Run startup tasks (FFmpeg config, encoder init) through status bar
280353
startup_tasks = [
281354
Task(t("Gather FFmpeg version"), ffmpeg_configuration),
282355
Task(t("Gather FFprobe version"), ffprobe_configuration),
@@ -286,17 +359,19 @@ def app_setup(
286359
]
287360

288361
try:
289-
ProgressBar(app, startup_tasks)
362+
container.status_bar.run_tasks(startup_tasks, persist_complete=True)
290363
except Exception:
291364
logger.exception(f"{t('Could not start FastFlix')}!")
292-
sys.exit(1)
365+
container.status_bar.set_state(STATE_ERROR, t("Could not start FastFlix"))
366+
container.setEnabled(True)
367+
return app
293368

294-
container = Container(app)
295-
container.show()
369+
# Encoders are now populated — initialize the encoder UI
370+
container.main.init_encoders_ui()
296371

297-
# container.move(QtGui.QGuiApplication.primaryScreen().availableGeometry().center() - container.rect().center())
298-
screen_geometry = QtGui.QGuiApplication.primaryScreen().availableGeometry()
299-
container.move(screen_geometry.center() - container.rect().center())
372+
# Re-enable UI after startup tasks complete
373+
container.setEnabled(True)
374+
container.status_bar.set_state(STATE_IDLE)
300375

301376
if not app.fastflix.config.disable_version_check:
302377
QtCore.QTimer.singleShot(500, lambda: latest_fastflix(app=app, show_new_dialog=False))

fastflix/data/icons/black/crop.svg

Lines changed: 15 additions & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading

fastflix/data/icons/white/crop.svg

Lines changed: 15 additions & 0 deletions
Loading
8.04 KB
Loading

0 commit comments

Comments
 (0)