Compare commits

...

30 commits

Author SHA1 Message Date
3ee781bfc2 chore: fige Cargo.lock (epoch-1.9.0, [patch] locaux)
Some checks failed
Validate .desktop files / validate (push) Has been cancelled
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 21:03:54 +02:00
cfdeaa3ae1 merge: epoch-1.9.0 d'upstream 2026-09-24 20:46:53 +02:00
Michael Murphy
66b3f34335
i18n: translation update from Hosted Weblate (#328)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for [Pop OS/COSMIC
Player](https://hosted.weblate.org/projects/pop-os/cosmic-player/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/pop-os/cosmic-player/matrix-auto.svg)
2026-09-15 21:57:21 +02:00
Hosted Weblate
3d8af19ac4
i18n: translation updates from weblate
Co-authored-by: Amadɣas <massiin@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kurt Harren Catindig <kurtharrencatindig03@gmail.com>
Co-authored-by: Quentin PAGÈS <quentinantonin@free.fr>
Co-authored-by: Satakun Utama <galaxytomostore@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/kab/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/oc/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/th/
Translation: Pop OS/COSMIC Player
2026-09-12 11:51:35 +00:00
78b806a347 chore: fige Cargo.lock
Some checks failed
Validate .desktop files / validate (push) Has been cancelled
2026-09-10 18:11:31 +02:00
45c9b1aa19 Merge tag 'epoch-1.8.0'
Epoch 1.8.0

# Conflicts:
#	Cargo.lock
#	src/video.rs
2026-09-10 17:57:28 +02:00
Levi Portenier
a297c24a96
Epoch 1.8.0 version update (#331)
Generated by cosmic-epoch scripts/version-update.sh
2026-09-02 12:19:07 -06:00
Jeremy Soller
f0365d411b Epoch 1.8.0 version update
Generated by cosmic-epoch scripts/version-update.sh
2026-09-02 08:15:29 -06:00
krakotay
e040f7fbc7
fix: playback of malformed MP4 files with invalid framerates
- [x] I have disclosed use of any AI generated code in my commit
messages.
- If you are using an LLM, and do not fully understand the changes it is
making to the code base, do not create a PR.
- In our experience, AI generated code often results in overly complex
code that lacks enough context for a proper fix or feature inclusion.
This results in considerably longer code reviews. Due to this, AI
authored or partially authored PRs may be closed without comment.
- [x] I understand these changes in full and will be able to respond to
review comments.
- [x] My change is accurately described in the commit message.
- [x] My contribution is tested and working as described.
- [x] I have read the [Developer Certificate of
Origin](https://developercertificate.org/) and certify my contribution
under its conditions.

Some malformed MP4 files previously wouldn't play at all because they
reported a 0/1 framerate.
Other files suffered from severe audio stuttering caused by repeated
long GAP events emitted from malformed edit lists.
This patch treats invalid framerates as unknown (allowing the existing
fallback to be used) and suppresses suspicious long audio GAP events
before they reach the audio sink.
As a result, both kinds of videos now play correctly.
2026-08-29 02:31:43 +02:00
89dd5e1f10 chore: fige Cargo.lock tel que resolu apres le merge 1.7.0
Some checks failed
Validate .desktop files / validate (push) Has been cancelled
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-27 07:58:51 +02:00
3171217e5a Merge tag 'epoch-1.7.0'
Some checks failed
Validate .desktop files / validate (push) Has been cancelled
Epoch 1.7.0
2026-08-27 07:50:01 +02:00
Jeremy Soller
c9cba75c84 Epoch 1.7.0 version update
Generated by cosmic-epoch scripts/version-update.sh
2026-08-25 12:11:05 -06:00
Michael Aaron Murphy
23254703eb
i18n(da): Weblate translation update 2026-08-24 20:05:24 +02:00
7f22e7ce73 Merge remote-tracking branch 'upstream/master'
Some checks failed
Validate .desktop files / validate (push) Has been cancelled
# Conflicts:
#	Cargo.lock
#	Cargo.toml
#	src/main.rs
2026-08-19 21:59:21 +02:00
Hosted Weblate
b5f2fffe65
i18n: translation updates from weblate
Co-authored-by: Andi Chandler <andi@gowling.com>
Co-authored-by: CodeBeats <nicholai67@hotmail.com>
Co-authored-by: Feike Donia <feikedonia@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jiri Grönroos <jiri.gronroos@iki.fi>
Co-authored-by: Martin Meizoso <martinmeizoso@gmail.com>
Co-authored-by: Michael Millet <mikevlet@protonmail.com>
Co-authored-by: Quentin PAGÈS <quentinantonin@free.fr>
Co-authored-by: Steen Rabol <steen@rabol.dev>
Co-authored-by: Walter William Beckerleg Bruckman <spayk.99@protonmail.com>
Co-authored-by: Wilbur Lindqvist <william@willmantrade.com>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/da/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/en_GB/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/fi/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/gl/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/hu/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/it/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/oc/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/pt_BR/
Translation: Pop OS/COSMIC Player
2026-08-19 11:51:33 +02:00
Jeremy Soller
55ecae4644 Epoch 1.6.0 version update
Generated by cosmic-epoch scripts/version-update.sh
2026-08-18 13:38:32 -06:00
Michael Murphy
12b82dee7f
i18n: translation update from Hosted Weblate (#313) 2026-08-18 14:09:20 +02:00
Hosted Weblate
7019204d92
i18n: translation updates from weblate
Co-authored-by: Andi Chandler <andi@gowling.com>
Co-authored-by: CodeBeats <nicholai67@hotmail.com>
Co-authored-by: Feike Donia <feikedonia@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jiri Grönroos <jiri.gronroos@iki.fi>
Co-authored-by: Martin Meizoso <martinmeizoso@gmail.com>
Co-authored-by: Michael Millet <mikevlet@protonmail.com>
Co-authored-by: Quentin PAGÈS <quentinantonin@free.fr>
Co-authored-by: Steen Rabol <steen@rabol.dev>
Co-authored-by: Walter William Beckerleg Bruckman <spayk.99@protonmail.com>
Co-authored-by: Wilbur Lindqvist <william@willmantrade.com>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/da/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/en_GB/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/fi/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/gl/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/hu/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/it/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/oc/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/pt_BR/
Translation: Pop OS/COSMIC Player
2026-08-18 05:51:23 +00:00
Jeremy Soller
23d59445af
Epoch 1.5.0 version update (#310)
Generated by cosmic-epoch scripts/version-update.sh
2026-07-28 18:02:38 -06:00
Jeremy Soller
ea17341561 Epoch 1.5.0 version update
Generated by cosmic-epoch scripts/version-update.sh
2026-07-28 09:14:39 -06:00
Michael Murphy
b5519754cf
i18n: translation update from Hosted Weblate (#277)
Translations update from [Hosted Weblate](https://hosted.weblate.org)
for [Pop OS/COSMIC
Player](https://hosted.weblate.org/projects/pop-os/cosmic-player/).



Current translation status:

![Weblate translation
status](https://hosted.weblate.org/widget/pop-os/cosmic-player/horizontal-auto.svg)
2026-07-28 16:47:30 +02:00
Hosted Weblate
2d8aa63da3
i18n: translation updates from weblate
Co-authored-by: Adolfo Jayme Barrientos <fitojb@ubuntu.com>
Co-authored-by: Ahrakiel <christopherbatrier@gmail.com>
Co-authored-by: Aman Alam <aalam@users.noreply.hosted.weblate.org>
Co-authored-by: AriyA66Y <ariya66y@protonmail.com>
Co-authored-by: Baurzhan Muftakhidinov <baurthefirst@gmail.com>
Co-authored-by: CYAXXX <85353920+CYAXXX@users.noreply.github.com>
Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Fedorov Alexei <aleksejfedorov963@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Isaac Subirana <isaacsubiranac@gmail.com>
Co-authored-by: Jim Spentzos <jimspentzos2000@gmail.com>
Co-authored-by: Jun Hwi Ku <siguning@gmail.com>
Co-authored-by: Kartik Nayak <65574961+kodebarista@users.noreply.github.com>
Co-authored-by: Prasanta-Hembram <Prasantahembram720@gmail.com>
Co-authored-by: VandaL <vandalhj@gmail.com>
Co-authored-by: Vilius Paliokas <viliuspaliokas@gmail.com>
Co-authored-by: Zahid Rizky Fakhri <zahidrizkyfakhri@gmail.com>
Co-authored-by: jonnysemon <jonnysemon@users.noreply.hosted.weblate.org>
Co-authored-by: taijuin Lee <taijuin@gmail.com>
Co-authored-by: therealmate <hellogaming91@gmail.com>
Co-authored-by: Димко <Dymkovych@proton.me>
Co-authored-by: 현월 <kmj10727@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/ar/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/ca/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/de/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/el/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/fa/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/fr/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/hi/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/hu/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/id/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/kk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/kmr/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/ko/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/lt/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/pa/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/pl/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/ru/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/uk/
Translate-URL: https://hosted.weblate.org/projects/pop-os/cosmic-player/zh_Hant/
Translation: Pop OS/COSMIC Player
2026-07-28 06:02:02 +00:00
Jeremy Soller
7550c300c4
Merge pull request #307 from pop-os/epoch-update
Epoch 1.4.0 version update
2026-07-20 18:14:42 -06:00
Jeremy Soller
bfbf2a1387 Epoch 1.4.0 version update
Generated by cosmic-epoch scripts/version-update.sh
2026-07-20 14:36:38 -06:00
Jeremy Soller
d910353b6f Epoch 1.3.0 version update
Generated by cosmic-epoch scripts/version-update.sh
2026-07-13 10:29:00 -06:00
Jeremy Soller
c33c3e97cd
Merge pull request #297 from pop-os/update-libcosmic
chore: update libcosmic
2026-07-09 17:14:05 -06:00
Ashley Wulber
8eb774ebca chore: update libcosmic 2026-07-09 18:23:34 -04:00
Ashley Wulber
e3b610271f fix: custom style with transparent clear is buggy 2026-07-07 20:48:00 +02:00
Jeremy Soller
b8000c5fff
Merge pull request #293 from pop-os/theme-v2
Theme v2
2026-07-06 07:12:10 -06:00
Ashley Wulber
54ed6b0a93 feat: blur 2026-07-01 22:59:45 -04:00
34 changed files with 1128 additions and 704 deletions

2
.gitignore vendored
View file

@ -10,4 +10,4 @@
!/vendor/iced_video_player/
!/vendor/iced_video_player/**
/vendor.tar
.idea/
.idea/

1432
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
[package]
name = "cosmic-player"
version = "1.3.0"
version = "1.8.0"
edition = "2024"
rust-version = "1.93"

36
debian/changelog vendored
View file

@ -1,3 +1,39 @@
cosmic-player (1.8.0) noble; urgency=medium
* Epoch 1.8.0 version update
-- Jeremy Soller <jeremy@system76.com> Wed, 02 Sep 2026 08:15:23 -0600
cosmic-player (1.7.0) noble; urgency=medium
* Epoch 1.7.0 version update
-- Jeremy Soller <jeremy@system76.com> Tue, 25 Aug 2026 09:20:51 -0600
cosmic-player (1.6.0) noble; urgency=medium
* Epoch 1.6.0 version update
-- Jeremy Soller <jeremy@system76.com> Tue, 18 Aug 2026 07:14:20 -0600
cosmic-player (1.5.0) noble; urgency=medium
* Epoch 1.5.0 version update
-- Jeremy Soller <jeremy@system76.com> Tue, 28 Jul 2026 09:14:34 -0600
cosmic-player (1.4.0) noble; urgency=medium
* Epoch 1.4.0 version update
-- Jeremy Soller <jeremy@system76.com> Mon, 20 Jul 2026 14:36:34 -0600
cosmic-player (1.3.0) noble; urgency=medium
* Epoch 1.3.0 version update
-- Jeremy Soller <jeremy@system76.com> Sun, 12 Jul 2026 13:21:52 -0600
cosmic-player (1.2.0) noble; urgency=medium
* Epoch 1.2.0 version update

View file

@ -17,7 +17,7 @@ settings = الإعدادات
### Appearance
appearance = المظهر
theme = النسق
theme = السمة
match-desktop = طابق سطح المكتب
dark = داكن
light = فاتح
@ -34,7 +34,7 @@ close-file = أغلِق الملف
open-media-folder = افتح مجلَّد الوسائط...
open-recent-media-folder = افتح مجلِّد الوسائط الحديثة
close-media-folder = أغلِق مجلد الوسائط
quit = أنهِ
quit = إنهِ
off = معطّل
clear-recent = امحُ القائمة الحديثة
repeat-disabled = التكرار مُعطَّل

View file

@ -1,2 +1,3 @@
quit = Surt
settings = Configuració
open-file = Obre el fitxer

View file

@ -0,0 +1,36 @@
quit = Afslut
appearance = Udseende
theme = Tema
match-desktop = Følg skrivebordets indstillinger
dark = Mørkt
light = Lyst
close-file = Luk fil
settings = Indstillinger
open-file = Åbn fil
open-folder = Åbn mappe
file = Fil
album = Album: { $album }
audio = Lyd
no-video-or-audio-file-open = Ingen video- eller lydfil åben
off = Fra
subtitles = Undertekster
unknown-author = Ukendt Forfatter
untitled = Utituleret
open-media = Åbn medie...
open-recent-media = Åbn seneste medie
clear-recent = Ryd seneste-liste
open-media-folder = Åbn mediemappe...
open-recent-media-folder = Åbn seneste mediemappe
close-media-folder = Luk mediemappe
repeat-disabled = Gentagelse deaktiveret
repeat-track = Gentag nummer
playback = Afspilning
next-frame = Næste billede
previous-frame = Forrige billede
ab-repeat = A-B-gentagelse
ab-repeat-set-a = A-B-gentagelse (A)
ab-repeat-set-b = A-B-gentagelse (B)
ab-repeat-clear = Ryd A-B-gentagelse
xdg-name = COSMIC Medieafspiller
xdg-comment = Medieafspiller til COSMIC-skrivebordet
xdg-keywords = Lyd;Film;Film;Musik;Lyd;Video;

View file

@ -28,10 +28,10 @@ light = Hell
## Datei
file = Datei
open-media = Medium öffnen...
open-media = Medium öffnen ...
open-recent-media = Zuletzt verwendetes Medium öffnen
close-file = Datei schließen
open-media-folder = Medienordner öffnen...
open-media-folder = Medienordner öffnen ...
open-recent-media-folder = Ordner der zuletzt verwendeten Medien öffnen
close-media-folder = Medienordner schließen
quit = Beenden

View file

@ -10,7 +10,7 @@ untitled = Χωρίς τίτλο
theme = Θέμα
repeat-track = Επανάληψη κομματιού
appearance = Εμφάνιση
quit = Έξοδος
quit = Τερματισμός
album = Άλμπουμ: { $album }
playback = Αναπαραγωγή
next-frame = Επόμενο καρέ

View file

@ -0,0 +1,11 @@
quit = Quit
settings = Settings
appearance = Appearance
theme = Theme
match-desktop = Match desktop
dark = Dark
light = Light
file = File
close-file = Close file
open-file = Open file
open-folder = Open folder

View file

@ -0,0 +1 @@
quit = خروج

View file

@ -11,7 +11,7 @@ unknown-author = Tuntematon tekijä
untitled = Nimetön
appearance = Ulkoasu
theme = Teema
match-desktop = Sovita työpöytään
match-desktop = Sama kuin työpöytä
dark = Tumma
light = Vaalea
file = Tiedosto

View file

View file

@ -2,7 +2,7 @@ album = Album : { $album }
audio = Audio
no-video-or-audio-file-open = Aucun média sélectionné
open-file = Ouvrir le fichier
open-folder = Ouvrir dossier
open-folder = Ouvrir le dossier
subtitles = Sous-titres
unknown-author = Auteur Inconnu
untitled = Sans titre

36
i18n/gl/cosmic_player.ftl Normal file
View file

@ -0,0 +1,36 @@
settings = Axustes
appearance = Apariencia
theme = Tema
match-desktop = Axustar ao escritorio
dark = Escuro
light = Claro
file = Ficheiro
close-file = Pechar ficheiro
quit = Pechar
open-file = Abrir ficheiro
open-folder = Abrir cartafol
album = Álbum: { $album }
audio = Audio
no-video-or-audio-file-open = Non hai ningún ficheiro de vídeo ou audio aberto
off = Desactivado
subtitles = Subtitulos
unknown-author = Autor descoñecido
untitled = Sen titulo
open-media = Abrir multimedia..
open-recent-media = Abrir multimedia recente
clear-recent = Limpar lista de recentes
open-media-folder = Abrir cartafol multimedia...
open-recent-media-folder = Abrir o cartafol de medios recentes
close-media-folder = Pechar carpeta multimedia
repeat-disabled = Repetición desactivada
repeat-track = Repetir pista
playback = Reprodución
next-frame = Seguinte fotograma
previous-frame = Fotograma anterior
ab-repeat = Repetición A-B
ab-repeat-set-a = Repetición A-B (A)
ab-repeat-set-b = Repetición A-B (B)
ab-repeat-clear = Limpar repetición A-B
xdg-name = Reproductor Multimedia COSMIC
xdg-comment = Reprodutor multimedia para o escritorio COSMIC
xdg-keywords = Audio;Película;Filme;Música;Son;Vídeo;

View file

@ -3,13 +3,13 @@
## Settings
settings = सेटिंग
settings = सेटिंग्स
### Appearance
appearance = उपस्थिति
theme = थीम
match-desktop = डेस्कटॉप से मिलाएं
appearance = रुप-रंग
theme = प्रसंग
match-desktop = डेस्कटॉप से मेल खाएँ
dark = डार्क
light = लाइट
album = एल्बम: { $album }
@ -24,7 +24,7 @@ close-file = फ़ाइल बंद करें
open-media-folder = मीडिया फ़ोल्डर खोलें…
open-recent-media-folder = हाल का मीडिया फ़ोल्डर खोलें
close-media-folder = मीडिया फ़ोल्डर बंद करें
quit = बंद करें
quit = बाहर जाएँ
no-video-or-audio-file-open = कोई वीडियो या ऑडियो फ़ाइल खुली नहीं है
open-media = मीडिया खोलें…
open-recent-media = हाल का मीडिया खोलें

View file

@ -11,7 +11,7 @@ settings = Pengaturan
untitled = Tidak Berjudul
appearance = Tampilan
theme = Tema
match-desktop = Cocokkan desktop
match-desktop = Cocok desktop
dark = Gelap
light = Terang
file = Berkas
@ -31,3 +31,6 @@ ab-repeat = Pengulangan A-B
playback = Pemutaran
next-frame = Bagian Selanjutnya
previous-frame = Bagian Sebelumnya
xdg-name = Pemutar Media COSMIC
xdg-comment = Pemutar Media untuk desktop COSMIC
xdg-keywords = Audio;Film;Film;Musik;Suara;Video;

View file

@ -18,7 +18,7 @@ settings = Impostazioni
appearance = Aspetto
theme = Tema
match-desktop = Sistema
match-desktop = Abbina al desktop
dark = Scuro
light = Chiaro

View file

@ -2,13 +2,13 @@ open-file = Ldi afaylu
open-folder = Ldi akaram
repeat-disabled = Allus yensa
repeat-track = Ales tazribt
quit = Tuffɣa
quit = Ffeɣ
settings = Iɣewwaṛen
appearance = Timeẓri
theme = Asentel
dark = Aɣmayan
light = Aceɛlal
match-desktop = Amṣada d tnarit
match-desktop = Semṣada akked tnarit
file = Afaylu
close-file = Mdel afaylu
album = Album: { $album }

View file

@ -1,11 +1,11 @@
open-file = Файлды ашу
open-folder = Буманы ашу
settings = Баптаулар
appearance = Сыртқы түрі
theme = Тақырып
match-desktop = Жұмыс үстеліне сәйкес келу
dark = Қараңғы
light = Жарық
appearance = Сыртқы көрініс
theme = Тема
match-desktop = Жұмыс үстеліне сәйкес болу
dark = Қою
light = Ашық
file = Файл
quit = Шығу
close-file = Файлды жабу

View file

@ -0,0 +1,36 @@
settings = Sazkarî
appearance = Xuyang
theme = Rûkar
dark = Tarî
light = Ronî
quit = Biqedîne
open-file = Pelê veke
open-folder = Peldankê veke
match-desktop = Bi sermaseyê re li hev bîne
album = Elbum: { $album }
audio = Deng
no-video-or-audio-file-open = Tu pelê vîdiyo yan jî dengê vekirî tune ne
off = Vemirî
subtitles = Jêrnivîs
unknown-author = Hunermendê nenas
untitled = Bê sernav
file = Pel
open-media = Mediyayê veke...
close-file = Pelê bigire
ab-repeat = A-B dûbare bike
open-recent-media = Mediyayên dawî veke
clear-recent = Lîsteya dawî pak bike
open-media-folder = Peldanka mediyayê veke...
open-recent-media-folder = Peldanka mediyayê ya dawî veke
close-media-folder = Peldanka mediyayê bigire
repeat-disabled = Dûbarekirin neçalak e
repeat-track = Stranê dûbare bike
playback = Lîstin
next-frame = Wêneya pêş
previous-frame = Wêneya paş
ab-repeat-set-a = A-B (A) dûbare bike
ab-repeat-set-b = A-B (B) dûbare bike
ab-repeat-clear = Dûbarekirina A-B pak bike
xdg-name = Lîstikvanê mediyayê ya COSMIC
xdg-comment = Lîstikvanê mediyayê ji bo sermaseya COSMIC
xdg-keywords = Deng;Fîlm;Fîlm;Muzîk;Deng;Vîdiyo;

View file

@ -25,3 +25,11 @@ close-file = 파일 닫기
repeat-disabled = 반복 비활성화
previous-frame = 이전 프레임
next-frame = 다음 프레임
ab-repeat = A-B 반복
ab-repeat-set-a = A-B 반복 (A)
ab-repeat-set-b = A-B 반복 (B)
ab-repeat-clear = A-B 반복 취소
xdg-name = COSMIC 미디어 플레이어
xdg-comment = COSMIC 데스크톱을 위한 미디어 플레이어
playback = 재생
repeat-track = 트랙 반복

View file

@ -1,5 +1,5 @@
quit = Išeiti
settings = Nuostatos
quit = Išjungti
settings = Nuostatai
close-file = Uždaryti failą
match-desktop = Pagal darbalaukio temą
appearance = Išvaizda

View file

@ -1 +1,34 @@
settings = Paramètres
settings = Configuracion
album = Album : { $album }
audio = Àudio
no-video-or-audio-file-open = Cap de fichièr vidèo o àudio pas dobèrt
off = Desactivat
subtitles = Sostítols
unknown-author = Autor desconegut
untitled = Sens títol
appearance = Aparéncia
theme = Tèma
match-desktop = Assortir al burèu
dark = Escur
light = Clar
file = Fichièr
open-media = Dorbir mèdia...
open-recent-media = Dobrir un mèdia recent
clear-recent = Escafar la lista recenta
close-file = Tampar lo fichièr
open-media-folder = Dobrir un dossièr multimèdia...
open-recent-media-folder = Dobrir lo dossièr del mèdia recent
close-media-folder = Tampar lo dossièr del mèdia
repeat-disabled = Repeticion desactivada
repeat-track = Repetir la pista
playback = Lectura
next-frame = Imatge seguent
previous-frame = Imatge precedent
ab-repeat = Repetir la seccion A-B
ab-repeat-set-a = Repeticion A-B (A)
ab-repeat-set-b = Repeticion A-B (B)
ab-repeat-clear = Escafar la repeticion A-B
xdg-name = Lector multimèdia COSMIC
xdg-comment = Lector multimèdia pel burèu COSMIC
xdg-keywords = Àudio;Musica;Vidèo;Film;Son;
quit = Quitar

View file

@ -1,10 +1,10 @@
settings = ਸੈਟਿੰਗਾਂ
appearance = ਦਿੱਖ
theme = ਥੀਮ
match-desktop = ਡੈਸਕਟਾਪ ਨਾਲ ਮਿਲਦਾ
match-desktop = ਡੈਸਕਟਾਪ ਨਾਲ ਮਿਲਾਓ
dark = ਗੂੜ੍ਹਾ
light = ਹਲਕਾ
quit = ਬਾਹਰ
light = ਫਿੱਕਾ
quit = ਸਮਾਪਤ
open-file = ਫ਼ਾਇਲ ਨੂੰ ਖੋਲ੍ਹੋ
file = ਫ਼ਾਇਲ
open-folder = ਫੋਲਡਰ ਨੂੰ ਖੋਲ੍ਹੋ

View file

@ -34,7 +34,7 @@ close-file = Zamknij plik
open-media-folder = Otwórz katalog z nośnikami…
open-recent-media-folder = Otwórz poprzedni katalog z nośnikami
close-media-folder = Zamknij katalog z nośnikami
quit = Zamknij
quit = Zakończ
off = Wyłączone
clear-recent = Wyczyść listę poprzednich
repeat-disabled = Powtarzanie wyłączone

View file

@ -34,7 +34,7 @@ close-file = Fechar arquivo
open-media-folder = Abrir pasta de mídias...
open-recent-media-folder = Abrir pasta recente de mídias
close-media-folder = Fechar pasta de mídias
quit = Sair
quit = Encerrar
off = Desligado
clear-recent = Limpar lista de recentes
repeat-track = Repetir faixa

View file

@ -15,7 +15,7 @@ light = Светлая
open-file = Открыть файл
album = Альбом: { $album }
audio = Аудио
no-video-or-audio-file-open = Нет открытых видео или аудио файлов
no-video-or-audio-file-open = Нет открытых медиафайлов
open-folder = Открыть папку
subtitles = Субтитры
unknown-author = Неизвестный автор
@ -27,7 +27,7 @@ close-file = Закрыть файл
open-media-folder = Открыть папку медиафайлов...
open-recent-media-folder = Открыть папку недавних медиафайлов
close-media-folder = Закрыть папку медиафайлов
quit = Выйти
quit = Завершить
off = Выкл.
clear-recent = Очистить список недавних
repeat-disabled = Повтор отключён

View file

View file

@ -0,0 +1,4 @@
settings = การตั้งค่า
dark = มืด
light = สว่าง
appearance = ลักษณะ

View file

@ -19,7 +19,7 @@ close-file = Закрити файл
open-media-folder = Відкрити теку...
open-recent-media-folder = Відкрити попередню теку
close-media-folder = Закрити теку
quit = Вийти
quit = Завершити
off = Вимк.
clear-recent = Очистити список
repeat-disabled = Не повторювати

View file

@ -34,7 +34,7 @@ close-file = 關閉檔案
open-media-folder = 開啟媒體資料夾...
open-recent-media-folder = 開啟最近使用的媒體資料夾
close-media-folder = 關閉媒體資料夾
quit = 退出
quit = 結束
off = 關閉
clear-recent = 清除最近使用清單
repeat-disabled = 重複已經停用

View file

@ -82,7 +82,32 @@ fn get_framerate(video: &Video) -> Option<f64> {
let caps = pad.current_caps()?;
let structure = caps.structure(0)?;
let framerate = structure.get::<gst::Fraction>("framerate").ok()?;
Some(framerate.numer() as f64 / framerate.denom() as f64)
positive_framerate(framerate)
}
fn positive_framerate(framerate: gst::Fraction) -> Option<f64> {
if framerate.numer() <= 0 || framerate.denom() <= 0 {
return None;
}
let fps = framerate.numer() as f64 / framerate.denom() as f64;
fps.is_finite().then_some(fps)
}
#[cfg(test)]
mod tests {
use super::positive_framerate;
use iced_video_player::gst;
#[test]
fn variable_framerate_uses_fallback() {
assert_eq!(positive_framerate(gst::Fraction::new(0, 1)), None);
}
#[test]
fn fixed_framerate_is_preserved() {
assert_eq!(positive_framerate(gst::Fraction::new(30, 1)), Some(30.0));
}
}
/// Runs application with these settings
@ -901,7 +926,7 @@ impl Application for App {
/// Creates the application, and optionally emits command on initialize.
fn init(mut core: Core, flags: Self::Flags) -> (Self, Task<Self::Message>) {
core.window.content_container = false;
core.window.border_padding = Some(0);
#[cfg(feature = "xdg-portal")]
let inhibit = {
@ -1062,18 +1087,6 @@ impl Application for App {
}
}
fn style(&self) -> Option<cosmic::iced::core::theme::Style> {
// This ensures we have a solid background color even when using no content container
let theme = self.core.system_theme();
Some(cosmic::iced::core::theme::Style {
background_color: theme.cosmic().bg_color().into(),
icon_color: theme.cosmic().on_bg_color().into(),
text_color: theme.cosmic().on_bg_color().into(),
})
}
/// Handle application events here.
fn update(&mut self, message: Self::Message) -> Task<Self::Message> {
match message {
@ -1740,7 +1753,7 @@ impl Application for App {
};
let Some(video) = &self.video_opt else {
//TODO: use space variables
// TODO: use space variables
let column = widget::column::with_capacity(4)
.align_x(Alignment::Center)
.spacing(24)
@ -1757,11 +1770,7 @@ impl Application for App {
.push(widget::button::suggested(fl!("open-file")).on_press(Message::FileOpen))
.push(widget::space::vertical());
return widget::container(column)
.width(Length::Fill)
.height(Length::Fill)
.class(theme::Container::WindowBackground)
.into();
return column.into();
};
let muted = video.muted();
@ -1781,8 +1790,9 @@ impl Application for App {
let mut background_color = Color::BLACK;
let mut text_color_opt = None;
if !video.has_video() {
background_color = theme.cosmic().bg_component_color().into();
text_color_opt = Some(Color::from(theme.cosmic().on_bg_component_color()));
let bg = theme.cosmic().background(theme.transparent);
background_color = Color::TRANSPARENT;
text_color_opt = Some(Color::from(bg.on));
let mut col = widget::column::with_capacity(10);
col = col.push(widget::space::vertical());
@ -1974,7 +1984,7 @@ impl Application for App {
//TODO: move style to libcosmic
.class(theme::Container::custom(|theme| {
let cosmic = theme.cosmic();
let component = &cosmic.background(false).component;
let component = &cosmic.background(theme.transparent).component;
widget::container::Style {
icon_color: Some(component.on.into()),
text_color: Some(component.on.into()),

View file

@ -4,6 +4,40 @@ use iced_video_player::{Video, gst, gst_app, gst_pbutils};
use cosmic::action;
use cosmic::app::Task;
const SUSPICIOUS_AUDIO_GAP_DURATION: gst::ClockTime = gst::ClockTime::SECOND;
fn is_suspicious_audio_gap(duration: Option<gst::ClockTime>) -> bool {
duration.is_some_and(|duration| duration >= SUSPICIOUS_AUDIO_GAP_DURATION)
}
fn suppress_suspicious_audio_gaps(audio_filter: &gst::Element) {
let Some(src_pad) = audio_filter.static_pad("src") else {
log::warn!("audio filter has no source pad; malformed audio gaps will not be suppressed");
return;
};
let _ = src_pad.add_probe(gst::PadProbeType::EVENT_DOWNSTREAM, |_, info| {
let Some(event) = info.event() else {
return gst::PadProbeReturn::Ok;
};
let gst::EventView::Gap(gap) = event.view() else {
return gst::PadProbeReturn::Ok;
};
let (timestamp, duration) = gap.get();
if !is_suspicious_audio_gap(duration) {
return gst::PadProbeReturn::Ok;
}
// Some malformed MP4 edit lists cause streamsynchronizer to emit a
// long GAP before almost every audio buffer. The next buffer's PTS is
// still continuous, so forwarding those events makes audio sinks
// repeatedly wait or resynchronise and produces choppy playback.
log::debug!("suppressing audio GAP at {timestamp} with duration {duration:?}");
drop(info.take_event());
gst::PadProbeReturn::Handled
});
}
#[derive(Debug, Default)]
pub struct VideoSettings {
pub mute: bool,
@ -33,11 +67,14 @@ pub fn new_video(
.downcast::<gst::Pipeline>()
.map_err(|_| iced_video_player::Error::Cast)
.unwrap();
if let Ok(scaletempo) = gst::ElementFactory::make("scaletempo").build() {
pipeline.set_property("audio-filter", &scaletempo);
} else {
log::warn!("scaletempo element not available; speed changes will affect pitch");
}
let audio_filter = gst::ElementFactory::make("scaletempo")
.build()
.unwrap_or_else(|_| {
log::warn!("scaletempo element not available; speed changes will affect pitch");
gst::ElementFactory::make("identity").build().unwrap()
});
suppress_suspicious_audio_gaps(&audio_filter);
pipeline.set_property("audio-filter", &audio_filter);
pipeline.connect("element-setup", false, |vals| {
let Ok(elem) = vals[1].get::<gst::Element>() else {
return None;
@ -111,3 +148,25 @@ fn disable_broken_hardware_decoders() {
}
}
}
#[cfg(test)]
mod tests {
use super::is_suspicious_audio_gap;
use iced_video_player::gst;
#[test]
fn long_audio_gap_is_suspicious() {
assert!(is_suspicious_audio_gap(Some(gst::ClockTime::SECOND)));
assert!(is_suspicious_audio_gap(Some(
gst::ClockTime::from_seconds(3)
)));
}
#[test]
fn short_or_unknown_audio_gap_is_preserved() {
assert!(!is_suspicious_audio_gap(Some(
gst::ClockTime::from_mseconds(999)
)));
assert!(!is_suspicious_audio_gap(None));
}
}