Skip to content

Commit 10a6955

Browse files
authored
Version 6.1.1 (#723)
* Adding "Show completion popup message" (default off) and "Show error popup message" (default on) settings, replacing the old "Disable completion and error messages" toggle (thanks to Balthazar) * Adding #703 precise frame-based trimming (--trim) for rigaya encoders (NVEncC, QSVEncC, VCEEncC) when using Exact seek mode (thanks to Augusto7743) * Fixing #722 Timeout while extracting covers (thanks to larsk2) * Fixing #722 Bottom Crop words cut off (thanks to larsk2)
1 parent b8d92b8 commit 10a6955

23 files changed

Lines changed: 727 additions & 87 deletions

CHANGES

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

3+
## Version 6.1.1
4+
5+
* Adding "Show completion popup message" (default off) and "Show error popup message" (default on) settings, replacing the old "Disable completion and error messages" toggle (thanks to Balthazar)
6+
* Adding #703 precise frame-based trimming (--trim) for rigaya encoders (NVEncC, QSVEncC, VCEEncC) when using Exact seek mode (thanks to Augusto7743)
7+
* Fixing #722 Timeout while extracting covers (thanks to larsk2)
8+
* Fixing #722 Bottom Crop words cut off (thanks to larsk2)
9+
310
## Version 6.1.0
411

512
* 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)

fastflix/data/languages.yaml

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13947,3 +13947,213 @@ top:
1394713947
ukr: верхній
1394813948
kor: top
1394913949
ron: top
13950+
Output Filename Template:
13951+
eng: Output Filename Template
13952+
deu: Vorlage für Ausgabedateinamen
13953+
fra: Modèle de nom de fichier de sortie
13954+
ita: Modello di nome del file di output
13955+
spa: Plantilla de nombre de archivo de salida
13956+
jpn: 出力ファイル名テンプレート
13957+
rus: Шаблон имени выходного файла
13958+
por: Modelo de nome de ficheiro de saída
13959+
swe: Mall för utdatafilens namn
13960+
pol: Szablon nazwy pliku wyjściowego
13961+
chs: 输出文件名模板
13962+
ukr: Шаблон імені вихідного файлу
13963+
kor: 출력 파일 이름 템플릿
13964+
ron: Șablon nume fișier de ieșire
13965+
Reset to default template:
13966+
eng: Reset to default template
13967+
deu: Auf Standardvorlage zurücksetzen
13968+
fra: Réinitialiser le modèle par défaut
13969+
ita: Ripristino del modello predefinito
13970+
spa: Restablecer plantilla por defecto
13971+
jpn: デフォルトテンプレートにリセット
13972+
rus: Сброс к шаблону по умолчанию
13973+
por: Repor o modelo predefinido
13974+
swe: Återställ till standardmall
13975+
pol: Przywróć domyślny szablon
13976+
chs: 重置为默认模板
13977+
ukr: Скидання до шаблону за замовчуванням
13978+
kor: 기본 템플릿으로 재설정
13979+
ron: Resetare la șablonul implicit
13980+
"Preview:":
13981+
eng: "Preview:"
13982+
deu: 'Vorschau:'
13983+
fra: 'Avant-première :'
13984+
ita: 'Anteprima:'
13985+
spa: 'Vista previa:'
13986+
jpn: プレビュー
13987+
rus: 'Предпросмотр:'
13988+
por: 'Pré-visualização:'
13989+
swe: 'Förhandsgranskning:'
13990+
pol: 'Podgląd:'
13991+
chs: 预览:
13992+
ukr: 'Попередній перегляд:'
13993+
kor: '미리 보기:'
13994+
ron: 'Previzualizare:'
13995+
Pre-Encode Variables:
13996+
eng: Pre-Encode Variables
13997+
deu: Variablen vorcodieren
13998+
fra: Pré-codage des variables
13999+
ita: Pre-codifica delle variabili
14000+
spa: Precodificación de variables
14001+
jpn: 変数の事前エンコード
14002+
rus: Предварительное кодирование переменных
14003+
por: Pré-codificar variáveis
14004+
swe: Förkoda variabler
14005+
pol: Wstępne kodowanie zmiennych
14006+
chs: 预编码变量
14007+
ukr: Змінні попереднього кодування
14008+
kor: 사전 인코딩 변수
14009+
ron: Pre-codificarea variabilelor
14010+
Example:
14011+
eng: Example
14012+
deu: Beispiel
14013+
fra: Exemple
14014+
ita: Esempio
14015+
spa: Ejemplo
14016+
jpn: 例
14017+
rus: Пример
14018+
por: Exemplo
14019+
swe: Exempel
14020+
pol: Przykład
14021+
chs: 示例
14022+
ukr: Приклад
14023+
kor: 예
14024+
ron: Exemplu
14025+
Post-Encode Variables:
14026+
eng: Post-Encode Variables
14027+
deu: Post-Encode-Variablen
14028+
fra: Variables post-codées
14029+
ita: Variabili post-codifica
14030+
spa: Variables postcodificación
14031+
jpn: ポスト・エンコード変数
14032+
rus: Переменные после кодирования
14033+
por: Variáveis pós-codificadas
14034+
swe: Variabler efter kodning
14035+
pol: Zmienne po zakodowaniu
14036+
chs: 编码后变量
14037+
ukr: Змінні після кодування
14038+
kor: 인코딩 후 변수
14039+
ron: Variabilele Post-Encode
14040+
Resolved after encoding completes; file will be renamed automatically:
14041+
eng: Resolved after encoding completes; file will be renamed automatically
14042+
deu: Nach Abschluss der Kodierung behoben; die Datei wird automatisch umbenannt
14043+
fra: Résolu une fois l'encodage terminé ; le fichier sera renommé automatiquement.
14044+
ita: Risolto al termine della codifica; il file verrà rinominato automaticamente.
14045+
spa: Resuelto una vez finalizada la codificación; el archivo se renombrará automáticamente.
14046+
jpn: エンコード完了後に解決。ファイル名は自動的に変更されます。
14047+
rus: Устранено после завершения кодирования; файл будет переименован автоматически
14048+
por: Resolvido após a conclusão da codificação; o ficheiro será renomeado automaticamente
14049+
swe: Löses efter att kodningen är klar; filen kommer att döpas om automatiskt
14050+
pol: Rozwiązane po zakończeniu kodowania; nazwa pliku zostanie zmieniona automatycznie.
14051+
chs: 编码完成后已解决;文件将自动重命名
14052+
ukr: Вирішено після завершення кодування; файл буде перейменовано автоматично
14053+
kor: 인코딩이 완료된 후 해결되며 파일 이름이 자동으로 변경됩니다.
14054+
ron: Rezolvat după finalizarea codării; fișierul va fi redenumit automat
14055+
Description:
14056+
eng: Description
14057+
deu: Beschreibung
14058+
fra: Description
14059+
ita: Descrizione
14060+
spa: Descripción
14061+
jpn: 説明
14062+
rus: Описание
14063+
por: Descrição
14064+
swe: Beskrivning
14065+
pol: Opis
14066+
chs: 说明
14067+
ukr: Опис
14068+
kor: 설명
14069+
ron: Descriere
14070+
Phase:
14071+
eng: Phase
14072+
deu: Phase
14073+
fra: Phase
14074+
ita: Fase
14075+
spa: Fase
14076+
jpn: フェーズ
14077+
rus: Фаза
14078+
por: Fase
14079+
swe: Fas
14080+
pol: Faza
14081+
chs: 阶段
14082+
ukr: Фаза
14083+
kor: 단계
14084+
ron: Faza
14085+
Pre-Encode:
14086+
eng: Pre-Encode
14087+
deu: Vor-Codierung
14088+
fra: Pré-encodage
14089+
ita: Pre-codifica
14090+
spa: Precodificación
14091+
jpn: プリ・エンコード
14092+
rus: Предварительное кодирование
14093+
por: Pré-codificar
14094+
swe: Förkodning
14095+
pol: Wstępne kodowanie
14096+
chs: 预编码
14097+
ukr: Попередній код
14098+
kor: 사전 인코딩
14099+
ron: Pre-codificare
14100+
Post-Encode:
14101+
eng: Post-Encode
14102+
deu: Post-Encode
14103+
fra: Post-Encode
14104+
ita: Post-codifica
14105+
spa: Post-Encode
14106+
jpn: ポスト・エンコード
14107+
rus: Post-Encode
14108+
por: Pós-codificação
14109+
swe: Post-kodning
14110+
pol: Post-Encode
14111+
chs: 编码后
14112+
ukr: Пост-енкод
14113+
kor: 인코딩 후
14114+
ron: Post-codificare
14115+
Output Naming:
14116+
eng: Output Naming
14117+
deu: Benennung der Ausgabe
14118+
fra: Désignation des sorties
14119+
ita: Denominazione dell'uscita
14120+
spa: Nombres de salida
14121+
jpn: 出力ネーミング
14122+
rus: Именование выходных данных
14123+
por: Nomeação de saída
14124+
swe: Namngivning av utdata
14125+
pol: Nazewnictwo wyjścia
14126+
chs: 输出命名
14127+
ukr: Іменування виходів
14128+
kor: 출력 이름 지정
14129+
ron: Denumiri de ieșire
14130+
Show completion popup message:
14131+
eng: Show completion popup message
14132+
deu: Popup-Meldung zum Abschluss anzeigen
14133+
fra: Afficher le message d'achèvement
14134+
ita: Mostra il messaggio popup di completamento
14135+
spa: Mostrar mensaje emergente de finalización
14136+
jpn: 完了ポップアップメッセージの表示
14137+
rus: Показать всплывающее сообщение о завершении
14138+
por: Mostrar mensagem pop-up de conclusão
14139+
swe: Visa popup-meddelande om slutförande
14140+
pol: Pokaż wyskakujący komunikat ukończenia
14141+
chs: 弹出显示完成信息
14142+
ukr: Показати спливаюче повідомлення про завершення
14143+
kor: 완료 팝업 메시지 표시
14144+
ron: Afișați mesajul pop-up de finalizare
14145+
Show error popup message:
14146+
eng: Show error popup message
14147+
deu: Fehler-Popup-Meldung anzeigen
14148+
fra: Afficher un message d'erreur
14149+
ita: Mostra il messaggio popup di errore
14150+
spa: Mostrar mensaje emergente de error
14151+
jpn: エラーのポップアップメッセージを表示する
14152+
rus: Показать всплывающее сообщение об ошибке
14153+
por: Mostrar mensagem pop-up de erro
14154+
swe: Visa popup-meddelande för fel
14155+
pol: Pokaż wyskakujący komunikat o błędzie
14156+
chs: 弹出错误信息
14157+
ukr: Показати спливаюче повідомлення про помилку
14158+
kor: 오류 팝업 메시지 표시
14159+
ron: Afișați mesajul pop-up de eroare

fastflix/encoders/common/encc_helpers.py

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# -*- coding: utf-8 -*-
22
import logging
3-
from typing import List
3+
from typing import List, Optional
44

5-
from fastflix.models.video import SubtitleTrack, AudioTrack, DataTrack
5+
from fastflix.models.video import SubtitleTrack, AudioTrack, DataTrack, Video
66
from fastflix.encoders.common.audio import lossless
77
from fastflix.models.fastflix import FastFlix
88
from fastflix.models.encode import VCEEncCAVCSettings, VCEEncCAV1Settings, VCEEncCSettings
@@ -72,6 +72,56 @@ def rigaya_auto_options(fastflix: FastFlix) -> List[str]:
7272
]
7373

7474

75+
def _parse_frame_rate(frame_rate_str: str) -> Optional[float]:
76+
"""Parse a frame rate string like '24000/1001' or '30' into a float.
77+
78+
Returns None if the string is empty or cannot be parsed.
79+
"""
80+
if not frame_rate_str:
81+
return None
82+
try:
83+
if "/" in frame_rate_str:
84+
num, den = frame_rate_str.split("/", 1)
85+
denominator = float(den)
86+
if denominator == 0:
87+
return None
88+
return float(num) / denominator
89+
return float(frame_rate_str)
90+
except (ValueError, ZeroDivisionError):
91+
return None
92+
93+
94+
def rigaya_trim_or_seek(video: Video) -> List[str]:
95+
"""Build time trimming arguments for rigaya encoders.
96+
97+
In exact mode (fast_seek=False), uses --trim with frame numbers for precise cutting.
98+
In fast mode (fast_seek=True), uses --seek/--seekto with timestamps.
99+
Falls back to --seek/--seekto if frame rate is unavailable in exact mode.
100+
"""
101+
start_time = video.video_settings.start_time
102+
end_time = video.video_settings.end_time
103+
104+
if not start_time and not end_time:
105+
return []
106+
107+
if not video.video_settings.fast_seek:
108+
fps = _parse_frame_rate(video.frame_rate)
109+
if fps:
110+
start_frame = int(start_time * fps) if start_time else 0
111+
if end_time:
112+
end_frame = int(end_time * fps)
113+
else:
114+
end_frame = int(video.duration * fps)
115+
return ["--trim", f"{start_frame}:{end_frame}"]
116+
117+
result = []
118+
if start_time:
119+
result.extend(["--seek", str(start_time)])
120+
if end_time:
121+
result.extend(["--seekto", str(end_time)])
122+
return result
123+
124+
75125
def pa_builder(settings: VCEEncCAVCSettings | VCEEncCAV1Settings | VCEEncCSettings):
76126
if not settings.pre_analysis:
77127
return ""

fastflix/encoders/nvencc_av1/command_builder.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
build_data,
1313
rigaya_auto_options,
1414
rigaya_avformat_reader,
15+
rigaya_trim_or_seek,
1516
)
1617

1718
logger = logging.getLogger("fastflix")
@@ -63,10 +64,7 @@ def build(fastflix: FastFlix):
6364

6465
if stream_id:
6566
command.extend(["--video-streamid", str(stream_id)])
66-
if video.video_settings.start_time:
67-
command.extend(["--seek", str(video.video_settings.start_time)])
68-
if video.video_settings.end_time:
69-
command.extend(["--seekto", str(video.video_settings.end_time)])
67+
command.extend(rigaya_trim_or_seek(video))
7068
if video.video_settings.source_fps:
7169
command.extend(["--fps", str(video.video_settings.source_fps)])
7270
if video.video_settings.rotate:

fastflix/encoders/nvencc_avc/command_builder.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
build_data,
1313
rigaya_auto_options,
1414
rigaya_avformat_reader,
15+
rigaya_trim_or_seek,
1516
)
1617

1718
logger = logging.getLogger("fastflix")
@@ -57,10 +58,7 @@ def build(fastflix: FastFlix):
5758

5859
if stream_id:
5960
command.extend(["--video-streamid", str(stream_id)])
60-
if video.video_settings.start_time:
61-
command.extend(["--seek", str(video.video_settings.start_time)])
62-
if video.video_settings.end_time:
63-
command.extend(["--seekto", str(video.video_settings.end_time)])
61+
command.extend(rigaya_trim_or_seek(video))
6462
if video.video_settings.source_fps:
6563
command.extend(["--fps", str(video.video_settings.source_fps)])
6664
if video.video_settings.rotate:

fastflix/encoders/nvencc_hevc/command_builder.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
build_data,
1313
rigaya_auto_options,
1414
rigaya_avformat_reader,
15+
rigaya_trim_or_seek,
1516
)
1617

1718
logger = logging.getLogger("fastflix")
@@ -63,10 +64,7 @@ def build(fastflix: FastFlix):
6364

6465
if stream_id:
6566
command.extend(["--video-streamid", str(stream_id)])
66-
if video.video_settings.start_time:
67-
command.extend(["--seek", str(video.video_settings.start_time)])
68-
if video.video_settings.end_time:
69-
command.extend(["--seekto", str(video.video_settings.end_time)])
67+
command.extend(rigaya_trim_or_seek(video))
7068
if video.video_settings.source_fps:
7169
command.extend(["--fps", str(video.video_settings.source_fps)])
7270
if video.video_settings.rotate:

fastflix/encoders/qsvencc_av1/command_builder.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
build_data,
1414
rigaya_auto_options,
1515
rigaya_avformat_reader,
16+
rigaya_trim_or_seek,
1617
)
1718

1819
logger = logging.getLogger("fastflix")
@@ -58,11 +59,7 @@ def build(fastflix: FastFlix):
5859
if stream_id:
5960
command.extend(["--video-streamid", str(stream_id)])
6061

61-
if video.video_settings.start_time:
62-
command.extend(["--seek", str(video.video_settings.start_time)])
63-
64-
if video.video_settings.end_time:
65-
command.extend(["--seekto", str(video.video_settings.end_time)])
62+
command.extend(rigaya_trim_or_seek(video))
6663

6764
if video.video_settings.source_fps:
6865
command.extend(["--fps", str(video.video_settings.source_fps)])

fastflix/encoders/qsvencc_avc/command_builder.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
build_data,
1414
rigaya_auto_options,
1515
rigaya_avformat_reader,
16+
rigaya_trim_or_seek,
1617
)
1718

1819
logger = logging.getLogger("fastflix")
@@ -58,11 +59,7 @@ def build(fastflix: FastFlix):
5859
if stream_id:
5960
command.extend(["--video-streamid", str(stream_id)])
6061

61-
if video.video_settings.start_time:
62-
command.extend(["--seek", str(video.video_settings.start_time)])
63-
64-
if video.video_settings.end_time:
65-
command.extend(["--seekto", str(video.video_settings.end_time)])
62+
command.extend(rigaya_trim_or_seek(video))
6663

6764
if video.video_settings.source_fps:
6865
command.extend(["--fps", str(video.video_settings.source_fps)])

0 commit comments

Comments
 (0)