141 Commits
0.4.1 ... 0.5.2

Author SHA1 Message Date
Rafał Dzięgiel
23bb253ca2 0.5.2 2022-06-24 10:05:02 +02:00
Rafał Dzięgiel
2343e84a41 plugin: Use set_static_metadata in class init
Use static version of this function, so our static strings will not be copied
2022-06-06 21:04:17 +02:00
Rafał Dzięgiel
c288223321 Merge pull request #278 from Rafostar/flatpak-gvfs
flatpak: Add missing GVFS access permissions
2022-06-06 20:48:53 +02:00
Rafał Dzięgiel
2ba6645462 flatpak-nightly: Add missing GVFS access permissions
Needed to make GVFS mounted filesystems work with GVFS 1.48+.
See: https://docs.flatpak.org/en/latest/sandbox-permissions.html#gvfs-access
2022-06-06 09:32:12 +02:00
Rafał Dzięgiel
adcbb5d827 flatpak: Add missing GVFS access permissions
Needed to make GVFS mounted filesystems work with GVFS 1.48+.
See: https://docs.flatpak.org/en/latest/sandbox-permissions.html#gvfs-access
2022-06-06 09:31:55 +02:00
Rafał Dzięgiel
9885a2f424 Merge pull request #275 from Rafostar/smart-colon
Use U+003A colon character on RTL languages
2022-06-03 16:17:27 +02:00
Rafał Dzięgiel
66b2d8c7de plugin: Also use min GL version when auto selecting context
When we prefer GLES, make sure its no lower then 3.1 version, so it can color convert 10bit videos,
otherwise core GL 3.2 that GTK4 normally defaults to takes precedence.

With auto behavior we should select the best one, both performance and support wise.
Otherwise user can request one or another with GST_GL_API env that works best
with his specific HW.
2022-06-03 14:36:34 +02:00
Rafał Dzięgiel
2c5d65d0b3 flatpak: Sync with Flathub 2022-06-02 14:08:17 +02:00
Rafał Dzięgiel
e37f2a0a30 Use U+003A colon character on RTL languages
Unfortunately U+2236 seems to break time labels on RTL languages. Check text direction at startup and select best one that works.
2022-06-01 17:09:39 +02:00
Rafał Dzięgiel
387bc7a2f3 Update LINGUAS file 2022-06-01 16:44:05 +02:00
Rafał Dzięgiel
495a59a07a New Crowdin updates (#274)
* New translations com.github.rafostar.Clapper.pot (Hebrew)
2022-06-01 16:41:59 +02:00
Rafał Dzięgiel
e5723cd25a 0.5.1 2022-05-29 14:17:25 +02:00
Rafostar
e7808df7cc plugin: paintable: Fix widget size calculations on non-100% display scaling
Unlike legacy sink that used GLArea, GdkPaintable snapshots without pre-multiplying
sizes with scale factor. Remove scaling multiply of our widget dimensions,
so both video and widget width/height will be calculated correctly.

This fixes both image and black borders displaying issues on displays with
non-100% scaling applied.
2022-05-29 10:19:48 +02:00
Rafał Dzięgiel
8f22b36045 0.5.0 2022-05-28 19:19:05 +02:00
Rafał Dzięgiel
dc257846ce New Crowdin updates (#268)
* New translations com.github.rafostar.Clapper.pot (Romanian)

* New translations com.github.rafostar.Clapper.pot (Korean)

* New translations com.github.rafostar.Clapper.pot (Vietnamese)

* New translations com.github.rafostar.Clapper.pot (Chinese Traditional)

* New translations com.github.rafostar.Clapper.pot (Chinese Simplified)

* New translations com.github.rafostar.Clapper.pot (Ukrainian)

* New translations com.github.rafostar.Clapper.pot (Turkish)

* New translations com.github.rafostar.Clapper.pot (Swedish)

* New translations com.github.rafostar.Clapper.pot (Serbian (Cyrillic))

* New translations com.github.rafostar.Clapper.pot (Russian)

* New translations com.github.rafostar.Clapper.pot (Portuguese)

* New translations com.github.rafostar.Clapper.pot (Polish)

* New translations com.github.rafostar.Clapper.pot (Norwegian)

* New translations com.github.rafostar.Clapper.pot (Dutch)

* New translations com.github.rafostar.Clapper.pot (Japanese)

* New translations com.github.rafostar.Clapper.pot (French)

* New translations com.github.rafostar.Clapper.pot (Italian)

* New translations com.github.rafostar.Clapper.pot (Hungarian)

* New translations com.github.rafostar.Clapper.pot (Hebrew)

* New translations com.github.rafostar.Clapper.pot (Finnish)

* New translations com.github.rafostar.Clapper.pot (Basque)

* New translations com.github.rafostar.Clapper.pot (Greek)

* New translations com.github.rafostar.Clapper.pot (German)

* New translations com.github.rafostar.Clapper.pot (Danish)

* New translations com.github.rafostar.Clapper.pot (Czech)

* New translations com.github.rafostar.Clapper.pot (Catalan)

* New translations com.github.rafostar.Clapper.pot (Arabic)

* New translations com.github.rafostar.Clapper.pot (Afrikaans)

* New translations com.github.rafostar.Clapper.pot (Spanish)

* New translations com.github.rafostar.Clapper.pot (Portuguese, Brazilian)

* New translations com.github.rafostar.Clapper.pot (Italian)

* New translations com.github.rafostar.Clapper.pot (German)
2022-05-27 19:48:48 +02:00
Rafał Dzięgiel
af77873205 plugin: paintable: Remove unused value 2022-05-27 19:46:54 +02:00
Rafał Dzięgiel
5289b2f0a4 plugin: Fix scaled subtitles position on anamorph video
GStreamer does not take pixel aspect ratio into account for overlay rectangles.
If we do so, we end up with subtitles that are displayed off-center.
Behave like any other GStreamer sink on this matter.
2022-05-27 19:38:10 +02:00
Rafał Dzięgiel
87b3fbc15a Update POT file 2022-05-26 18:43:34 +02:00
Rafał Dzięgiel
59ff5bc006 Merge pull request #267 from Rafostar/fix-glx
Fix caps negotiation on GLX
2022-05-26 11:51:11 +02:00
Rafał Dzięgiel
91efc4ecdb plugin: gluploader: Use GLUpload provided propose_allocation method
Instead figuring out what kind of pool we should make just use the upstream provided
functionality that comes as part of GLUpload API.

Fixes uploads with GstVideoGLTextureUploadMeta, which legacy VAAPI plugin uses on GLX.
2022-05-26 10:21:11 +02:00
Rafał Dzięgiel
713449b4ab plugin: sink: Only add pool to query if there is one 2022-05-26 10:17:36 +02:00
Rafał Dzięgiel
3f7ba0674f plugin: importers: Support different template and actual caps
Make a template caps during class_init. It will be used for e.g. gst-inspect-1.0, while do and use an actual caps that current HW can handle.
2022-05-25 20:37:18 +02:00
Rafał Dzięgiel
5b89879031 plugin: gluploader: Remove DMABuf caps features on GLX
GLX cannot do DMABufs. Do not advertise its support in caps, so upstream elements will never try using this kind of memory on GLX.
2022-05-25 15:46:04 +02:00
Rafał Dzięgiel
2385af9b94 Merge pull request #265 from Rafostar/devel
Merge devel branch changes
2022-05-25 10:42:35 +02:00
Rafał Dzięgiel
54e4644236 app: Call window_present without timestamp
GTK4 now handles this internally via xdg-activation. To make it work correctly we should stop using custom timestamp so default handlers will be used.
2022-05-24 18:23:15 +02:00
Rafał Dzięgiel
3c248250f3 plugin: Always make sure we have Gdk display
Give up creating GL context in an unlikely situation that there is no default display
2022-05-24 16:48:00 +02:00
Rafał Dzięgiel
51619cbd2a plugin: Temporarily try to avoid direct DMABuf import on desktop
This tries to avoid "scrambled" image on Linux with Intel GPUs that are mostly used
together with x86 CPUs at the expense of using slightly slower non-direct DMABuf import,
by not going with GLES by default on EGL.

The "GST_GL_API" env can still be used to force one or another context type.

We need for GStreamer to be aware of currently used DRM modifier first. On the other
hand forcing GL everywhere would break most embedded systems that only work with GLES,
so do it for x86 processors only... and pray for it to work.

See: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1236
2022-05-24 16:36:43 +02:00
Rafał Dzięgiel
f9e84ac99b plugin: Improve GL context realization code
We only want GLES on EGL display, so check for it one by one instead of always trying to realize GLES with everything that is not a macOS
2022-05-24 16:36:32 +02:00
Rafał Dzięgiel
1bd371dabd app: Always activate before opening files
Make sure app window was created and bring it on top when started with file(s) as args
2022-05-23 15:32:32 +02:00
Rafał Dzięgiel
5f6c0922c0 plugin: Clear paintable importer in dispose
Remove our ref on importer a little earlier, with a lock taken
2022-05-23 15:02:25 +02:00
Rafał Dzięgiel
041deb559c headerbar: Merge code into single subclass
We no longer ship the web app that was reusing parts of this code.
Combine it into single file without additional subclass.
2022-05-23 14:19:37 +02:00
Rafał Dzięgiel
fce8ec59b8 app: Merge code into single subclass
We no longer ship the web app that was reusing parts of this code.
Combine it into single file without additional subclass.

Also put window creation inside first activate code instead of startup
in order to fix running app as a gapplication service.
2022-05-23 14:18:00 +02:00
Rafał Dzięgiel
306505dc4d data: Add missing desktop file options
Mark as DBusActivatable and enable StartupNotify
2022-05-23 11:55:15 +02:00
Rafał Dzięgiel
60234419c2 data: Add DBus service file 2022-05-23 11:54:50 +02:00
Rafał Dzięgiel
c395c6b9be Merge pull request #262 from Rafostar/reloaded
plugin: Make modules management separate per instance
2022-05-20 11:28:27 +02:00
Rafał Dzięgiel
8301cded2f plugin: Make modules management separate per instance
There were various problems with importer loader code. One defect was that
it kept managing a single global list of available importers and marking
which one is currently used on it. This made it not work correctly for
multiple sink instances in single process and was not thread safe.

This commit changes importer loader code into a GstObject subclass, which
keeps its own list of importers per instance and unlike before makes it
possible to free this data from memory when destroyed.

Now only open modules are kept always in memory until process finishes
since we cannot unload them once loaded anyway.
2022-05-20 10:13:14 +02:00
Rafał Dzięgiel
34386bc96c plugin: Use different lock for importer within paintable
This way we can avoid an additional importer ref + unref for every frame draw
2022-05-18 19:25:00 +02:00
Rafał Dzięgiel
2b85afc03e plugin: Do not use weak ref on importer
There is no good reason to keep using weak ref on importer within paintable object. Change that to a gst_object_ref which is faster.
2022-05-18 18:28:20 +02:00
Rafał Dzięgiel
bb56efa705 Merge pull request #261 from Rafostar/adw-fixes
libadwaita CSS fixes
2022-05-18 12:26:52 +02:00
Rafał Dzięgiel
82922e51f9 flatpak: Update GTK4 to 4.6.4
With latest GTK 4.6.4 the issues with opening popovers are finally fixed. Stop patching older version and just build the latest one.
2022-05-18 11:39:07 +02:00
Rafał Dzięgiel
ca64d9d2ee flatpak: Build recent libadwaita version
With updated CSS we use some variables intoduced in stable versions of libadwaita. To make it work properly, stop using alpha.2 and build recent stable version.
2022-05-18 11:39:04 +02:00
Rafostar
2a18c6a374 css: Misc fixes for recent Adwaita theme
Fixes for recent libadwaita provided theme, mainly needed to workaround:
https://gitlab.gnome.org/GNOME/libadwaita/-/issues/454

Devs rejected my idea of fixing it upstream. They said to override it
in my own app. So here it is.
2022-05-18 11:38:56 +02:00
Rafał Dzięgiel
af6cf01c98 player: Remove hardcoded ring buffer value
We should aim to have this as a configurable option.
Until then lets use the default value.
2022-05-17 22:07:21 +02:00
Rafał Dzięgiel
85bdbb1132 plugin: Prefer GL over GLES on macOS
Apple decoder uses rectangle texture-target, which GLES does not support
2022-05-16 19:16:36 +02:00
Rafał Dzięgiel
8e89b0d8ca gschema: Make resume video option disabled by default
A resume video question dialog that keeps poping confuses new Clapper users.
Looks like some spam. Change default option value to be disabled, so people
that are interested in this feature can enable it in preferences.
2022-05-16 09:45:36 +02:00
Rafostar
4e3cc3e23f plugin: Set initial display resolution to 1x1
We do not support zero width/height (described in our caps). Set initial video
dimensions to 1x1. They are going to be updated on first buffer after video info is set.

This avoids running into https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1139
and makes sure we do not do any divisions by zero here either.
2022-05-15 20:02:01 +02:00
Rafostar
c6c43346fa lib: Replace usage of "g_str_equal" with "g_strcmp0"
The first one is meant for hash tables comparisons and does not guard against NULL values (#259).
2022-05-15 14:45:49 +02:00
Rafał Dzięgiel
be58af2256 Merge pull request #256 from Rafostar/gl-win
plugin: Add GL support for Windows OS
2022-05-13 16:34:26 +02:00
Rafał Dzięgiel
343eef5894 plugin: Add GL support for Windows OS
Add support for both WGL and EGL on Win32
2022-05-13 15:17:53 +02:00
Rafał Dzięgiel
04657017f9 Merge pull request #257 from Rafostar/gl-macos
plugin: Add GL support for macOS
2022-05-13 14:12:09 +02:00
Rafał Dzięgiel
1cdaa36559 plugin: Add GL support for macOS 2022-05-13 13:53:35 +02:00
Rafał Dzięgiel
f351982067 plugin: Handle premultiplied alpha in RAW frames
Add support for premultiplied alpha flag detection when creating GdkMemoryTextures.
Also check if overlays have premultiplied alpha and if they do set this flag for
their video info, so it will be detected when creating a GdkMemoryTexture out of them.

Fixes performance issues with karaoke subtitles, as now GTK does not have to perform
unnecessary multiplication.
2022-05-12 18:08:53 +02:00
Rafał Dzięgiel
ae531db2b7 plugin: Have a separate mutex lock in GL base class
Make GL base importer class and all its subclasses that access parent props,
use a different mutex lock then the main importer class.

This way main importer class can continue processing buffers without waiting for
GL-based subclasses, as most GL operations (e.g. upload) are time consuming.
2022-05-11 22:00:49 +02:00
Rafał Dzięgiel
66fb8d4a1f Merge pull request #255 from Rafostar/fixes
Misc fixes
2022-05-11 21:21:33 +02:00
Rafał Dzięgiel
8f0ad12795 meson: Make sink compile on Windows OS
We cannot compile app as a whole on MS Windows yet, but with those changes it is now possible to compile and run our new video sink alone on Windows OS
2022-05-11 18:55:06 +02:00
Rafał Dzięgiel
908a388f68 meson: Give up on building GL base without GL windowing
We do not want to build GL-based importers when GTK GL windowing support is missing,
which might happen because of missing deps or on unsupported platform
2022-05-11 18:55:03 +02:00
Rafał Dzięgiel
7f33db4159 plugin: Fix possible buffer and v_info mismatch 2022-05-11 18:54:48 +02:00
Rafał Dzięgiel
288b829139 Further alter default plugin feature ranks on startup
Too many problems with VAAPI decodebin, meanwhile VA works fine and there is already
a pending MR on GStreamer to enable it by default, so we do that a little early.

We also do promise working HW accel out of box, so enable all common NVDEC elements too.
They can always be disabled back in player preferences window if any problems do happen.

We can now remove the alternations of v4l2codecs as those are PRIMARY+1 by default and we
now require GStreamer 1.20+ so no need for version checking there too.

Fixes #236
2022-05-11 11:50:15 +02:00
Rafał Dzięgiel
aa6d21973c gschema: Disable download buffering by default
We had this option enabled to workaround problems with old YT code.
Adaptive streaming now seems to work correctly, so restoring the
default play flags value.
2022-05-10 13:57:11 +02:00
Rafał Dzięgiel
e506063409 gschema: Remove leftover web app settings 2022-05-10 12:09:30 +02:00
Rafał Dzięgiel
e679430d3e meson: Set plugin option to be auto by default
This should allow to still compile and use the player with the legacy sink, without changing meson default options
2022-05-09 12:39:41 +02:00
Rafał Dzięgiel
4b93d4d132 meson: Cleanup plugin build script 2022-05-08 18:47:13 +02:00
Rafał Dzięgiel
b7b99c20cf meson: Do not go down in lib versioning
Install plugin lib stuff into a dir named "clapper-1.0" instead of "clapper-0.0". Even through our API is still very unstable, we cannot go down with versioning. The sink importers being installed there are not part of public API anyway.
2022-05-08 13:54:55 +02:00
Rafał Dzięgiel
5775738f67 plugin: Fix possible dir enumerator NULL unref
On an unlikely chance that sink was compiled without any importers, iterated dir does not exists thus we try to unref a NULL. Avoid doing that.
2022-05-07 13:43:51 +02:00
Rafał Dzięgiel
7159459160 meson: Cleanup of plugin build script 2022-05-06 21:08:03 +02:00
Rafał Dzięgiel
00650a596f obs: Use "trigger_services" step
Instead "rebuild_package" use "trigger_services" for OBS integration, otherwise the same old package is rebuild again and again.
2022-05-06 18:57:12 +02:00
Rafał Dzięgiel
6a995e2143 Merge pull request #253 from Rafostar/clappersink2
Move away from GtkGLArea
2022-05-06 17:52:56 +02:00
Rafał Dzięgiel
01b3feb213 New Crowdin updates (#247)
* New translations com.github.rafostar.Clapper.pot (Chinese Simplified)

* New translations com.github.rafostar.Clapper.pot (Portuguese)
2022-05-06 17:36:53 +02:00
Rafał Dzięgiel
5b9e7eacba meson: Do not auto build rawimporter when building gluploader
No need to auto build rawimporter if we are building gluploader as it
will be always loaded on startup, but never used.

Skip the build of it when its meson option is set to "auto".
2022-05-06 11:42:47 +02:00
Rafostar
b37ab432d7 player: Use new "clappersink" element
Use brand new clapper video sink for video output. Also add "CLAPPER_USE_LEGACY_SINK" env
to still allow the usage of old video sink if any problems arise.
2022-05-05 11:17:28 +02:00
Rafostar
0410c6e9b5 plugin: Add GL uploader
Add "clappergluploader" module which uses "glupload" and "glcolorconvert" internally,
allowing either uploading RAW system memory into GPU with GL colorspace conversion or
importing DMABufs into GL memory and making a GdkTexture out of them at one go.
2022-05-05 11:17:17 +02:00
Rafostar
3e0a0e0555 plugin: Add GL memory importer
Add "clapperglimporter" and a base class for creating GL importers. This module allows importing GL memory into GdkTexture.
2022-05-05 11:17:04 +02:00
Rafostar
5b7b7085e4 plugin: Add RAW system memory importer
Add "clapperrawimporter" module which allows importing RAW system memory mapped frames
2022-05-05 11:16:44 +02:00
Rafostar
044710f97e plugin: Add clapper GStreamer plugin
Add new GStreamer plugin with custom video sink for Clapper video player.

The main difference is that unlike the old one, this does not operate using `GtkGLArea`
anymore, but processes and displays `GdkTextures` directly through `GtkPicture` widget.
Also this one is installed like any other GStreamer plugin, thus can be used via
`gst-launch-1.0` binary or even by other GTK4 apps if they wish to integrate it.

In order to not depend on GL stuff at build time, this plugin uses seperate GModules
called "importers" in order to import different kind of memories into GdkTexture. This
allows expanding its capabilities further then we were able to do before.
2022-05-05 11:16:34 +02:00
Rafał Dzięgiel
b83d500352 Merge pull request #245 from Rafostar/crowdin_sync
New Crowdin updates
2022-04-11 21:02:50 +02:00
Rafał Dzięgiel
3fadf13125 api: Also check "USE_PLAYBIN3" env
Some mobile distros seem to be under assumption that playbin3 is required to
get HW accel and setting this env by default is good idea. Both are wrong.

Check this env presence to avoid problems as factory will always return
playbin3 if set (even if playbin2 was requested).
2022-04-11 19:44:05 +02:00
Rafał Dzięgiel
f8fe49a809 obs: Add "workflows.yml" file 2022-04-11 18:08:52 +02:00
Rafał Dzięgiel
264f0abb64 New translations com.github.rafostar.Clapper.pot (Dutch) 2022-04-08 18:14:27 +02:00
Rafał Dzięgiel
b330aa1ccd workflow: Increase default timeout time
AArch64 build is taking a lot of time...
2022-04-08 17:27:38 +02:00
Rafał Dzięgiel
de8ecb8f82 flatpak: Do not build pango anymore
GNOME 42 runtime includes version that is new enough
2022-04-08 17:08:32 +02:00
Rafał Dzięgiel
a2bb927502 Update LINGUAS file 2022-04-08 10:08:05 +02:00
Rafał Dzięgiel
df728f383b Merge pull request #237 from Rafostar/crowdin_sync
New Crowdin updates
2022-04-08 10:01:39 +02:00
Rafał Dzięgiel
c80d2e9fd6 New translations com.github.rafostar.Clapper.pot (Turkish) 2022-04-02 03:43:30 +02:00
Rafał Dzięgiel
5a00301935 New translations com.github.rafostar.Clapper.pot (Turkish) 2022-04-02 02:44:03 +02:00
Rafał Dzięgiel
46b5a6df96 New translations com.github.rafostar.Clapper.pot (Japanese) 2022-04-01 11:06:26 +02:00
Rafał Dzięgiel
f771e0320c Merge pull request #240 from Rafostar/pkgs
Update Flatpak, remove RPM specfiles
2022-04-01 11:05:22 +02:00
Rafał Dzięgiel
72a64a41d9 Update README.md 2022-04-01 09:42:06 +02:00
Rafał Dzięgiel
2818d3c91b flatpak: Enable network access for CI GTK4 builds
Make sure CI can satisfy latest GTK4 dependency requirements by allowing it to download libs it needs as fallback projects
2022-04-01 09:27:13 +02:00
Rafał Dzięgiel
ffb481b52b pkgs: Remove RPM build files from git
Clapper is now available in official repos on both Fedora and openSUSE. Considering that, I will not have time to properly maintain them here, so they go away.
2022-04-01 09:27:10 +02:00
Rafał Dzięgiel
c5c289d466 flatpak: Do not build libsoup3 anymore
It is now included in GNOME 42 runtime
2022-04-01 09:27:07 +02:00
Rafał Dzięgiel
3074051b3d flatpak: Build recent GTK 4.6.2 version
We are gonna move into depending on at least 4.6.0, build it for CI to pass
2022-04-01 09:26:58 +02:00
Rafał Dzięgiel
980e1d9e1a flatpak: Update git actions runtime to 42 2022-03-31 16:28:30 +02:00
Rafał Dzięgiel
045e4fc2c4 flatpak: Sync with Flathub 2022-03-31 16:20:47 +02:00
Rafał Dzięgiel
4f27739287 New translations com.github.rafostar.Clapper.pot (Japanese) 2022-03-31 10:08:37 +02:00
Rafał Dzięgiel
52aa7710dc Update README.md 2022-03-30 11:21:01 +02:00
Rafał Dzięgiel
0e49eaec7e New translations com.github.rafostar.Clapper.pot (Arabic) 2022-03-26 14:37:46 +01:00
Rafał Dzięgiel
62a923a3c1 New translations com.github.rafostar.Clapper.pot (Arabic) 2022-03-26 13:39:14 +01:00
Rafał Dzięgiel
f59b937316 New translations com.github.rafostar.Clapper.pot (Arabic) 2022-03-26 12:42:32 +01:00
Rafał Dzięgiel
8c914d0555 New translations com.github.rafostar.Clapper.pot (Arabic) 2022-03-25 22:09:19 +01:00
Rafał Dzięgiel
d2fab16093 New translations com.github.rafostar.Clapper.pot (Arabic) 2022-03-25 20:58:27 +01:00
Rafał Dzięgiel
67e877af0f New translations com.github.rafostar.Clapper.pot (Basque) 2022-03-25 17:45:32 +01:00
Rafał Dzięgiel
c825649a71 New translations com.github.rafostar.Clapper.pot (Basque) 2022-03-25 16:34:21 +01:00
Rafał Dzięgiel
5101fce5a7 Merge pull request #228 from Rafostar/nightly-fix
Flatpak nightly fixes
2022-03-11 00:30:05 +01:00
Rafał Dzięgiel
e0daf8435a flatpak-nightly: Use "--wrap-mode=nodownload" for GStreamer build
We do not have net access during build of GStreamer, nor we want to pull anything, so disable downloads so it will not try
2022-03-10 22:55:31 +01:00
Rafał Dzięgiel
9f18295728 flatpak-nightly: Do not disable GStreamer asserts and checks
We may disable them for stable releases, but should be left to default on nightly
2022-03-10 22:55:27 +01:00
Rafał Dzięgiel
8ce977505e actions: nightly: Manually install SDK extensions via workflow
The github actions Flatpak action only allows to specify single source
for installing missing dependencies. This makes impossible to build
some things from "gnome-nightly" while others from "flathub" repo.

Work around this limitation by manually installing missing SDK
extensions from Flathub prior to using this git action.
2022-03-10 22:55:24 +01:00
Rafał Dzięgiel
8ac839c9aa flatpak-nightly: Disable cloning GStreamer submodules
It seems that now GStreamer ships its testsuite (which we do not need) as a submodule. Do not try to clone it.
2022-03-10 22:55:09 +01:00
Rafał Dzięgiel
8fa2036265 actions: Allow runs on workflow_dispatch 2022-03-10 09:32:11 +01:00
Rafał Dzięgiel
1d5bb1e6aa Merge pull request #227 from Rafostar/nightly-rust
flatpak-nightly: Build dav1d decoder from gst-plugins-rs
2022-03-09 22:09:22 +01:00
Rafał Dzięgiel
9ec87c1b58 flatpak-nightly: Build dav1d decoder from gst-plugins-rs 2022-03-09 20:53:18 +01:00
Rafał Dzięgiel
16c0f8baae Merge pull request #226 from Rafostar/speed-fix
Fix end time calculation with with non-1x speed
2022-03-06 16:52:40 +01:00
Rafał Dzięgiel
c94d21fc53 Fix end time calculation with with non-1x speed 2022-03-06 15:51:06 +01:00
Rafał Dzięgiel
159f96c984 Merge pull request #214 from Rafostar/libsoup3
libsoup3
2022-02-28 16:58:29 +01:00
Rafał Dzięgiel
96ad4fa3db RPM: Require libsoup3 2022-02-17 15:44:45 +01:00
Rafał Dzięgiel
b2e7bef8d4 flatpak: Update git actions runtime to 41
We need to update, so we can build libsoup3. Flathub ver will likely remain as 40 ver to avoid some problems and will be updated directly to 42 later.
2022-02-14 17:37:15 +01:00
Rafał Dzięgiel
40a1dc6960 flatpak: Build libsoup3
Now both Clapper and Gtuber lib require libsoup3, so build it until it will be available in runtime
2022-02-14 17:37:15 +01:00
Rafał Dzięgiel
c4bd604e17 Port to libsoup3
With all apps and modules/plugins porting itself to libsoup3 we also need to do so.

It would appear as a good idea to conditionally import "3.0" and fallback to "2.4"
bindings here, but its not as loaded GStreamer plugins might use libsoup3 already
and we cannot have both libsoup2 and libsoup3 in a single process.
2022-02-14 17:37:15 +01:00
Rafał Dzięgiel
83c0e3b598 Remove unfinished web application
It used Broadway as an easy "reuse the same code into web application" way for me, but Broadway
is not very good for this. This feature should be made using some better dedicated framework for
building websites (so it can work better and support different screen sizes).

All the WebSocket functionality needed for this will remain (and be documented at a later point
when expanded and stable), so if anyone would like to make such remote controlling app, will be
free to do so (outside of Clapper code).
2022-02-14 17:37:15 +01:00
Rafał Dzięgiel
54715023c0 flatpak: Update git actions manifest 2022-02-14 16:36:29 +01:00
Rafał Dzięgiel
95046ceba8 flatpak: Sync with Flathub 2022-02-14 16:06:36 +01:00
Rafał Dzięgiel
b189e24b5e Merge pull request #209 from simonsextras/swdeish-tranlation-nbfreygff
Full Swedish Translation
2022-01-21 12:14:22 +01:00
sastofficial
cb9e2ac979 Update sv.po 2022-01-21 09:35:17 +01:00
sastofficial
545d8826e0 Update sv.po 2022-01-19 13:46:08 +01:00
Rafał Dzięgiel
c2160198b9 Update LINGUAS file 2022-01-19 10:07:09 +01:00
Rafał Dzięgiel
aa7eae2417 New translations com.github.rafostar.Clapper.pot (French) (#208) 2022-01-19 10:00:56 +01:00
Rafał Dzięgiel
3192a32845 Merge pull request #206 from Rafostar/unicode
Use more unicode characters
2022-01-18 18:46:06 +01:00
Rafał Dzięgiel
706c783498 Use unicode U+2215 for division 2022-01-17 22:28:17 +01:00
Rafał Dzięgiel
8ba3ca4af6 Use unicode U+00D7 for multiplication 2022-01-17 21:01:23 +01:00
Rafał Dzięgiel
38efa7ab9f Use unicode U+2236 for time 2022-01-17 20:27:13 +01:00
Rafał Dzięgiel
d19ddbcaca Merge pull request #204 from Rafostar/devel
Misc gstclapper fixes
2022-01-17 11:00:28 +01:00
Rafał Dzięgiel
615f1553fb flatpak: Sync with Flathub 2022-01-17 10:19:29 +01:00
Rafał Dzięgiel
09c9e7560b New Crowdin updates (#201)
* New translations com.github.rafostar.Clapper.pot (Swedish)

* New translations com.github.rafostar.Clapper.pot (Russian)

* New translations com.github.rafostar.Clapper.pot (Chinese Simplified)

* New translations com.github.rafostar.Clapper.pot (Spanish)

* New translations com.github.rafostar.Clapper.pot (Spanish)

* New translations com.github.rafostar.Clapper.pot (Basque)
2022-01-17 08:56:59 +01:00
Rafał Dzięgiel
f40ce756ad Merge pull request #199 from majjejjam/master
change three dots to ellipsis
2022-01-16 14:10:49 +01:00
majjejjam
23d51be185 changed to ellipses in ui/clapper.ui 2022-01-15 18:20:13 +01:00
Rafał Dzięgiel
0db2a4a045 gstclapper: Fix plugin feature leak 2022-01-14 09:28:26 +01:00
Rafostar
469c06d22b gstclapper: Go into NULL state directly when stopped
Instead of waiting another 60 seconds for user, go into NULL state ASAP to free all resources and open devices.
2022-01-09 13:31:37 +01:00
Rafostar
3feaf225b5 gstclapper: Make tags writable before insert
Someone might be holding a copied media info in which case tag
list ref count is not 1. Use gst_tag_list_make_writable to
assure that ref count is 1, so we can insert more tags into the list.
2022-01-09 13:31:29 +01:00
majjejjam
fc8d881efd change three dots to ellipsis 2022-01-08 16:28:07 +01:00
Rafał Dzięgiel
ac76836fd7 Merge pull request #192 from Rafostar/yt-removal
YouTube code removal
2022-01-05 14:27:59 +01:00
Rafał Dzięgiel
f6a1aaf1dc Remove all YouTube code
It has been broken for quite some time. From now on this is gonna be left to handle for GStreamer plugins.
2021-12-22 08:12:55 +01:00
Rafał Dzięgiel
000dca82d9 flatpak: Sync with Flathub 2021-12-20 21:23:31 +01:00
109 changed files with 8005 additions and 5919 deletions

View File

@@ -1,4 +1,5 @@
on: on:
workflow_dispatch:
schedule: schedule:
- cron: "0 0 * * *" - cron: "0 0 * * *"
name: "Flatpak Nightly" name: "Flatpak Nightly"
@@ -6,6 +7,7 @@ jobs:
flatpak: flatpak:
name: "Flatpak" name: "Flatpak"
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 600
container: container:
image: bilelmoussaoui/flatpak-github-actions:gnome-nightly image: bilelmoussaoui/flatpak-github-actions:gnome-nightly
options: --privileged options: --privileged
@@ -25,8 +27,12 @@ jobs:
uses: docker/setup-qemu-action@v1 uses: docker/setup-qemu-action@v1
with: with:
platforms: arm64 platforms: arm64
- name: Prepare Runtime
run: |
flatpak --system install -y --noninteractive flathub org.freedesktop.Sdk.Extension.rust-nightly/${{ matrix.arch }}/21.08
flatpak --system install -y --noninteractive flathub org.freedesktop.Sdk.Extension.llvm13/${{ matrix.arch }}/21.08
- uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v4 - uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v4
name: "Build" name: Build
with: with:
bundle: com.github.rafostar.Clapper.flatpak bundle: com.github.rafostar.Clapper.flatpak
manifest-path: pkgs/flatpak/com.github.rafostar.Clapper-nightly.json manifest-path: pkgs/flatpak/com.github.rafostar.Clapper-nightly.json

View File

@@ -1,4 +1,5 @@
on: on:
workflow_dispatch:
push: push:
branches: branches:
- master - master
@@ -10,8 +11,9 @@ jobs:
flatpak: flatpak:
name: "Flatpak" name: "Flatpak"
runs-on: ubuntu-latest runs-on: ubuntu-latest
timeout-minutes: 600
container: container:
image: bilelmoussaoui/flatpak-github-actions:gnome-40 image: bilelmoussaoui/flatpak-github-actions:gnome-42
options: --privileged options: --privileged
strategy: strategy:
matrix: matrix:

10
.obs/workflows.yml Normal file
View File

@@ -0,0 +1,10 @@
rebuild_master:
steps:
- trigger_services:
project: home:Rafostar
package: clapper
filters:
event: push
branches:
only:
- master

View File

@@ -2,6 +2,8 @@
[![Flatpak](https://github.com/Rafostar/clapper/actions/workflows/flatpak.yml/badge.svg?event=push)](https://github.com/Rafostar/clapper/actions/workflows/flatpak.yml) [![Flatpak](https://github.com/Rafostar/clapper/actions/workflows/flatpak.yml/badge.svg?event=push)](https://github.com/Rafostar/clapper/actions/workflows/flatpak.yml)
[![Flatpak Nightly](https://github.com/Rafostar/clapper/actions/workflows/flatpak-nightly.yml/badge.svg?event=schedule)](https://github.com/Rafostar/clapper/actions/workflows/flatpak-nightly.yml) [![Flatpak Nightly](https://github.com/Rafostar/clapper/actions/workflows/flatpak-nightly.yml/badge.svg?event=schedule)](https://github.com/Rafostar/clapper/actions/workflows/flatpak-nightly.yml)
[![Crowdin](https://badges.crowdin.net/clapper/localized.svg)](https://crowdin.com/project/clapper) [![Crowdin](https://badges.crowdin.net/clapper/localized.svg)](https://crowdin.com/project/clapper)
[![Matrix](https://img.shields.io/matrix/clapper-player:matrix.org?label=matrix)](https://matrix.to/#/#clapper-player:matrix.org)
[![Donate](https://img.shields.io/liberapay/receives/Clapper.svg?logo=liberapay)](https://liberapay.com/Clapper)
A GNOME media player built using [GJS](https://gitlab.gnome.org/GNOME/gjs) with [GTK4](https://www.gtk.org) toolkit. A GNOME media player built using [GJS](https://gitlab.gnome.org/GNOME/gjs) with [GTK4](https://www.gtk.org) toolkit.
The media player uses [GStreamer](https://gstreamer.freedesktop.org/) as a media backend and renders everything via [OpenGL](https://www.opengl.org). The media player uses [GStreamer](https://gstreamer.freedesktop.org/) as a media backend and renders everything via [OpenGL](https://www.opengl.org).
@@ -38,17 +40,13 @@ List of patches used in this version can be found [here](https://github.com/Rafo
<img width='240' alt='Download on Flathub' src='https://flathub.org/assets/badges/flathub-badge-en.png'/> <img width='240' alt='Download on Flathub' src='https://flathub.org/assets/badges/flathub-badge-en.png'/>
</a> </a>
## Packages ## Packages in Linux Distributions
#### Fedora & openSUSE [![Packaging status](https://repology.org/badge/vertical-allrepos/clapper.svg)](https://repology.org/project/clapper/versions)
Pre-built packages are available in [my repo](https://software.opensuse.org//download.html?project=home%3ARafostar&package=clapper) ([see status](https://build.opensuse.org/package/show/home:Rafostar/clapper)).<br>
Those are automatically built on each git commit, and are thus considered unstable.
#### Arch Linux Pre-built RPM packages are also available in [my repo](https://software.opensuse.org//download.html?project=home%3ARafostar&package=clapper) ([see status](https://build.opensuse.org/package/show/home:Rafostar/clapper)).<br>
You can get Clapper from the AUR: Those are automatically built on each git commit, thus are considered unstable.
* [clapper](https://aur.archlinux.org/packages/clapper) (stable version)
* [clapper-git](https://aur.archlinux.org/packages/clapper-git)
## Installation from source code ## Installation from Source Code
```sh ```sh
meson builddir --prefix=/usr/local meson builddir --prefix=/usr/local
sudo meson install -C builddir sudo meson install -C builddir

View File

@@ -6,4 +6,4 @@ imports.package.init({
prefix: '@prefix@', prefix: '@prefix@',
libdir: '@libdir@', libdir: '@libdir@',
}); });
imports.package.run(imports.src.main@ID_POSTFIX@); imports.package.run(imports.src.main);

View File

@@ -1,25 +1,19 @@
clapper_apps = ['', 'Remote', 'Daemon'] bin_conf = configuration_data()
foreach id_postfix : clapper_apps bin_conf.set('GJS', find_program('gjs').path())
app_postfix = (id_postfix != '') ? '.' + id_postfix : '' bin_conf.set('PACKAGE_NAME', meson.project_name())
bin_conf.set('PACKAGE_VERSION', meson.project_version())
bin_conf.set('prefix', get_option('prefix'))
bin_conf.set('libdir', libdir)
bin_conf = configuration_data() configure_file(
bin_conf.set('GJS', find_program('gjs').path()) input: 'com.github.rafostar.Clapper.in',
bin_conf.set('PACKAGE_NAME', meson.project_name()) output: 'com.github.rafostar.Clapper',
bin_conf.set('PACKAGE_VERSION', meson.project_version()) configuration: bin_conf,
bin_conf.set('ID_POSTFIX', id_postfix) install: true,
bin_conf.set('prefix', get_option('prefix')) install_dir: bindir,
bin_conf.set('libdir', libdir) install_mode: 'rwxr-xr-x'
)
configure_file(
input: 'com.github.rafostar.Clapper.in',
output: 'com.github.rafostar.Clapper' + app_postfix,
configuration: bin_conf,
install: true,
install_dir: bindir,
install_mode: 'rwxr-xr-x'
)
endforeach
clapper_symlink_cmd = 'ln -fs @0@ $DESTDIR@1@'.format( clapper_symlink_cmd = 'ln -fs @0@ $DESTDIR@1@'.format(
'com.github.rafostar.Clapper', 'com.github.rafostar.Clapper',

View File

@@ -9,6 +9,41 @@ scrolledwindow scrollbar.vertical slider {
min-height: 16px; min-height: 16px;
} }
/* Consistent scales color */
scale trough highlight {
color: @accent_fg_color;
background-color: @accent_bg_color;
}
/* Consistent radio buttons color */
.osd radio {
color: @accent_fg_color;
background-color: transparent;
background-image: none;
}
.osd radio:hover,
.osd radio:checked {
background-image: image(rgba(255,255,255,0.1));
}
.osd radio:active {
background-image: image(rgba(255,255,255,0.3));
}
/* Adwaita OSD background color is unacceptable:
* https://gitlab.gnome.org/GNOME/libadwaita/-/issues/454 */
box.osd,
.osd popover contents,
.osd popover arrow,
.osdheaderbar button {
background-color: rgba(38,38,38,0.78);
}
.osdheaderbar button:hover,
.osdheaderbar button:checked {
background-color: rgba(63,63,63,0.78);
}
.osdheaderbar button:active {
background-color: rgba(82,82,82,0.78);
}
/* Adwaita is missing osd ListBox */ /* Adwaita is missing osd ListBox */
.clapperplaylist { .clapperplaylist {
background: none; background: none;
@@ -59,6 +94,8 @@ popover contents {
} }
.popoverseparator separator { .popoverseparator separator {
background-color: @insensitive_fg_color; background-color: @insensitive_fg_color;
margin-left: 3px;
margin-right: 3px;
} }
/* Rounded corners */ /* Rounded corners */
@@ -129,8 +166,9 @@ scale trough slider {
margin-left: 0px; margin-left: 0px;
margin-right: 4px; margin-right: 4px;
border: 2px solid; border: 2px solid;
min-width: 17px; min-width: 16px;
min-height: 17px; min-height: 16px;
box-shadow: none;
} }
/* Also affects popover buttons */ /* Also affects popover buttons */
@@ -260,7 +298,8 @@ scale trough slider {
min-width: 6px; min-width: 6px;
} }
.overamp trough highlight { .overamp trough highlight {
background: @error_color; color: @error_fg_color;
background-color: @error_bg_color;
} }
/* Elapsed Popover */ /* Elapsed Popover */
@@ -323,7 +362,7 @@ scale trough slider {
border: none; border: none;
} }
.controlsbox { .controlsbox {
background: @theme_bg_color; background: @popover_bg_color;
} }
.gpufriendly { .gpufriendly {
box-shadow: -8px -8px transparent, 8px 8px transparent; box-shadow: -8px -8px transparent, 8px 8px transparent;

View File

@@ -6,6 +6,8 @@ Categories=GTK;GNOME;AudioVideo;Player;Video;TV;
MimeType=application/claps;application/mpeg4-iod;application/mpeg4-muxcodetable;application/mxf;application/ogg;application/ram;application/sdp;application/streamingmedia;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;application/x-extension-m4a;application/x-extension-mp4;application/x-flac;application/x-flash-video;application/x-matroska;application/x-ogg;application/x-streamingmedia;audio/3gpp;audio/3gpp2;audio/aac;audio/ac3;audio/amr;audio/amr-wb;audio/basic;audio/dv;audio/eac3;audio/flac;audio/m4a;audio/midi;audio/mp1;audio/mp2;audio/mp3;audio/mp4;audio/mpeg;audio/mpegurl;audio/mpg;audio/ogg;audio/opus;audio/scpls;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.rn-realaudio;audio/wav;audio/webm;audio/x-aac;audio/x-aiff;audio/x-ape;audio/x-flac;audio/x-gsm;audio/x-it;audio/x-m4a;audio/x-matroska;audio/x-mod;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-mpg;audio/x-ms-asf;audio/x-ms-wma;audio/x-musepack;audio/x-pn-aiff;audio/x-pn-au;audio/x-pn-realaudio;audio/x-pn-wav;audio/x-real-audio;audio/x-realaudio;audio/x-s3m;audio/x-scpls;audio/x-shorten;audio/x-speex;audio/x-tta;audio/x-vorbis;audio/x-vorbis+ogg;audio/x-wav;audio/x-wavpack;audio/x-xm;video/3gp;video/3gpp;video/3gpp2;video/divx;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/mpeg-system;video/msvideo;video/ogg;video/quicktime;video/vnd.mpegurl;video/vnd.rn-realvideo;video/webm;video/x-avi;video/x-flc;video/x-fli;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-mpeg-system;video/x-mpeg2;video/x-ms-asf;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-msvideo;video/x-nsv;video/x-ogm+ogg;video/x-theora;video/x-theora+ogg;x-content/audio-cdda;x-content/audio-player;x-content/video-dvd;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtmp;x-scheme-handler/rtp;x-scheme-handler/rtsp; MimeType=application/claps;application/mpeg4-iod;application/mpeg4-muxcodetable;application/mxf;application/ogg;application/ram;application/sdp;application/streamingmedia;application/vnd.apple.mpegurl;application/vnd.ms-asf;application/vnd.rn-realmedia;application/vnd.rn-realmedia-vbr;application/x-extension-m4a;application/x-extension-mp4;application/x-flac;application/x-flash-video;application/x-matroska;application/x-ogg;application/x-streamingmedia;audio/3gpp;audio/3gpp2;audio/aac;audio/ac3;audio/amr;audio/amr-wb;audio/basic;audio/dv;audio/eac3;audio/flac;audio/m4a;audio/midi;audio/mp1;audio/mp2;audio/mp3;audio/mp4;audio/mpeg;audio/mpegurl;audio/mpg;audio/ogg;audio/opus;audio/scpls;audio/vnd.dolby.heaac.1;audio/vnd.dolby.heaac.2;audio/vnd.dolby.mlp;audio/vnd.dts;audio/vnd.dts.hd;audio/vnd.rn-realaudio;audio/wav;audio/webm;audio/x-aac;audio/x-aiff;audio/x-ape;audio/x-flac;audio/x-gsm;audio/x-it;audio/x-m4a;audio/x-matroska;audio/x-mod;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpeg;audio/x-mpegurl;audio/x-mpg;audio/x-ms-asf;audio/x-ms-wma;audio/x-musepack;audio/x-pn-aiff;audio/x-pn-au;audio/x-pn-realaudio;audio/x-pn-wav;audio/x-real-audio;audio/x-realaudio;audio/x-s3m;audio/x-scpls;audio/x-shorten;audio/x-speex;audio/x-tta;audio/x-vorbis;audio/x-vorbis+ogg;audio/x-wav;audio/x-wavpack;audio/x-xm;video/3gp;video/3gpp;video/3gpp2;video/divx;video/dv;video/fli;video/flv;video/mp2t;video/mp4;video/mp4v-es;video/mpeg;video/mpeg-system;video/msvideo;video/ogg;video/quicktime;video/vnd.mpegurl;video/vnd.rn-realvideo;video/webm;video/x-avi;video/x-flc;video/x-fli;video/x-flv;video/x-m4v;video/x-matroska;video/x-mpeg;video/x-mpeg-system;video/x-mpeg2;video/x-ms-asf;video/x-ms-wm;video/x-ms-wmv;video/x-ms-wmx;video/x-msvideo;video/x-nsv;video/x-ogm+ogg;video/x-theora;video/x-theora+ogg;x-content/audio-cdda;x-content/audio-player;x-content/video-dvd;x-scheme-handler/mms;x-scheme-handler/mmsh;x-scheme-handler/rtmp;x-scheme-handler/rtp;x-scheme-handler/rtsp;
Exec=com.github.rafostar.Clapper %U Exec=com.github.rafostar.Clapper %U
Icon=com.github.rafostar.Clapper Icon=com.github.rafostar.Clapper
DBusActivatable=true
StartupNotify=true
Terminal=false Terminal=false
Type=Application Type=Application
# Translators: Search terms to find this application. Do NOT translate the semicolons! # Translators: Search terms to find this application. Do NOT translate the semicolons!

View File

@@ -33,7 +33,7 @@
<summary>Unit ID to use with seeking value</summary> <summary>Unit ID to use with seeking value</summary>
</key> </key>
<key name="resume-enabled" type="b"> <key name="resume-enabled" type="b">
<default>true</default> <default>false</default>
<summary>Ask to resume unfinished video</summary> <summary>Ask to resume unfinished video</summary>
</key> </key>
<key name="resume-database" type="s"> <key name="resume-database" type="s">
@@ -66,14 +66,6 @@
<default>6446</default> <default>6446</default>
<summary>Listening port to use for incoming WebSocket connections</summary> <summary>Listening port to use for incoming WebSocket connections</summary>
</key> </key>
<key name="webapp-enabled" type="b">
<default>false</default>
<summary>Run built-in broadway based web application</summary>
</key>
<key name="webapp-port" type="i">
<default>8086</default>
<summary>Port for running broadwayd service</summary>
</key>
<!-- Tweaks --> <!-- Tweaks -->
<key name="dark-theme" type="b"> <key name="dark-theme" type="b">
@@ -99,20 +91,10 @@
<summary>Use PipeWire for audio output</summary> <summary>Use PipeWire for audio output</summary>
</key> </key>
<key name="play-flags" type="i"> <key name="play-flags" type="i">
<default>1687</default> <default>1559</default>
<summary>Set PlayFlags for playbin</summary> <summary>Set PlayFlags for playbin</summary>
</key> </key>
<!-- YouTube -->
<key name="yt-adaptive-enabled" type="b">
<default>false</default>
<summary>Enable to use adaptive streaming for YouTube</summary>
</key>
<key name="yt-quality-type" type="i">
<default>1</default>
<summary>Max YouTube video quality type</summary>
</key>
<!-- Other --> <!-- Other -->
<key name="window-size" type="s"> <key name="window-size" type="s">
<default>'[800, 490]'</default> <default>'[800, 490]'</default>

View File

@@ -48,6 +48,48 @@
</screenshot> </screenshot>
</screenshots> </screenshots>
<releases> <releases>
<release version="0.5.2" date="2022-06-24">
<description>
<p>Fixes:</p>
<ul>
<li>Fix time labels display on RTL languages</li>
<li>Improved GL/GLES context automatic selection</li>
</ul>
<p>New translations:</p>
<ul>
<li>Hebrew</li>
</ul>
</description>
</release>
<release version="0.5.1" date="2022-05-29">
<description>
<p>
A quick hotfix release. Fixes problems with new video sink on displays with non-100% scaling applied.
See 0.5.0 version release notes for full recent changelog.
</p>
</description>
</release>
<release version="0.5.0" date="2022-05-28">
<description>
<p>Changes:</p>
<ul>
<li>Includes and uses new, improved GStreamer video sink</li>
<li>All networking ported to libsoup3</li>
<li>A lot of cleanup, including removal of unfinished web application and old YT code</li>
<li>App now supports D-Bus launching (DBusActivatable)</li>
<li>Other small fixes</li>
</ul>
<p>New translations:</p>
<ul>
<li>Arabic</li>
<li>Basque</li>
<li>French</li>
<li>Japanese</li>
<li>Swedish</li>
<li>Turkish</li>
</ul>
</description>
</release>
<release version="0.4.1" date="2021-12-20"> <release version="0.4.1" date="2021-12-20">
<description> <description>
<p>Fixes:</p> <p>Fixes:</p>

View File

@@ -0,0 +1,3 @@
[D-BUS Service]
Name=@app_id@
Exec=@bindir@/@app_id@ --gapplication-service

View File

@@ -32,3 +32,15 @@ gnome.compile_resources('com.github.rafostar.Clapper.data',
install: true, install: true,
install_dir: pkgdatadir, install_dir: pkgdatadir,
) )
dbus_conf = configuration_data()
dbus_conf.set('app_id', meson.project_name())
dbus_conf.set('bindir', bindir)
configure_file(
input: 'com.github.rafostar.Clapper.service.in',
output: 'com.github.rafostar.Clapper.service',
configuration: dbus_conf,
install: true,
install_dir: join_paths(datadir, 'dbus-1', 'services'),
)

View File

@@ -152,7 +152,7 @@ struct _GstClapper
GstBus *bus; GstBus *bus;
GstState target_state, current_state; GstState target_state, current_state;
gboolean is_live; gboolean is_live;
GSource *tick_source, *ready_timeout_source; GSource *tick_source;
GstClockTime cached_duration; GstClockTime cached_duration;
gdouble rate; gdouble rate;
@@ -1138,44 +1138,6 @@ remove_tick_source (GstClapper * self)
self->tick_source = NULL; self->tick_source = NULL;
} }
static gboolean
ready_timeout_cb (gpointer user_data)
{
GstClapper *self = user_data;
if (self->target_state <= GST_STATE_READY) {
GST_DEBUG_OBJECT (self, "Setting pipeline to NULL state");
self->target_state = GST_STATE_NULL;
self->current_state = GST_STATE_NULL;
gst_element_set_state (self->playbin, GST_STATE_NULL);
}
return G_SOURCE_REMOVE;
}
static void
add_ready_timeout_source (GstClapper * self)
{
if (self->ready_timeout_source)
return;
self->ready_timeout_source = g_timeout_source_new_seconds (60);
g_source_set_callback (self->ready_timeout_source,
(GSourceFunc) ready_timeout_cb, self, NULL);
g_source_attach (self->ready_timeout_source, self->context);
}
static void
remove_ready_timeout_source (GstClapper * self)
{
if (!self->ready_timeout_source)
return;
g_source_destroy (self->ready_timeout_source);
g_source_unref (self->ready_timeout_source);
self->ready_timeout_source = NULL;
}
typedef struct typedef struct
{ {
GstClapper *clapper; GstClapper *clapper;
@@ -1220,7 +1182,6 @@ emit_error (GstClapper * self, GError * err)
g_error_free (err); g_error_free (err);
remove_tick_source (self); remove_tick_source (self);
remove_ready_timeout_source (self);
self->target_state = GST_STATE_NULL; self->target_state = GST_STATE_NULL;
self->current_state = GST_STATE_NULL; self->current_state = GST_STATE_NULL;
@@ -1868,10 +1829,12 @@ media_info_update (GstClapper * self, GstClapperMediaInfo * info)
static void static void
merge_tags (GstTagList **my_tags, GstTagList *tags) merge_tags (GstTagList **my_tags, GstTagList *tags)
{ {
if (*my_tags) if (*my_tags) {
*my_tags = gst_tag_list_make_writable (*my_tags);
gst_tag_list_insert (*my_tags, tags, GST_TAG_MERGE_REPLACE); gst_tag_list_insert (*my_tags, tags, GST_TAG_MERGE_REPLACE);
else } else {
*my_tags = gst_tag_list_ref (tags); *my_tags = gst_tag_list_ref (tags);
}
} }
static void static void
@@ -2226,7 +2189,7 @@ gst_clapper_subtitle_info_update (GstClapper * self,
g_object_get (G_OBJECT (self->playbin), "current-suburi", &suburi, NULL); g_object_get (G_OBJECT (self->playbin), "current-suburi", &suburi, NULL);
if (suburi) { if (suburi) {
if (self->use_playbin3) { if (self->use_playbin3) {
if (g_str_equal (self->subtitle_sid, stream_info->stream_id)) if (!g_strcmp0 (self->subtitle_sid, stream_info->stream_id))
info->language = g_path_get_basename (suburi); info->language = g_path_get_basename (suburi);
} else { } else {
g_object_get (G_OBJECT (self->playbin), "current-text", &text_index, g_object_get (G_OBJECT (self->playbin), "current-text", &text_index,
@@ -2424,7 +2387,7 @@ gst_clapper_stream_info_find_from_stream_id (GstClapperMediaInfo * media_info,
list = gst_clapper_media_info_get_stream_list (media_info); list = gst_clapper_media_info_get_stream_list (media_info);
for (l = list; l != NULL; l = l->next) { for (l = list; l != NULL; l = l->next) {
info = (GstClapperStreamInfo *) l->data; info = (GstClapperStreamInfo *) l->data;
if (g_str_equal (info->stream_id, stream_id)) { if (!g_strcmp0 (info->stream_id, stream_id)) {
return info; return info;
} }
} }
@@ -3259,6 +3222,10 @@ gst_clapper_main (gpointer data)
_update_from_env (&self->use_playbin3, "GST_CLAPPER_USE_PLAYBIN3"); _update_from_env (&self->use_playbin3, "GST_CLAPPER_USE_PLAYBIN3");
/* Takes precedence over `GST_CLAPPER_USE_PLAYBIN3` as it
* influences element factory behavior */
_update_from_env (&self->use_playbin3, "USE_PLAYBIN3");
if (self->use_playbin3) { if (self->use_playbin3) {
GST_DEBUG_OBJECT (self, "playbin3 enabled"); GST_DEBUG_OBJECT (self, "playbin3 enabled");
self->playbin = gst_element_factory_make ("playbin3", "playbin3"); self->playbin = gst_element_factory_make ("playbin3", "playbin3");
@@ -3410,7 +3377,6 @@ gst_clapper_main (gpointer data)
gst_object_unref (bus); gst_object_unref (bus);
remove_tick_source (self); remove_tick_source (self);
remove_ready_timeout_source (self);
g_mutex_lock (&self->lock); g_mutex_lock (&self->lock);
if (self->media_info) { if (self->media_info) {
@@ -3565,6 +3531,7 @@ _env_feature_rank_update (void)
gst_plugin_feature_set_rank (feature, rank); gst_plugin_feature_set_rank (feature, rank);
GST_DEBUG ("Updated rank from env: %i -> %i for %s", old_rank, rank, name); GST_DEBUG ("Updated rank from env: %i -> %i for %s", old_rank, rank, name);
} }
gst_object_unref (feature);
} }
} }
} }
@@ -3583,19 +3550,23 @@ gst_clapper_prepare_gstreamer (void)
GST_DEBUG ("Preparing GStreamer plugins"); GST_DEBUG ("Preparing GStreamer plugins");
/* Too many problems with VAAPI decodebin, meanwhile VA works
* fine and there is already a pending MR on GStreamer to enable
* it by default, so we do that a little early */
if (gst_clapper_has_plugin_with_features ("va")) { if (gst_clapper_has_plugin_with_features ("va")) {
gst_clapper_set_feature_rank_versioned ("vah264dec", rank, 1, 19, 1); gst_clapper_set_feature_rank ("vampeg2dec", rank);
gst_clapper_set_feature_rank_versioned ("vampeg2dec", rank, 1, 19, 1); gst_clapper_set_feature_rank ("vah264dec", rank);
gst_clapper_set_feature_rank ("vah265dec", rank);
gst_clapper_set_feature_rank ("vavp8dec", rank);
gst_clapper_set_feature_rank ("vavp9dec", rank);
gst_clapper_set_feature_rank ("vaav1dec", rank);
} }
/* We do promise working HW accel out of box, so enable NVDEC too */
if (gst_clapper_has_plugin_with_features ("nvcodec")) { if (gst_clapper_has_plugin_with_features ("nvcodec")) {
gst_clapper_set_feature_rank ("nvh264dec", rank + 4); gst_clapper_set_feature_rank ("nvh264dec", rank + 4);
gst_clapper_set_feature_rank ("nvh265dec", rank + 4); gst_clapper_set_feature_rank ("nvh265dec", rank + 4);
} gst_clapper_set_feature_rank ("nvvp8dec", rank + 4);
if (gst_clapper_has_plugin_with_features ("v4l2codecs")) { gst_clapper_set_feature_rank ("nvvp9dec", rank + 4);
if (!gst_clapper_set_feature_rank_versioned ("v4l2slh264dec", rank + 10, 1, 19, 1))
gst_clapper_set_feature_rank ("v4l2slh264dec", GST_RANK_NONE);
if (!gst_clapper_set_feature_rank_versioned ("v4l2slvp8dec", rank + 10, 1, 19, 2))
gst_clapper_set_feature_rank ("v4l2slvp8dec", GST_RANK_NONE);
} }
/* After setting defaults, update them from ENV */ /* After setting defaults, update them from ENV */
@@ -3677,7 +3648,6 @@ gst_clapper_play_internal (gpointer user_data)
} }
g_mutex_unlock (&self->lock); g_mutex_unlock (&self->lock);
remove_ready_timeout_source (self);
self->target_state = GST_STATE_PLAYING; self->target_state = GST_STATE_PLAYING;
if (self->current_state < GST_STATE_PAUSED) if (self->current_state < GST_STATE_PAUSED)
@@ -3745,7 +3715,6 @@ gst_clapper_pause_internal (gpointer user_data)
tick_cb (self); tick_cb (self);
remove_tick_source (self); remove_tick_source (self);
remove_ready_timeout_source (self);
self->target_state = GST_STATE_PAUSED; self->target_state = GST_STATE_PAUSED;
@@ -3825,13 +3794,11 @@ gst_clapper_stop_internal (GstClapper * self, gboolean transient)
tick_cb (self); tick_cb (self);
remove_tick_source (self); remove_tick_source (self);
add_ready_timeout_source (self);
self->target_state = GST_STATE_NULL; self->target_state = GST_STATE_NULL;
self->current_state = GST_STATE_READY; self->current_state = GST_STATE_NULL;
self->is_live = FALSE; self->is_live = FALSE;
gst_bus_set_flushing (self->bus, TRUE); gst_bus_set_flushing (self->bus, TRUE);
gst_element_set_state (self->playbin, GST_STATE_READY); gst_element_set_state (self->playbin, GST_STATE_NULL);
gst_bus_set_flushing (self->bus, FALSE); gst_bus_set_flushing (self->bus, FALSE);
change_state (self, transient && self->app_state != GST_CLAPPER_STATE_STOPPED change_state (self, transient && self->app_state != GST_CLAPPER_STATE_STOPPED
? GST_CLAPPER_STATE_BUFFERING : GST_CLAPPER_STATE_STOPPED); ? GST_CLAPPER_STATE_BUFFERING : GST_CLAPPER_STATE_STOPPED);

View File

@@ -43,6 +43,10 @@ if not gtk4_dep.version().version_compare('>=4.0.0')
error('GTK4 version on this system is too old') error('GTK4 version on this system is too old')
endif endif
if not gir.found()
error('Cannot build lib without GIR support')
endif
if gst_gl_have_window_x11 and (gst_gl_have_platform_egl or gst_gl_have_platform_glx) if gst_gl_have_window_x11 and (gst_gl_have_platform_egl or gst_gl_have_platform_glx)
gtk_x11_dep = dependency('gtk4-x11', required: false) gtk_x11_dep = dependency('gtk4-x11', required: false)
if gtk_x11_dep.found() if gtk_x11_dep.found()
@@ -76,6 +80,18 @@ gstclapper_mpris_gdbus = gnome.gdbus_codegen('gstclapper-mpris-gdbus',
namespace: 'GstClapperMpris' namespace: 'GstClapperMpris'
) )
gstclapper_deps = [
gtk4_dep, glib_dep, gio_dep,
gstbase_dep, gstvideo_dep, gstaudio_dep,
gsttag_dep, gstpbutils_dep, libm
] + gtk_deps
if os_unix
gstclapper_deps += giounix_dep
else
gstclapper_deps += giowin_dep
endif
gstclapper = library('gstclapper-' + api_version, gstclapper = library('gstclapper-' + api_version,
gstclapper_sources + gstclapper_mpris_gdbus, gstclapper_sources + gstclapper_mpris_gdbus,
c_args: gstclapper_defines, c_args: gstclapper_defines,
@@ -84,9 +100,7 @@ gstclapper = library('gstclapper-' + api_version,
version: libversion, version: libversion,
install: true, install: true,
install_dir: pkglibdir, install_dir: pkglibdir,
dependencies: [gtk4_dep, glib_dep, gio_dep, giounix_dep, dependencies: gstclapper_deps,
gstbase_dep, gstvideo_dep, gstaudio_dep,
gsttag_dep, gstpbutils_dep, libm] + gtk_deps,
) )
clapper_gir = gnome.generate_gir(gstclapper, clapper_gir = gnome.generate_gir(gstclapper,

6
lib/gst/meson.build vendored
View File

@@ -1 +1,5 @@
subdir('clapper') if get_option('lib')
subdir('clapper')
endif
subdir('plugin')

455
lib/gst/plugin/gstclapperimporter.c vendored Normal file
View File

@@ -0,0 +1,455 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "gstclapperimporter.h"
#include "gstgtkutils.h"
#define GST_CAT_DEFAULT gst_clapper_importer_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_importer_parent_class
G_DEFINE_TYPE (GstClapperImporter, gst_clapper_importer, GST_TYPE_OBJECT);
typedef struct
{
GdkTexture *texture;
GstVideoOverlayRectangle *rectangle;
gint x, y;
guint width, height;
gint index;
gatomicrefcount ref_count;
} GstClapperGdkOverlay;
static GstClapperGdkOverlay *
gst_clapper_gdk_overlay_new (GdkTexture *texture, GstVideoOverlayRectangle *rectangle,
gint x, gint y, guint width, guint height, guint index)
{
GstClapperGdkOverlay *overlay = g_slice_new (GstClapperGdkOverlay);
overlay->texture = g_object_ref (texture);
overlay->rectangle = gst_video_overlay_rectangle_ref (rectangle);
overlay->x = x;
overlay->y = y;
overlay->width = width;
overlay->height = height;
overlay->index = index;
g_atomic_ref_count_init (&overlay->ref_count);
return overlay;
}
static GstClapperGdkOverlay *
gst_clapper_gdk_overlay_ref (GstClapperGdkOverlay *overlay)
{
g_atomic_ref_count_inc (&overlay->ref_count);
return overlay;
}
static void
gst_clapper_gdk_overlay_unref (GstClapperGdkOverlay *overlay)
{
if (g_atomic_ref_count_dec (&overlay->ref_count)) {
GST_TRACE ("Freeing overlay: %" GST_PTR_FORMAT, overlay);
g_object_unref (overlay->texture);
gst_video_overlay_rectangle_unref (overlay->rectangle);
g_slice_free (GstClapperGdkOverlay, overlay);
}
}
static GstBufferPool *
_default_create_pool (GstClapperImporter *self, GstStructure **config)
{
GST_FIXME_OBJECT (self, "Need to create buffer pool");
return NULL;
}
static GdkTexture *
_default_generate_texture (GstClapperImporter *self,
GstBuffer *buffer, GstVideoInfo *v_info)
{
GST_FIXME_OBJECT (self, "GdkTexture generation not implemented");
return NULL;
}
static void
gst_clapper_importer_init (GstClapperImporter *self)
{
gst_video_info_init (&self->pending_v_info);
gst_video_info_init (&self->v_info);
self->pending_overlays = g_ptr_array_new_with_free_func (
(GDestroyNotify) gst_clapper_gdk_overlay_unref);
self->overlays = g_ptr_array_new_with_free_func (
(GDestroyNotify) gst_clapper_gdk_overlay_unref);
gdk_rgba_parse (&self->bg, "black");
}
static void
gst_clapper_importer_finalize (GObject *object)
{
GstClapperImporter *self = GST_CLAPPER_IMPORTER_CAST (object);
GST_TRACE ("Finalize");
gst_clear_caps (&self->pending_caps);
gst_clear_buffer (&self->pending_buffer);
gst_clear_buffer (&self->buffer);
g_ptr_array_unref (self->pending_overlays);
g_ptr_array_unref (self->overlays);
g_clear_object (&self->texture);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static void
gst_clapper_importer_class_init (GstClapperImporterClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GstClapperImporterClass *importer_class = (GstClapperImporterClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperimporter", 0,
"Clapper Importer");
gobject_class->finalize = gst_clapper_importer_finalize;
importer_class->create_pool = _default_create_pool;
importer_class->generate_texture = _default_generate_texture;
}
static GstClapperGdkOverlay *
_get_cached_overlay (GPtrArray *overlays, GstVideoOverlayRectangle *rectangle)
{
guint i;
for (i = 0; i < overlays->len; i++) {
GstClapperGdkOverlay *overlay = g_ptr_array_index (overlays, i);
if (overlay->rectangle == rectangle)
return overlay;
}
return NULL;
}
static gint
_sort_overlays_cb (gconstpointer a, gconstpointer b)
{
GstClapperGdkOverlay *overlay_a, *overlay_b;
overlay_a = *((GstClapperGdkOverlay **) a);
overlay_b = *((GstClapperGdkOverlay **) b);
return (overlay_a->index - overlay_b->index);
}
/*
* Prepares overlays to show with the next rendered buffer.
*
* In order for overlays caching to work correctly, this should be called for
* every received buffer (even if its going to be disgarded), also must be
* called together with pending buffer replacement within a single importer
* locking, to make sure prepared overlays always match the pending buffer.
*/
static void
gst_clapper_importer_prepare_overlays_locked (GstClapperImporter *self)
{
GstVideoOverlayCompositionMeta *comp_meta;
guint num_overlays, i;
if (G_UNLIKELY (!self->pending_buffer)
|| !(comp_meta = gst_buffer_get_video_overlay_composition_meta (self->pending_buffer))) {
guint n_pending = self->pending_overlays->len;
/* Remove all cached overlays if new buffer does not have any */
if (n_pending > 0) {
GST_TRACE ("No overlays in buffer, removing all cached ones");
g_ptr_array_remove_range (self->pending_overlays, 0, n_pending);
}
return;
}
GST_LOG_OBJECT (self, "Preparing overlays...");
/* Mark all old overlays as unused by giving them negative index */
for (i = 0; i < self->pending_overlays->len; i++) {
GstClapperGdkOverlay *overlay = g_ptr_array_index (self->pending_overlays, i);
overlay->index = -1;
}
num_overlays = gst_video_overlay_composition_n_rectangles (comp_meta->overlay);
for (i = 0; i < num_overlays; i++) {
GdkTexture *texture;
GstBuffer *comp_buffer;
GstVideoFrame comp_frame;
GstVideoMeta *v_meta;
GstVideoInfo v_info;
GstVideoOverlayRectangle *rectangle;
GstClapperGdkOverlay *overlay;
GstVideoOverlayFormatFlags flags, alpha_flags = 0;
gint comp_x, comp_y;
guint comp_width, comp_height;
rectangle = gst_video_overlay_composition_get_rectangle (comp_meta->overlay, i);
if ((overlay = _get_cached_overlay (self->pending_overlays, rectangle))) {
overlay->index = i;
GST_TRACE ("Reusing cached overlay: %" GST_PTR_FORMAT, overlay);
continue;
}
if (G_UNLIKELY (!gst_video_overlay_rectangle_get_render_rectangle (rectangle,
&comp_x, &comp_y, &comp_width, &comp_height))) {
GST_WARNING ("Invalid overlay rectangle dimensions: %" GST_PTR_FORMAT, rectangle);
continue;
}
flags = gst_video_overlay_rectangle_get_flags (rectangle);
if (flags & GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA)
alpha_flags |= GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA;
comp_buffer = gst_video_overlay_rectangle_get_pixels_unscaled_argb (rectangle, alpha_flags);
/* Update overlay video info from video meta */
if ((v_meta = gst_buffer_get_video_meta (comp_buffer))) {
gst_video_info_set_format (&v_info, v_meta->format, v_meta->width, v_meta->height);
v_info.stride[0] = v_meta->stride[0];
if (alpha_flags & GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA)
v_info.flags |= GST_VIDEO_FLAG_PREMULTIPLIED_ALPHA;
}
if (G_UNLIKELY (!gst_video_frame_map (&comp_frame, &v_info, comp_buffer, GST_MAP_READ)))
return;
if ((texture = gst_video_frame_into_gdk_texture (&comp_frame))) {
overlay = gst_clapper_gdk_overlay_new (texture, rectangle, comp_x, comp_y,
comp_width, comp_height, i);
g_object_unref (texture);
GST_TRACE_OBJECT (self, "Created overlay: %"
GST_PTR_FORMAT ", x: %i, y: %i, width: %u, height: %u",
overlay, overlay->x, overlay->y, overlay->width, overlay->height);
g_ptr_array_insert (self->pending_overlays, i, overlay);
}
gst_video_frame_unmap (&comp_frame);
}
/* Remove all overlays that are not going to be used */
for (i = self->pending_overlays->len; i > 0; i--) {
GstClapperGdkOverlay *overlay = g_ptr_array_index (self->pending_overlays, i - 1);
if (overlay->index < 0) {
GST_TRACE ("Removing unused cached overlay: %" GST_PTR_FORMAT, overlay);
g_ptr_array_remove (self->pending_overlays, overlay);
}
}
/* Sort remaining overlays */
if (self->pending_overlays->len > 1) {
GST_LOG_OBJECT (self, "Sorting overlays");
g_ptr_array_sort (self->pending_overlays, (GCompareFunc) _sort_overlays_cb);
}
if (G_UNLIKELY (num_overlays != self->pending_overlays->len)) {
GST_WARNING_OBJECT (self, "Some overlays could not be prepared, %u != %u",
num_overlays, self->pending_overlays->len);
}
GST_LOG_OBJECT (self, "Prepared overlays: %u", self->pending_overlays->len);
}
gboolean
gst_clapper_importer_prepare (GstClapperImporter *self)
{
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
if (importer_class->prepare) {
if (!importer_class->prepare (self))
return FALSE;
}
GST_DEBUG_OBJECT (self, "Importer prepared");
return TRUE;
}
void
gst_clapper_importer_share_data (GstClapperImporter *self, GstClapperImporter *dest)
{
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
if (importer_class->share_data)
importer_class->share_data (self, dest);
}
void
gst_clapper_importer_set_caps (GstClapperImporter *self, GstCaps *caps)
{
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
GST_OBJECT_LOCK (self);
gst_caps_replace (&self->pending_caps, caps);
GST_OBJECT_UNLOCK (self);
if (importer_class->set_caps)
importer_class->set_caps (self, caps);
}
void
gst_clapper_importer_set_buffer (GstClapperImporter *self, GstBuffer *buffer)
{
GST_OBJECT_LOCK (self);
/* Pending v_info, buffer and overlays must be
* set within a single importer locking */
if (self->pending_caps) {
self->has_pending_v_info = gst_video_info_from_caps (&self->pending_v_info, self->pending_caps);
gst_clear_caps (&self->pending_caps);
}
gst_buffer_replace (&self->pending_buffer, buffer);
gst_clapper_importer_prepare_overlays_locked (self);
GST_OBJECT_UNLOCK (self);
}
GstBufferPool *
gst_clapper_importer_create_pool (GstClapperImporter *self, GstStructure **config)
{
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
return importer_class->create_pool (self, config);
}
void
gst_clapper_importer_add_allocation_metas (GstClapperImporter *self, GstQuery *query)
{
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
if (importer_class->add_allocation_metas)
importer_class->add_allocation_metas (self, query);
}
gboolean
gst_clapper_importer_handle_context_query (GstClapperImporter *self,
GstBaseSink *bsink, GstQuery *query)
{
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
if (!importer_class->handle_context_query)
return FALSE;
return importer_class->handle_context_query (self, bsink, query);
}
void
gst_clapper_importer_snapshot (GstClapperImporter *self, GdkSnapshot *snapshot,
gdouble width, gdouble height)
{
guint i;
gboolean buffer_changed;
/* Collect all data that we need to snapshot pending buffer,
* lock ourselves to make sure everything matches */
GST_OBJECT_LOCK (self);
if (self->has_pending_v_info) {
self->v_info = self->pending_v_info;
self->has_pending_v_info = FALSE;
}
buffer_changed = gst_buffer_replace (&self->buffer, self->pending_buffer);
/* Ref overlays associated with current buffer */
for (i = 0; i < self->pending_overlays->len; i++) {
GstClapperGdkOverlay *overlay = g_ptr_array_index (self->pending_overlays, i);
g_ptr_array_insert (self->overlays, i, gst_clapper_gdk_overlay_ref (overlay));
}
GST_OBJECT_UNLOCK (self);
/* Draw black BG when no buffer or imported format has alpha */
if (!self->buffer || GST_VIDEO_INFO_HAS_ALPHA (&self->v_info))
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, width, height));
if (self->buffer) {
if (buffer_changed || !self->texture) {
GstClapperImporterClass *importer_class = GST_CLAPPER_IMPORTER_GET_CLASS (self);
GST_TRACE_OBJECT (self, "Importing %" GST_PTR_FORMAT, self->buffer);
g_clear_object (&self->texture);
self->texture = importer_class->generate_texture (self, self->buffer, &self->v_info);
} else {
GST_TRACE_OBJECT (self, "Reusing texture from %" GST_PTR_FORMAT, self->buffer);
}
if (G_LIKELY (self->texture)) {
gtk_snapshot_append_texture (snapshot, self->texture, &GRAPHENE_RECT_INIT (0, 0, width, height));
if (self->overlays->len > 0) {
gfloat scale_x, scale_y;
/* FIXME: GStreamer scales subtitles without considering pixel aspect ratio.
* See: https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/20 */
scale_x = (gfloat) width / GST_VIDEO_INFO_WIDTH (&self->v_info);
scale_y = (gfloat) height / GST_VIDEO_INFO_HEIGHT (&self->v_info);
for (i = 0; i < self->overlays->len; i++) {
GstClapperGdkOverlay *overlay = g_ptr_array_index (self->overlays, i);
gtk_snapshot_append_texture (snapshot, overlay->texture,
&GRAPHENE_RECT_INIT (overlay->x * scale_x, overlay->y * scale_y,
overlay->width * scale_x, overlay->height * scale_y));
}
}
} else {
GST_ERROR_OBJECT (self, "Failed import of %" GST_PTR_FORMAT, self->buffer);
/* Draw black instead of texture on failure if not drawn already */
if (!GST_VIDEO_INFO_HAS_ALPHA (&self->v_info))
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, width, height));
}
}
/* Unref all used overlays */
if (self->overlays->len > 0)
g_ptr_array_remove_range (self->overlays, 0, self->overlays->len);
}

104
lib/gst/plugin/gstclapperimporter.h vendored Normal file
View File

@@ -0,0 +1,104 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once
#include <gtk/gtk.h>
#include <gst/gst.h>
#include <gst/video/video.h>
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_IMPORTER (gst_clapper_importer_get_type())
#define GST_IS_CLAPPER_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_CLAPPER_IMPORTER))
#define GST_IS_CLAPPER_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CLAPPER_IMPORTER))
#define GST_CLAPPER_IMPORTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CLAPPER_IMPORTER, GstClapperImporterClass))
#define GST_CLAPPER_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_CLAPPER_IMPORTER, GstClapperImporter))
#define GST_CLAPPER_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_CLAPPER_IMPORTER, GstClapperImporterClass))
#define GST_CLAPPER_IMPORTER_CAST(obj) ((GstClapperImporter *)(obj))
#define GST_CLAPPER_IMPORTER_DEFINE(camel,lower,type) \
G_DEFINE_TYPE (camel, lower, type) \
G_MODULE_EXPORT GstClapperImporter *make_importer (void); \
G_MODULE_EXPORT GstCaps *make_caps (gboolean is_template, \
GstRank *rank, GStrv *context_types);
typedef struct _GstClapperImporter GstClapperImporter;
typedef struct _GstClapperImporterClass GstClapperImporterClass;
#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstClapperImporter, gst_object_unref)
#endif
struct _GstClapperImporter
{
GstObject parent;
GstCaps *pending_caps;
GstBuffer *pending_buffer, *buffer;
GPtrArray *pending_overlays, *overlays;
GstVideoInfo pending_v_info, v_info;
gboolean has_pending_v_info;
GdkTexture *texture;
GdkRGBA bg;
};
struct _GstClapperImporterClass
{
GstObjectClass parent_class;
gboolean (* prepare) (GstClapperImporter *importer);
void (* share_data) (GstClapperImporter *src,
GstClapperImporter *dest);
void (* set_caps) (GstClapperImporter *importer,
GstCaps *caps);
gboolean (* handle_context_query) (GstClapperImporter *importer,
GstBaseSink *bsink,
GstQuery *query);
GstBufferPool * (* create_pool) (GstClapperImporter *importer,
GstStructure **config);
void (* add_allocation_metas) (GstClapperImporter *importer,
GstQuery *query);
GdkTexture * (* generate_texture) (GstClapperImporter *importer,
GstBuffer *buffer,
GstVideoInfo *v_info);
};
GType gst_clapper_importer_get_type (void);
gboolean gst_clapper_importer_prepare (GstClapperImporter *importer);
void gst_clapper_importer_share_data (GstClapperImporter *importer, GstClapperImporter *dest);
gboolean gst_clapper_importer_handle_context_query (GstClapperImporter *importer, GstBaseSink *bsink, GstQuery *query);
GstBufferPool * gst_clapper_importer_create_pool (GstClapperImporter *importer, GstStructure **config);
void gst_clapper_importer_add_allocation_metas (GstClapperImporter *importer, GstQuery *query);
void gst_clapper_importer_set_caps (GstClapperImporter *importer, GstCaps *caps);
void gst_clapper_importer_set_buffer (GstClapperImporter *importer, GstBuffer *buffer);
void gst_clapper_importer_snapshot (GstClapperImporter *importer, GdkSnapshot *snapshot, gdouble width, gdouble height);
G_END_DECLS

View File

@@ -0,0 +1,429 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gmodule.h>
#include "gstclapperimporterloader.h"
#include "gstclapperimporter.h"
#define GST_CAT_DEFAULT gst_clapper_importer_loader_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_importer_loader_parent_class
G_DEFINE_TYPE (GstClapperImporterLoader, gst_clapper_importer_loader, GST_TYPE_OBJECT);
typedef GstClapperImporter* (* MakeImporter) (void);
typedef GstCaps* (* MakeCaps) (gboolean is_template, GstRank *rank, GStrv *context_types);
typedef struct
{
GModule *module;
GstCaps *caps;
GstRank rank;
GStrv context_types;
} GstClapperImporterData;
static void
gst_clapper_importer_data_free (GstClapperImporterData *data)
{
GST_TRACE ("Freeing importer data: %" GST_PTR_FORMAT, data);
gst_clear_caps (&data->caps);
g_strfreev (data->context_types);
g_free (data);
}
static GstClapperImporterData *
_obtain_importer_data (GModule *module, gboolean is_template)
{
MakeCaps make_caps;
GstClapperImporterData *data;
if (!g_module_symbol (module, "make_caps", (gpointer *) &make_caps)
|| make_caps == NULL) {
GST_WARNING ("Make caps function missing in importer");
return NULL;
}
data = g_new0 (GstClapperImporterData, 1);
data->module = module;
data->caps = make_caps (is_template, &data->rank, &data->context_types);
GST_TRACE ("Created importer data: %" GST_PTR_FORMAT, data);
if (G_UNLIKELY (!data->caps)) {
GST_ERROR ("Invalid importer without caps: %s",
g_module_name (data->module));
gst_clapper_importer_data_free (data);
return NULL;
}
GST_DEBUG ("Found importer: %s, caps: %" GST_PTR_FORMAT,
g_module_name (data->module), data->caps);
return data;
}
static GstClapperImporter *
_obtain_importer_internal (GModule *module)
{
MakeImporter make_importer;
GstClapperImporter *importer;
if (!g_module_symbol (module, "make_importer", (gpointer *) &make_importer)
|| make_importer == NULL) {
GST_WARNING ("Make function missing in importer");
return NULL;
}
importer = make_importer ();
GST_TRACE ("Created importer: %" GST_PTR_FORMAT, importer);
return importer;
}
static gpointer
_obtain_available_modules_once (G_GNUC_UNUSED gpointer data)
{
GPtrArray *modules;
GFile *dir;
GFileEnumerator *dir_enum;
GError *error = NULL;
GST_INFO ("Preparing modules");
modules = g_ptr_array_new ();
dir = g_file_new_for_path (CLAPPER_SINK_IMPORTER_PATH);
if ((dir_enum = g_file_enumerate_children (dir,
G_FILE_ATTRIBUTE_STANDARD_NAME,
G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL, &error))) {
while (TRUE) {
GFileInfo *info = NULL;
GModule *module;
gchar *module_path;
const gchar *module_name;
if (!g_file_enumerator_iterate (dir_enum, &info,
NULL, NULL, &error) || !info)
break;
module_name = g_file_info_get_name (info);
if (!g_str_has_suffix (module_name, G_MODULE_SUFFIX))
continue;
module_path = g_module_build_path (CLAPPER_SINK_IMPORTER_PATH, module_name);
module = g_module_open (module_path, G_MODULE_BIND_LAZY);
g_free (module_path);
if (!module) {
GST_WARNING ("Could not read module: %s, reason: %s",
module_name, g_module_error ());
continue;
}
GST_INFO ("Found module: %s", module_name);
g_ptr_array_add (modules, module);
}
g_object_unref (dir_enum);
}
g_object_unref (dir);
if (error) {
GST_ERROR ("Could not load module, reason: %s",
(error->message) ? error->message : "unknown");
g_error_free (error);
}
return modules;
}
static const GPtrArray *
gst_clapper_importer_loader_get_available_modules (void)
{
static GOnce once = G_ONCE_INIT;
g_once (&once, _obtain_available_modules_once, NULL);
return (const GPtrArray *) once.retval;
}
static gint
_sort_importers_cb (gconstpointer a, gconstpointer b)
{
GstClapperImporterData *data_a, *data_b;
data_a = *((GstClapperImporterData **) a);
data_b = *((GstClapperImporterData **) b);
return (data_b->rank - data_a->rank);
}
static GPtrArray *
_obtain_available_importers (gboolean is_template)
{
const GPtrArray *modules;
GPtrArray *importers;
guint i;
GST_DEBUG ("Checking available importers");
modules = gst_clapper_importer_loader_get_available_modules ();
importers = g_ptr_array_new_with_free_func (
(GDestroyNotify) gst_clapper_importer_data_free);
for (i = 0; i < modules->len; i++) {
GModule *module = g_ptr_array_index (modules, i);
GstClapperImporterData *data;
if ((data = _obtain_importer_data (module, is_template)))
g_ptr_array_add (importers, data);
}
g_ptr_array_sort (importers, (GCompareFunc) _sort_importers_cb);
GST_DEBUG ("Found %i available importers", importers->len);
return importers;
}
GstClapperImporterLoader *
gst_clapper_importer_loader_new (void)
{
return g_object_new (GST_TYPE_CLAPPER_IMPORTER_LOADER, NULL);
}
static GstCaps *
_make_caps_for_importers (const GPtrArray *importers)
{
GstCaps *caps = gst_caps_new_empty ();
guint i;
for (i = 0; i < importers->len; i++) {
GstClapperImporterData *data = g_ptr_array_index (importers, i);
gst_caps_append (caps, gst_caps_ref (data->caps));
}
return caps;
}
GstPadTemplate *
gst_clapper_importer_loader_make_sink_pad_template (void)
{
GPtrArray *importers;
GstCaps *caps;
GstPadTemplate *templ;
/* This is only called once from sink class init function */
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperimporterloader", 0,
"Clapper Importer Loader");
GST_DEBUG ("Making sink pad template");
importers = _obtain_available_importers (TRUE);
caps = _make_caps_for_importers (importers);
g_ptr_array_unref (importers);
if (G_UNLIKELY (gst_caps_is_empty (caps)))
gst_caps_append (caps, gst_caps_new_any ());
templ = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps);
gst_caps_unref (caps);
GST_TRACE ("Created sink pad template");
return templ;
}
GstCaps *
gst_clapper_importer_loader_make_actual_caps (GstClapperImporterLoader *self)
{
return _make_caps_for_importers (self->importers);
}
static const GstClapperImporterData *
_get_importer_data_for_caps (const GPtrArray *importers, const GstCaps *caps)
{
guint i;
for (i = 0; i < importers->len; i++) {
GstClapperImporterData *data = g_ptr_array_index (importers, i);
if (!gst_caps_is_always_compatible (caps, data->caps))
continue;
return data;
}
return NULL;
}
static const GstClapperImporterData *
_get_importer_data_for_context_type (const GPtrArray *importers, const gchar *context_type)
{
guint i;
for (i = 0; i < importers->len; i++) {
GstClapperImporterData *data = g_ptr_array_index (importers, i);
guint j;
if (!data->context_types)
continue;
for (j = 0; data->context_types[j]; j++) {
if (strcmp (context_type, data->context_types[j]))
continue;
return data;
}
}
return NULL;
}
static gboolean
_find_importer_internal (GstClapperImporterLoader *self,
GstCaps *caps, GstQuery *query, GstClapperImporter **importer)
{
const GstClapperImporterData *data = NULL;
GstClapperImporter *found_importer = NULL;
GST_OBJECT_LOCK (self);
if (caps) {
GST_DEBUG_OBJECT (self, "Requested importer for caps: %" GST_PTR_FORMAT, caps);
data = _get_importer_data_for_caps (self->importers, caps);
} else if (query) {
const gchar *context_type;
gst_query_parse_context_type (query, &context_type);
GST_DEBUG_OBJECT (self, "Requested importer for context: %s", context_type);
data = _get_importer_data_for_context_type (self->importers, context_type);
}
GST_LOG_OBJECT (self, "Old importer path: %s, new path: %s",
(self->last_module) ? g_module_name (self->last_module) : NULL,
(data) ? g_module_name (data->module) : NULL);
if (!data) {
/* In case of missing importer for context query, leave the old one.
* We should allow some queries to go through unresponded */
if (query)
GST_DEBUG_OBJECT (self, "No importer for query, leaving old one");
else
gst_clear_object (importer);
goto finish;
}
if (*importer && (self->last_module == data->module)) {
GST_DEBUG_OBJECT (self, "No importer change");
if (caps)
gst_clapper_importer_set_caps (*importer, caps);
goto finish;
}
found_importer = _obtain_importer_internal (data->module);
if (*importer && found_importer)
gst_clapper_importer_share_data (*importer, found_importer);
gst_clear_object (importer);
if (!found_importer || !gst_clapper_importer_prepare (found_importer)) {
gst_clear_object (&found_importer);
goto finish;
}
if (caps)
gst_clapper_importer_set_caps (found_importer, caps);
*importer = found_importer;
finish:
self->last_module = (*importer && data)
? data->module
: NULL;
GST_OBJECT_UNLOCK (self);
return (*importer != NULL);
}
gboolean
gst_clapper_importer_loader_find_importer_for_caps (GstClapperImporterLoader *self,
GstCaps *caps, GstClapperImporter **importer)
{
return _find_importer_internal (self, caps, NULL, importer);
}
gboolean
gst_clapper_importer_loader_find_importer_for_context_query (GstClapperImporterLoader *self,
GstQuery *query, GstClapperImporter **importer)
{
return _find_importer_internal (self, NULL, query, importer);
}
static void
gst_clapper_importer_loader_init (GstClapperImporterLoader *self)
{
}
static void
gst_clapper_importer_loader_constructed (GObject *object)
{
GstClapperImporterLoader *self = GST_CLAPPER_IMPORTER_LOADER_CAST (object);
self->importers = _obtain_available_importers (FALSE);
GST_CALL_PARENT (G_OBJECT_CLASS, constructed, (object));
}
static void
gst_clapper_importer_loader_finalize (GObject *object)
{
GstClapperImporterLoader *self = GST_CLAPPER_IMPORTER_LOADER_CAST (object);
GST_TRACE ("Finalize");
g_ptr_array_unref (self->importers);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static void
gst_clapper_importer_loader_class_init (GstClapperImporterLoaderClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
gobject_class->constructed = gst_clapper_importer_loader_constructed;
gobject_class->finalize = gst_clapper_importer_loader_finalize;
}

View File

@@ -0,0 +1,51 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once
#include <gst/gst.h>
#include "gstclapperimporter.h"
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_IMPORTER_LOADER (gst_clapper_importer_loader_get_type())
G_DECLARE_FINAL_TYPE (GstClapperImporterLoader, gst_clapper_importer_loader, GST, CLAPPER_IMPORTER_LOADER, GstObject)
#define GST_CLAPPER_IMPORTER_LOADER_CAST(obj) ((GstClapperImporterLoader *)(obj))
struct _GstClapperImporterLoader
{
GstObject parent;
GModule *last_module;
GPtrArray *importers;
};
GstClapperImporterLoader * gst_clapper_importer_loader_new (void);
GstPadTemplate * gst_clapper_importer_loader_make_sink_pad_template (void);
GstCaps * gst_clapper_importer_loader_make_actual_caps (GstClapperImporterLoader *loader);
gboolean gst_clapper_importer_loader_find_importer_for_caps (GstClapperImporterLoader *loader, GstCaps *caps, GstClapperImporter **importer);
gboolean gst_clapper_importer_loader_find_importer_for_context_query (GstClapperImporterLoader *loader, GstQuery *query, GstClapperImporter **importer);
G_END_DECLS

435
lib/gst/plugin/gstclapperpaintable.c vendored Normal file
View File

@@ -0,0 +1,435 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "gstclapperpaintable.h"
#define DEFAULT_PAR_N 1
#define DEFAULT_PAR_D 1
#define GST_CAT_DEFAULT gst_clapper_paintable_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
static void gst_clapper_paintable_iface_init (GdkPaintableInterface *iface);
static void gst_clapper_paintable_dispose (GObject *object);
static void gst_clapper_paintable_finalize (GObject *object);
#define parent_class gst_clapper_paintable_parent_class
G_DEFINE_TYPE_WITH_CODE (GstClapperPaintable, gst_clapper_paintable, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (GDK_TYPE_PAINTABLE,
gst_clapper_paintable_iface_init));
static void
gst_clapper_paintable_class_init (GstClapperPaintableClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperpaintable", 0,
"Clapper Paintable");
gobject_class->dispose = gst_clapper_paintable_dispose;
gobject_class->finalize = gst_clapper_paintable_finalize;
}
static void
gst_clapper_paintable_init (GstClapperPaintable *self)
{
self->display_width = 1;
self->display_height = 1;
self->display_aspect_ratio = 1.0;
self->par_n = DEFAULT_PAR_N;
self->par_d = DEFAULT_PAR_D;
g_mutex_init (&self->lock);
g_mutex_init (&self->importer_lock);
gst_video_info_init (&self->v_info);
g_weak_ref_init (&self->widget, NULL);
gdk_rgba_parse (&self->bg, "black");
}
static void
gst_clapper_paintable_dispose (GObject *object)
{
GstClapperPaintable *self = GST_CLAPPER_PAINTABLE (object);
GST_CLAPPER_PAINTABLE_LOCK (self);
if (self->draw_id > 0) {
g_source_remove (self->draw_id);
self->draw_id = 0;
}
GST_CLAPPER_PAINTABLE_UNLOCK (self);
GST_CLAPPER_PAINTABLE_IMPORTER_LOCK (self);
gst_clear_object (&self->importer);
GST_CLAPPER_PAINTABLE_IMPORTER_UNLOCK (self);
GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
}
static void
gst_clapper_paintable_finalize (GObject *object)
{
GstClapperPaintable *self = GST_CLAPPER_PAINTABLE (object);
GST_TRACE ("Finalize");
g_weak_ref_clear (&self->widget);
g_mutex_clear (&self->lock);
g_mutex_clear (&self->importer_lock);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static gboolean
calculate_display_par (GstClapperPaintable *self, const GstVideoInfo *info)
{
gint width, height, par_n, par_d, req_par_n, req_par_d;
gboolean success;
width = GST_VIDEO_INFO_WIDTH (info);
height = GST_VIDEO_INFO_HEIGHT (info);
/* Cannot apply aspect ratio if there is no video */
if (width == 0 || height == 0)
return FALSE;
par_n = GST_VIDEO_INFO_PAR_N (info);
par_d = GST_VIDEO_INFO_PAR_D (info);
req_par_n = self->par_n;
req_par_d = self->par_d;
if (par_n == 0)
par_n = 1;
/* Use defaults if user set zero */
if (req_par_n == 0 || req_par_d == 0) {
req_par_n = DEFAULT_PAR_N;
req_par_d = DEFAULT_PAR_D;
}
GST_LOG_OBJECT (self, "PAR: %u/%u, DAR: %u/%u", par_n, par_d, req_par_n, req_par_d);
if (!(success = gst_video_calculate_display_ratio (&self->display_ratio_num,
&self->display_ratio_den, width, height, par_n, par_d,
req_par_n, req_par_d))) {
GST_ERROR_OBJECT (self, "Could not calculate display ratio values");
}
return success;
}
static void
invalidate_paintable_size_internal (GstClapperPaintable *self)
{
gint video_width, video_height;
guint display_ratio_num, display_ratio_den;
GST_CLAPPER_PAINTABLE_LOCK (self);
video_width = GST_VIDEO_INFO_WIDTH (&self->v_info);
video_height = GST_VIDEO_INFO_HEIGHT (&self->v_info);
display_ratio_num = self->display_ratio_num;
display_ratio_den = self->display_ratio_den;
GST_CLAPPER_PAINTABLE_UNLOCK (self);
if (video_height % display_ratio_den == 0) {
GST_LOG ("Keeping video height");
self->display_width = (guint)
gst_util_uint64_scale_int (video_height, display_ratio_num, display_ratio_den);
self->display_height = video_height;
} else if (video_width % display_ratio_num == 0) {
GST_LOG ("Keeping video width");
self->display_width = video_width;
self->display_height = (guint)
gst_util_uint64_scale_int (video_width, display_ratio_den, display_ratio_num);
} else {
GST_LOG ("Approximating while keeping video height");
self->display_width = (guint)
gst_util_uint64_scale_int (video_height, display_ratio_num, display_ratio_den);
self->display_height = video_height;
}
self->display_aspect_ratio = ((gdouble) self->display_width
/ (gdouble) self->display_height);
GST_DEBUG_OBJECT (self, "Invalidate paintable size, display: %dx%d",
self->display_width, self->display_height);
gdk_paintable_invalidate_size ((GdkPaintable *) self);
}
static gboolean
invalidate_paintable_size_on_main_cb (GstClapperPaintable *self)
{
GST_CLAPPER_PAINTABLE_LOCK (self);
self->draw_id = 0;
GST_CLAPPER_PAINTABLE_UNLOCK (self);
invalidate_paintable_size_internal (self);
return G_SOURCE_REMOVE;
}
static gboolean
update_paintable_on_main_cb (GstClapperPaintable *self)
{
gboolean size_changed;
GST_CLAPPER_PAINTABLE_LOCK (self);
/* Check if we will need to invalidate size */
if ((size_changed = self->pending_resize))
self->pending_resize = FALSE;
self->draw_id = 0;
GST_CLAPPER_PAINTABLE_UNLOCK (self);
if (size_changed)
invalidate_paintable_size_internal (self);
GST_LOG_OBJECT (self, "Invalidate paintable contents");
gdk_paintable_invalidate_contents ((GdkPaintable *) self);
return G_SOURCE_REMOVE;
}
GstClapperPaintable *
gst_clapper_paintable_new (void)
{
return g_object_new (GST_TYPE_CLAPPER_PAINTABLE, NULL);
}
void
gst_clapper_paintable_set_widget (GstClapperPaintable *self, GtkWidget *widget)
{
g_weak_ref_set (&self->widget, widget);
}
void
gst_clapper_paintable_set_importer (GstClapperPaintable *self, GstClapperImporter *importer)
{
GST_CLAPPER_PAINTABLE_IMPORTER_LOCK (self);
gst_object_replace ((GstObject **) &self->importer, GST_OBJECT_CAST (importer));
GST_CLAPPER_PAINTABLE_IMPORTER_UNLOCK (self);
}
void
gst_clapper_paintable_queue_draw (GstClapperPaintable *self)
{
GST_CLAPPER_PAINTABLE_LOCK (self);
if (self->draw_id > 0) {
GST_CLAPPER_PAINTABLE_UNLOCK (self);
GST_TRACE ("Already have pending draw");
return;
}
self->draw_id = g_idle_add_full (G_PRIORITY_DEFAULT,
(GSourceFunc) update_paintable_on_main_cb, self, NULL);
GST_CLAPPER_PAINTABLE_UNLOCK (self);
}
gboolean
gst_clapper_paintable_set_video_info (GstClapperPaintable *self, const GstVideoInfo *v_info)
{
GST_CLAPPER_PAINTABLE_LOCK (self);
if (gst_video_info_is_equal (&self->v_info, v_info)) {
GST_CLAPPER_PAINTABLE_UNLOCK (self);
return TRUE;
}
/* Reject info if values would cause integer overflow */
if (G_UNLIKELY (!calculate_display_par (self, v_info))) {
GST_CLAPPER_PAINTABLE_UNLOCK (self);
return FALSE;
}
self->pending_resize = TRUE;
self->v_info = *v_info;
GST_CLAPPER_PAINTABLE_UNLOCK (self);
return TRUE;
}
void
gst_clapper_paintable_set_pixel_aspect_ratio (GstClapperPaintable *self,
gint par_n, gint par_d)
{
gboolean success;
GST_CLAPPER_PAINTABLE_LOCK (self);
/* No change */
if (self->par_n == par_n && self->par_d == par_d) {
GST_CLAPPER_PAINTABLE_UNLOCK (self);
return;
}
self->par_n = par_n;
self->par_d = par_d;
/* Check if we can accept new values. This will update
* display `ratio_num` and `ratio_den` only when successful */
success = calculate_display_par (self, &self->v_info);
/* If paintable update is queued, wait for it, otherwise invalidate
* size only for change to be applied even when paused */
if (!success || self->draw_id > 0) {
self->pending_resize = success;
GST_CLAPPER_PAINTABLE_UNLOCK (self);
return;
}
self->draw_id = g_idle_add_full (G_PRIORITY_DEFAULT,
(GSourceFunc) invalidate_paintable_size_on_main_cb, self, NULL);
GST_CLAPPER_PAINTABLE_UNLOCK (self);
}
/*
* GdkPaintableInterface
*/
static void
gst_clapper_paintable_snapshot_internal (GstClapperPaintable *self,
GdkSnapshot *snapshot, gdouble width, gdouble height,
gint widget_width, gint widget_height)
{
gfloat scale_x, scale_y;
GST_LOG_OBJECT (self, "Snapshot");
scale_x = (gfloat) width / self->display_width;
scale_y = (gfloat) height / self->display_height;
/* Apply black borders when keeping aspect ratio */
if (scale_x == scale_y || abs (scale_x - scale_y) <= FLT_EPSILON) {
if (widget_height - height > 0) {
/* XXX: Top uses integer to work with GTK rounding (not going offscreen) */
gint top_bar_height = (widget_height - height) / 2;
gdouble bottom_bar_height = (widget_height - top_bar_height - height);
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, width, -top_bar_height));
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, height, width, bottom_bar_height));
} else if (widget_width - width > 0) {
gint left_bar_width = (widget_width - width) / 2;
gdouble right_bar_width = (widget_width - left_bar_width - width);
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, -left_bar_width, height));
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (width, 0, right_bar_width, height));
}
}
GST_CLAPPER_PAINTABLE_IMPORTER_LOCK (self);
if (self->importer) {
gst_clapper_importer_snapshot (self->importer, snapshot, width, height);
} else {
GST_LOG_OBJECT (self, "No texture importer, drawing black");
gtk_snapshot_append_color (snapshot, &self->bg, &GRAPHENE_RECT_INIT (0, 0, width, height));
}
GST_CLAPPER_PAINTABLE_IMPORTER_UNLOCK (self);
}
static void
gst_clapper_paintable_snapshot (GdkPaintable *paintable,
GdkSnapshot *snapshot, gdouble width, gdouble height)
{
GstClapperPaintable *self = GST_CLAPPER_PAINTABLE_CAST (paintable);
GtkWidget *widget;
gint widget_width = 0, widget_height = 0;
if ((widget = g_weak_ref_get (&self->widget))) {
widget_width = gtk_widget_get_width (widget);
widget_height = gtk_widget_get_height (widget);
g_object_unref (widget);
}
gst_clapper_paintable_snapshot_internal (self, snapshot,
width, height, widget_width, widget_height);
}
static GdkPaintable *
gst_clapper_paintable_get_current_image (GdkPaintable *paintable)
{
GstClapperPaintable *self = GST_CLAPPER_PAINTABLE_CAST (paintable);
GtkSnapshot *snapshot = gtk_snapshot_new ();
/* Snapshot without widget size in order to get
* paintable without black borders */
gst_clapper_paintable_snapshot_internal (self, snapshot,
self->display_width, self->display_height, 0, 0);
return gtk_snapshot_free_to_paintable (snapshot, NULL);
}
static gint
gst_clapper_paintable_get_intrinsic_width (GdkPaintable *paintable)
{
GstClapperPaintable *self = GST_CLAPPER_PAINTABLE_CAST (paintable);
return self->display_width;
}
static gint
gst_clapper_paintable_get_intrinsic_height (GdkPaintable *paintable)
{
GstClapperPaintable *self = GST_CLAPPER_PAINTABLE_CAST (paintable);
return self->display_height;
}
static gdouble
gst_clapper_paintable_get_intrinsic_aspect_ratio (GdkPaintable *paintable)
{
GstClapperPaintable *self = GST_CLAPPER_PAINTABLE_CAST (paintable);
return self->display_aspect_ratio;
}
static void
gst_clapper_paintable_iface_init (GdkPaintableInterface *iface)
{
iface->snapshot = gst_clapper_paintable_snapshot;
iface->get_current_image = gst_clapper_paintable_get_current_image;
iface->get_intrinsic_width = gst_clapper_paintable_get_intrinsic_width;
iface->get_intrinsic_height = gst_clapper_paintable_get_intrinsic_height;
iface->get_intrinsic_aspect_ratio = gst_clapper_paintable_get_intrinsic_aspect_ratio;
}

81
lib/gst/plugin/gstclapperpaintable.h vendored Normal file
View File

@@ -0,0 +1,81 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once
#include <gtk/gtk.h>
#include <gst/gst.h>
#include <gst/video/video.h>
#include "gstclapperimporter.h"
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_PAINTABLE (gst_clapper_paintable_get_type())
G_DECLARE_FINAL_TYPE (GstClapperPaintable, gst_clapper_paintable, GST, CLAPPER_PAINTABLE, GObject)
#define GST_CLAPPER_PAINTABLE_CAST(obj) ((GstClapperPaintable *)(obj))
#define GST_CLAPPER_PAINTABLE_GET_LOCK(obj) (&GST_CLAPPER_PAINTABLE_CAST(obj)->lock)
#define GST_CLAPPER_PAINTABLE_LOCK(obj) g_mutex_lock (GST_CLAPPER_PAINTABLE_GET_LOCK(obj))
#define GST_CLAPPER_PAINTABLE_UNLOCK(obj) g_mutex_unlock (GST_CLAPPER_PAINTABLE_GET_LOCK(obj))
#define GST_CLAPPER_PAINTABLE_IMPORTER_GET_LOCK(obj) (&GST_CLAPPER_PAINTABLE_CAST(obj)->importer_lock)
#define GST_CLAPPER_PAINTABLE_IMPORTER_LOCK(obj) g_mutex_lock (GST_CLAPPER_PAINTABLE_IMPORTER_GET_LOCK(obj))
#define GST_CLAPPER_PAINTABLE_IMPORTER_UNLOCK(obj) g_mutex_unlock (GST_CLAPPER_PAINTABLE_IMPORTER_GET_LOCK(obj))
struct _GstClapperPaintable
{
GObject parent;
GMutex lock;
GMutex importer_lock;
GstVideoInfo v_info;
GdkRGBA bg;
GWeakRef widget;
GstClapperImporter *importer;
/* Sink properties */
gint par_n, par_d;
/* Resize */
gboolean pending_resize;
guint display_ratio_num;
guint display_ratio_den;
/* GdkPaintableInterface */
gint display_width;
gint display_height;
gdouble display_aspect_ratio;
/* Pending draw signal id */
guint draw_id;
};
GstClapperPaintable * gst_clapper_paintable_new (void);
void gst_clapper_paintable_queue_draw (GstClapperPaintable *paintable);
void gst_clapper_paintable_set_widget (GstClapperPaintable *paintable, GtkWidget *widget);
void gst_clapper_paintable_set_importer (GstClapperPaintable *paintable, GstClapperImporter *importer);
gboolean gst_clapper_paintable_set_video_info (GstClapperPaintable *paintable, const GstVideoInfo *v_info);
void gst_clapper_paintable_set_pixel_aspect_ratio (GstClapperPaintable *paintable, gint par_n, gint par_d);
G_END_DECLS

910
lib/gst/plugin/gstclappersink.c vendored Normal file
View File

@@ -0,0 +1,910 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "gstclappersink.h"
#include "gstgtkutils.h"
#define DEFAULT_FORCE_ASPECT_RATIO TRUE
#define DEFAULT_PAR_N 1
#define DEFAULT_PAR_D 1
#define DEFAULT_KEEP_LAST_FRAME FALSE
#define WINDOW_CSS_CLASS_NAME "clappersinkwindow"
enum
{
PROP_0,
PROP_WIDGET,
PROP_FORCE_ASPECT_RATIO,
PROP_PIXEL_ASPECT_RATIO,
PROP_KEEP_LAST_FRAME,
PROP_LAST
};
#define GST_CAT_DEFAULT gst_clapper_sink_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
static void gst_clapper_sink_navigation_interface_init (
GstNavigationInterface *iface);
#define parent_class gst_clapper_sink_parent_class
G_DEFINE_TYPE_WITH_CODE (GstClapperSink, gst_clapper_sink, GST_TYPE_VIDEO_SINK,
G_IMPLEMENT_INTERFACE (GST_TYPE_NAVIGATION,
gst_clapper_sink_navigation_interface_init));
GST_ELEMENT_REGISTER_DEFINE (clappersink, "clappersink", GST_RANK_NONE,
GST_TYPE_CLAPPER_SINK);
static void
window_clear_no_lock (GstClapperSink *self)
{
if (!self->window)
return;
GST_TRACE_OBJECT (self, "Window clear");
if (self->window_destroy_id) {
g_signal_handler_disconnect (self->window, self->window_destroy_id);
self->window_destroy_id = 0;
}
self->window = NULL;
self->presented_window = FALSE;
}
static void
widget_clear_no_lock (GstClapperSink *self)
{
if (!self->widget)
return;
GST_TRACE_OBJECT (self, "Widget clear");
if (self->widget_destroy_id) {
g_signal_handler_disconnect (self->widget, self->widget_destroy_id);
self->widget_destroy_id = 0;
}
g_clear_object (&self->widget);
}
static void
widget_destroy_cb (GtkWidget *widget, GstClapperSink *self)
{
GST_CLAPPER_SINK_LOCK (self);
widget_clear_no_lock (self);
GST_CLAPPER_SINK_UNLOCK (self);
}
static void
window_destroy_cb (GtkWidget *window, GstClapperSink *self)
{
GST_DEBUG_OBJECT (self, "Window destroy");
GST_CLAPPER_SINK_LOCK (self);
widget_clear_no_lock (self);
window_clear_no_lock (self);
GST_CLAPPER_SINK_UNLOCK (self);
}
static void
calculate_stream_coords (GstClapperSink *self, GtkWidget *widget,
gdouble x, gdouble y, gdouble *stream_x, gdouble *stream_y)
{
GstVideoRectangle result;
gint scaled_width, scaled_height, scale_factor;
gint video_width, video_height;
gboolean force_aspect_ratio;
GST_CLAPPER_SINK_LOCK (self);
video_width = GST_VIDEO_INFO_WIDTH (&self->v_info);
video_height = GST_VIDEO_INFO_HEIGHT (&self->v_info);
force_aspect_ratio = self->force_aspect_ratio;
GST_CLAPPER_SINK_UNLOCK (self);
scale_factor = gtk_widget_get_scale_factor (widget);
scaled_width = gtk_widget_get_width (widget) * scale_factor;
scaled_height = gtk_widget_get_height (widget) * scale_factor;
if (force_aspect_ratio) {
GstVideoRectangle src, dst;
src.x = 0;
src.y = 0;
src.w = gdk_paintable_get_intrinsic_width ((GdkPaintable *) self->paintable);
src.h = gdk_paintable_get_intrinsic_height ((GdkPaintable *) self->paintable);
dst.x = 0;
dst.y = 0;
dst.w = scaled_width;
dst.h = scaled_height;
gst_video_center_rect (&src, &dst, &result, TRUE);
} else {
result.x = 0;
result.y = 0;
result.w = scaled_width;
result.h = scaled_height;
}
/* Display coordinates to stream coordinates */
*stream_x = (result.w > 0)
? (x - result.x) / result.w * video_width
: 0;
*stream_y = (result.h > 0)
? (y - result.y) / result.h * video_height
: 0;
/* Clip to stream size */
*stream_x = CLAMP (*stream_x, 0, video_width);
*stream_y = CLAMP (*stream_y, 0, video_height);
GST_LOG ("Transform coords %fx%f => %fx%f", x, y, *stream_x, *stream_y);
}
static void
gst_clapper_sink_widget_motion_event (GtkEventControllerMotion *motion,
gdouble x, gdouble y, GstClapperSink *self)
{
GtkWidget *widget;
gdouble stream_x, stream_y;
gboolean is_inactive;
if (x == self->last_pos_x && y == self->last_pos_y)
return;
GST_OBJECT_LOCK (self);
is_inactive = (GST_STATE (self) < GST_STATE_PLAYING);
GST_OBJECT_UNLOCK (self);
if (is_inactive)
return;
self->last_pos_x = x;
self->last_pos_y = y;
widget = gtk_event_controller_get_widget ((GtkEventController *) motion);
calculate_stream_coords (self, widget, x, y, &stream_x, &stream_y);
GST_LOG ("Event \"mouse-move\", x: %f, y: %f", stream_x, stream_y);
gst_navigation_send_mouse_event ((GstNavigation *) self, "mouse-move",
0, stream_x, stream_y);
}
static void
gst_clapper_sink_widget_button_event (GtkGestureClick *click,
gint n_press, gdouble x, gdouble y, GstClapperSink *self)
{
GtkWidget *widget;
GdkEvent *event;
GdkEventType event_type;
const gchar *event_name;
gdouble stream_x, stream_y;
gboolean is_inactive;
GST_OBJECT_LOCK (self);
is_inactive = (GST_STATE (self) < GST_STATE_PLAYING);
GST_OBJECT_UNLOCK (self);
if (is_inactive)
return;
event = gtk_event_controller_get_current_event ((GtkEventController *) click);
event_type = gdk_event_get_event_type (event);
/* FIXME: Touchscreen handling should probably use new touch events from GStreamer 1.22 */
event_name = (event_type == GDK_BUTTON_PRESS || event_type == GDK_TOUCH_BEGIN)
? "mouse-button-press"
: (event_type == GDK_BUTTON_RELEASE || event_type == GDK_TOUCH_END)
? "mouse-button-release"
: NULL;
/* Can be NULL on touch */
if (!event_name)
return;
widget = gtk_event_controller_get_widget ((GtkEventController *) click);
calculate_stream_coords (self, widget, x, y, &stream_x, &stream_y);
GST_LOG ("Event \"%s\", x: %f, y: %f", event_name, stream_x, stream_y);
/* Gesture is set to handle only primary button, so we do not have to check */
gst_navigation_send_mouse_event ((GstNavigation *) self, event_name,
1, stream_x, stream_y);
}
/* Must call from main thread only with a lock */
static GtkWidget *
gst_clapper_sink_get_widget (GstClapperSink *self)
{
if (G_UNLIKELY (!self->widget)) {
GtkEventController *controller;
GtkGesture *gesture;
/* Make sure GTK is initialized */
if (!gtk_init_check ()) {
GST_ERROR_OBJECT (self, "Could not ensure GTK initialization");
return NULL;
}
self->widget = gtk_picture_new ();
/* Otherwise widget in grid will appear as a 1x1px
* video which might be misleading for users */
gtk_widget_set_hexpand (self->widget, TRUE);
gtk_widget_set_vexpand (self->widget, TRUE);
gtk_widget_set_focusable (self->widget, TRUE);
gtk_widget_set_can_focus (self->widget, TRUE);
controller = gtk_event_controller_motion_new ();
g_signal_connect (controller, "motion",
G_CALLBACK (gst_clapper_sink_widget_motion_event), self);
gtk_widget_add_controller (self->widget, controller);
gesture = gtk_gesture_click_new ();
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), 1);
g_signal_connect (gesture, "pressed",
G_CALLBACK (gst_clapper_sink_widget_button_event), self);
g_signal_connect (gesture, "released",
G_CALLBACK (gst_clapper_sink_widget_button_event), self);
gtk_widget_add_controller (self->widget, GTK_EVENT_CONTROLLER (gesture));
/* TODO: Implement touch events once we depend on GStreamer 1.22 */
/* Take floating ref */
g_object_ref_sink (self->widget);
/* Set widget back pointer */
gst_clapper_paintable_set_widget (self->paintable, self->widget);
/* Set earlier remembered property */
gtk_picture_set_keep_aspect_ratio (GTK_PICTURE (self->widget),
self->force_aspect_ratio);
gtk_picture_set_paintable (GTK_PICTURE (self->widget), GDK_PAINTABLE (self->paintable));
self->widget_destroy_id = g_signal_connect (self->widget,
"destroy", G_CALLBACK (widget_destroy_cb), self);
}
return self->widget;
}
static GtkWidget *
gst_clapper_sink_obtain_widget (GstClapperSink *self)
{
GtkWidget *widget;
GST_CLAPPER_SINK_LOCK (self);
widget = gst_clapper_sink_get_widget (self);
if (widget)
g_object_ref (widget);
GST_CLAPPER_SINK_UNLOCK (self);
return widget;
}
static void
gst_clapper_sink_get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (object);
GST_CLAPPER_SINK_LOCK (self);
switch (prop_id) {
case PROP_WIDGET:
if (self->widget) {
g_value_set_object (value, self->widget);
} else {
GtkWidget *widget;
GST_CLAPPER_SINK_UNLOCK (self);
widget = gst_gtk_invoke_on_main ((GThreadFunc) gst_clapper_sink_obtain_widget, self);
GST_CLAPPER_SINK_LOCK (self);
g_value_set_object (value, widget);
g_object_unref (widget);
}
break;
case PROP_FORCE_ASPECT_RATIO:
g_value_set_boolean (value, self->force_aspect_ratio);
break;
case PROP_PIXEL_ASPECT_RATIO:
gst_value_set_fraction (value, self->par_n, self->par_d);
break;
case PROP_KEEP_LAST_FRAME:
g_value_set_boolean (value, self->keep_last_frame);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
GST_CLAPPER_SINK_UNLOCK (self);
}
static void
gst_clapper_sink_set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (object);
GST_CLAPPER_SINK_LOCK (self);
switch (prop_id) {
case PROP_FORCE_ASPECT_RATIO:
self->force_aspect_ratio = g_value_get_boolean (value);
if (self->widget) {
gtk_picture_set_keep_aspect_ratio (GTK_PICTURE (self->widget),
self->force_aspect_ratio);
}
break;
case PROP_PIXEL_ASPECT_RATIO:
self->par_n = gst_value_get_fraction_numerator (value);
self->par_d = gst_value_get_fraction_denominator (value);
gst_clapper_paintable_set_pixel_aspect_ratio (self->paintable,
self->par_n, self->par_d);
break;
case PROP_KEEP_LAST_FRAME:
self->keep_last_frame = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
GST_CLAPPER_SINK_UNLOCK (self);
}
static void
gst_clapper_sink_navigation_send_event (GstNavigation *navigation,
GstStructure *structure)
{
GstClapperSink *sink = GST_CLAPPER_SINK_CAST (navigation);
GstEvent *event;
GST_TRACE_OBJECT (sink, "Navigation event: %" GST_PTR_FORMAT, structure);
event = gst_event_new_navigation (structure);
if (G_LIKELY (event)) {
GstPad *pad;
pad = gst_pad_get_peer (GST_VIDEO_SINK_PAD (sink));
if (G_LIKELY (pad)) {
if (!gst_pad_send_event (pad, gst_event_ref (event))) {
/* If upstream didn't handle the event we'll post a message with it
* for the application in case it wants to do something with it */
gst_element_post_message (GST_ELEMENT_CAST (sink),
gst_navigation_message_new_event (GST_OBJECT_CAST (sink), event));
}
gst_object_unref (pad);
}
gst_event_unref (event);
}
}
static gboolean
gst_clapper_sink_propose_allocation (GstBaseSink *bsink, GstQuery *query)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (bsink);
GstCaps *caps;
GstVideoInfo info;
guint size, min_buffers;
gboolean need_pool;
gst_query_parse_allocation (query, &caps, &need_pool);
if (!caps) {
GST_DEBUG_OBJECT (self, "No caps specified");
return FALSE;
}
if (!gst_video_info_from_caps (&info, caps)) {
GST_DEBUG_OBJECT (self, "Invalid caps specified");
return FALSE;
}
/* Normal size of a frame */
size = GST_VIDEO_INFO_SIZE (&info);
/* We keep around current buffer and a pending one */
min_buffers = 3;
if (need_pool) {
GstBufferPool *pool;
GstStructure *config = NULL;
GST_DEBUG_OBJECT (self, "Need to create buffer pool");
GST_CLAPPER_SINK_LOCK (self);
pool = gst_clapper_importer_create_pool (self->importer, &config);
GST_CLAPPER_SINK_UNLOCK (self);
if (pool) {
/* If we did not get config, use default one */
if (!config)
config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_set_params (config, caps, size, min_buffers, 0);
if (!gst_buffer_pool_set_config (pool, config)) {
gst_object_unref (pool);
GST_ERROR_OBJECT (self, "Failed to set config");
return FALSE;
}
gst_query_add_allocation_pool (query, pool, size, min_buffers, 0);
gst_object_unref (pool);
} else if (config) {
GST_WARNING_OBJECT (self, "Got config without a pool to apply it");
gst_structure_free (config);
}
}
GST_CLAPPER_SINK_LOCK (self);
gst_clapper_importer_add_allocation_metas (self->importer, query);
GST_CLAPPER_SINK_UNLOCK (self);
return TRUE;
}
static gboolean
gst_clapper_sink_query (GstBaseSink *bsink, GstQuery *query)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (bsink);
gboolean res = FALSE;
GST_CLAPPER_SINK_LOCK (self);
if (GST_QUERY_TYPE (query) == GST_QUERY_CONTEXT) {
gboolean is_inactive;
GST_OBJECT_LOCK (self);
is_inactive = (GST_STATE (self) < GST_STATE_PAUSED);
GST_OBJECT_UNLOCK (self);
/* Some random context query in the middle of playback
* should not trigger importer replacement */
if (is_inactive)
gst_clapper_importer_loader_find_importer_for_context_query (self->loader, query, &self->importer);
if (self->importer)
res = gst_clapper_importer_handle_context_query (self->importer, bsink, query);
}
GST_CLAPPER_SINK_UNLOCK (self);
if (res)
return TRUE;
return GST_BASE_SINK_CLASS (parent_class)->query (bsink, query);
}
static gboolean
gst_clapper_sink_start_on_main (GstClapperSink *self)
{
GtkWidget *widget;
GST_CLAPPER_SINK_LOCK (self);
/* Make sure widget is created */
if (!(widget = gst_clapper_sink_get_widget (self))) {
GST_CLAPPER_SINK_UNLOCK (self);
return FALSE;
}
/* When no toplevel window, make our own */
if (G_UNLIKELY (!gtk_widget_get_root (widget) && !self->window)) {
GtkWidget *toplevel, *parent;
GtkCssProvider *provider;
gchar *win_title;
if ((parent = gtk_widget_get_parent (widget))) {
GtkWidget *temp_parent;
while ((temp_parent = gtk_widget_get_parent (parent)))
parent = temp_parent;
}
toplevel = (parent) ? parent : widget;
self->window = (GtkWindow *) gtk_window_new ();
gtk_widget_add_css_class (GTK_WIDGET (self->window), WINDOW_CSS_CLASS_NAME);
provider = gtk_css_provider_new ();
gtk_css_provider_load_from_data (provider,
"." WINDOW_CSS_CLASS_NAME " { background: none; }", -1);
gtk_style_context_add_provider_for_display (
gdk_display_get_default (), GTK_STYLE_PROVIDER (provider),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
g_object_unref (provider);
win_title = g_strdup_printf ("Clapper Sink - GTK %u.%u.%u Window",
gtk_get_major_version (),
gtk_get_minor_version (),
gtk_get_micro_version ());
/* Set some common default size, adding stock headerbar height
* to it in order to display 4:3 aspect video widget */
gtk_window_set_default_size (self->window, 640, 480 + 37);
gtk_window_set_title (self->window, win_title);
gtk_window_set_child (self->window, toplevel);
g_free (win_title);
self->window_destroy_id = g_signal_connect (self->window,
"destroy", G_CALLBACK (window_destroy_cb), self);
}
GST_CLAPPER_SINK_UNLOCK (self);
return TRUE;
}
static gboolean
window_present_on_main_idle (GtkWindow *window)
{
GST_INFO ("Presenting window");
gtk_window_present (window);
return G_SOURCE_REMOVE;
}
static gboolean
gst_clapper_sink_start (GstBaseSink *bsink)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (bsink);
GST_INFO_OBJECT (self, "Start");
if (G_UNLIKELY (!(! !gst_gtk_invoke_on_main ((GThreadFunc) (GCallback)
gst_clapper_sink_start_on_main, self)))) {
GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND,
("GtkWidget could not be created"), (NULL));
return FALSE;
}
return TRUE;
}
static gboolean
gst_clapper_sink_stop_on_main (GstClapperSink *self)
{
GtkWindow *window = NULL;
GST_CLAPPER_SINK_LOCK (self);
if (self->window)
window = g_object_ref (self->window);
GST_CLAPPER_SINK_UNLOCK (self);
if (window) {
gtk_window_destroy (window);
g_object_unref (window);
}
return TRUE;
}
static gboolean
gst_clapper_sink_stop (GstBaseSink *bsink)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (bsink);
gboolean has_window;
GST_INFO_OBJECT (self, "Stop");
GST_CLAPPER_SINK_LOCK (self);
has_window = (self->window != NULL);
GST_CLAPPER_SINK_UNLOCK (self);
if (G_UNLIKELY (has_window)) {
return (! !gst_gtk_invoke_on_main ((GThreadFunc) (GCallback)
gst_clapper_sink_stop_on_main, self));
}
return TRUE;
}
static GstStateChangeReturn
gst_clapper_sink_change_state (GstElement *element, GstStateChange transition)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (element);
GST_DEBUG_OBJECT (self, "Changing state: %s => %s",
gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)),
gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition)));
switch (transition) {
case GST_STATE_CHANGE_PAUSED_TO_READY:
GST_CLAPPER_SINK_LOCK (self);
if (!self->keep_last_frame && self->importer) {
gst_clapper_importer_set_buffer (self->importer, NULL);
gst_clapper_paintable_queue_draw (self->paintable);
}
GST_CLAPPER_SINK_UNLOCK (self);
break;
case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
GST_CLAPPER_SINK_LOCK (self);
if (G_UNLIKELY (self->window && !self->presented_window)) {
g_idle_add_full (G_PRIORITY_DEFAULT,
(GSourceFunc) window_present_on_main_idle,
g_object_ref (self->window), (GDestroyNotify) g_object_unref);
self->presented_window = TRUE;
}
GST_CLAPPER_SINK_UNLOCK (self);
break;
default:
break;
}
return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
}
static void
gst_clapper_sink_get_times (GstBaseSink *bsink, GstBuffer *buffer,
GstClockTime *start, GstClockTime *end)
{
if (!GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
return;
*start = GST_BUFFER_TIMESTAMP (buffer);
if (GST_BUFFER_DURATION_IS_VALID (buffer)) {
*end = *start + GST_BUFFER_DURATION (buffer);
} else {
GstClapperSink *self = GST_CLAPPER_SINK_CAST (bsink);
gint fps_n, fps_d;
GST_CLAPPER_SINK_LOCK (self);
fps_n = GST_VIDEO_INFO_FPS_N (&self->v_info);
fps_d = GST_VIDEO_INFO_FPS_D (&self->v_info);
GST_CLAPPER_SINK_UNLOCK (self);
if (fps_n > 0)
*end = *start + gst_util_uint64_scale_int (GST_SECOND, fps_d, fps_n);
}
}
static GstCaps *
gst_clapper_sink_get_caps (GstBaseSink *bsink, GstCaps *filter)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (bsink);
GstCaps *result, *tmp;
tmp = gst_clapper_importer_loader_make_actual_caps (self->loader);
if (filter) {
GST_DEBUG ("Intersecting with filter caps: %" GST_PTR_FORMAT, filter);
result = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST);
gst_caps_unref (tmp);
} else {
result = tmp;
}
GST_DEBUG ("Returning caps: %" GST_PTR_FORMAT, result);
return result;
}
static gboolean
gst_clapper_sink_set_caps (GstBaseSink *bsink, GstCaps *caps)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (bsink);
GST_INFO_OBJECT (self, "Set caps: %" GST_PTR_FORMAT, caps);
GST_CLAPPER_SINK_LOCK (self);
if (G_UNLIKELY (!self->widget)) {
GST_CLAPPER_SINK_UNLOCK (self);
GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND,
("Output widget was destroyed"), (NULL));
return FALSE;
}
if (!gst_clapper_importer_loader_find_importer_for_caps (self->loader, caps, &self->importer)) {
GST_CLAPPER_SINK_UNLOCK (self);
GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND,
("No importer for given caps found"), (NULL));
return FALSE;
}
gst_clapper_paintable_set_importer (self->paintable, self->importer);
GST_CLAPPER_SINK_UNLOCK (self);
return GST_BASE_SINK_CLASS (parent_class)->set_caps (bsink, caps);
}
static gboolean
gst_clapper_sink_set_info (GstVideoSink *vsink, GstCaps *caps, const GstVideoInfo *info)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (vsink);
gboolean res;
GST_CLAPPER_SINK_LOCK (self);
self->v_info = *info;
GST_DEBUG_OBJECT (self, "Video info changed");
res = gst_clapper_paintable_set_video_info (self->paintable, info);
GST_CLAPPER_SINK_UNLOCK (self);
return res;
}
static GstFlowReturn
gst_clapper_sink_show_frame (GstVideoSink *vsink, GstBuffer *buffer)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (vsink);
GST_TRACE ("Got %" GST_PTR_FORMAT, buffer);
GST_CLAPPER_SINK_LOCK (self);
if (G_UNLIKELY (!self->widget)) {
GST_CLAPPER_SINK_UNLOCK (self);
GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND,
("Output widget was destroyed"), (NULL));
return GST_FLOW_ERROR;
}
gst_clapper_importer_set_buffer (self->importer, buffer);
gst_clapper_paintable_queue_draw (self->paintable);
GST_CLAPPER_SINK_UNLOCK (self);
return GST_FLOW_OK;
}
static void
gst_clapper_sink_init (GstClapperSink *self)
{
GObjectClass *gobject_class;
gobject_class = (GObjectClass *) GST_CLAPPER_SINK_GET_CLASS (self);
/* HACK: install here instead of class init to avoid GStreamer
* plugin scanner GObject type conflicts with older GTK versions */
if (!g_object_class_find_property (gobject_class, "widget")) {
g_object_class_install_property (gobject_class, PROP_WIDGET,
g_param_spec_object ("widget", "GTK Widget",
"The GtkWidget to place in the widget hierarchy",
GTK_TYPE_WIDGET, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
}
self->force_aspect_ratio = DEFAULT_FORCE_ASPECT_RATIO;
self->par_n = DEFAULT_PAR_N;
self->par_d = DEFAULT_PAR_D;
self->keep_last_frame = DEFAULT_KEEP_LAST_FRAME;
g_mutex_init (&self->lock);
gst_video_info_init (&self->v_info);
self->paintable = gst_clapper_paintable_new ();
self->loader = gst_clapper_importer_loader_new ();
}
static void
gst_clapper_sink_dispose (GObject *object)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (object);
GST_CLAPPER_SINK_LOCK (self);
window_clear_no_lock (self);
widget_clear_no_lock (self);
g_clear_object (&self->paintable);
gst_clear_object (&self->importer);
GST_CLAPPER_SINK_UNLOCK (self);
GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
}
static void
gst_clapper_sink_finalize (GObject *object)
{
GstClapperSink *self = GST_CLAPPER_SINK_CAST (object);
GST_TRACE ("Finalize");
gst_clear_object (&self->loader);
g_mutex_clear (&self->lock);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static void
gst_clapper_sink_class_init (GstClapperSinkClass *klass)
{
GstPadTemplate *sink_pad_templ;
GObjectClass *gobject_class = (GObjectClass *) klass;
GstElementClass *gstelement_class = (GstElementClass *) klass;
GstBaseSinkClass *gstbasesink_class = (GstBaseSinkClass *) klass;
GstVideoSinkClass *gstvideosink_class = (GstVideoSinkClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clappersink", 0,
"Clapper Sink");
gobject_class->get_property = gst_clapper_sink_get_property;
gobject_class->set_property = gst_clapper_sink_set_property;
gobject_class->dispose = gst_clapper_sink_dispose;
gobject_class->finalize = gst_clapper_sink_finalize;
g_object_class_install_property (gobject_class, PROP_FORCE_ASPECT_RATIO,
g_param_spec_boolean ("force-aspect-ratio", "Force aspect ratio",
"When enabled, scaling will respect original aspect ratio",
DEFAULT_FORCE_ASPECT_RATIO,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_PIXEL_ASPECT_RATIO,
gst_param_spec_fraction ("pixel-aspect-ratio", "Pixel Aspect Ratio",
"The pixel aspect ratio of the device",
DEFAULT_PAR_N, DEFAULT_PAR_D,
G_MAXINT, 1, 1, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_KEEP_LAST_FRAME,
g_param_spec_boolean ("keep-last-frame", "Keep last frame",
"Keep showing last video frame after playback instead of black screen",
DEFAULT_KEEP_LAST_FRAME,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
gstelement_class->change_state = gst_clapper_sink_change_state;
gstbasesink_class->get_caps = gst_clapper_sink_get_caps;
gstbasesink_class->set_caps = gst_clapper_sink_set_caps;
gstbasesink_class->get_times = gst_clapper_sink_get_times;
gstbasesink_class->propose_allocation = gst_clapper_sink_propose_allocation;
gstbasesink_class->query = gst_clapper_sink_query;
gstbasesink_class->start = gst_clapper_sink_start;
gstbasesink_class->stop = gst_clapper_sink_stop;
gstvideosink_class->set_info = gst_clapper_sink_set_info;
gstvideosink_class->show_frame = gst_clapper_sink_show_frame;
gst_element_class_set_static_metadata (gstelement_class,
"Clapper video sink",
"Sink/Video", "A GTK4 video sink used by Clapper media player",
"Rafał Dzięgiel <rafostar.github@gmail.com>");
sink_pad_templ = gst_clapper_importer_loader_make_sink_pad_template ();
gst_element_class_add_pad_template (gstelement_class, sink_pad_templ);
}
/*
* GstNavigationInterface
*/
static void
gst_clapper_sink_navigation_interface_init (GstNavigationInterface *iface)
{
/* TODO: Port to "send_event_simple" once we depend on GStreamer 1.22 */
iface->send_event = gst_clapper_sink_navigation_send_event;
}

74
lib/gst/plugin/gstclappersink.h vendored Normal file
View File

@@ -0,0 +1,74 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once
#include <gtk/gtk.h>
#include <gst/gst.h>
#include <gst/video/gstvideosink.h>
#include <gst/video/video.h>
#include "gstclapperpaintable.h"
#include "gstclapperimporterloader.h"
#include "gstclapperimporter.h"
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_SINK (gst_clapper_sink_get_type())
G_DECLARE_FINAL_TYPE (GstClapperSink, gst_clapper_sink, GST, CLAPPER_SINK, GstVideoSink)
#define GST_CLAPPER_SINK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CLAPPER_SINK, GstClapperSinkClass))
#define GST_CLAPPER_SINK_CAST(obj) ((GstClapperSink *)(obj))
#define GST_CLAPPER_SINK_GET_LOCK(obj) (&GST_CLAPPER_SINK_CAST(obj)->lock)
#define GST_CLAPPER_SINK_LOCK(obj) g_mutex_lock (GST_CLAPPER_SINK_GET_LOCK(obj))
#define GST_CLAPPER_SINK_UNLOCK(obj) g_mutex_unlock (GST_CLAPPER_SINK_GET_LOCK(obj))
struct _GstClapperSink
{
GstVideoSink parent;
GMutex lock;
GstClapperPaintable *paintable;
GstClapperImporterLoader *loader;
GstClapperImporter *importer;
GstVideoInfo v_info;
GtkWidget *widget;
GtkWindow *window;
gboolean presented_window;
/* Properties */
gboolean force_aspect_ratio;
gint par_n, par_d;
gboolean keep_last_frame;
/* Position coords */
gdouble last_pos_x;
gdouble last_pos_y;
gulong widget_destroy_id;
gulong window_destroy_id;
};
GST_ELEMENT_REGISTER_DECLARE (clappersink);
G_END_DECLS

37
lib/gst/plugin/gstgdkformats.h vendored Normal file
View File

@@ -0,0 +1,37 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include <glib.h>
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
#define GST_GDK_MEMORY_ENDIAN_FORMATS "RGBA64_LE"
#define GST_GDK_GL_TEXTURE_ENDIAN_FORMATS "RGBA64_LE"
#elif G_BYTE_ORDER == G_BIG_ENDIAN
#define GST_GDK_MEMORY_ENDIAN_FORMATS "RGBA64_BE"
#define GST_GDK_GL_TEXTURE_ENDIAN_FORMATS "RGBA64_BE"
#endif
#define GST_GDK_MEMORY_FORMATS \
GST_GDK_MEMORY_ENDIAN_FORMATS ", " \
"ABGR, BGRA, ARGB, RGBA, BGRx, RGBx, BGR, RGB"
/* Formats that `GdkGLTexture` supports */
#define GST_GDK_GL_TEXTURE_FORMATS \
GST_GDK_GL_TEXTURE_ENDIAN_FORMATS ", " \
"RGBA, RGBx, RGB"

142
lib/gst/plugin/gstgtkutils.c vendored Normal file
View File

@@ -0,0 +1,142 @@
/*
* GStreamer
* Copyright (C) 2015 Matthew Waters <matthew@centricular.com>
* Copyright (C) 2015 Thibault Saunier <tsaunier@gnome.org>
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "gstgtkutils.h"
#define _IS_FRAME_PREMULTIPLIED(f) (GST_VIDEO_INFO_FLAG_IS_SET (&(f)->info, GST_VIDEO_FLAG_PREMULTIPLIED_ALPHA))
struct invoke_context
{
GThreadFunc func;
gpointer data;
GMutex lock;
GCond cond;
gboolean fired;
gpointer res;
};
static gboolean
gst_gtk_invoke_func (struct invoke_context *info)
{
g_mutex_lock (&info->lock);
info->res = info->func (info->data);
info->fired = TRUE;
g_cond_signal (&info->cond);
g_mutex_unlock (&info->lock);
return G_SOURCE_REMOVE;
}
gpointer
gst_gtk_invoke_on_main (GThreadFunc func, gpointer data)
{
GMainContext *main_context = g_main_context_default ();
struct invoke_context info;
g_mutex_init (&info.lock);
g_cond_init (&info.cond);
info.fired = FALSE;
info.func = func;
info.data = data;
g_main_context_invoke (main_context, (GSourceFunc) gst_gtk_invoke_func,
&info);
g_mutex_lock (&info.lock);
while (!info.fired)
g_cond_wait (&info.cond, &info.lock);
g_mutex_unlock (&info.lock);
g_mutex_clear (&info.lock);
g_cond_clear (&info.cond);
return info.res;
}
static GdkMemoryFormat
gst_gdk_memory_format_from_frame (GstVideoFrame *frame)
{
switch (GST_VIDEO_FRAME_FORMAT (frame)) {
case GST_VIDEO_FORMAT_RGBA64_LE:
case GST_VIDEO_FORMAT_RGBA64_BE:
return (_IS_FRAME_PREMULTIPLIED (frame))
? GDK_MEMORY_R16G16B16A16_PREMULTIPLIED
: GDK_MEMORY_R16G16B16A16;
case GST_VIDEO_FORMAT_RGBA:
return (_IS_FRAME_PREMULTIPLIED (frame))
? GDK_MEMORY_R8G8B8A8_PREMULTIPLIED
: GDK_MEMORY_R8G8B8A8;
case GST_VIDEO_FORMAT_BGRA:
return (_IS_FRAME_PREMULTIPLIED (frame))
? GDK_MEMORY_B8G8R8A8_PREMULTIPLIED
: GDK_MEMORY_B8G8R8A8;
case GST_VIDEO_FORMAT_ARGB:
return (_IS_FRAME_PREMULTIPLIED (frame))
? GDK_MEMORY_A8R8G8B8_PREMULTIPLIED
: GDK_MEMORY_A8R8G8B8;
case GST_VIDEO_FORMAT_ABGR:
/* GTK is missing premultiplied ABGR support */
return GDK_MEMORY_A8B8G8R8;
case GST_VIDEO_FORMAT_RGBx:
return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED;
case GST_VIDEO_FORMAT_BGRx:
return GDK_MEMORY_B8G8R8A8_PREMULTIPLIED;
case GST_VIDEO_FORMAT_RGB:
return GDK_MEMORY_R8G8B8;
case GST_VIDEO_FORMAT_BGR:
return GDK_MEMORY_B8G8R8;
default:
break;
}
/* This should never happen as long as above switch statement
* is updated when new formats are added to caps */
g_assert_not_reached ();
/* Fallback format */
return GDK_MEMORY_R8G8B8A8_PREMULTIPLIED;
}
GdkTexture *
gst_video_frame_into_gdk_texture (GstVideoFrame *frame)
{
GdkTexture *texture;
GBytes *bytes;
bytes = g_bytes_new_with_free_func (
GST_VIDEO_FRAME_PLANE_DATA (frame, 0),
GST_VIDEO_FRAME_HEIGHT (frame) * GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0),
(GDestroyNotify) gst_buffer_unref,
gst_buffer_ref (frame->buffer));
texture = gdk_memory_texture_new (
GST_VIDEO_FRAME_WIDTH (frame),
GST_VIDEO_FRAME_HEIGHT (frame),
gst_gdk_memory_format_from_frame (frame),
bytes,
GST_VIDEO_FRAME_PLANE_STRIDE (frame, 0));
g_bytes_unref (bytes);
return texture;
}

35
lib/gst/plugin/gstgtkutils.h vendored Normal file
View File

@@ -0,0 +1,35 @@
/*
* GStreamer
* Copyright (C) 2015 Matthew Waters <matthew@centricular.com>
* Copyright (C) 2015 Thibault Saunier <tsaunier@gnome.org>
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once
#include <glib.h>
#include <gtk/gtk.h>
#include <gst/video/video.h>
G_BEGIN_DECLS
gpointer gst_gtk_invoke_on_main (GThreadFunc func, gpointer data);
GdkTexture * gst_video_frame_into_gdk_texture (GstVideoFrame *frame);
G_END_DECLS

43
lib/gst/plugin/gstplugin.c vendored Normal file
View File

@@ -0,0 +1,43 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gmodule.h>
#include "gstclappersink.h"
static gboolean
plugin_init (GstPlugin *plugin)
{
if (!g_module_supported ())
return FALSE;
gst_plugin_add_dependency_simple (plugin,
NULL, CLAPPER_SINK_IMPORTER_PATH, NULL,
GST_PLUGIN_DEPENDENCY_FLAG_NONE);
return GST_ELEMENT_REGISTER (clappersink, plugin);
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR,
clapper, "Clapper elements", plugin_init, VERSION, "LGPL",
GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)

View File

@@ -0,0 +1,674 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "gstclapperglbaseimporter.h"
#include "gst/plugin/gstgdkformats.h"
#include "gst/plugin/gstgtkutils.h"
#include <gst/gl/gstglfuncs.h>
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WAYLAND
#include <gdk/wayland/gdkwayland.h>
#include <gst/gl/wayland/gstgldisplay_wayland.h>
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11
#include <gdk/x11/gdkx.h>
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_GLX
#include <gst/gl/x11/gstgldisplay_x11.h>
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_EGL || GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32_EGL
#include <gst/gl/egl/gstgldisplay_egl.h>
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32
#include <gdk/win32/gdkwin32.h>
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_MACOS
#include <gdk/macos/gdkmacos.h>
#endif
#define GST_CAT_DEFAULT gst_clapper_gl_base_importer_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_gl_base_importer_parent_class
G_DEFINE_TYPE (GstClapperGLBaseImporter, gst_clapper_gl_base_importer, GST_TYPE_CLAPPER_IMPORTER);
static GstGLContext *
wrap_current_gl (GstGLDisplay *display, GdkGLAPI gdk_gl_api, GstGLPlatform platform)
{
GstGLAPI gst_gl_api = GST_GL_API_NONE;
switch (gdk_gl_api) {
case GDK_GL_API_GL:
gst_gl_api = GST_GL_API_OPENGL | GST_GL_API_OPENGL3;
break;
case GDK_GL_API_GLES:
gst_gl_api = GST_GL_API_GLES2;
break;
default:
g_assert_not_reached ();
break;
}
if (gst_gl_api != GST_GL_API_NONE) {
guintptr gl_handle;
gst_gl_display_filter_gl_api (display, gst_gl_api);
if ((gl_handle = gst_gl_context_get_current_gl_context (platform)))
return gst_gl_context_new_wrapped (display, gl_handle, platform, gst_gl_api);
}
return NULL;
}
static gboolean
retrieve_gl_context_on_main (GstClapperGLBaseImporter *self)
{
GstClapperGLBaseImporterClass *gl_bi_class = GST_CLAPPER_GL_BASE_IMPORTER_GET_CLASS (self);
GdkDisplay *gdk_display;
GdkGLContext *gdk_context;
GError *error = NULL;
GdkGLAPI gdk_gl_api;
GstGLPlatform platform = GST_GL_PLATFORM_NONE;
gint gl_major = 0, gl_minor = 0;
if (!gtk_init_check ()) {
GST_ERROR_OBJECT (self, "Could not ensure GTK initialization");
return FALSE;
}
/* Make sure we are clean here, otherwise data sharing
* between GL-based importers may lead to leaks */
gst_clear_object (&self->wrapped_context);
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_display);
gdk_display = gdk_display_get_default ();
if (G_UNLIKELY (!gdk_display)) {
GST_ERROR_OBJECT (self, "Could not retrieve Gdk display");
return FALSE;
}
if (!(gdk_context = gdk_display_create_gl_context (gdk_display, &error))) {
GST_ERROR_OBJECT (self, "Error creating Gdk GL context: %s",
error ? error->message : "No error set by Gdk");
g_clear_error (&error);
return FALSE;
}
if (!gl_bi_class->gdk_context_realize (self, gdk_context)) {
GST_ERROR_OBJECT (self, "Could not realize Gdk context: %" GST_PTR_FORMAT,
gdk_context);
g_object_unref (gdk_context);
return FALSE;
}
gdk_gl_api = gdk_gl_context_get_api (gdk_context);
GST_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
self->gdk_context = gdk_context;
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WAYLAND
if (GDK_IS_WAYLAND_DISPLAY (gdk_display)) {
struct wl_display *wayland_display =
gdk_wayland_display_get_wl_display (gdk_display);
self->gst_display = (GstGLDisplay *)
gst_gl_display_wayland_new_with_display (wayland_display);
}
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11
if (GDK_IS_X11_DISPLAY (gdk_display)) {
gpointer display_ptr;
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_EGL
display_ptr = gdk_x11_display_get_egl_display (gdk_display);
if (display_ptr) {
self->gst_display = (GstGLDisplay *)
gst_gl_display_egl_new_with_egl_display (display_ptr);
}
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_GLX
if (!self->gst_display) {
display_ptr = gdk_x11_display_get_xdisplay (gdk_display);
self->gst_display = (GstGLDisplay *)
gst_gl_display_x11_new_with_display (display_ptr);
}
}
#endif
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32
if (GDK_IS_WIN32_DISPLAY (gdk_display)) {
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32_EGL
gpointer display_ptr = gdk_win32_display_get_egl_display (gdk_display);
if (display_ptr) {
self->gst_display = (GstGLDisplay *)
gst_gl_display_egl_new_with_egl_display (display_ptr);
}
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32_WGL
if (!self->gst_display) {
self->gst_display =
gst_gl_display_new_with_type (GST_GL_DISPLAY_TYPE_WIN32);
}
}
#endif
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_MACOS
if (GDK_IS_MACOS_DISPLAY (gdk_display)) {
self->gst_display =
gst_gl_display_new_with_type (GST_GL_DISPLAY_TYPE_COCOA);
}
#endif
/* Fallback to generic display */
if (G_UNLIKELY (!self->gst_display)) {
GST_WARNING_OBJECT (self, "Unknown Gdk display!");
self->gst_display = gst_gl_display_new ();
}
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WAYLAND
if (GST_IS_GL_DISPLAY_WAYLAND (self->gst_display)) {
platform = GST_GL_PLATFORM_EGL;
GST_INFO_OBJECT (self, "Using EGL on Wayland");
goto have_display;
}
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_EGL
if (GST_IS_GL_DISPLAY_EGL (self->gst_display)
&& GDK_IS_X11_DISPLAY (gdk_display)) {
platform = GST_GL_PLATFORM_EGL;
GST_INFO_OBJECT (self, "Using EGL on x11");
goto have_display;
}
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_GLX
if (GST_IS_GL_DISPLAY_X11 (self->gst_display)) {
platform = GST_GL_PLATFORM_GLX;
GST_INFO_OBJECT (self, "Using GLX on x11");
goto have_display;
}
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32_EGL
if (GST_IS_GL_DISPLAY_EGL (self->gst_display)
&& GDK_IS_WIN32_DISPLAY (gdk_display)) {
platform = GST_GL_PLATFORM_EGL;
GST_INFO_OBJECT (self, "Using EGL on Win32");
goto have_display;
}
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32_WGL
if (gst_gl_display_get_handle_type (self->gst_display) == GST_GL_DISPLAY_TYPE_WIN32) {
platform = GST_GL_PLATFORM_WGL;
GST_INFO_OBJECT (self, "Using WGL on Win32");
goto have_display;
}
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_MACOS
if (gst_gl_display_get_handle_type (self->gst_display) == GST_GL_DISPLAY_TYPE_COCOA) {
platform = GST_GL_PLATFORM_CGL;
GST_INFO_OBJECT (self, "Using CGL on macOS");
goto have_display;
}
#endif
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_display);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
GST_ERROR_OBJECT (self, "Unsupported GL platform");
return FALSE;
have_display:
gdk_gl_context_make_current (self->gdk_context);
self->wrapped_context = wrap_current_gl (self->gst_display, gdk_gl_api, platform);
if (!self->wrapped_context) {
GST_ERROR ("Could not retrieve Gdk OpenGL context");
gdk_gl_context_clear_current ();
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_display);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
return FALSE;
}
GST_INFO ("Retrieved Gdk OpenGL context %" GST_PTR_FORMAT, self->wrapped_context);
gst_gl_context_activate (self->wrapped_context, TRUE);
if (!gst_gl_context_fill_info (self->wrapped_context, &error)) {
GST_ERROR ("Failed to fill Gdk context info: %s", error->message);
g_clear_error (&error);
gst_gl_context_activate (self->wrapped_context, FALSE);
gst_clear_object (&self->wrapped_context);
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_display);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
return FALSE;
}
gst_gl_context_get_gl_version (self->wrapped_context, &gl_major, &gl_minor);
GST_INFO ("Using OpenGL%s %i.%i", (gdk_gl_api == GDK_GL_API_GLES) ? " ES" : "",
gl_major, gl_minor);
/* Deactivate in both places */
gst_gl_context_activate (self->wrapped_context, FALSE);
gdk_gl_context_clear_current ();
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
return TRUE;
}
static gboolean
retrieve_gst_context (GstClapperGLBaseImporter *self)
{
GstGLDisplay *gst_display = NULL;
GstGLContext *gst_context = NULL;
GError *error = NULL;
GST_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
gst_display = gst_object_ref (self->gst_display);
/* GstGLDisplay operations require display object lock to be held */
GST_OBJECT_LOCK (gst_display);
if (!self->gst_context) {
GST_TRACE_OBJECT (self, "Creating new GstGLContext");
if (!gst_gl_display_create_context (gst_display, self->wrapped_context,
&self->gst_context, &error)) {
GST_WARNING ("Could not create OpenGL context: %s",
error ? error->message : "Unknown");
g_clear_error (&error);
GST_OBJECT_UNLOCK (gst_display);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
return FALSE;
}
}
gst_context = gst_object_ref (self->gst_context);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
gst_gl_display_add_context (gst_display, gst_context);
GST_OBJECT_UNLOCK (gst_display);
gst_object_unref (gst_display);
gst_object_unref (gst_context);
return TRUE;
}
static gboolean
gst_clapper_gl_base_importer_prepare (GstClapperImporter *importer)
{
GstClapperGLBaseImporter *self = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
gboolean need_invoke;
GST_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
need_invoke = (!self->gdk_context || !self->gst_display || !self->wrapped_context);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
if (need_invoke) {
if (!(! !gst_gtk_invoke_on_main ((GThreadFunc) (GCallback)
retrieve_gl_context_on_main, self)))
return FALSE;
}
if (!retrieve_gst_context (self))
return FALSE;
if (!GST_CLAPPER_IMPORTER_CLASS (parent_class)->prepare)
return TRUE;
return GST_CLAPPER_IMPORTER_CLASS (parent_class)->prepare (importer);
}
static void
gst_clapper_gl_base_importer_share_data (GstClapperImporter *importer, GstClapperImporter *dest_importer)
{
GstClapperGLBaseImporter *self = GST_CLAPPER_GL_BASE_IMPORTER (importer);
if (GST_IS_CLAPPER_GL_BASE_IMPORTER (dest_importer)) {
GstClapperGLBaseImporter *dest = GST_CLAPPER_GL_BASE_IMPORTER (dest_importer);
GST_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
GST_CLAPPER_GL_BASE_IMPORTER_LOCK (dest);
/* Successfully prepared GL importer should have all three */
if (self->gdk_context && self->gst_display && self->wrapped_context) {
g_clear_object (&dest->gdk_context);
dest->gdk_context = g_object_ref (self->gdk_context);
gst_clear_object (&dest->gst_display);
dest->gst_display = gst_object_ref (self->gst_display);
gst_clear_object (&dest->wrapped_context);
dest->wrapped_context = gst_object_ref (self->wrapped_context);
}
/* This context is not required, we can create it ourselves
* using gst_display and wrapped_context */
if (self->gst_context) {
gst_clear_object (&dest->gst_context);
dest->gst_context = gst_object_ref (self->gst_context);
}
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (dest);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
}
if (GST_CLAPPER_IMPORTER_CLASS (parent_class)->share_data)
GST_CLAPPER_IMPORTER_CLASS (parent_class)->share_data (importer, dest_importer);
}
static gboolean
gst_clapper_gl_base_importer_handle_context_query (GstClapperImporter *importer,
GstBaseSink *bsink, GstQuery *query)
{
GstClapperGLBaseImporter *self = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
gboolean res;
GST_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
res = gst_gl_handle_context_query (GST_ELEMENT_CAST (bsink), query,
self->gst_display, self->gst_context, self->wrapped_context);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
return res;
}
static GstBufferPool *
gst_clapper_gl_base_importer_create_pool (GstClapperImporter *importer, GstStructure **config)
{
GstClapperGLBaseImporter *self = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
GstBufferPool *pool;
GST_DEBUG_OBJECT (self, "Creating new GL buffer pool");
GST_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
pool = gst_gl_buffer_pool_new (self->gst_context);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
*config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_add_option (*config, GST_BUFFER_POOL_OPTION_VIDEO_META);
gst_buffer_pool_config_add_option (*config, GST_BUFFER_POOL_OPTION_GL_SYNC_META);
return pool;
}
static void
gst_clapper_gl_base_importer_add_allocation_metas (GstClapperImporter *importer, GstQuery *query)
{
GstClapperGLBaseImporter *self = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
gst_query_add_allocation_meta (query, GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL);
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
GST_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
if (self->gst_context->gl_vtable->FenceSync)
gst_query_add_allocation_meta (query, GST_GL_SYNC_META_API_TYPE, NULL);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
}
static gboolean
_realize_gdk_context_with_api (GdkGLContext *gdk_context, GdkGLAPI api, gint maj, gint min)
{
GError *error = NULL;
gboolean success;
gdk_gl_context_set_allowed_apis (gdk_context, api);
gdk_gl_context_set_required_version (gdk_context, maj, min);
GST_DEBUG ("Trying to realize %s context, min ver: %i.%i",
(api & GDK_GL_API_GL) ? "GL" : "GLES", maj, min);
if (!(success = gdk_gl_context_realize (gdk_context, &error))) {
GST_DEBUG ("Could not realize Gdk context with %s: %s",
(api & GDK_GL_API_GL) ? "GL" : "GLES", error->message);
g_clear_error (&error);
}
return success;
}
static gboolean
gst_clapper_gl_base_importer_gdk_context_realize (GstClapperGLBaseImporter *self, GdkGLContext *gdk_context)
{
GdkGLAPI preferred_api = GDK_GL_API_GL;
GdkDisplay *gdk_display;
const gchar *gl_env;
gboolean success;
GST_DEBUG_OBJECT (self, "Realizing GdkGLContext with default implementation");
/* Use single "GST_GL_API" env to also influence Gdk GL selection */
if ((gl_env = g_getenv ("GST_GL_API"))) {
preferred_api = (g_str_has_prefix (gl_env, "gles"))
? GDK_GL_API_GLES
: g_str_has_prefix (gl_env, "opengl")
? GDK_GL_API_GL
: GDK_GL_API_GL | GDK_GL_API_GLES;
/* With requested by user API, we either use it or give up */
return _realize_gdk_context_with_api (gdk_context, preferred_api, 0, 0);
}
gdk_display = gdk_gl_context_get_display (gdk_context);
GST_DEBUG_OBJECT (self, "Auto selecting GL API for display: %s",
gdk_display_get_name (gdk_display));
/* Apple decoder uses rectangle texture-target, which GLES does not support.
* For Linux we prefer EGL + GLES in order to get direct HW colorspace conversion.
* Windows will try EGL + GLES setup first and auto fallback to WGL. */
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WAYLAND
if (GDK_IS_WAYLAND_DISPLAY (gdk_display))
preferred_api = GDK_GL_API_GLES;
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_EGL
if (GDK_IS_X11_DISPLAY (gdk_display) && gdk_x11_display_get_egl_display (gdk_display))
preferred_api = GDK_GL_API_GLES;
#endif
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32_EGL
if (GDK_IS_WIN32_DISPLAY (gdk_display) && gdk_win32_display_get_egl_display (gdk_display))
preferred_api = GDK_GL_API_GLES;
#endif
/* FIXME: Remove once GStreamer can handle DRM modifiers. This tries to avoid
* "scrambled" image on Linux with Intel GPUs that are mostly used together with
* x86 CPUs at the expense of using slightly slower non-direct DMABuf import.
* See: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1236 */
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WAYLAND || GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_EGL
#if !defined(HAVE_GST_PATCHES) && (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64))
preferred_api = GDK_GL_API_GL;
#endif
#endif
/* Continue with GLES only if it should have "GL_EXT_texture_norm16"
* extension, as we need it to handle P010_10LE, etc. */
if ((preferred_api == GDK_GL_API_GLES)
&& _realize_gdk_context_with_api (gdk_context, GDK_GL_API_GLES, 3, 1))
return TRUE;
/* If not using GLES 3.1, try with core GL 3.2 that GTK4 defaults to */
if (_realize_gdk_context_with_api (gdk_context, GDK_GL_API_GL, 3, 2))
return TRUE;
/* Try with what we normally prefer first, otherwise use fallback */
if (!(success = _realize_gdk_context_with_api (gdk_context, preferred_api, 0, 0))) {
GdkGLAPI fallback_api;
fallback_api = (GDK_GL_API_GL | GDK_GL_API_GLES);
fallback_api &= ~preferred_api;
success = _realize_gdk_context_with_api (gdk_context, fallback_api, 0, 0);
}
return success;
}
static void
gst_clapper_gl_base_importer_init (GstClapperGLBaseImporter *self)
{
g_mutex_init (&self->lock);
}
static void
gst_clapper_gl_base_importer_finalize (GObject *object)
{
GstClapperGLBaseImporter *self = GST_CLAPPER_GL_BASE_IMPORTER_CAST (object);
g_clear_object (&self->gdk_context);
gst_clear_object (&self->gst_display);
gst_clear_object (&self->wrapped_context);
gst_clear_object (&self->gst_context);
g_mutex_clear (&self->lock);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static void
gst_clapper_gl_base_importer_class_init (GstClapperGLBaseImporterClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GstClapperImporterClass *importer_class = (GstClapperImporterClass *) klass;
GstClapperGLBaseImporterClass *gl_bi_class = (GstClapperGLBaseImporterClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperglbaseimporter", 0,
"Clapper GL Base Importer");
gobject_class->finalize = gst_clapper_gl_base_importer_finalize;
importer_class->prepare = gst_clapper_gl_base_importer_prepare;
importer_class->share_data = gst_clapper_gl_base_importer_share_data;
importer_class->handle_context_query = gst_clapper_gl_base_importer_handle_context_query;
importer_class->create_pool = gst_clapper_gl_base_importer_create_pool;
importer_class->add_allocation_metas = gst_clapper_gl_base_importer_add_allocation_metas;
gl_bi_class->gdk_context_realize = gst_clapper_gl_base_importer_gdk_context_realize;
}
GstCaps *
gst_clapper_gl_base_importer_make_supported_gdk_gl_caps (void)
{
GstCaps *caps, *tmp;
tmp = gst_caps_from_string (
GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
"{ " GST_GDK_GL_TEXTURE_FORMATS " }") ", "
"texture-target = (string) { " GST_GL_TEXTURE_TARGET_2D_STR " }");
caps = gst_caps_copy (tmp);
gst_caps_set_features_simple (caps, gst_caps_features_new (
GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION, NULL));
gst_caps_append (caps, tmp);
return caps;
}
GStrv
gst_clapper_gl_base_importer_make_gl_context_types (void)
{
GStrv context_types;
GStrvBuilder *builder = g_strv_builder_new ();
g_strv_builder_add (builder, GST_GL_DISPLAY_CONTEXT_TYPE);
g_strv_builder_add (builder, "gst.gl.app_context");
g_strv_builder_add (builder, "gst.gl.local_context");
context_types = g_strv_builder_end (builder);
g_strv_builder_unref (builder);
return context_types;
}
GdkTexture *
gst_clapper_gl_base_importer_make_gl_texture (GstClapperGLBaseImporter *self,
GstBuffer *buffer, GstVideoInfo *v_info)
{
GdkTexture *texture;
GstGLSyncMeta *sync_meta;
GstVideoFrame frame;
if (G_UNLIKELY (!gst_video_frame_map (&frame, v_info, buffer, GST_MAP_READ | GST_MAP_GL))) {
GST_ERROR_OBJECT (self, "Could not map input buffer for reading");
return NULL;
}
GST_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
/* Must have context active here for both sync meta
* and Gdk texture format auto-detection to work */
gdk_gl_context_make_current (self->gdk_context);
gst_gl_context_activate (self->wrapped_context, TRUE);
sync_meta = gst_buffer_get_gl_sync_meta (buffer);
/* Wait for all previous OpenGL commands to complete,
* before we start using the input texture */
if (sync_meta) {
gst_gl_sync_meta_set_sync_point (sync_meta, self->gst_context);
gst_gl_sync_meta_wait (sync_meta, self->wrapped_context);
}
texture = gdk_gl_texture_new (
self->gdk_context,
*(guint *) GST_VIDEO_FRAME_PLANE_DATA (&frame, 0),
GST_VIDEO_FRAME_WIDTH (&frame),
GST_VIDEO_FRAME_HEIGHT (&frame),
(GDestroyNotify) gst_buffer_unref,
gst_buffer_ref (buffer));
gst_gl_context_activate (self->wrapped_context, FALSE);
gdk_gl_context_clear_current ();
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
gst_video_frame_unmap (&frame);
return texture;
}

View File

@@ -0,0 +1,85 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once
#include <gst/gl/gl.h>
#include "gst/plugin/gstclapperimporter.h"
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_GL_BASE_IMPORTER (gst_clapper_gl_base_importer_get_type())
#define GST_IS_CLAPPER_GL_BASE_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_CLAPPER_GL_BASE_IMPORTER))
#define GST_IS_CLAPPER_GL_BASE_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_CLAPPER_GL_BASE_IMPORTER))
#define GST_CLAPPER_GL_BASE_IMPORTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_CLAPPER_GL_BASE_IMPORTER, GstClapperGLBaseImporterClass))
#define GST_CLAPPER_GL_BASE_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_CLAPPER_GL_BASE_IMPORTER, GstClapperGLBaseImporter))
#define GST_CLAPPER_GL_BASE_IMPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_CLAPPER_GL_BASE_IMPORTER, GstClapperGLBaseImporterClass))
#define GST_CLAPPER_GL_BASE_IMPORTER_CAST(obj) ((GstClapperGLBaseImporter *)(obj))
#define GST_CLAPPER_GL_BASE_IMPORTER_GET_LOCK(obj) (&GST_CLAPPER_GL_BASE_IMPORTER_CAST(obj)->lock)
#define GST_CLAPPER_GL_BASE_IMPORTER_LOCK(obj) g_mutex_lock (GST_CLAPPER_GL_BASE_IMPORTER_GET_LOCK(obj))
#define GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK(obj) g_mutex_unlock (GST_CLAPPER_GL_BASE_IMPORTER_GET_LOCK(obj))
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WAYLAND (GST_GL_HAVE_WINDOW_WAYLAND && defined (GDK_WINDOWING_WAYLAND))
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11 (GST_GL_HAVE_WINDOW_X11 && defined (GDK_WINDOWING_X11))
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_GLX (GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11 && GST_GL_HAVE_PLATFORM_GLX)
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_EGL (GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11 && GST_GL_HAVE_PLATFORM_EGL)
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32 (GST_GL_HAVE_WINDOW_WIN32 && defined (GDK_WINDOWING_WIN32))
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32_WGL (GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32 && GST_GL_HAVE_PLATFORM_WGL)
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32_EGL (GST_CLAPPER_GL_BASE_IMPORTER_HAVE_WIN32 && GST_GL_HAVE_PLATFORM_EGL)
#define GST_CLAPPER_GL_BASE_IMPORTER_HAVE_MACOS (GST_GL_HAVE_WINDOW_COCOA && defined (GDK_WINDOWING_MACOS) && GST_GL_HAVE_PLATFORM_CGL)
typedef struct _GstClapperGLBaseImporter GstClapperGLBaseImporter;
typedef struct _GstClapperGLBaseImporterClass GstClapperGLBaseImporterClass;
#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC (GstClapperGLBaseImporter, gst_object_unref)
#endif
struct _GstClapperGLBaseImporter
{
GstClapperImporter parent;
GMutex lock;
GdkGLContext *gdk_context;
GstGLDisplay *gst_display;
GstGLContext *wrapped_context;
GstGLContext *gst_context;
};
struct _GstClapperGLBaseImporterClass
{
GstClapperImporterClass parent_class;
gboolean (* gdk_context_realize) (GstClapperGLBaseImporter *gl_bi,
GdkGLContext *gdk_context);
};
GType gst_clapper_gl_base_importer_get_type (void);
GstCaps * gst_clapper_gl_base_importer_make_supported_gdk_gl_caps (void);
GStrv gst_clapper_gl_base_importer_make_gl_context_types (void);
GdkTexture * gst_clapper_gl_base_importer_make_gl_texture (GstClapperGLBaseImporter *self, GstBuffer *buffer, GstVideoInfo *v_info);
G_END_DECLS

View File

@@ -0,0 +1,70 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "gstclapperglimporter.h"
#define GST_CAT_DEFAULT gst_clapper_gl_importer_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_gl_importer_parent_class
GST_CLAPPER_IMPORTER_DEFINE (GstClapperGLImporter, gst_clapper_gl_importer, GST_TYPE_CLAPPER_GL_BASE_IMPORTER);
static GdkTexture *
gst_clapper_gl_importer_generate_texture (GstClapperImporter *importer,
GstBuffer *buffer, GstVideoInfo *v_info)
{
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
return gst_clapper_gl_base_importer_make_gl_texture (gl_bi, buffer, v_info);
}
static void
gst_clapper_gl_importer_init (GstClapperGLImporter *self)
{
}
static void
gst_clapper_gl_importer_class_init (GstClapperGLImporterClass *klass)
{
GstClapperImporterClass *importer_class = (GstClapperImporterClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperglimporter", 0,
"Clapper GL Importer");
importer_class->generate_texture = gst_clapper_gl_importer_generate_texture;
}
GstClapperImporter *
make_importer (void)
{
return g_object_new (GST_TYPE_CLAPPER_GL_IMPORTER, NULL);
}
GstCaps *
make_caps (gboolean is_template, GstRank *rank, GStrv *context_types)
{
*rank = GST_RANK_SECONDARY;
*context_types = gst_clapper_gl_base_importer_make_gl_context_types ();
return gst_clapper_gl_base_importer_make_supported_gdk_gl_caps ();
}

View File

@@ -0,0 +1,36 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once
#include "gstclapperglbaseimporter.h"
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_GL_IMPORTER (gst_clapper_gl_importer_get_type())
G_DECLARE_FINAL_TYPE (GstClapperGLImporter, gst_clapper_gl_importer, GST, CLAPPER_GL_IMPORTER, GstClapperGLBaseImporter)
#define GST_CLAPPER_GL_IMPORTER_CAST(obj) ((GstClapperGLImporter *)(obj))
struct _GstClapperGLImporter
{
GstClapperGLBaseImporter parent;
};
G_END_DECLS

View File

@@ -0,0 +1,312 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "gstclappergluploader.h"
#include "gst/plugin/gstgtkutils.h"
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11
#include <gdk/x11/gdkx.h>
#endif
#define GST_CAT_DEFAULT gst_clapper_gl_uploader_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_gl_uploader_parent_class
GST_CLAPPER_IMPORTER_DEFINE (GstClapperGLUploader, gst_clapper_gl_uploader, GST_TYPE_CLAPPER_GL_BASE_IMPORTER);
static void
_update_elements_caps_locked (GstClapperGLUploader *self, GstCaps *upload_sink_caps)
{
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (self);
GstCaps *upload_src_caps, *color_sink_caps, *color_src_caps, *gdk_sink_caps;
GST_INFO_OBJECT (self, "Input caps: %" GST_PTR_FORMAT, upload_sink_caps);
upload_src_caps = gst_gl_upload_transform_caps (self->upload, gl_bi->gst_context,
GST_PAD_SINK, upload_sink_caps, NULL);
upload_src_caps = gst_caps_fixate (upload_src_caps);
GST_INFO_OBJECT (self, "GLUpload caps: %" GST_PTR_FORMAT, upload_src_caps);
gst_gl_upload_set_caps (self->upload, upload_sink_caps, upload_src_caps);
gdk_sink_caps = gst_clapper_gl_base_importer_make_supported_gdk_gl_caps ();
color_sink_caps = gst_gl_color_convert_transform_caps (gl_bi->gst_context,
GST_PAD_SRC, upload_src_caps, gdk_sink_caps);
gst_caps_unref (gdk_sink_caps);
/* Second caps arg is transfer-full */
color_src_caps = gst_gl_color_convert_fixate_caps (gl_bi->gst_context,
GST_PAD_SINK, upload_src_caps, color_sink_caps);
GST_INFO_OBJECT (self, "GLColorConvert caps: %" GST_PTR_FORMAT, color_src_caps);
gst_gl_color_convert_set_caps (self->color_convert, upload_src_caps, color_src_caps);
self->has_pending_v_info = gst_video_info_from_caps (&self->pending_v_info, color_src_caps);
gst_caps_unref (upload_src_caps);
gst_caps_unref (color_src_caps);
}
static void
gst_clapper_gl_uploader_set_caps (GstClapperImporter *importer, GstCaps *caps)
{
GstClapperGLUploader *self = GST_CLAPPER_GL_UPLOADER_CAST (importer);
GST_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
_update_elements_caps_locked (self, caps);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
}
static void
_uploader_reconfigure_locked (GstClapperGLUploader *self)
{
GstCaps *in_caps = NULL;
GST_DEBUG_OBJECT (self, "Reconfiguring upload");
gst_gl_upload_get_caps (self->upload, &in_caps, NULL);
if (G_LIKELY (in_caps)) {
_update_elements_caps_locked (self, in_caps);
gst_caps_unref (in_caps);
}
}
static gboolean
gst_clapper_gl_uploader_prepare (GstClapperImporter *importer)
{
gboolean res = GST_CLAPPER_IMPORTER_CLASS (parent_class)->prepare (importer);
if (res) {
GstClapperGLUploader *self = GST_CLAPPER_GL_UPLOADER_CAST (importer);
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
GST_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
if (!self->upload)
self->upload = gst_gl_upload_new (gl_bi->gst_context);
if (!self->color_convert)
self->color_convert = gst_gl_color_convert_new (gl_bi->gst_context);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
}
return res;
}
static GstBuffer *
_upload_perform_locked (GstClapperGLUploader *self, GstBuffer *buffer)
{
GstBuffer *upload_buf = NULL;
GstGLUploadReturn ret;
ret = gst_gl_upload_perform_with_buffer (self->upload, buffer, &upload_buf);
if (G_UNLIKELY (ret != GST_GL_UPLOAD_DONE)) {
switch (ret) {
case GST_GL_UPLOAD_RECONFIGURE:
_uploader_reconfigure_locked (self);
/* Retry with the same buffer after reconfiguring */
return _upload_perform_locked (self, buffer);
default:
GST_ERROR_OBJECT (self, "Could not upload input buffer, returned: %i", ret);
break;
}
}
return upload_buf;
}
static GstBufferPool *
gst_clapper_gl_uploader_create_pool (GstClapperImporter *importer, GstStructure **config)
{
/* Since GLUpload API provides a ready to use propose_allocation method,
* we will use it with our query in add_allocation_metas instead of
* making pool here ourselves */
return NULL;
}
static void
gst_clapper_gl_uploader_add_allocation_metas (GstClapperImporter *importer, GstQuery *query)
{
GstClapperGLUploader *self = GST_CLAPPER_GL_UPLOADER_CAST (importer);
GstGLUpload *upload;
GST_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
upload = gst_object_ref (self->upload);
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
gst_gl_upload_propose_allocation (upload, NULL, query);
gst_object_unref (upload);
GST_CLAPPER_IMPORTER_CLASS (parent_class)->add_allocation_metas (importer, query);
}
static GdkTexture *
gst_clapper_gl_uploader_generate_texture (GstClapperImporter *importer,
GstBuffer *buffer, GstVideoInfo *v_info)
{
GstClapperGLUploader *self = GST_CLAPPER_GL_UPLOADER_CAST (importer);
GstClapperGLBaseImporter *gl_bi = GST_CLAPPER_GL_BASE_IMPORTER_CAST (importer);
GstBuffer *upload_buf, *color_buf;
GdkTexture *texture;
/* XXX: We both upload and perform color conversion here, thus we skip
* upload for buffers that are not going to be shown and gain more free
* CPU time to prepare the next one. Improves performance on weak HW. */
GST_LOG_OBJECT (self, "Uploading %" GST_PTR_FORMAT, buffer);
GST_CLAPPER_GL_BASE_IMPORTER_LOCK (self);
upload_buf = _upload_perform_locked (self, buffer);
if (G_UNLIKELY (!upload_buf)) {
GST_ERROR_OBJECT (self, "Could not perform upload on input buffer");
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
return NULL;
}
GST_LOG_OBJECT (self, "Uploaded into %" GST_PTR_FORMAT, upload_buf);
color_buf = gst_gl_color_convert_perform (self->color_convert, upload_buf);
gst_buffer_unref (upload_buf);
/* Use video info associated with converted buffer */
if (self->has_pending_v_info) {
self->v_info = self->pending_v_info;
self->has_pending_v_info = FALSE;
}
GST_CLAPPER_GL_BASE_IMPORTER_UNLOCK (self);
if (G_UNLIKELY (!color_buf)) {
GST_ERROR_OBJECT (self, "Could not perform color conversion on input buffer");
return NULL;
}
GST_LOG_OBJECT (self, "Color converted into %" GST_PTR_FORMAT, color_buf);
texture = gst_clapper_gl_base_importer_make_gl_texture (gl_bi, color_buf, &self->v_info);
gst_buffer_unref (color_buf);
return texture;
}
static void
gst_clapper_gl_uploader_init (GstClapperGLUploader *self)
{
gst_video_info_init (&self->pending_v_info);
gst_video_info_init (&self->v_info);
}
static void
gst_clapper_gl_uploader_finalize (GObject *object)
{
GstClapperGLUploader *self = GST_CLAPPER_GL_UPLOADER_CAST (object);
gst_clear_object (&self->upload);
gst_clear_object (&self->color_convert);
GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}
static void
gst_clapper_gl_uploader_class_init (GstClapperGLUploaderClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GstClapperImporterClass *importer_class = (GstClapperImporterClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clappergluploader", 0,
"Clapper GL Uploader");
gobject_class->finalize = gst_clapper_gl_uploader_finalize;
importer_class->prepare = gst_clapper_gl_uploader_prepare;
importer_class->set_caps = gst_clapper_gl_uploader_set_caps;
importer_class->create_pool = gst_clapper_gl_uploader_create_pool;
importer_class->add_allocation_metas = gst_clapper_gl_uploader_add_allocation_metas;
importer_class->generate_texture = gst_clapper_gl_uploader_generate_texture;
}
GstClapperImporter *
make_importer (void)
{
return g_object_new (GST_TYPE_CLAPPER_GL_UPLOADER, NULL);
}
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_GLX
static gboolean
_filter_glx_caps_cb (GstCapsFeatures *features,
GstStructure *structure, gpointer user_data)
{
return !gst_caps_features_contains (features, "memory:DMABuf");
}
static gboolean
_update_glx_caps_on_main (GstCaps *caps)
{
GdkDisplay *gdk_display;
if (!gtk_init_check ())
return FALSE;
gdk_display = gdk_display_get_default ();
if (G_UNLIKELY (!gdk_display))
return FALSE;
if (GDK_IS_X11_DISPLAY (gdk_display)) {
gboolean using_glx = TRUE;
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_EGL
using_glx = (gdk_x11_display_get_egl_display (gdk_display) == NULL);
#endif
if (using_glx) {
gst_caps_filter_and_map_in_place (caps,
(GstCapsFilterMapFunc) _filter_glx_caps_cb, NULL);
}
}
return TRUE;
}
#endif
GstCaps *
make_caps (gboolean is_template, GstRank *rank, GStrv *context_types)
{
GstCaps *caps = gst_gl_upload_get_input_template_caps ();
#if GST_CLAPPER_GL_BASE_IMPORTER_HAVE_X11_GLX
if (!is_template && !(! !gst_gtk_invoke_on_main ((GThreadFunc) (GCallback)
_update_glx_caps_on_main, caps)))
gst_clear_caps (&caps);
#endif
if (G_UNLIKELY (!caps))
return NULL;
*rank = GST_RANK_MARGINAL + 1;
*context_types = gst_clapper_gl_base_importer_make_gl_context_types ();
return caps;
}

View File

@@ -0,0 +1,42 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once
#include "gstclapperglbaseimporter.h"
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_GL_UPLOADER (gst_clapper_gl_uploader_get_type())
G_DECLARE_FINAL_TYPE (GstClapperGLUploader, gst_clapper_gl_uploader, GST, CLAPPER_GL_UPLOADER, GstClapperGLBaseImporter)
#define GST_CLAPPER_GL_UPLOADER_CAST(obj) ((GstClapperGLUploader *)(obj))
struct _GstClapperGLUploader
{
GstClapperGLBaseImporter parent;
GstGLUpload *upload;
GstGLColorConvert *color_convert;
GstVideoInfo pending_v_info, v_info;
gboolean has_pending_v_info;
};
G_END_DECLS

View File

@@ -0,0 +1,111 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "gstclapperrawimporter.h"
#include "gst/plugin/gstgtkutils.h"
#include "gst/plugin/gstgdkformats.h"
#define GST_CAT_DEFAULT gst_clapper_raw_importer_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
#define parent_class gst_clapper_raw_importer_parent_class
GST_CLAPPER_IMPORTER_DEFINE (GstClapperRawImporter, gst_clapper_raw_importer, GST_TYPE_CLAPPER_IMPORTER);
static GstBufferPool *
gst_clapper_raw_importer_create_pool (GstClapperImporter *importer, GstStructure **config)
{
GstClapperRawImporter *self = GST_CLAPPER_RAW_IMPORTER_CAST (importer);
GstBufferPool *pool;
GST_DEBUG_OBJECT (self, "Creating new buffer pool");
pool = gst_video_buffer_pool_new ();
*config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_add_option (*config, GST_BUFFER_POOL_OPTION_VIDEO_META);
return pool;
}
static void
gst_clapper_raw_importer_add_allocation_metas (GstClapperImporter *importer, GstQuery *query)
{
gst_query_add_allocation_meta (query, GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL);
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
}
static GdkTexture *
gst_clapper_raw_importer_generate_texture (GstClapperImporter *importer,
GstBuffer *buffer, GstVideoInfo *v_info)
{
GdkTexture *texture;
GstVideoFrame frame;
if (G_UNLIKELY (!gst_video_frame_map (&frame, v_info, buffer, GST_MAP_READ))) {
GST_ERROR_OBJECT (importer, "Could not map input buffer for reading");
return NULL;
}
texture = gst_video_frame_into_gdk_texture (&frame);
gst_video_frame_unmap (&frame);
return texture;
}
static void
gst_clapper_raw_importer_init (GstClapperRawImporter *self)
{
}
static void
gst_clapper_raw_importer_class_init (GstClapperRawImporterClass *klass)
{
GstClapperImporterClass *importer_class = (GstClapperImporterClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperrawimporter", 0,
"Clapper RAW Importer");
importer_class->create_pool = gst_clapper_raw_importer_create_pool;
importer_class->add_allocation_metas = gst_clapper_raw_importer_add_allocation_metas;
importer_class->generate_texture = gst_clapper_raw_importer_generate_texture;
}
GstClapperImporter *
make_importer (void)
{
return g_object_new (GST_TYPE_CLAPPER_RAW_IMPORTER, NULL);
}
GstCaps *
make_caps (gboolean is_template, GstRank *rank, GStrv *context_types)
{
*rank = GST_RANK_MARGINAL;
return gst_caps_from_string (
GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY ", "
GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION,
"{ " GST_GDK_MEMORY_FORMATS " }")
"; "
GST_VIDEO_CAPS_MAKE (
"{ " GST_GDK_MEMORY_FORMATS " }"));
}

View File

@@ -0,0 +1,36 @@
/*
* Copyright (C) 2022 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#pragma once
#include "gst/plugin/gstclapperimporter.h"
G_BEGIN_DECLS
#define GST_TYPE_CLAPPER_RAW_IMPORTER (gst_clapper_raw_importer_get_type())
G_DECLARE_FINAL_TYPE (GstClapperRawImporter, gst_clapper_raw_importer, GST, CLAPPER_RAW_IMPORTER, GstClapperImporter)
#define GST_CLAPPER_RAW_IMPORTER_CAST(obj) ((GstClapperRawImporter *)(obj))
struct _GstClapperRawImporter
{
GstClapperImporter parent;
};
G_END_DECLS

151
lib/gst/plugin/importers/meson.build vendored Normal file
View File

@@ -0,0 +1,151 @@
gst_clapper_gl_base_importer_dep = dependency('', required: false)
all_importers = [
'glimporter',
'gluploader',
'rawimporter',
]
build_glbase = (
not get_option('glimporter').disabled()
or not get_option('gluploader').disabled()
)
gl_support_required = (
get_option('glimporter').enabled()
or get_option('gluploader').enabled()
)
# We cannot build any importers without sink that they depend on
if not gst_clapper_sink_dep.found()
foreach imp : all_importers
if get_option(imp).enabled()
error('"@0@" option was enabled, but it requires building gstreamer plugin'.format(imp))
endif
endforeach
endif
gst_plugin_gl_base_deps = [gst_clapper_sink_dep, gstgl_dep, gstglproto_dep]
have_gtk_gl_windowing = false
if gst_gl_have_window_x11 and (gst_gl_have_platform_egl or gst_gl_have_platform_glx)
gtk_x11_dep = dependency('gtk4-x11', required: false)
if gtk_x11_dep.found()
gst_plugin_gl_base_deps += gtk_x11_dep
if gst_gl_have_platform_glx
gst_plugin_gl_base_deps += gstglx11_dep
endif
have_gtk_gl_windowing = true
endif
endif
if gst_gl_have_window_wayland and gst_gl_have_platform_egl
gtk_wayland_dep = dependency('gtk4-wayland', required: false)
if gtk_wayland_dep.found()
gst_plugin_gl_base_deps += [gtk_wayland_dep, gstglwayland_dep]
have_gtk_gl_windowing = true
endif
endif
if gst_gl_have_window_win32 and (gst_gl_have_platform_egl or gst_gl_have_platform_wgl)
gtk_win32_dep = dependency('gtk4-win32', required: false)
if gtk_win32_dep.found()
gst_plugin_gl_base_deps += gtk_win32_dep
have_gtk_gl_windowing = true
endif
endif
if gst_gl_have_window_cocoa and gst_gl_have_platform_cgl
gtk_macos_dep = dependency('gtk4-macos', required: false)
if gtk_macos_dep.found()
gst_plugin_gl_base_deps += gtk_macos_dep
have_gtk_gl_windowing = true
endif
endif
if not have_gtk_gl_windowing
if gl_support_required
error('GL-based importer was enabled, but support for current GL windowing is missing')
endif
build_glbase = false
endif
if gst_gl_have_platform_egl
gst_plugin_gl_base_deps += gstglegl_dep
endif
foreach dep : gst_plugin_gl_base_deps
if not dep.found()
if gl_support_required
error('GL-based importer was enabled, but required dependencies were not found')
endif
build_glbase = false
endif
endforeach
if build_glbase
gst_clapper_gl_base_importer_dep = declare_dependency(
link_with: library('gstclapperglbaseimporter',
'gstclapperglbaseimporter.c',
c_args: gst_clapper_plugin_args,
include_directories: configinc,
dependencies: gst_plugin_gl_base_deps,
version: libversion,
install: true,
),
include_directories: configinc,
dependencies: gst_plugin_gl_base_deps,
)
endif
build_glimporter = (
not get_option('glimporter').disabled()
and gst_clapper_gl_base_importer_dep.found()
)
if build_glimporter
library(
'gstclapperglimporter',
'gstclapperglimporter.c',
dependencies: gst_clapper_gl_base_importer_dep,
include_directories: configinc,
c_args: gst_clapper_plugin_args,
install: true,
install_dir: gst_clapper_importers_libdir,
)
endif
build_gluploader = (
not get_option('gluploader').disabled()
and gst_clapper_gl_base_importer_dep.found()
)
if build_gluploader
library(
'gstclappergluploader',
'gstclappergluploader.c',
dependencies: gst_clapper_gl_base_importer_dep,
include_directories: configinc,
c_args: gst_clapper_plugin_args,
install: true,
install_dir: gst_clapper_importers_libdir,
)
endif
# No need to auto build rawimporter if we are building gluploader
build_rawimporter = (
not get_option('rawimporter').disabled()
and (not build_gluploader or get_option('rawimporter').enabled())
and gst_clapper_sink_dep.found()
)
if build_rawimporter
library(
'gstclapperrawimporter',
'gstclapperrawimporter.c',
dependencies: gst_clapper_sink_dep,
include_directories: configinc,
c_args: gst_clapper_plugin_args,
install: true,
install_dir: gst_clapper_importers_libdir,
)
endif

63
lib/gst/plugin/meson.build vendored Normal file
View File

@@ -0,0 +1,63 @@
gst_plugins_libdir = join_paths(prefix, libdir, 'gstreamer-1.0')
gst_clapper_plugin_args = [
'-DHAVE_CONFIG_H',
'-DGST_USE_UNSTABLE_API',
]
gst_clapper_sink_dep = dependency('', required: false)
gtk4_dep = dependency('gtk4', version: '>=4.6.0', required: false)
gmodule_dep = dependency('gmodule-2.0',
version: glib_req,
required: false,
fallback: ['glib', 'libgmodule_dep'],
)
gst_clapper_plugin_deps = [
gtk4_dep,
gst_dep,
gstbase_dep,
gstvideo_dep,
gmodule_dep,
]
build_gst_plugin = not get_option('gst-plugin').disabled()
foreach dep : gst_clapper_plugin_deps
if not dep.found()
if get_option('gst-plugin').enabled()
error('GStreamer plugin was enabled, but required dependencies were not found')
endif
build_gst_plugin = false
endif
endforeach
if get_option('default_library') == 'static'
gst_clapper_plugin_args += ['-DGST_STATIC_COMPILATION']
endif
gst_clapper_plugin_sources = [
'gstclappersink.c',
'gstclapperpaintable.c',
'gstgtkutils.c',
'gstplugin.c',
'gstclapperimporter.c',
'gstclapperimporterloader.c',
]
if build_gst_plugin
gst_clapper_sink_dep = declare_dependency(
link_with: library('gstclapper',
gst_clapper_plugin_sources,
c_args: gst_clapper_plugin_args,
include_directories: configinc,
dependencies: gst_clapper_plugin_deps,
install: true,
install_dir: gst_plugins_libdir,
),
include_directories: configinc,
dependencies: gst_clapper_plugin_deps,
)
endif
subdir('importers')

33
lib/meson.build vendored
View File

@@ -1,5 +1,5 @@
glib_req = '>= 2.56.0' glib_req = '>= 2.68.0'
gst_req = '>= 1.18.0' gst_req = '>= 1.20.0'
api_version = '1.0' api_version = '1.0'
libversion = meson.project_version() libversion = meson.project_version()
@@ -9,6 +9,8 @@ cxx = meson.get_compiler('cpp')
cdata = configuration_data() cdata = configuration_data()
os_unix = host_machine.system() != 'windows'
if cc.get_id() == 'msvc' if cc.get_id() == 'msvc'
msvc_args = [ msvc_args = [
# Ignore several spurious warnings for things gstreamer does very commonly # Ignore several spurious warnings for things gstreamer does very commonly
@@ -42,10 +44,6 @@ endif
# Symbol visibility # Symbol visibility
if cc.get_id() == 'msvc' if cc.get_id() == 'msvc'
export_define = '__declspec(dllexport) extern' export_define = '__declspec(dllexport) extern'
elif cc.has_argument('-fvisibility=hidden')
add_project_arguments('-fvisibility=hidden', language: 'c')
add_project_arguments('-fvisibility=hidden', language: 'cpp')
export_define = 'extern __attribute__ ((visibility ("default")))'
else else
export_define = 'extern' export_define = 'extern'
endif endif
@@ -132,7 +130,7 @@ cdata.set('SIZEOF_SHORT', cc.sizeof('short'))
cdata.set('SIZEOF_VOIDP', cc.sizeof('void*')) cdata.set('SIZEOF_VOIDP', cc.sizeof('void*'))
cdata.set_quoted('VERSION', libversion) cdata.set_quoted('VERSION', libversion)
cdata.set_quoted('PACKAGE', 'gst-plugins-clapper') cdata.set_quoted('PACKAGE', 'clapper')
cdata.set_quoted('PACKAGE_VERSION', libversion) cdata.set_quoted('PACKAGE_VERSION', libversion)
cdata.set_quoted('PACKAGE_BUGREPORT', 'https://github.com/Rafostar/clapper/issues/new') cdata.set_quoted('PACKAGE_BUGREPORT', 'https://github.com/Rafostar/clapper/issues/new')
cdata.set_quoted('PACKAGE_NAME', 'GStreamer Clapper Libs') cdata.set_quoted('PACKAGE_NAME', 'GStreamer Clapper Libs')
@@ -184,7 +182,7 @@ foreach extra_arg : warning_flags
endif endif
endforeach endforeach
cdata.set_quoted('GST_PACKAGE_NAME', 'GStreamer Plugins Clapper') cdata.set_quoted('GST_PACKAGE_NAME', 'gst-plugin-clapper')
cdata.set_quoted('GST_PACKAGE_ORIGIN', 'https://github.com/Rafostar/clapper') cdata.set_quoted('GST_PACKAGE_ORIGIN', 'https://github.com/Rafostar/clapper')
# Mandatory GST deps # Mandatory GST deps
@@ -247,25 +245,30 @@ libm = cc.find_library('m', required: false)
glib_dep = dependency('glib-2.0', version: glib_req, fallback: ['glib', 'libglib_dep']) glib_dep = dependency('glib-2.0', version: glib_req, fallback: ['glib', 'libglib_dep'])
gmodule_dep = dependency('gmodule-2.0', fallback: ['glib', 'libgmodule_dep']) gmodule_dep = dependency('gmodule-2.0', fallback: ['glib', 'libgmodule_dep'])
gio_dep = dependency('gio-2.0', fallback: ['glib', 'libgio_dep']) gio_dep = dependency('gio-2.0', fallback: ['glib', 'libgio_dep'])
giounix_dep = dependency('gio-unix-2.0', version: glib_req, fallback: ['glib', 'libgiounix_dep'])
if os_unix
giounix_dep = dependency('gio-unix-2.0', version: glib_req, fallback: ['glib', 'libgio_dep'])
else
giowin_dep = dependency('gio-windows-2.0', version: glib_req, fallback : ['glib', 'libgio_dep'])
endif
cdata.set('DISABLE_ORC', 1) cdata.set('DISABLE_ORC', 1)
cdata.set('GST_ENABLE_EXTRA_CHECKS', get_option('devel-checks')) cdata.set('GST_ENABLE_EXTRA_CHECKS', get_option('devel-checks'))
cdata.set_quoted('GST_PACKAGE_RELEASE_DATETIME', 'Unknown')
configinc = include_directories('.') configinc = include_directories('.')
libsinc = include_directories('gst') libsinc = include_directories('gst')
gir = find_program('g-ir-scanner', required: true) gir = find_program('g-ir-scanner', required: false)
if not gir.found()
error('Clapper requires GI bindings to be compiled')
endif
gir_init_section = ['--add-init-section=extern void gst_init(gint*,gchar**);' + \ gir_init_section = ['--add-init-section=extern void gst_init(gint*,gchar**);' + \
'g_setenv("GST_REGISTRY_1.0", "@0@", TRUE);'.format(meson.current_build_dir() + '/gir_empty_registry.reg') + \ 'g_setenv("GST_REGISTRY_1.0", "@0@", TRUE);'.format(meson.current_build_dir() + '/gir_empty_registry.reg') + \
'g_setenv("GST_PLUGIN_PATH_1_0", "", TRUE);' + \ 'g_setenv("GST_PLUGIN_PATH_1_0", "", TRUE);' + \
'g_setenv("GST_PLUGIN_SYSTEM_PATH_1_0", "", TRUE);' + \ 'g_setenv("GST_PLUGIN_SYSTEM_PATH_1_0", "", TRUE);' + \
'gst_init(NULL,NULL);', '--quiet' 'gst_init(NULL,NULL);', '--quiet'
] ]
gst_clapper_plugin_libdir = join_paths(get_option('prefix'), libdir, 'clapper-@0@'.format(api_version), 'gst', 'plugin')
gst_clapper_importers_libdir = join_paths(gst_clapper_plugin_libdir, 'importers')
cdata.set_quoted('CLAPPER_SINK_IMPORTER_PATH', gst_clapper_importers_libdir)
subdir('gst') subdir('gst')
configure_file(output: 'config.h', configuration: cdata) configure_file(output: 'config.h', configuration: cdata)

View File

@@ -1,5 +1,5 @@
project('com.github.rafostar.Clapper', 'c', 'cpp', project('com.github.rafostar.Clapper', 'c', 'cpp',
version: '0.4.1', version: '0.5.2',
meson_version: '>= 0.50.0', meson_version: '>= 0.50.0',
license: 'GPL-3.0-or-later', license: 'GPL-3.0-or-later',
default_options: [ default_options: [
@@ -19,9 +19,7 @@ datadir = join_paths(get_option('prefix'), get_option('datadir'))
pkglibdir = join_paths(libdir, meson.project_name()) pkglibdir = join_paths(libdir, meson.project_name())
pkgdatadir = join_paths(datadir, meson.project_name()) pkgdatadir = join_paths(datadir, meson.project_name())
if get_option('lib') subdir('lib')
subdir('lib')
endif
if get_option('player') if get_option('player')
subdir('bin') subdir('bin')

View File

@@ -8,6 +8,28 @@ option('lib',
value: true, value: true,
description: 'Build GstClapper lib' description: 'Build GstClapper lib'
) )
option('gst-plugin',
type: 'feature',
value: 'auto',
description: 'Build GStreamer plugin (includes GTK video sink element)'
)
option('glimporter',
type: 'feature',
value: 'auto',
description: 'Build GL memory importer for clappersink'
)
option('gluploader',
type: 'feature',
value: 'auto',
description: 'Build GL uploader for clappersink'
)
option('rawimporter',
type: 'feature',
value: 'auto',
description: 'Build RAW system memory importer for clappersink'
)
option('devel-checks', option('devel-checks',
type: 'boolean', type: 'boolean',
value: false, value: false,

View File

@@ -3,6 +3,10 @@
"runtime": "org.gnome.Platform", "runtime": "org.gnome.Platform",
"runtime-version": "master", "runtime-version": "master",
"sdk": "org.gnome.Sdk", "sdk": "org.gnome.Sdk",
"sdk-extensions": [
"org.freedesktop.Sdk.Extension.rust-nightly",
"org.freedesktop.Sdk.Extension.llvm13"
],
"command": "com.github.rafostar.Clapper", "command": "com.github.rafostar.Clapper",
"finish-args": [ "finish-args": [
"--share=ipc", "--share=ipc",
@@ -14,11 +18,16 @@
"--device=all", "--device=all",
"--filesystem=xdg-run/pipewire-0:ro", "--filesystem=xdg-run/pipewire-0:ro",
"--filesystem=xdg-videos", "--filesystem=xdg-videos",
"--filesystem=xdg-run/gvfsd",
"--own-name=org.mpris.MediaPlayer2.Clapper", "--own-name=org.mpris.MediaPlayer2.Clapper",
"--talk-name=org.gtk.vfs.*",
"--talk-name=org.gnome.Shell", "--talk-name=org.gnome.Shell",
"--env=GST_PLUGIN_SYSTEM_PATH=/app/lib/gstreamer-1.0", "--env=GST_PLUGIN_SYSTEM_PATH=/app/lib/gstreamer-1.0"
"--env=GST_VAAPI_ALL_DRIVERS=1"
], ],
"build-options": {
"append-path": "/usr/lib/sdk/rust-nightly/bin:/usr/lib/sdk/llvm13/bin",
"prepend-ld-library-path": "/usr/lib/sdk/llvm13/lib"
},
"modules": [ "modules": [
"flathub/shared-modules/gudev/gudev.json", "flathub/shared-modules/gudev/gudev.json",
"flathub/lib/libsass.json", "flathub/lib/libsass.json",
@@ -33,6 +42,7 @@
"flathub/lib/libass.json", "flathub/lib/libass.json",
"flathub/lib/ffmpeg.json", "flathub/lib/ffmpeg.json",
"testing/gstreamer.json", "testing/gstreamer.json",
"testing/gst-plugins-rs.json",
"testing/gtuber.json", "testing/gtuber.json",
{ {
"name": "clapper", "name": "clapper",

View File

@@ -1,7 +1,7 @@
{ {
"app-id": "com.github.rafostar.Clapper", "app-id": "com.github.rafostar.Clapper",
"runtime": "org.gnome.Platform", "runtime": "org.gnome.Platform",
"runtime-version": "40", "runtime-version": "42",
"sdk": "org.gnome.Sdk", "sdk": "org.gnome.Sdk",
"command": "com.github.rafostar.Clapper", "command": "com.github.rafostar.Clapper",
"finish-args": [ "finish-args": [
@@ -14,14 +14,14 @@
"--device=all", "--device=all",
"--filesystem=xdg-run/pipewire-0:ro", "--filesystem=xdg-run/pipewire-0:ro",
"--filesystem=xdg-videos", "--filesystem=xdg-videos",
"--filesystem=xdg-run/gvfsd",
"--own-name=org.mpris.MediaPlayer2.Clapper", "--own-name=org.mpris.MediaPlayer2.Clapper",
"--talk-name=org.gtk.vfs.*",
"--talk-name=org.gnome.Shell", "--talk-name=org.gnome.Shell",
"--env=GST_PLUGIN_SYSTEM_PATH=/app/lib/gstreamer-1.0", "--env=GST_PLUGIN_SYSTEM_PATH=/app/lib/gstreamer-1.0"
"--env=GST_VAAPI_ALL_DRIVERS=1"
], ],
"modules": [ "modules": [
"flathub/shared-modules/gudev/gudev.json", "flathub/shared-modules/gudev/gudev.json",
"flathub/lib/pango.json",
"flathub/lib/libsass.json", "flathub/lib/libsass.json",
"flathub/lib/sassc.json", "flathub/lib/sassc.json",
"flathub/lib/liba52.json", "flathub/lib/liba52.json",
@@ -34,18 +34,15 @@
"flathub/lib/ffmpeg.json", "flathub/lib/ffmpeg.json",
"flathub/lib/uchardet.json", "flathub/lib/uchardet.json",
"flathub/gstreamer-1.0/gstreamer.json", "flathub/gstreamer-1.0/gstreamer.json",
"flathub/gstreamer-1.0/gst-plugins-base.json",
"flathub/gstreamer-1.0/gst-plugins-good.json",
"flathub/gstreamer-1.0/gst-plugins-bad.json",
"flathub/gstreamer-1.0/gst-plugins-ugly.json",
"flathub/gstreamer-1.0/gst-libav.json",
"flathub/gstreamer-1.0/gstreamer-vaapi.json",
"flathub/lib/gtk4.json", "flathub/lib/gtk4.json",
"flathub/lib/libadwaita.json", "flathub/lib/libadwaita.json",
"testing/gtuber.json", "testing/gtuber.json",
{ {
"name": "clapper", "name": "clapper",
"buildsystem": "meson", "buildsystem": "meson",
"config-opts": [
"-Dc_args=\"-DHAVE_GST_PATCHES=1\""
],
"sources": [ "sources": [
{ {
"type": "dir", "type": "dir",

View File

@@ -0,0 +1,23 @@
{
"name": "gst-plugins-rs",
"buildsystem": "simple",
"build-options": {
"build-args": [
"--share=network"
],
"env": {
"CARGO_HOME": "/run/build/gst-plugins-rs/cargo"
}
},
"sources": [
{
"type": "git",
"url": "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git",
"branch": "main"
}
],
"build-commands": [
"cargo install cargo-c",
"cargo cinstall --prefix=/app -p gst-plugin-dav1d"
]
}

View File

@@ -2,7 +2,7 @@
"name": "gstreamer", "name": "gstreamer",
"buildsystem": "meson", "buildsystem": "meson",
"config-opts": [ "config-opts": [
"--wrap-mode=nofallback", "--wrap-mode=nodownload",
"-Dbase=enabled", "-Dbase=enabled",
"-Dgood=enabled", "-Dgood=enabled",
@@ -26,26 +26,12 @@
"-Dgpl=enabled", "-Dgpl=enabled",
"-Dgstreamer:benchmarks=disabled", "-Dgstreamer:benchmarks=disabled",
"-Dgstreamer:gobject-cast-checks=disabled",
"-Dgstreamer:glib-asserts=disabled",
"-Dgstreamer:glib-checks=disabled",
"-Dgstreamer:extra-checks=disabled",
"-Dgst-plugins-base:gobject-cast-checks=disabled",
"-Dgst-plugins-base:glib-asserts=disabled",
"-Dgst-plugins-base:glib-checks=disabled",
"-Dgst-plugins-base:gl_api=opengl,gles2", "-Dgst-plugins-base:gl_api=opengl,gles2",
"-Dgst-plugins-base:gl_platform=egl,glx", "-Dgst-plugins-base:gl_platform=egl,glx",
"-Dgst-plugins-good:gobject-cast-checks=disabled",
"-Dgst-plugins-good:glib-asserts=disabled",
"-Dgst-plugins-good:glib-checks=disabled",
"-Dgst-plugins-good:gtk3=disabled", "-Dgst-plugins-good:gtk3=disabled",
"-Dgst-plugins-bad:gobject-cast-checks=disabled",
"-Dgst-plugins-bad:glib-asserts=disabled",
"-Dgst-plugins-bad:glib-checks=disabled",
"-Dgst-plugins-bad:extra-checks=disabled",
"-Dgst-plugins-bad:vulkan=disabled", "-Dgst-plugins-bad:vulkan=disabled",
"-Dgst-plugins-bad:webrtc=disabled", "-Dgst-plugins-bad:webrtc=disabled",
"-Dgst-plugins-bad:wasapi=disabled", "-Dgst-plugins-bad:wasapi=disabled",
@@ -57,16 +43,14 @@
"-Dgst-plugins-bad:v4l2codecs=enabled", "-Dgst-plugins-bad:v4l2codecs=enabled",
"-Dgst-plugins-bad:va=enabled", "-Dgst-plugins-bad:va=enabled",
"-Dgst-plugins-ugly:gobject-cast-checks=disabled",
"-Dgst-plugins-ugly:glib-asserts=disabled",
"-Dgst-plugins-ugly:glib-checks=disabled",
"-Dgst-plugins-ugly:mpeg2dec=enabled" "-Dgst-plugins-ugly:mpeg2dec=enabled"
], ],
"sources": [ "sources": [
{ {
"type": "git", "type": "git",
"url": "https://gitlab.freedesktop.org/gstreamer/gstreamer.git", "url": "https://gitlab.freedesktop.org/gstreamer/gstreamer.git",
"branch": "main" "branch": "main",
"disable-submodules": true
} }
] ]
} }

3
pkgs/rpm/.gitignore vendored
View File

@@ -1,3 +0,0 @@
.osc/
clapper/
.lock

View File

@@ -1 +0,0 @@
addFilter("explicit-lib-dependency")

View File

@@ -1,187 +0,0 @@
#
# spec file for package clapper
#
# Copyright (C) 2020 sp1rit
# Copyright (C) 2020-21 Rafostar
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
%define debug_package %{nil}
%global appname com.github.rafostar.Clapper
%global gst_version 1.18.0
%global gtk4_version 4.0.0
%global meson_version 0.50
%global glib2_version 2.56.0
Name: clapper
Version: 0.4.1
Release: 1%{?dist}
Summary: Simple and modern GNOME media player
License: GPL-3.0
URL: https://github.com/Rafostar/clapper
BuildRoot: %{_builddir}/%{name}-%{version}-build
Source0: _service
BuildRequires: meson >= %{meson_version}
BuildRequires: gtk4-devel >= %{gtk4_version}
BuildRequires: glib2-devel >= %{glib2_version}
BuildRequires: gobject-introspection-devel
BuildRequires: gjs
BuildRequires: gcc-c++
BuildRequires: desktop-file-utils
BuildRequires: hicolor-icon-theme
Requires: gjs
Requires: gtk4 >= %{gtk4_version}
Requires: libadwaita
Requires: hicolor-icon-theme
%if 0%{?suse_version}
# SUSE recommends group tag, while Fedora discourages their use
Group: Productivity/Multimedia/Video/Players
BuildRequires: update-desktop-files
BuildRequires: gstreamer-devel >= %{gst_version}
BuildRequires: gstreamer-plugins-base-devel >= %{gst_version}
BuildRequires: Mesa-libGLESv2-devel
BuildRequires: Mesa-libGLESv3-devel
Requires: gstreamer >= %{gst_version}
Requires: gstreamer-plugins-base >= %{gst_version}
Requires: gstreamer-plugins-good >= %{gst_version}
Requires: gstreamer-plugins-bad >= %{gst_version}
# Popular video decoders
Recommends: gstreamer-plugins-libav >= %{gst_version}
# CD Playback
Suggests: gstreamer-plugins-ugly
# Intel/AMD video acceleration
Suggests: gstreamer-plugins-vaapi
%else
BuildRequires: glibc-all-langpacks
BuildRequires: gstreamer1-devel >= %{gst_version}
BuildRequires: gstreamer1-plugins-base-devel >= %{gst_version}
BuildRequires: mesa-libGL-devel
BuildRequires: mesa-libGLES-devel
BuildRequires: mesa-libGLU-devel
BuildRequires: mesa-libEGL-devel
Requires: gstreamer1 >= %{gst_version}
Requires: gstreamer1-plugins-base >= %{gst_version}
Requires: gstreamer1-plugins-good >= %{gst_version}
Requires: gstreamer1-plugins-bad-free >= %{gst_version}
# ASS subtitles (assrender)
Recommends: gstreamer1-plugins-bad-free-extras >= %{gst_version}
# CD Playback
Suggests: gstreamer1-plugins-ugly-free
# Intel/AMD video acceleration
Suggests: gstreamer1-vaapi
%endif
%description
A GNOME media player built using GJS with GTK4 toolkit and powered by GStreamer with OpenGL rendering.
%prep
%setup -q -n %{_sourcedir}/%{name}-%{version} -T -D
%build
%meson
%meson_build
%install
%meson_install
%if 0%{?suse_version}
%suse_update_desktop_file %{appname}
%endif
%check
desktop-file-validate %{buildroot}%{_datadir}/applications/*.desktop
%files
%license COPYING
%doc README.md
%{_bindir}/%{appname}*
%{_bindir}/clapper
%{_datadir}/%{appname}/
%{_datadir}/icons/hicolor/*/apps/*.svg
%{_datadir}/glib-2.0/schemas/%{appname}.gschema.xml
%{_datadir}/mime/packages/%{appname}.xml
%{_datadir}/applications/*.desktop
%{_datadir}/metainfo/*.metainfo.xml
%{_datadir}/gir-1.0/GstClapper-1.0.gir
%{_datadir}/locale/*/LC_MESSAGES/%{appname}.mo
%{_libdir}/%{appname}/
%changelog
* Mon Dec 20 2021 Rafostar <rafostar.github@gmail.com> - 0.4.1-1
- New version
* Sun Sep 12 2021 Rafostar <rafostar.github@gmail.com> - 0.4.0-1
- New version
* Thu Aug 26 2021 Rafostar <rafostar.github@gmail.com> - 0.3.0-4
- Install translations
* Thu Aug 26 2021 Rafostar <rafostar.github@gmail.com> - 0.3.0-3
- Install clapper symlink
* Mon Aug 23 2021 Rafostar <rafostar.github@gmail.com> - 0.3.0-2
- Require libadwaita
* Fri Jun 18 2021 Rafostar <rafostar.github@gmail.com> - 0.3.0-1
- New version
* Mon Apr 19 2021 Rafostar <rafostar.github@gmail.com> - 0.2.1-1
- New version
* Tue Apr 13 2021 Rafostar <rafostar.github@gmail.com> - 0.2.0-1
- New version
* Fri Feb 26 2021 Rafostar <rafostar.github@gmail.com> - 0.1.0-1
- New version
* Sun Feb 7 2021 Rafostar <rafostar.github@gmail.com> - 0.0.0-10
- Install gstclapper libs to app named subdirectory
* Fri Feb 5 2021 Rafostar <rafostar.github@gmail.com> - 0.0.0-9
- Update build with gstclapper libs support
* Thu Jan 21 2021 Rafostar <rafostar.github@gmail.com> - 0.0.0-8
- Use metainfo instead of deprecated appdata
* Mon Jan 18 2021 Rafostar <rafostar.github@gmail.com> - 0.0.0-7
- Remove gjs-1.0 files
* Sun Dec 20 2020 Rafostar <rafostar.github@gmail.com> - 0.0.0-6
- Include additional app binaries
* Sat Oct 31 2020 Rafostar <rafostar.github@gmail.com> - 0.0.0-5
- Added metainfo
* Sun Oct 25 2020 Rafostar <rafostar.github@gmail.com> - 0.0.0-4
- Added gschema
* Wed Oct 14 2020 Rafostar <rafostar.github@gmail.com> - 0.0.0-3
- Update to GTK4
* Sat Sep 19 22:02:00 CEST 2020 sp1rit - 0.0.0-2
- Added suse_update_desktop_file macro for SuSE packages
* Fri Sep 18 2020 Rafostar <rafostar.github@gmail.com> - 0.0.0-1
- Initial package

View File

@@ -1 +1 @@
ca cs de es hu it nl pl pt pt_BR ru zh_CN ar ca cs de es eu fr he hu it ja nl pl pt pt_BR ru sv tr zh_CN

131
po/af.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Afrikaans\n" "Language-Team: Afrikaans\n"
"Language: af_ZA\n" "Language: af_ZA\n"
@@ -18,11 +18,11 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr ""
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -41,12 +41,11 @@ msgstr ""
msgid "Speed" msgid "Speed"
msgstr "" msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr ""
@@ -118,7 +117,7 @@ msgstr ""
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr ""
@@ -182,203 +181,183 @@ msgstr ""
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr ""
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr ""
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "" msgstr ""
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr ""
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "" msgstr ""
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr ""
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr ""
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "" msgstr ""
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "" msgstr ""
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr ""
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr ""
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "" msgstr ""
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "" msgstr ""
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr ""
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "" msgstr ""
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "" msgstr ""
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr ""
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr ""
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr ""
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr ""
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr ""
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr ""
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr ""
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr ""
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr ""
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr ""
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "" msgstr ""
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "" msgstr ""
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "" msgstr ""
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "" msgstr ""
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "" msgstr ""
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "" msgstr ""
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "" msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "" msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr ""
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr ""
@@ -445,15 +424,15 @@ msgstr ""
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr ""
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr ""
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""

377
po/ar.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Arabic\n" "Language-Team: Arabic\n"
"Language: ar_SA\n" "Language: ar_SA\n"
@@ -18,442 +18,421 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr "فتح الملفات…"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr "فتح عنوان URL…"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
msgstr "" msgstr "الإعدادات"
#: ui/clapper.ui:20 #: ui/clapper.ui:20
msgid "Shortcuts" msgid "Shortcuts"
msgstr "" msgstr "الاختصارات"
#: ui/clapper.ui:26 #: ui/clapper.ui:26
msgid "About Clapper" msgid "About Clapper"
msgstr "" msgstr "حول Clapper"
#: ui/elapsed-time-button.ui:27 #: ui/elapsed-time-button.ui:27
msgid "Speed" msgid "Speed"
msgstr "" msgstr "السرعة"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr "عادي"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr "عام"
#: ui/help-overlay.ui:13 #: ui/help-overlay.ui:13
msgid "Show shortcuts" msgid "Show shortcuts"
msgstr "" msgstr "إظهار الاختصارات"
#: ui/help-overlay.ui:19 #: ui/help-overlay.ui:19
msgid "Toggle fullscreen" msgid "Toggle fullscreen"
msgstr "" msgstr "تبديل ملء الشاشة"
#: ui/help-overlay.ui:20 #: ui/help-overlay.ui:20
msgid "Double tap | Double click" msgid "Double tap | Double click"
msgstr "" msgstr "نقرة مزدوجة"
#: ui/help-overlay.ui:26 #: ui/help-overlay.ui:26
msgid "Leave fullscreen" msgid "Leave fullscreen"
msgstr "" msgstr "مغادرة ملء الشاشة"
#: ui/help-overlay.ui:32 #: ui/help-overlay.ui:32
msgid "Reveal OSD (fullscreen only)" msgid "Reveal OSD (fullscreen only)"
msgstr "" msgstr "إظهار المعلومات (ملء الشاشة فقط)"
#: ui/help-overlay.ui:33 #: ui/help-overlay.ui:33
msgid "Tap" msgid "Tap"
msgstr "" msgstr "نقرة"
#: ui/help-overlay.ui:39 #: ui/help-overlay.ui:39
msgid "Quit" msgid "Quit"
msgstr "" msgstr "خروج"
#: ui/help-overlay.ui:47 #: ui/help-overlay.ui:47
msgid "Media" msgid "Media"
msgstr "" msgstr "الوسائط"
#: ui/help-overlay.ui:50 #: ui/help-overlay.ui:50
msgid "Open files" msgid "Open files"
msgstr "" msgstr "افتح ملفًا"
#: ui/help-overlay.ui:56 src/dialogs.js:137 #: ui/help-overlay.ui:56 src/dialogs.js:137
msgid "Open URI" msgid "Open URI"
msgstr "" msgstr "فتح عنوان URL"
#: ui/help-overlay.ui:64 #: ui/help-overlay.ui:64
msgid "Playlist" msgid "Playlist"
msgstr "" msgstr "قوائم التشغيل"
#: ui/help-overlay.ui:67 #: ui/help-overlay.ui:67
msgid "Next item" msgid "Next item"
msgstr "" msgstr "المحتوى التالي"
#: ui/help-overlay.ui:68 #: ui/help-overlay.ui:68
msgid "Double tap (right side)" msgid "Double tap (right side)"
msgstr "" msgstr "نقر مزدوج (الجانب الأيمن)"
#: ui/help-overlay.ui:74 #: ui/help-overlay.ui:74
msgid "Previous item" msgid "Previous item"
msgstr "" msgstr "المحتوى السابق"
#: ui/help-overlay.ui:75 #: ui/help-overlay.ui:75
msgid "Double tap (left side)" msgid "Double tap (left side)"
msgstr "" msgstr "نقر مزدوج (الجانب الأيسر)"
#: ui/help-overlay.ui:81 #: ui/help-overlay.ui:81
msgid "Change repeat mode" msgid "Change repeat mode"
msgstr "" msgstr "تغيير وضع التكرار"
#: ui/help-overlay.ui:87 #: ui/help-overlay.ui:87
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr "التصدير إلى مِلَفّ"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr "المشغل"
#: ui/help-overlay.ui:98 #: ui/help-overlay.ui:98
msgid "Toggle play" msgid "Toggle play"
msgstr "" msgstr "بَدْءّ / إيقاف"
#: ui/help-overlay.ui:99 #: ui/help-overlay.ui:99
msgid "Long press | Right click" msgid "Long press | Right click"
msgstr "" msgstr "اضغط مطولاً | انقر بزر الفائرة الأيمن"
#: ui/help-overlay.ui:105 #: ui/help-overlay.ui:105
msgid "Seek forward" msgid "Seek forward"
msgstr "" msgstr "التقدم للأمام"
#: ui/help-overlay.ui:106 #: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right" msgid "Swipe right | Scroll right"
msgstr "" msgstr "مرر لليمين"
#: ui/help-overlay.ui:112 #: ui/help-overlay.ui:112
msgid "Seek backward" msgid "Seek backward"
msgstr "" msgstr "الرجوع للوراء"
#: ui/help-overlay.ui:113 #: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left" msgid "Swipe left | Scroll left"
msgstr "" msgstr "مرر لليسار"
#: ui/help-overlay.ui:119 #: ui/help-overlay.ui:119
msgid "Volume up" msgid "Volume up"
msgstr "" msgstr "رفع مستوى الصوت"
#: ui/help-overlay.ui:120 #: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up" msgid "Swipe up | Scroll up"
msgstr "" msgstr "مرر لأعلى"
#: ui/help-overlay.ui:126 #: ui/help-overlay.ui:126
msgid "Volume down" msgid "Volume down"
msgstr "" msgstr "خفض مستوى الصوت"
#: ui/help-overlay.ui:127 #: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down" msgid "Swipe down | Scroll down"
msgstr "" msgstr "مرر لأسفل"
#: ui/help-overlay.ui:133 #: ui/help-overlay.ui:133
msgid "Toggle mute" msgid "Toggle mute"
msgstr "" msgstr "كتم الصوت"
#: ui/help-overlay.ui:139 #: ui/help-overlay.ui:139
msgid "Next chapter" msgid "Next chapter"
msgstr "" msgstr "الفصل التالي"
#: ui/help-overlay.ui:145 #: ui/help-overlay.ui:145
msgid "Previous chapter" msgid "Previous chapter"
msgstr "" msgstr "الفصل السابق"
#: ui/preferences-plugin-ranking-subpage.ui:11 #: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders" msgid "Decoders"
msgstr "" msgstr "برامج فك التشفير"
#: ui/preferences-plugin-ranking-subpage.ui:18 #: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr "العودة إلى الإعدادات"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr "السلوك"
#: ui/preferences-window.ui:18
msgid "Auto fullscreen"
msgstr "ملء الشاشة تلقائياً"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr "أدخل ملء الشاشة عند استبدال قائمة التشغيل باستثناء الوضع العائم"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr "اطلب استئناف الوسائط السابقة"
#: ui/preferences-window.ui:31
msgid "Float on all workspaces"
msgstr "عائم في جميع مساحات العمل"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr "هذا الخِيار يعمل فقط على GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr "بعد انتهاء"
#: ui/preferences-window.ui:43
msgid "Do nothing"
msgstr "لا تفعل شيئًا"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:44
msgid "Do nothing" msgid "Freeze last frame"
msgstr "" msgstr "تجميد الأخر لقطة"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:46
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr "أغلق التطبيق"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr "الصوت"
#: ui/preferences-window.ui:58
msgid "Custom initial value"
msgstr "قيمة الافتراضية مخصصة"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr "تعيين مستوى صوت مخصص عند بَدْء التشغيل بدلاً من إعادته"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr "حجم الصوت"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr "الوضع"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr "النمط"
#: ui/preferences-window.ui:83
msgid "Accurate"
msgstr "دَقيق"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:85
msgid "Fast" msgid "Fast"
msgstr "" msgstr "سريع"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr "الوحدة"
#: ui/preferences-window.ui:97
msgid "Second"
msgstr "ثواني"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:98
msgid "Second" msgid "Minute"
msgstr "" msgstr "دقائق"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:100
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr "النسبة المئوية"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr "القيمة"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr "الصوت"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr "إزاحة بالمللي ثانية"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr "تنسيقات الصوت الأصلية فقط"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr "التَّرْجَمَةً"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr "الخط الافتراضي"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr "الشبكة"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr "العميل"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr "التخزين المؤقت للتنزيل بالتدريج"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr "الخادم"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr "التحكم بالوسائط عن بعد"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr "منفذ الاستماع"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background" msgid "Tweaks"
msgstr "" msgstr "تعديلات"
#: ui/preferences-window.ui:184 #: ui/preferences-window.ui:192
msgid "Requires GTK compiled with Broadway backend" msgid "Appearance"
msgstr "" msgstr "إعدادات المظهر"
#: ui/preferences-window.ui:190 #: ui/preferences-window.ui:195
msgid "Web application port" msgid "Dark theme"
msgstr "" msgstr "المظهر الداكن"
#: ui/preferences-window.ui:204 #: ui/preferences-window.ui:201
msgid "Prefer adaptive streaming" msgid "Render window shadows"
msgstr "" msgstr "عرض ظلال النافذة"
#: ui/preferences-window.ui:210 #: ui/preferences-window.ui:202
msgid "Max quality" msgid "Disable to increase performance when windowed"
msgstr "" msgstr "تعطيل لزيادة الأداء عند وضع النافذة"
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr "أعدادات الإضافات"
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr "تغيير الأعدادات الافتراضية للأضافات GStreamer"
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr "استخدام playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr "يتطلب إعادة التشغيل"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
msgstr "تجريبية"
#: ui/preferences-window.ui:228 #: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr "استخدام PipeWire لإخراج الصوت"
#: src/buttons.js:201 #: src/buttons.js:201
#, javascript-format #, javascript-format
msgid "Decoder: %s" msgid "Decoder: %s"
msgstr "" msgstr "فك التشفير: %s"
#: src/dialogs.js:152 #: src/dialogs.js:152
msgid "Enter or drop URI here" msgid "Enter or drop URI here"
msgstr "" msgstr "أدخل أو الصق URI هنا"
#: src/dialogs.js:157 #: src/dialogs.js:157
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr "إلغاء"
#: src/dialogs.js:158 #: src/dialogs.js:158
msgid "Open" msgid "Open"
msgstr "" msgstr "فتح"
#: src/dialogs.js:226 #: src/dialogs.js:226
msgid "Title" msgid "Title"
msgstr "" msgstr "العنوان"
#: src/dialogs.js:227 #: src/dialogs.js:227
msgid "Completed" msgid "Completed"
msgstr "" msgstr "تم مشاهدة"
#: src/dialogs.js:235 #: src/dialogs.js:235
msgid "Resume playback?" msgid "Resume playback?"
msgstr "" msgstr "استئناف التشغيل؟"
#: src/dialogs.js:289 #: src/dialogs.js:289
#, javascript-format #, javascript-format
msgid "GTK version: %s" msgid "GTK version: %s"
msgstr "" msgstr "إصدار GTK: %s"
#: src/dialogs.js:290 #: src/dialogs.js:290
#, javascript-format #, javascript-format
msgid "Adwaita version: %s" msgid "Adwaita version: %s"
msgstr "" msgstr "إصدار Adwaita: %s"
#: src/dialogs.js:291 #: src/dialogs.js:291
#, javascript-format #, javascript-format
msgid "GStreamer version: %s" msgid "GStreamer version: %s"
msgstr "" msgstr "إصدار GStreamer: %s"
#: src/dialogs.js:292 #: src/dialogs.js:292
#, javascript-format #, javascript-format
msgid "GJS version: %s" msgid "GJS version: %s"
msgstr "" msgstr "إصدار GJS: %s"
#: src/dialogs.js:300 #: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer" msgid "A GNOME media player powered by GStreamer"
msgstr "" msgstr "مشغل وسائط GNOME مدعوم من GStreamer"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated #. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305 #: src/dialogs.js:305
msgid "translator-credits" msgid "translator-credits"
msgstr "" msgstr "Yousef Fawaz"
#: src/revealers.js:170 #: src/revealers.js:170
#, javascript-format #, javascript-format
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr "ينتهي في: %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr "غير محدّد"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr "قنوات"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr "مُعطّل"

135
po/ca.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 16:21\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Catalan\n" "Language-Team: Catalan\n"
"Language: ca_ES\n" "Language: ca_ES\n"
@@ -18,12 +18,12 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "Obre fitxers..." msgstr "Obre fitxers"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "Obre l'URI..." msgstr "Obre l'URI"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
@@ -41,12 +41,11 @@ msgstr "Quant al Clapper"
msgid "Speed" msgid "Speed"
msgstr "Velocitat" msgstr "Velocitat"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "Normal" msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "General" msgstr "General"
@@ -118,7 +117,7 @@ msgstr "Canvia el mode de repetició"
msgid "Export to file" msgid "Export to file"
msgstr "Exporta a un fitxer" msgstr "Exporta a un fitxer"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "Reproducció" msgstr "Reproducció"
@@ -182,203 +181,183 @@ msgstr "Descodificadors"
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "Torna a les preferències" msgstr "Torna a les preferències"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "Comportament" msgstr "Comportament"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "Pantalla completa automàtica" msgstr "Pantalla completa automàtica"
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Entra a pantalla completa quan se substitueix la llista de reproducció excepte el mode flotant" msgstr "Entra a pantalla completa quan se substitueix la llista de reproducció excepte el mode flotant"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "Pregunta per reprendre recents" msgstr "Pregunta per reprendre recents"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "Flota en tots els espais de treball" msgstr "Flota en tots els espais de treball"
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "Aquesta opció només funciona amb el GNOME" msgstr "Aquesta opció només funciona amb el GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "Després de la reproducció" msgstr "Després de la reproducció"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "No facis res" msgstr "No facis res"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "Congela l'últim fotograma" msgstr "Congela l'últim fotograma"
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "Surt de l'aplicació" msgstr "Surt de l'aplicació"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "Volum" msgstr "Volum"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "Valor inicial personalitzat" msgstr "Valor inicial personalitzat"
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "Estableix el volum personalitzat a l'inici en lloc de restaurar-lo" msgstr "Estableix el volum personalitzat a l'inici en lloc de restaurar-lo"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "Percentatge de volum" msgstr "Percentatge de volum"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "Cerca" msgstr "Cerca"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "Mode" msgstr "Mode"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "Acurat" msgstr "Acurat"
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "Ràpid" msgstr "Ràpid"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "Unitat" msgstr "Unitat"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "Segon" msgstr "Segon"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "Minut" msgstr "Minut"
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "Percentatge" msgstr "Percentatge"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "Valor" msgstr "Valor"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "Àudio" msgstr "Àudio"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "Desplaçament en mil·lisegons" msgstr "Desplaçament en mil·lisegons"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "Només formats d'àudio natius" msgstr "Només formats d'àudio natius"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "Subtítols" msgstr "Subtítols"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "Tipus de lletra per defecte" msgstr "Tipus de lletra per defecte"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "Xarxa" msgstr "Xarxa"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "Client" msgstr "Client"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "Memòria intermèdia de baixada progressiva" msgstr "Memòria intermèdia de baixada progressiva"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "Servidor" msgstr "Servidor"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "Controla el reproductor remotament" msgstr "Controla el reproductor remotament"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "Port d'escolta" msgstr "Port d'escolta"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr "Executa l'aplicació web en segon pla"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Requereix el GTK compilat amb el backend Broadway"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Port de l'aplicació web"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Prefereix la transmissió adaptativa"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Qualitat màxima"
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "Ajustaments" msgstr "Ajustaments"
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "Aparença" msgstr "Aparença"
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "Tema fosc" msgstr "Tema fosc"
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "Renderitza les ombres de la finestra" msgstr "Renderitza les ombres de la finestra"
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "Inhabilita per augmentar el rendiment en mode finestra" msgstr "Inhabilita per augmentar el rendiment en mode finestra"
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "Classificació dels connectors" msgstr "Classificació dels connectors"
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "Altera els rangs predeterminats dels connectors del GStreamer" msgstr "Altera els rangs predeterminats dels connectors del GStreamer"
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "Usa playbin3" msgstr "Usa playbin3"
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "Requereix reiniciar el reproductor" msgstr "Requereix reiniciar el reproductor"
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "Experimental" msgstr "Experimental"
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "Usa PipeWire per la sortida d'àudio" msgstr "Usa PipeWire per la sortida d'àudio"
@@ -445,15 +424,15 @@ msgstr "Ícar Nin Solana <icar.nin@protonmail.com>, 2021"
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "Acaba a la/les %s" msgstr "Acaba a la/les %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "Sense determinar" msgstr "Sense determinar"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "Canals" msgstr "Canals"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "Deshabilitat" msgstr "Deshabilitat"

View File

@@ -8,21 +8,21 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: com.github.rafostar.Clapper\n" "Project-Id-Version: com.github.rafostar.Clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n" "Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr ""
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -41,12 +41,11 @@ msgstr ""
msgid "Speed" msgid "Speed"
msgstr "" msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr ""
@@ -118,7 +117,7 @@ msgstr ""
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr ""
@@ -182,203 +181,183 @@ msgstr ""
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr ""
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr ""
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "" msgstr ""
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr ""
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "" msgstr ""
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr ""
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr ""
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "" msgstr ""
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "" msgstr ""
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr ""
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr ""
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "" msgstr ""
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "" msgstr ""
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr ""
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "" msgstr ""
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "" msgstr ""
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr ""
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr ""
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr ""
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr ""
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr ""
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr ""
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr ""
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr ""
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr ""
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr ""
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "" msgstr ""
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "" msgstr ""
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "" msgstr ""
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "" msgstr ""
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "" msgstr ""
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "" msgstr ""
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "" msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "" msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr ""
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr ""
@@ -445,14 +424,14 @@ msgstr ""
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr ""
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr ""
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""

135
po/cs.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-19 20:57\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Czech\n" "Language-Team: Czech\n"
"Language: cs_CZ\n" "Language: cs_CZ\n"
@@ -18,12 +18,12 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "Otevřít soubory..." msgstr "Otevřít soubory"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "Otevřít URI..." msgstr "Otevřít URI"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
@@ -41,12 +41,11 @@ msgstr "O aplikaci Clapper"
msgid "Speed" msgid "Speed"
msgstr "Rychlost" msgstr "Rychlost"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "Normální" msgstr "Normální"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "Obecné" msgstr "Obecné"
@@ -118,7 +117,7 @@ msgstr "Změnit režim opakování"
msgid "Export to file" msgid "Export to file"
msgstr "Exportovat do souboru" msgstr "Exportovat do souboru"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "Přehrávání" msgstr "Přehrávání"
@@ -182,203 +181,183 @@ msgstr "Dekodéry"
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "Zpět do předvoleb" msgstr "Zpět do předvoleb"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "Chování" msgstr "Chování"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "Automaticky na celou obrazovku" msgstr "Automaticky na celou obrazovku"
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Přejít do režimu na celou obrazovku při nahrazení seznamu skladeb s výjimkou plovoucího režimu" msgstr "Přejít do režimu na celou obrazovku při nahrazení seznamu skladeb s výjimkou plovoucího režimu"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "Zeptat se na obnovení nedávných médií" msgstr "Zeptat se na obnovení nedávných médií"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "Plovoucí režim na všech pracovních plochách" msgstr "Plovoucí režim na všech pracovních plochách"
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "Tato možnost funguje pouze na GNOME" msgstr "Tato možnost funguje pouze na GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "Po skončení přehrávání" msgstr "Po skončení přehrávání"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "Nedělat nic" msgstr "Nedělat nic"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "Zůstat na posledním snímku" msgstr "Zůstat na posledním snímku"
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "Zavřít aplikaci" msgstr "Zavřít aplikaci"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "Hlasitost" msgstr "Hlasitost"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "Vlastní počáteční hodnota" msgstr "Vlastní počáteční hodnota"
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "Nastavit vlastní hlasitost při spuštění namísto obnovení předchozí hodnoty" msgstr "Nastavit vlastní hlasitost při spuštění namísto obnovení předchozí hodnoty"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "Procento hlasitosti" msgstr "Procento hlasitosti"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "Přetáčení" msgstr "Přetáčení"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "Režim" msgstr "Režim"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "Přesný" msgstr "Přesný"
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "Rychlý" msgstr "Rychlý"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "Jednotka" msgstr "Jednotka"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "Sekundy" msgstr "Sekundy"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "Minuty" msgstr "Minuty"
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "Procenta" msgstr "Procenta"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "Hodnota" msgstr "Hodnota"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "Zvuk" msgstr "Zvuk"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "Posunutí v milisekundách" msgstr "Posunutí v milisekundách"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "Pouze nativní formáty zvuku" msgstr "Pouze nativní formáty zvuku"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "Titulky" msgstr "Titulky"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "Výchozí styl písma" msgstr "Výchozí styl písma"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "Síť" msgstr "Síť"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "Klient" msgstr "Klient"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "Postupné stahování do vyrovnávací paměti" msgstr "Postupné stahování do vyrovnávací paměti"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "Server" msgstr "Server"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "Vzdáleně ovládat přehrávač" msgstr "Vzdáleně ovládat přehrávač"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "Naslouchat na portu" msgstr "Naslouchat na portu"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr "Spustit webovou aplikaci na pozadí"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Vyžaduje GTK kompilovaný s Broadway backendem"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Port webové aplikace"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Preferovat adaptivní streamování"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Maximální kvalita"
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "Vylepšení" msgstr "Vylepšení"
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "Vzhled" msgstr "Vzhled"
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "Tmavý motiv" msgstr "Tmavý motiv"
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "Vykreslovat stíny okna" msgstr "Vykreslovat stíny okna"
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "Zakázat pro zvýšení výkonu" msgstr "Zakázat pro zvýšení výkonu"
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "Pořadí pluginů" msgstr "Pořadí pluginů"
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "Změna výchozího pořadí zásuvných modulů GStreameru" msgstr "Změna výchozího pořadí zásuvných modulů GStreameru"
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "Použít playbin3" msgstr "Použít playbin3"
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "Vyžaduje restart přehrávače" msgstr "Vyžaduje restart přehrávače"
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "Experimentální" msgstr "Experimentální"
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "Použít PipeWire pro zvukový výstup" msgstr "Použít PipeWire pro zvukový výstup"
@@ -445,15 +424,15 @@ msgstr "Vojtěch Perník <translations@pervoj.cz>"
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "Končí v: %s" msgstr "Končí v: %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "Neurčeno" msgstr "Neurčeno"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "Kanály" msgstr "Kanály"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "Vypnuto" msgstr "Vypnuto"

131
po/da.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Danish\n" "Language-Team: Danish\n"
"Language: da_DK\n" "Language: da_DK\n"
@@ -18,11 +18,11 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr ""
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -41,12 +41,11 @@ msgstr ""
msgid "Speed" msgid "Speed"
msgstr "" msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr ""
@@ -118,7 +117,7 @@ msgstr ""
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr ""
@@ -182,203 +181,183 @@ msgstr ""
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr ""
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr ""
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "" msgstr ""
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr ""
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "" msgstr ""
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr ""
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr ""
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "" msgstr ""
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "" msgstr ""
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr ""
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr ""
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "" msgstr ""
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "" msgstr ""
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr ""
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "" msgstr ""
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "" msgstr ""
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr ""
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr ""
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr ""
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr ""
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr ""
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr ""
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr ""
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr ""
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr ""
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr ""
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "" msgstr ""
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "" msgstr ""
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "" msgstr ""
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "" msgstr ""
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "" msgstr ""
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "" msgstr ""
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "" msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "" msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr ""
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr ""
@@ -445,15 +424,15 @@ msgstr ""
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr ""
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr ""
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""

137
po/de.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n" "PO-Revision-Date: 2022-05-27 16:27\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: German\n" "Language-Team: German\n"
"Language: de_DE\n" "Language: de_DE\n"
@@ -18,12 +18,12 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "Dateien öffnen..." msgstr "Dateien öffnen"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "Webquelle öffnen..." msgstr "Webquelle öffnen"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
@@ -41,12 +41,11 @@ msgstr "Über Clapper"
msgid "Speed" msgid "Speed"
msgstr "Wiedergabegeschwindigkeit" msgstr "Wiedergabegeschwindigkeit"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "Normal" msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "Allgemein" msgstr "Allgemein"
@@ -118,7 +117,7 @@ msgstr "Wiederholmodus ändern"
msgid "Export to file" msgid "Export to file"
msgstr "Als Datei exportieren" msgstr "Als Datei exportieren"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "Wiedergabe" msgstr "Wiedergabe"
@@ -182,203 +181,183 @@ msgstr "Decodierer"
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "Zurück zu den Einstellungen" msgstr "Zurück zu den Einstellungen"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "Verhalten" msgstr "Verhalten"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "Automatischer Vollbildmodus" msgstr "Automatischer Vollbildmodus"
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Vollbildmodus betreten, wenn Wiedergabeliste ersetzt wird. (Außer Clapper befindet sich im Schwebemodus)" msgstr "Vollbildmodus betreten, wenn Wiedergabeliste ersetzt wird. (Außer Clapper befindet sich im Schwebemodus)"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "Nachfragen ob kürzlich wiedergegebene Medien weitergespielt werden sollen" msgstr "Nachfragen ob kürzlich wiedergegebene Medien weitergespielt werden sollen"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "Schwebemodus auf allen Arbeitsflächen" msgstr "Schwebemodus auf allen Arbeitsflächen"
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "Diese Option funktioniert nur auf GNOME" msgstr "Diese Option funktioniert nur auf GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "Nach Wiedergabe" msgstr "Nach Wiedergabe"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "Nichts tun" msgstr "Nichts tun"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "Letztes Bild einfrieren" msgstr "Letztes Bild einfrieren"
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "Anwendung beenden" msgstr "Anwendung beenden"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "Lautstärke" msgstr "Lautstärke"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "Benutzerdefinierter Anfangswert" msgstr "Benutzerdefinierter Anfangswert"
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "Lautstärke auf einen fixierten Wert beim Start setzen, anstelle ihn wiederherzustellen." msgstr "Lautstärke auf einen fixierten Wert beim Start setzen, anstelle ihn wiederherzustellen."
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "Lautstärke (in Prozent)" msgstr "Lautstärke (in Prozent)"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "Springen" msgstr "Springen"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "Modus" msgstr "Modus"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "Genau" msgstr "Genau"
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "Schnell" msgstr "Schnell"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "Einheit" msgstr "Einheit"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "Sekunden" msgstr "Sekunden"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "Minuten" msgstr "Minuten"
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "Prozentsatz" msgstr "Prozentsatz"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "Wert" msgstr "Wert"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "Audio" msgstr "Audio"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "Verschiebung in Millisekunden" msgstr "Verschiebung in Millisekunden"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "Nur systemeigene Audioformate" msgstr "Nur systemeigene Audioformate"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "Untertitel" msgstr "Untertitel"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "Standartschriftart" msgstr "Standartschriftart"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "Netzwerk" msgstr "Netzwerk"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "Client" msgstr "Client"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "Fortschreitender Download-Puffer" msgstr "Fortschreitender Download-Puffer"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "Server" msgstr "Server"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "Clapper fernsteuern" msgstr "Clapper fernsteuern"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "Empfangsport" msgstr "Empfangsport"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr "Webanwendung im Hintergrund starten"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Benötigt, dass GTK mit Broadway Unterstützung kompiliert wurde"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Webanwendungsport"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Bevorzuge adaptives Streaming"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Höchste Qualität"
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "Optimierungen" msgstr "Optimierungen"
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "Erscheinungsbild" msgstr "Erscheinungsbild"
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "Dunkler Modus" msgstr "Dunkler Modus"
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "Fensterschatten darstellen" msgstr "Fensterschatten darstellen"
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "Deaktivieren, um Performance im Fenstermodus zu verbessern" msgstr "Deaktivieren, um Performance im Fenstermodus zu verbessern"
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "Plugin-Reihenfolge" msgstr "Plugin-Reihenfolge"
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "Standard GStreamer Reihenfolge verändern" msgstr "Standard GStreamer Reihenfolge verändern"
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "Playbin3 benutzen" msgstr "Playbin3 benutzen"
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "Benötigt Neustart von Clapper" msgstr "Benötigt Neustart von Clapper"
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "Experimentell" msgstr "Experimentell"
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "PipeWire für Audioausgabe verwenden" msgstr "PipeWire für Audioausgabe verwenden"
@@ -438,22 +417,22 @@ msgstr "Ein von GStreamer betriebener GNOME Multimedia-Player"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated #. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305 #: src/dialogs.js:305
msgid "translator-credits" msgid "translator-credits"
msgstr "" msgstr "Florian \"sp1rit\" <sp1rit@disroot.org>"
#: src/revealers.js:170 #: src/revealers.js:170
#, javascript-format #, javascript-format
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "Ended um %s" msgstr "Ended um %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "Unbestimmet" msgstr "Unbestimmet"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "Audio-Kanäle" msgstr "Audio-Kanäle"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "Deaktiviert" msgstr "Deaktiviert"

131
po/el.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Greek\n" "Language-Team: Greek\n"
"Language: el_GR\n" "Language: el_GR\n"
@@ -18,11 +18,11 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr ""
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -41,12 +41,11 @@ msgstr ""
msgid "Speed" msgid "Speed"
msgstr "" msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr ""
@@ -118,7 +117,7 @@ msgstr ""
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr ""
@@ -182,203 +181,183 @@ msgstr ""
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr ""
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr ""
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "" msgstr ""
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr ""
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "" msgstr ""
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr ""
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr ""
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "" msgstr ""
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "" msgstr ""
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr ""
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr ""
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "" msgstr ""
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "" msgstr ""
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr ""
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "" msgstr ""
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "" msgstr ""
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr ""
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr ""
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr ""
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr ""
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr ""
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr ""
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr ""
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr ""
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr ""
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr ""
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "" msgstr ""
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "" msgstr ""
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "" msgstr ""
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "" msgstr ""
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "" msgstr ""
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "" msgstr ""
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "" msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "" msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr ""
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr ""
@@ -445,15 +424,15 @@ msgstr ""
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr ""
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr ""
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""

171
po/es.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Spanish\n" "Language-Team: Spanish\n"
"Language: es_ES\n" "Language: es_ES\n"
@@ -18,12 +18,12 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "Abrir archivos" msgstr "Abrir archivos"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "Abrir URI" msgstr "Abrir URI"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
@@ -41,12 +41,11 @@ msgstr "Acerca de Clapper"
msgid "Speed" msgid "Speed"
msgstr "Velocidad" msgstr "Velocidad"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "Normal" msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "General" msgstr "General"
@@ -76,7 +75,7 @@ msgstr "Tocar"
#: ui/help-overlay.ui:39 #: ui/help-overlay.ui:39
msgid "Quit" msgid "Quit"
msgstr "Abandonar" msgstr "Renunciar"
#: ui/help-overlay.ui:47 #: ui/help-overlay.ui:47
msgid "Media" msgid "Media"
@@ -96,7 +95,7 @@ msgstr "Lista de reproducción"
#: ui/help-overlay.ui:67 #: ui/help-overlay.ui:67
msgid "Next item" msgid "Next item"
msgstr "Artículo siguiente" msgstr "Elemento siguiente"
#: ui/help-overlay.ui:68 #: ui/help-overlay.ui:68
msgid "Double tap (right side)" msgid "Double tap (right side)"
@@ -104,7 +103,7 @@ msgstr "Tocar doble (lado derecho)"
#: ui/help-overlay.ui:74 #: ui/help-overlay.ui:74
msgid "Previous item" msgid "Previous item"
msgstr "Artículo anterior" msgstr "Elemento anterior"
#: ui/help-overlay.ui:75 #: ui/help-overlay.ui:75
msgid "Double tap (left side)" msgid "Double tap (left side)"
@@ -112,13 +111,13 @@ msgstr "Tocar doble (lado izquierdo)"
#: ui/help-overlay.ui:81 #: ui/help-overlay.ui:81
msgid "Change repeat mode" msgid "Change repeat mode"
msgstr "Cambiar a modo repetición" msgstr "Cambiar a modo repetir"
#: ui/help-overlay.ui:87 #: ui/help-overlay.ui:87
msgid "Export to file" msgid "Export to file"
msgstr "Exportar a archivo" msgstr "Exportar a archivo"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "Reproducir" msgstr "Reproducir"
@@ -132,7 +131,7 @@ msgstr "Pulsación larga | Clic derecho"
#: ui/help-overlay.ui:105 #: ui/help-overlay.ui:105
msgid "Seek forward" msgid "Seek forward"
msgstr "Buscar adelante " msgstr "Buscar siguiente"
#: ui/help-overlay.ui:106 #: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right" msgid "Swipe right | Scroll right"
@@ -140,7 +139,7 @@ msgstr "Deslizar a derecha | Desplazar a derecha"
#: ui/help-overlay.ui:112 #: ui/help-overlay.ui:112
msgid "Seek backward" msgid "Seek backward"
msgstr "Buscar a atrás" msgstr "Buscar anterior"
#: ui/help-overlay.ui:113 #: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left" msgid "Swipe left | Scroll left"
@@ -168,11 +167,11 @@ msgstr "Fijar a mudo"
#: ui/help-overlay.ui:139 #: ui/help-overlay.ui:139
msgid "Next chapter" msgid "Next chapter"
msgstr "Siguiente capítulo" msgstr "Capítulo siguiente"
#: ui/help-overlay.ui:145 #: ui/help-overlay.ui:145
msgid "Previous chapter" msgid "Previous chapter"
msgstr "Anterior capítulo" msgstr "Capítulo anterior"
#: ui/preferences-plugin-ranking-subpage.ui:11 #: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders" msgid "Decoders"
@@ -182,205 +181,185 @@ msgstr "Decodificadores"
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "Regresar a preferencias" msgstr "Regresar a preferencias"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "Comportamiento" msgstr "Configuraciones"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "Pantalla completa automática" msgstr "Pantalla completa automática"
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Fijar a pantalla completa cuando se reemplaza la lista de reproducción, excepto el modo flotante" msgstr "Entra a pantalla completa cuando se reemplaza la lista de reproducción, excepto en modo flotante"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "Preguntar al reanudar los medios recientes" msgstr "Preguntar al reanudar los medios recientes"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "Flotar todos los espacios de trabajo" msgstr "Flotar todos los espacios de trabajo"
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "Esta opción solo funciona en GNOME" msgstr "Esta opción solo funciona en GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "Después de reproducción " msgstr "Después de reproducción "
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "Nada por hacer" msgstr "Nada por hacer"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "Congelar el último fotograma" msgstr "Detener último fotograma"
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "Cerrar la aplicación" msgstr "Cerrar la aplicación"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "Volumen" msgstr "Volumen"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "Valor inicial personalizado" msgstr "Valor inicial personalizado"
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "Establecer un volumen personalizado al inicio en lugar de restaurarlo" msgstr "Establece un volumen personalizado al inicio en lugar de restaurarlo"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "Porcentaje de volumen" msgstr "Porcentaje de volumen"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "Buscando" msgstr "Buscando"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "Modo" msgstr "Modo"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "Precisión" msgstr "Precisión"
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "Rápido" msgstr "Rápido"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "Unidad" msgstr "Unidad"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "Segundo" msgstr "Segundo"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "Minuto" msgstr "Minuto"
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "Porcentaje" msgstr "Porcentaje"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "Valor" msgstr "Valor"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "Audio" msgstr "Audio"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "Compensación en milisegundos" msgstr "Compensación en milisegundos"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "Solo formatos de audio nativos" msgstr "Solo formatos de audio nativos"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "Subtítulos" msgstr "Subtítulos"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "Fuente predeterminada" msgstr "Fuente por defecto"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "Red" msgstr "Red"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "Cliente" msgstr "Cliente"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "Bajada progresiva de búfer" msgstr "Bajada progresiva de búfer"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "Servidor" msgstr "Servidor"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "Controlar el reproductor remotamente" msgstr "Controlar el reproductor remotamente"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "Puerto de escucha" msgstr "Puerto de escucha"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr "Ejecutar la aplicación web en modo demonio"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Requiere GTK compilado con el backend de Broadway"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Puerto de la aplicación web"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Preferir la transmisión adaptativa "
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Calidad máxima"
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "Retoques" msgstr "Retoques"
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "Apariencia" msgstr "Apariencia"
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "Tema oscuro" msgstr "Tema oscuro"
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "Renderizar sombras de ventana" msgstr "Renderizar sombras de ventana"
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "Desactivar para aumentar el rendimiento cuando se abre en ventana" msgstr "Deshabilitado aumenta el rendimiento cuando se abre en ventana"
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "Rango de enchufes" msgstr "Rango de enchufes"
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "Alterar los rangos predeterminados de los enchufes de GStreamer" msgstr "Altera los rangos predeterminados de los enchufes de GStreamer"
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "Usar Playbin3" msgstr "Usar Playbin3"
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "Require reiniciar el reproductor" msgstr "Require reiniciar el reproductor"
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "Experimental" msgstr "Experimental"
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "Usar PipeWire para la salida de audio" msgstr "Usar PipeWire"
#: src/buttons.js:201 #: src/buttons.js:201
#, javascript-format #, javascript-format
@@ -389,7 +368,7 @@ msgstr "Decodificador: %s"
#: src/dialogs.js:152 #: src/dialogs.js:152
msgid "Enter or drop URI here" msgid "Enter or drop URI here"
msgstr "Intoducir la URI aquí" msgstr "Introducir la URI"
#: src/dialogs.js:157 #: src/dialogs.js:157
msgid "Cancel" msgid "Cancel"
@@ -445,15 +424,15 @@ msgstr "carlosgonz"
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "Termina en: %s" msgstr "Termina en: %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "Indeterminado" msgstr "Indeterminado"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "Canales" msgstr "Canales"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "Deshabilitado" msgstr "Deshabilitar"

438
po/eu.po Normal file
View File

@@ -0,0 +1,438 @@
msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n"
"Language-Team: Basque\n"
"Language: eu_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: clapper\n"
"X-Crowdin-Project-ID: 473374\n"
"X-Crowdin-Language: eu\n"
"X-Crowdin-File: /master/po/com.github.rafostar.Clapper.pot\n"
"X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6
msgid "Open Files…"
msgstr "Artxiboak ireki…"
#: ui/clapper.ui:10
msgid "Open URI…"
msgstr "Ireki URI…"
#: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences"
msgstr "Hobespenak"
#: ui/clapper.ui:20
msgid "Shortcuts"
msgstr "Lasterbideak"
#: ui/clapper.ui:26
msgid "About Clapper"
msgstr "Clapperi buruz"
#: ui/elapsed-time-button.ui:27
msgid "Speed"
msgstr "Abiadura"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
msgid "Normal"
msgstr "Normala"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General"
msgstr "Orokorra"
#: ui/help-overlay.ui:13
msgid "Show shortcuts"
msgstr "Erakutsi lasterbideak"
#: ui/help-overlay.ui:19
msgid "Toggle fullscreen"
msgstr "Aktibatu pantaila osoa"
#: ui/help-overlay.ui:20
msgid "Double tap | Double click"
msgstr "Ukitu bikoitza / Bikoitza klik"
#: ui/help-overlay.ui:26
msgid "Leave fullscreen"
msgstr "Pantaila osoa utzi"
#: ui/help-overlay.ui:32
msgid "Reveal OSD (fullscreen only)"
msgstr "OSD errebelatu (pantaila osoan bakarrik)"
#: ui/help-overlay.ui:33
msgid "Tap"
msgstr "Ukitu"
#: ui/help-overlay.ui:39
msgid "Quit"
msgstr "Irten"
#: ui/help-overlay.ui:47
msgid "Media"
msgstr "Media"
#: ui/help-overlay.ui:50
msgid "Open files"
msgstr "Artxiboak ireki"
#: ui/help-overlay.ui:56 src/dialogs.js:137
msgid "Open URI"
msgstr "Ireki URI"
#: ui/help-overlay.ui:64
msgid "Playlist"
msgstr "Erreprodukzio-zerrenda"
#: ui/help-overlay.ui:67
msgid "Next item"
msgstr "Hurrengo elementua"
#: ui/help-overlay.ui:68
msgid "Double tap (right side)"
msgstr "Ukitu bikoitza (eskuineko aldea)"
#: ui/help-overlay.ui:74
msgid "Previous item"
msgstr "Aurreko elementua"
#: ui/help-overlay.ui:75
msgid "Double tap (left side)"
msgstr "Ukitu bikoitza (ezkerreko aldea)"
#: ui/help-overlay.ui:81
msgid "Change repeat mode"
msgstr "Errepikapen modua aldatu"
#: ui/help-overlay.ui:87
msgid "Export to file"
msgstr "Esportatu fitxategira"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback"
msgstr "Erreprodukzioa"
#: ui/help-overlay.ui:98
msgid "Toggle play"
msgstr "Erreprodukzioa aktibatu"
#: ui/help-overlay.ui:99
msgid "Long press | Right click"
msgstr "Pultsazio luzea / Eskuineko klik"
#: ui/help-overlay.ui:105
msgid "Seek forward"
msgstr "Aurrerapena bilatu"
#: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right"
msgstr "Eskuinera irristatu / Eskuinera joan"
#: ui/help-overlay.ui:112
msgid "Seek backward"
msgstr "Atzerantz bilatu"
#: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left"
msgstr "Ezkerrera irristatu / Ezkerrera mugitu"
#: ui/help-overlay.ui:119
msgid "Volume up"
msgstr "Bolumena igo"
#: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up"
msgstr "Gorantz irristatu / Gorantz mugitu"
#: ui/help-overlay.ui:126
msgid "Volume down"
msgstr "Bolumena jeitsi"
#: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down"
msgstr "Beherantz irristatu / Beherantz mugitu"
#: ui/help-overlay.ui:133
msgid "Toggle mute"
msgstr "Aktibatu isiltasuna"
#: ui/help-overlay.ui:139
msgid "Next chapter"
msgstr "Hurrengo kapitulua"
#: ui/help-overlay.ui:145
msgid "Previous chapter"
msgstr "Aurreko kapitulua"
#: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders"
msgstr "Deskodetzaileak"
#: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences"
msgstr "Itzuli ezarpenetara"
#: ui/preferences-window.ui:15
msgid "Behavior"
msgstr "Portaera"
#: ui/preferences-window.ui:18
msgid "Auto fullscreen"
msgstr "Pantaila osoa automatikoa"
#: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Pantaila osoan sartu erreprodukzio-zerrenda ordezten denean, flotatzeko modua izan ezik"
#: ui/preferences-window.ui:25
msgid "Ask to resume recent media"
msgstr "Azkenaldiko media berriro ekiteko eskatzea"
#: ui/preferences-window.ui:31
msgid "Float on all workspaces"
msgstr "Laneko espazio guztietan flotatzea"
#: ui/preferences-window.ui:32
msgid "This option only works on GNOME"
msgstr "Aukera honek GNOMEn bakarrik funtzionatzen du"
#: ui/preferences-window.ui:38
msgid "After playback"
msgstr "Erreprodukzioaren ondoren"
#: ui/preferences-window.ui:43
msgid "Do nothing"
msgstr "Ez egin ezer"
#: ui/preferences-window.ui:44
msgid "Freeze last frame"
msgstr "Izoztu azken fotograma"
#: ui/preferences-window.ui:45
msgid "Close the app"
msgstr "Aplikazioa itxi"
#: ui/preferences-window.ui:55
msgid "Volume"
msgstr "Bolumena"
#: ui/preferences-window.ui:58
msgid "Custom initial value"
msgstr "Hasierako balio pertsonalizatua"
#: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it"
msgstr "Hasieran bolumen pertsonalizatua ezartzea, lehengoratu beharrean"
#: ui/preferences-window.ui:63
msgid "Volume percentage"
msgstr "Bolumenaren ehunekoa"
#: ui/preferences-window.ui:74
msgid "Seeking"
msgstr "Bilaketa"
#: ui/preferences-window.ui:77
msgid "Mode"
msgstr "Modua"
#: ui/preferences-window.ui:83
msgid "Accurate"
msgstr "Zehatza"
#: ui/preferences-window.ui:84
msgid "Fast"
msgstr "Azkarra"
#: ui/preferences-window.ui:92
msgid "Unit"
msgstr "Unitatea"
#: ui/preferences-window.ui:97
msgid "Second"
msgstr "Segundu"
#: ui/preferences-window.ui:98
msgid "Minute"
msgstr "Minutu"
#: ui/preferences-window.ui:99
msgid "Percentage"
msgstr "Ehunekoa"
#: ui/preferences-window.ui:107
msgid "Value"
msgstr "Balioa"
#: ui/preferences-window.ui:122
msgid "Audio"
msgstr "Audioa"
#: ui/preferences-window.ui:125
msgid "Offset in milliseconds"
msgstr "Desplazamendua milisegundotan"
#: ui/preferences-window.ui:132
msgid "Only native audio formats"
msgstr "Jatorrizko audio-formatuak bakarrik"
#: ui/preferences-window.ui:140
msgid "Subtitles"
msgstr "Azpitituluak"
#: ui/preferences-window.ui:143
msgid "Default font"
msgstr "Hizki lehenetsia"
#: ui/preferences-window.ui:153
msgid "Network"
msgstr "Sarea"
#: ui/preferences-window.ui:157
msgid "Client"
msgstr "Bezeroa"
#: ui/preferences-window.ui:160
msgid "Progressive download buffering"
msgstr "Deskargak pixkanaka bufferizatzea"
#: ui/preferences-window.ui:168
msgid "Server"
msgstr "Zerbitzaria"
#: ui/preferences-window.ui:171
msgid "Control player remotely"
msgstr "Urrutiko erreproduzitzailea kontrolatzea"
#: ui/preferences-window.ui:175
msgid "Listening port"
msgstr "Entzuteko ataka"
#: ui/preferences-window.ui:188
msgid "Tweaks"
msgstr "Ukituak"
#: ui/preferences-window.ui:192
msgid "Appearance"
msgstr "Itxura"
#: ui/preferences-window.ui:195
msgid "Dark theme"
msgstr "Gai iluna"
#: ui/preferences-window.ui:201
msgid "Render window shadows"
msgstr "Leihoetako itzalak errenderizatzea"
#: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed"
msgstr "Desaktibatu leihoa erabiltzen denean errendimendua handitzeko"
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr "Pluginen sailkapena"
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr "Aldatu GStreamer-en pluginen lehenetsitako mailak"
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr "Playbin3 erabili"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr "Berrabiaraztea eskatzen du"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
msgstr "Esperimentala"
#: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output"
msgstr "Erabili PipeWire audio-irteerarako"
#: src/buttons.js:201
#, javascript-format
msgid "Decoder: %s"
msgstr "Deskodetzailea: %s"
#: src/dialogs.js:152
msgid "Enter or drop URI here"
msgstr "Sartu edo utzi URIa erortzen hemen"
#: src/dialogs.js:157
msgid "Cancel"
msgstr "Ezeztatu"
#: src/dialogs.js:158
msgid "Open"
msgstr "Ireki"
#: src/dialogs.js:226
msgid "Title"
msgstr "Titulua"
#: src/dialogs.js:227
msgid "Completed"
msgstr "Osatuta"
#: src/dialogs.js:235
msgid "Resume playback?"
msgstr "Jarraitu erreprodukzioarekin?"
#: src/dialogs.js:289
#, javascript-format
msgid "GTK version: %s"
msgstr "GTK bertsioa: %s"
#: src/dialogs.js:290
#, javascript-format
msgid "Adwaita version: %s"
msgstr "Adwaitaren bertsioa: %s"
#: src/dialogs.js:291
#, javascript-format
msgid "GStreamer version: %s"
msgstr "GStreamer-en bertsioa: %s"
#: src/dialogs.js:292
#, javascript-format
msgid "GJS version: %s"
msgstr "GJS bertsioa: %s"
#: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer"
msgstr "GNOMEren multimedia erreproduzitzaile bat GStreamer-ekin"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305
msgid "translator-credits"
msgstr "Sergio Varela (@IngrownMink4)"
#: src/revealers.js:170
#, javascript-format
msgid "Ends at: %s"
msgstr "Amaiera: %s"
#: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined"
msgstr "Zehaztugabea"
#: src/widget.js:242
msgid "Channels"
msgstr "Kanalak"
#: src/widget.js:260
msgid "Disabled"
msgstr "Desgaituta"

131
po/fi.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Finnish\n" "Language-Team: Finnish\n"
"Language: fi_FI\n" "Language: fi_FI\n"
@@ -18,11 +18,11 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr ""
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -41,12 +41,11 @@ msgstr ""
msgid "Speed" msgid "Speed"
msgstr "" msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr ""
@@ -118,7 +117,7 @@ msgstr ""
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr ""
@@ -182,203 +181,183 @@ msgstr ""
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr ""
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr ""
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "" msgstr ""
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr ""
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "" msgstr ""
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr ""
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr ""
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "" msgstr ""
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "" msgstr ""
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr ""
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr ""
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "" msgstr ""
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "" msgstr ""
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr ""
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "" msgstr ""
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "" msgstr ""
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr ""
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr ""
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr ""
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr ""
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr ""
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr ""
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr ""
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr ""
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr ""
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr ""
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "" msgstr ""
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "" msgstr ""
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "" msgstr ""
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "" msgstr ""
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "" msgstr ""
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "" msgstr ""
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "" msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "" msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr ""
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr ""
@@ -445,15 +424,15 @@ msgstr ""
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr ""
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr ""
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""

377
po/fr.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: French\n" "Language-Team: French\n"
"Language: fr_FR\n" "Language: fr_FR\n"
@@ -18,442 +18,421 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr "Ouvrir un fichier…"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr "Ouvrir une URL…"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
msgstr "" msgstr "Préférences"
#: ui/clapper.ui:20 #: ui/clapper.ui:20
msgid "Shortcuts" msgid "Shortcuts"
msgstr "" msgstr "Raccourcis clavier"
#: ui/clapper.ui:26 #: ui/clapper.ui:26
msgid "About Clapper" msgid "About Clapper"
msgstr "" msgstr "Á propos de Clapper"
#: ui/elapsed-time-button.ui:27 #: ui/elapsed-time-button.ui:27
msgid "Speed" msgid "Speed"
msgstr "" msgstr "Vitesse"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr "Général"
#: ui/help-overlay.ui:13 #: ui/help-overlay.ui:13
msgid "Show shortcuts" msgid "Show shortcuts"
msgstr "" msgstr "Montrer les raccourcis"
#: ui/help-overlay.ui:19 #: ui/help-overlay.ui:19
msgid "Toggle fullscreen" msgid "Toggle fullscreen"
msgstr "" msgstr "Basculer en plein écran"
#: ui/help-overlay.ui:20 #: ui/help-overlay.ui:20
msgid "Double tap | Double click" msgid "Double tap | Double click"
msgstr "" msgstr "Tapoter/cliquer deux fois"
#: ui/help-overlay.ui:26 #: ui/help-overlay.ui:26
msgid "Leave fullscreen" msgid "Leave fullscreen"
msgstr "" msgstr "Sortir du plein écran"
#: ui/help-overlay.ui:32 #: ui/help-overlay.ui:32
msgid "Reveal OSD (fullscreen only)" msgid "Reveal OSD (fullscreen only)"
msgstr "" msgstr "Afficher les commandes de lecture (seulement en plein écran)"
#: ui/help-overlay.ui:33 #: ui/help-overlay.ui:33
msgid "Tap" msgid "Tap"
msgstr "" msgstr "Taper"
#: ui/help-overlay.ui:39 #: ui/help-overlay.ui:39
msgid "Quit" msgid "Quit"
msgstr "" msgstr "Quitter"
#: ui/help-overlay.ui:47 #: ui/help-overlay.ui:47
msgid "Media" msgid "Media"
msgstr "" msgstr "Média"
#: ui/help-overlay.ui:50 #: ui/help-overlay.ui:50
msgid "Open files" msgid "Open files"
msgstr "" msgstr "Ouvrir un fichier"
#: ui/help-overlay.ui:56 src/dialogs.js:137 #: ui/help-overlay.ui:56 src/dialogs.js:137
msgid "Open URI" msgid "Open URI"
msgstr "" msgstr "Ouvrir une URL"
#: ui/help-overlay.ui:64 #: ui/help-overlay.ui:64
msgid "Playlist" msgid "Playlist"
msgstr "" msgstr "Playlist"
#: ui/help-overlay.ui:67 #: ui/help-overlay.ui:67
msgid "Next item" msgid "Next item"
msgstr "" msgstr "Prochain média"
#: ui/help-overlay.ui:68 #: ui/help-overlay.ui:68
msgid "Double tap (right side)" msgid "Double tap (right side)"
msgstr "" msgstr "Tapoter deux fois (côté droit)"
#: ui/help-overlay.ui:74 #: ui/help-overlay.ui:74
msgid "Previous item" msgid "Previous item"
msgstr "" msgstr "Média précédent"
#: ui/help-overlay.ui:75 #: ui/help-overlay.ui:75
msgid "Double tap (left side)" msgid "Double tap (left side)"
msgstr "" msgstr "Tapoter deux fois (côté gauche)"
#: ui/help-overlay.ui:81 #: ui/help-overlay.ui:81
msgid "Change repeat mode" msgid "Change repeat mode"
msgstr "" msgstr "Changer le mode de répétition"
#: ui/help-overlay.ui:87 #: ui/help-overlay.ui:87
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr "Exporter vers un fichier"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr "Lecture"
#: ui/help-overlay.ui:98 #: ui/help-overlay.ui:98
msgid "Toggle play" msgid "Toggle play"
msgstr "" msgstr "Relancer/stopper la lecture"
#: ui/help-overlay.ui:99 #: ui/help-overlay.ui:99
msgid "Long press | Right click" msgid "Long press | Right click"
msgstr "" msgstr "Longue pression | Clic droit"
#: ui/help-overlay.ui:105 #: ui/help-overlay.ui:105
msgid "Seek forward" msgid "Seek forward"
msgstr "" msgstr "Avancer dans la lecture"
#: ui/help-overlay.ui:106 #: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right" msgid "Swipe right | Scroll right"
msgstr "" msgstr "Glisser/Faire défiler vers la droite"
#: ui/help-overlay.ui:112 #: ui/help-overlay.ui:112
msgid "Seek backward" msgid "Seek backward"
msgstr "" msgstr "Reculer dans la lecture"
#: ui/help-overlay.ui:113 #: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left" msgid "Swipe left | Scroll left"
msgstr "" msgstr "Glisser/Faire défiler vers la gauche"
#: ui/help-overlay.ui:119 #: ui/help-overlay.ui:119
msgid "Volume up" msgid "Volume up"
msgstr "" msgstr "Augmenter le volume"
#: ui/help-overlay.ui:120 #: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up" msgid "Swipe up | Scroll up"
msgstr "" msgstr "Glisser/Défiler vers le haut"
#: ui/help-overlay.ui:126 #: ui/help-overlay.ui:126
msgid "Volume down" msgid "Volume down"
msgstr "" msgstr "Baisser le volume"
#: ui/help-overlay.ui:127 #: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down" msgid "Swipe down | Scroll down"
msgstr "" msgstr "Glisser/Défiler vers le bas"
#: ui/help-overlay.ui:133 #: ui/help-overlay.ui:133
msgid "Toggle mute" msgid "Toggle mute"
msgstr "" msgstr "Basculer le mode silencieux"
#: ui/help-overlay.ui:139 #: ui/help-overlay.ui:139
msgid "Next chapter" msgid "Next chapter"
msgstr "" msgstr "Prochain chapitre"
#: ui/help-overlay.ui:145 #: ui/help-overlay.ui:145
msgid "Previous chapter" msgid "Previous chapter"
msgstr "" msgstr "Chapitre précédent"
#: ui/preferences-plugin-ranking-subpage.ui:11 #: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders" msgid "Decoders"
msgstr "" msgstr "Décodeurs"
#: ui/preferences-plugin-ranking-subpage.ui:18 #: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr "Retourner aux préférences"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr "Comportement"
#: ui/preferences-window.ui:18
msgid "Auto fullscreen"
msgstr "Lecture automatique en plein écran"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr "Basculer en plein écran quand la playlisyt est remplacée sauf si le mode flottant est activé"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr "Demander pour reprendre à la position des médias récents"
#: ui/preferences-window.ui:31
msgid "Float on all workspaces"
msgstr "Flotter sur tous les bureaux virtuels"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr "Cette option ne marche qu'avec GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr "Après la lecture"
#: ui/preferences-window.ui:43
msgid "Do nothing"
msgstr "Ne rien faire"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:44
msgid "Do nothing" msgid "Freeze last frame"
msgstr "" msgstr "Geler la dernière image"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:46
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr "Fermer l'application"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr "Volume"
#: ui/preferences-window.ui:58
msgid "Custom initial value"
msgstr "Valeur initiale personnalisée"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr "Régler une valeur personnalisée du volume au démarrage au lien de restorer la valeur précédente"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr "Pourcentage du volume"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr "Avancement"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr "Comportement"
#: ui/preferences-window.ui:83
msgid "Accurate"
msgstr "Précis"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:85
msgid "Fast" msgid "Fast"
msgstr "" msgstr "Rapide"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr "Unité des sauts"
#: ui/preferences-window.ui:97
msgid "Second"
msgstr "Seconde"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:98
msgid "Second" msgid "Minute"
msgstr "" msgstr "Minute"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:100
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr "Pourcentage"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr "Longueur du saut"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr "Audio"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr "Décalage en millisecondes"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr "Seulement des formats audios natifs"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr "Sous-titres"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr "Police par défaut"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr "Réseau"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr "Client"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr "Téléchargement progressif dans le tampon"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr "Serveur"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr "Controler le lecteur à distance"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr "Écouter sur le port"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background" msgid "Tweaks"
msgstr "" msgstr "Réglages"
#: ui/preferences-window.ui:184 #: ui/preferences-window.ui:192
msgid "Requires GTK compiled with Broadway backend" msgid "Appearance"
msgstr "" msgstr "Apparence"
#: ui/preferences-window.ui:190 #: ui/preferences-window.ui:195
msgid "Web application port" msgid "Dark theme"
msgstr "" msgstr "Thème sombre"
#: ui/preferences-window.ui:204 #: ui/preferences-window.ui:201
msgid "Prefer adaptive streaming" msgid "Render window shadows"
msgstr "" msgstr "Afficher les ombres de la fenêtre"
#: ui/preferences-window.ui:210 #: ui/preferences-window.ui:202
msgid "Max quality" msgid "Disable to increase performance when windowed"
msgstr "" msgstr "Désactiver pour améliorer les performances quand fenêtré"
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr "Liste des plugins"
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr "Changer les options par défaut de plugins GStreamer"
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr "Utiliser playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr "Requiert le redémarrage du lecteur"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
msgstr "Expérimental"
#: ui/preferences-window.ui:228 #: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr "Utiliser PipeWire pour la sortie audio"
#: src/buttons.js:201 #: src/buttons.js:201
#, javascript-format #, javascript-format
msgid "Decoder: %s" msgid "Decoder: %s"
msgstr "" msgstr "Décodeur: %s"
#: src/dialogs.js:152 #: src/dialogs.js:152
msgid "Enter or drop URI here" msgid "Enter or drop URI here"
msgstr "" msgstr "Entrer ou déposer une URL ici"
#: src/dialogs.js:157 #: src/dialogs.js:157
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr "Annuler"
#: src/dialogs.js:158 #: src/dialogs.js:158
msgid "Open" msgid "Open"
msgstr "" msgstr "Ouvrir"
#: src/dialogs.js:226 #: src/dialogs.js:226
msgid "Title" msgid "Title"
msgstr "" msgstr "Titre"
#: src/dialogs.js:227 #: src/dialogs.js:227
msgid "Completed" msgid "Completed"
msgstr "" msgstr "Terminé"
#: src/dialogs.js:235 #: src/dialogs.js:235
msgid "Resume playback?" msgid "Resume playback?"
msgstr "" msgstr "Reprendre la lecture?"
#: src/dialogs.js:289 #: src/dialogs.js:289
#, javascript-format #, javascript-format
msgid "GTK version: %s" msgid "GTK version: %s"
msgstr "" msgstr "Version de GTK: %s"
#: src/dialogs.js:290 #: src/dialogs.js:290
#, javascript-format #, javascript-format
msgid "Adwaita version: %s" msgid "Adwaita version: %s"
msgstr "" msgstr "Version d'Adwaita: %s"
#: src/dialogs.js:291 #: src/dialogs.js:291
#, javascript-format #, javascript-format
msgid "GStreamer version: %s" msgid "GStreamer version: %s"
msgstr "" msgstr "Version de GStreamer: %s"
#: src/dialogs.js:292 #: src/dialogs.js:292
#, javascript-format #, javascript-format
msgid "GJS version: %s" msgid "GJS version: %s"
msgstr "" msgstr "Version de GJS: %s"
#: src/dialogs.js:300 #: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer" msgid "A GNOME media player powered by GStreamer"
msgstr "" msgstr "Un lecteur multimédia pour GNOME propulsé par GStreamer"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated #. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305 #: src/dialogs.js:305
msgid "translator-credits" msgid "translator-credits"
msgstr "" msgstr "Robin Verdenal-Tallieux"
#: src/revealers.js:170 #: src/revealers.js:170
#, javascript-format #, javascript-format
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr "Finit à: %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr "Indéterminé"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr "Chaines"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr "Désactivé"

377
po/he.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n" "PO-Revision-Date: 2022-06-01 08:42\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Hebrew\n" "Language-Team: Hebrew\n"
"Language: he_IL\n" "Language: he_IL\n"
@@ -18,442 +18,421 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr "פתיחת קבצים…"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr "פתיחת כתובת…"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
msgstr "" msgstr "העדפות"
#: ui/clapper.ui:20 #: ui/clapper.ui:20
msgid "Shortcuts" msgid "Shortcuts"
msgstr "" msgstr "צירופי מקשים"
#: ui/clapper.ui:26 #: ui/clapper.ui:26
msgid "About Clapper" msgid "About Clapper"
msgstr "" msgstr "על אודות Clapper"
#: ui/elapsed-time-button.ui:27 #: ui/elapsed-time-button.ui:27
msgid "Speed" msgid "Speed"
msgstr "" msgstr "מהירות"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr "רגילה"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr "כללי"
#: ui/help-overlay.ui:13 #: ui/help-overlay.ui:13
msgid "Show shortcuts" msgid "Show shortcuts"
msgstr "" msgstr "הצגת צירופי מקשים"
#: ui/help-overlay.ui:19 #: ui/help-overlay.ui:19
msgid "Toggle fullscreen" msgid "Toggle fullscreen"
msgstr "" msgstr "שינוי מצב מסך מלא"
#: ui/help-overlay.ui:20 #: ui/help-overlay.ui:20
msgid "Double tap | Double click" msgid "Double tap | Double click"
msgstr "" msgstr "נגיעה כפולה | לחיצה כפולה"
#: ui/help-overlay.ui:26 #: ui/help-overlay.ui:26
msgid "Leave fullscreen" msgid "Leave fullscreen"
msgstr "" msgstr "יציאה ממסך מלא"
#: ui/help-overlay.ui:32 #: ui/help-overlay.ui:32
msgid "Reveal OSD (fullscreen only)" msgid "Reveal OSD (fullscreen only)"
msgstr "" msgstr "הצגת מידע וכפתורים (מסך מלא בלבד)"
#: ui/help-overlay.ui:33 #: ui/help-overlay.ui:33
msgid "Tap" msgid "Tap"
msgstr "" msgstr "נגיעה"
#: ui/help-overlay.ui:39 #: ui/help-overlay.ui:39
msgid "Quit" msgid "Quit"
msgstr "" msgstr "יציאה"
#: ui/help-overlay.ui:47 #: ui/help-overlay.ui:47
msgid "Media" msgid "Media"
msgstr "" msgstr "מדיה"
#: ui/help-overlay.ui:50 #: ui/help-overlay.ui:50
msgid "Open files" msgid "Open files"
msgstr "" msgstr "פתיחת קבצים"
#: ui/help-overlay.ui:56 src/dialogs.js:137 #: ui/help-overlay.ui:56 src/dialogs.js:137
msgid "Open URI" msgid "Open URI"
msgstr "" msgstr "פתיחת כתובת"
#: ui/help-overlay.ui:64 #: ui/help-overlay.ui:64
msgid "Playlist" msgid "Playlist"
msgstr "" msgstr "רשימת השמעה"
#: ui/help-overlay.ui:67 #: ui/help-overlay.ui:67
msgid "Next item" msgid "Next item"
msgstr "" msgstr "פריט הבא"
#: ui/help-overlay.ui:68 #: ui/help-overlay.ui:68
msgid "Double tap (right side)" msgid "Double tap (right side)"
msgstr "" msgstr "נגיעה כפולה (צד ימין)"
#: ui/help-overlay.ui:74 #: ui/help-overlay.ui:74
msgid "Previous item" msgid "Previous item"
msgstr "" msgstr "פריט קודם"
#: ui/help-overlay.ui:75 #: ui/help-overlay.ui:75
msgid "Double tap (left side)" msgid "Double tap (left side)"
msgstr "" msgstr "נגיעה כפולה (צד שמאל)"
#: ui/help-overlay.ui:81 #: ui/help-overlay.ui:81
msgid "Change repeat mode" msgid "Change repeat mode"
msgstr "" msgstr "שינוי מצב חזרה"
#: ui/help-overlay.ui:87 #: ui/help-overlay.ui:87
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr "ייצוא לקובץ"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr "השמעה"
#: ui/help-overlay.ui:98 #: ui/help-overlay.ui:98
msgid "Toggle play" msgid "Toggle play"
msgstr "" msgstr "הפעלה/השהיה"
#: ui/help-overlay.ui:99 #: ui/help-overlay.ui:99
msgid "Long press | Right click" msgid "Long press | Right click"
msgstr "" msgstr "לחיצה ארוכה | לחצן ימני"
#: ui/help-overlay.ui:105 #: ui/help-overlay.ui:105
msgid "Seek forward" msgid "Seek forward"
msgstr "" msgstr "דילוג קדימה"
#: ui/help-overlay.ui:106 #: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right" msgid "Swipe right | Scroll right"
msgstr "" msgstr "החלקה ימינה | גלילה ימינה"
#: ui/help-overlay.ui:112 #: ui/help-overlay.ui:112
msgid "Seek backward" msgid "Seek backward"
msgstr "" msgstr "דילוג לאחור"
#: ui/help-overlay.ui:113 #: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left" msgid "Swipe left | Scroll left"
msgstr "" msgstr "החלקה שמאלה | גלילה שמאלה"
#: ui/help-overlay.ui:119 #: ui/help-overlay.ui:119
msgid "Volume up" msgid "Volume up"
msgstr "" msgstr "הגברת עצמת השמע"
#: ui/help-overlay.ui:120 #: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up" msgid "Swipe up | Scroll up"
msgstr "" msgstr "החלקה למעלה | גלילה למעלה"
#: ui/help-overlay.ui:126 #: ui/help-overlay.ui:126
msgid "Volume down" msgid "Volume down"
msgstr "" msgstr "הנמכת עצמת השמע"
#: ui/help-overlay.ui:127 #: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down" msgid "Swipe down | Scroll down"
msgstr "" msgstr "החלקה למעלה | גלילה למעלה"
#: ui/help-overlay.ui:133 #: ui/help-overlay.ui:133
msgid "Toggle mute" msgid "Toggle mute"
msgstr "" msgstr "השתקה/ביטול השתקה"
#: ui/help-overlay.ui:139 #: ui/help-overlay.ui:139
msgid "Next chapter" msgid "Next chapter"
msgstr "" msgstr "פרק הבא"
#: ui/help-overlay.ui:145 #: ui/help-overlay.ui:145
msgid "Previous chapter" msgid "Previous chapter"
msgstr "" msgstr "פרק קודם"
#: ui/preferences-plugin-ranking-subpage.ui:11 #: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders" msgid "Decoders"
msgstr "" msgstr "מפענחים"
#: ui/preferences-plugin-ranking-subpage.ui:18 #: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr "חזרה להגדרות"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr "התנהגות"
#: ui/preferences-window.ui:18
msgid "Auto fullscreen"
msgstr "מסך מלא אוטומטי"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr "כניסה למצב מסך מלא עם החלפת רשימת השמעה מלבד במצב ציפה"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr "לשאול אם להפעיל מחדש את המדיה האחרונה"
#: ui/preferences-window.ui:31
msgid "Float on all workspaces"
msgstr "ציפה בכל מרחבי העבודה"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr "אפשרות זו פועלת רק ב־GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr "בסיום צפייה"
#: ui/preferences-window.ui:43
msgid "Do nothing"
msgstr "לא לעשות דבר"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:44
msgid "Do nothing" msgid "Freeze last frame"
msgstr "" msgstr "הקפאת התמונה האחרונה"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:46
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr "סגירת היישום"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr "עצמת שמע"
#: ui/preferences-window.ui:58
msgid "Custom initial value"
msgstr "התאמת ערך התחלתי"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr "הגדרת עצמת השמע עם ההפעלה במקום שחזור"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr "עצמת שמע באחוזים"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr "דילוג"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr "מצב"
#: ui/preferences-window.ui:83
msgid "Accurate"
msgstr "מדויק"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:85
msgid "Fast" msgid "Fast"
msgstr "" msgstr "מהיר"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr "יחידה"
#: ui/preferences-window.ui:97
msgid "Second"
msgstr "שניה"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:98
msgid "Second" msgid "Minute"
msgstr "" msgstr "דקה"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:100
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr "אחוז"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr "ערך"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr "שמע"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr "היסט במילי־שניות"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr "תבניות שמע רגילות בלבד"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr "כתוביות"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr "גופן ברירת מחדל"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr "רשת"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr "לקוח"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr "שימוש בחוצץ הורדה"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr "שרת"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr "שליטה בנגן מרחוק"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr "פתחת האזנה"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background" msgid "Tweaks"
msgstr "" msgstr "התאמות"
#: ui/preferences-window.ui:184 #: ui/preferences-window.ui:192
msgid "Requires GTK compiled with Broadway backend" msgid "Appearance"
msgstr "" msgstr "מראה"
#: ui/preferences-window.ui:190 #: ui/preferences-window.ui:195
msgid "Web application port" msgid "Dark theme"
msgstr "" msgstr "מראה כהה"
#: ui/preferences-window.ui:204 #: ui/preferences-window.ui:201
msgid "Prefer adaptive streaming" msgid "Render window shadows"
msgstr "" msgstr "עיבוד צל לחלון"
#: ui/preferences-window.ui:210 #: ui/preferences-window.ui:202
msgid "Max quality" msgid "Disable to increase performance when windowed"
msgstr "" msgstr "השבתה לצמצום צריכת החלונות"
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr "דרגות תוספים"
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr "שינוי דירוג ברירת המחדל של תוספי GStreamer"
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr "שימוש ב־playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr "דורש הפעלה מחדש של הנגן"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
msgstr "ניסיוני"
#: ui/preferences-window.ui:228 #: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr "שימוש ב־PipeWire לפלט השמע"
#: src/buttons.js:201 #: src/buttons.js:201
#, javascript-format #, javascript-format
msgid "Decoder: %s" msgid "Decoder: %s"
msgstr "" msgstr "מפענח: %s"
#: src/dialogs.js:152 #: src/dialogs.js:152
msgid "Enter or drop URI here" msgid "Enter or drop URI here"
msgstr "" msgstr "יש להזין או להשליך כתובת לכאן"
#: src/dialogs.js:157 #: src/dialogs.js:157
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr "ביטול"
#: src/dialogs.js:158 #: src/dialogs.js:158
msgid "Open" msgid "Open"
msgstr "" msgstr "פתיחה"
#: src/dialogs.js:226 #: src/dialogs.js:226
msgid "Title" msgid "Title"
msgstr "" msgstr "כותרת"
#: src/dialogs.js:227 #: src/dialogs.js:227
msgid "Completed" msgid "Completed"
msgstr "" msgstr "הושלם"
#: src/dialogs.js:235 #: src/dialogs.js:235
msgid "Resume playback?" msgid "Resume playback?"
msgstr "" msgstr "להמשיך בצפייה?"
#: src/dialogs.js:289 #: src/dialogs.js:289
#, javascript-format #, javascript-format
msgid "GTK version: %s" msgid "GTK version: %s"
msgstr "" msgstr "גרסת GTK: %s"
#: src/dialogs.js:290 #: src/dialogs.js:290
#, javascript-format #, javascript-format
msgid "Adwaita version: %s" msgid "Adwaita version: %s"
msgstr "" msgstr "גרסת Adwaita: %s"
#: src/dialogs.js:291 #: src/dialogs.js:291
#, javascript-format #, javascript-format
msgid "GStreamer version: %s" msgid "GStreamer version: %s"
msgstr "" msgstr "גרסת GStreamer: %s"
#: src/dialogs.js:292 #: src/dialogs.js:292
#, javascript-format #, javascript-format
msgid "GJS version: %s" msgid "GJS version: %s"
msgstr "" msgstr "גרסת GJS: %s"
#: src/dialogs.js:300 #: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer" msgid "A GNOME media player powered by GStreamer"
msgstr "" msgstr "נגן מדיה עבור GNOME המופעל על ידי GStreamer"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated #. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305 #: src/dialogs.js:305
msgid "translator-credits" msgid "translator-credits"
msgstr "" msgstr "יוסף אור בוצ׳קו <yoseforb@gnome.org>"
#: src/revealers.js:170 #: src/revealers.js:170
#, javascript-format #, javascript-format
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr "שעת סיום: %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr "לא מוגדר"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr "ערוצים"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr "מושבת"

135
po/hu.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-21 16:37\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Hungarian\n" "Language-Team: Hungarian\n"
"Language: hu_HU\n" "Language: hu_HU\n"
@@ -18,12 +18,12 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "Fájlok megnyitása..." msgstr "Fájlok megnyitása"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "URI megnyitása..." msgstr "URI megnyitása"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
@@ -41,12 +41,11 @@ msgstr "A Clapper -ről"
msgid "Speed" msgid "Speed"
msgstr "Sebesség" msgstr "Sebesség"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "Normál" msgstr "Normál"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "Általános beállítások" msgstr "Általános beállítások"
@@ -118,7 +117,7 @@ msgstr "Ismétlési típus változtatása"
msgid "Export to file" msgid "Export to file"
msgstr "Exportálás fájlba" msgstr "Exportálás fájlba"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "Lejátszás" msgstr "Lejátszás"
@@ -182,203 +181,183 @@ msgstr "Dekóderek"
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "Visszatérés a beállításokhoz" msgstr "Visszatérés a beállításokhoz"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "Viselkedés" msgstr "Viselkedés"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "Automatikus teljes képernyős mód" msgstr "Automatikus teljes képernyős mód"
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Teljes képernyős módra váltás a lejátszólista megváltoztatásakor (kivétel ha lebegőablakos módban vagyunk)" msgstr "Teljes képernyős módra váltás a lejátszólista megváltoztatásakor (kivétel ha lebegőablakos módban vagyunk)"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "Rákérdezés a legutóbbi média folytatására" msgstr "Rákérdezés a legutóbbi média folytatására"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "Lebegő ablak az összes munkaasztalon" msgstr "Lebegő ablak az összes munkaasztalon"
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "Ez az opció csak GNOME asztali környezettel működik" msgstr "Ez az opció csak GNOME asztali környezettel működik"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "Lejátszás után" msgstr "Lejátszás után"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "Ne csináljon semmit" msgstr "Ne csináljon semmit"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "Utolsó képkocka mutatása" msgstr "Utolsó képkocka mutatása"
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "Alkalmazás bezárása" msgstr "Alkalmazás bezárása"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "Hangerő" msgstr "Hangerő"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "Egyedi kezdeti érték" msgstr "Egyedi kezdeti érték"
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "Induláskor egyedi hangerő az utolsó visszaállítása helyett" msgstr "Induláskor egyedi hangerő az utolsó visszaállítása helyett"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "Hangerő százalék" msgstr "Hangerő százalék"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "Tekerés" msgstr "Tekerés"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "Mód" msgstr "Mód"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "Precíz" msgstr "Precíz"
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "Gyors" msgstr "Gyors"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "Mértékegység" msgstr "Mértékegység"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "Másodperc" msgstr "Másodperc"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "Perc" msgstr "Perc"
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "Százalék" msgstr "Százalék"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "Érték" msgstr "Érték"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "Hang" msgstr "Hang"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "Eltolás miliszekundumban" msgstr "Eltolás miliszekundumban"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "Csak natív hang formátumok" msgstr "Csak natív hang formátumok"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "Feliratok" msgstr "Feliratok"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "Alapértelmezett betűtípus" msgstr "Alapértelmezett betűtípus"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "Hálózat" msgstr "Hálózat"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "Kliens" msgstr "Kliens"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "Progresszív letöltéspufferelés" msgstr "Progresszív letöltéspufferelés"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "Szerver" msgstr "Szerver"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "Lejátszó távirányítása" msgstr "Lejátszó távirányítása"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "Port figyelése" msgstr "Port figyelése"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr "Web alkalmazás háttérben való futtatása"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Broadway backenddel fordított GTK -t igényel"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Web alkalmazás portja"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Adaptív streaming előnyben részesítése"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Maximális minőség"
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "Finomhangolások" msgstr "Finomhangolások"
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "Megjelenés" msgstr "Megjelenés"
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "Sötét téma" msgstr "Sötét téma"
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "Ablak árnyékok renderelése" msgstr "Ablak árnyékok renderelése"
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "Kikapcsolása javítja a teljesítményt ablakban futtatás esetén" msgstr "Kikapcsolása javítja a teljesítményt ablakban futtatás esetén"
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "Bővítményrangsor" msgstr "Bővítményrangsor"
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "Az alapértelmezett GStreamer bővítményrangsor megváltoztatása" msgstr "Az alapértelmezett GStreamer bővítményrangsor megváltoztatása"
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "A playbin3 használata" msgstr "A playbin3 használata"
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "A lejátszó újraindítását igényli" msgstr "A lejátszó újraindítását igényli"
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "Kísérleti funkció" msgstr "Kísérleti funkció"
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "A PipeWire használata hang kimenetként" msgstr "A PipeWire használata hang kimenetként"
@@ -445,15 +424,15 @@ msgstr "Ferenc Géczi"
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "%s-kor ér véget" msgstr "%s-kor ér véget"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "Meghatározatlan" msgstr "Meghatározatlan"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "Csatornák" msgstr "Csatornák"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "Kikapcsolva" msgstr "Kikapcsolva"

137
po/it.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-10-04 08:30\n" "PO-Revision-Date: 2022-05-27 12:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Italian\n" "Language-Team: Italian\n"
"Language: it_IT\n" "Language: it_IT\n"
@@ -18,12 +18,12 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "Apri i File..." msgstr "Apri i File"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "Apri URI..." msgstr "Apri URI"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
@@ -41,12 +41,11 @@ msgstr "Informazioni su Clapper"
msgid "Speed" msgid "Speed"
msgstr "Velocità" msgstr "Velocità"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "Normale" msgstr "Normale"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "Generale" msgstr "Generale"
@@ -118,7 +117,7 @@ msgstr "Cambia modalità di ripetizione"
msgid "Export to file" msgid "Export to file"
msgstr "Esporta su file" msgstr "Esporta su file"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "Riproduzione" msgstr "Riproduzione"
@@ -182,203 +181,183 @@ msgstr "Decodificatori"
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "Ritorna alle preferenze" msgstr "Ritorna alle preferenze"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "Comportamento" msgstr "Comportamento"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "Schermo intero automatico" msgstr "Schermo intero automatico"
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Attiva schermo intero quando la playlist viene sostituita, tranne in modalità fluttuante" msgstr "Attiva schermo intero quando la playlist viene sostituita, tranne in modalità fluttuante"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "Chiedi di riprendere i media recenti" msgstr "Chiedi di riprendere i media recenti"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "Fluttuante su tutti i workspace" msgstr "Fluttuante su tutti i workspace"
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "Questa opzione funziona solo su GNOME" msgstr "Questa opzione funziona solo su GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "Dopo la riproduzione" msgstr "Dopo la riproduzione"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "Non fare nulla" msgstr "Non fare nulla"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "Mostra l'ultimo fotogramma" msgstr "Mostra l'ultimo fotogramma"
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "Chiudi l'app" msgstr "Chiudi l'app"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "Volume" msgstr "Volume"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "Valore iniziale personalizato" msgstr "Valore iniziale personalizato"
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "Imposta un volume all'avvio personalizzato invece di ripristinarlo" msgstr "Imposta un volume all'avvio personalizzato invece di ripristinarlo"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "Percentuale volume" msgstr "Percentuale volume"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "Scorrimento" msgstr "Scorrimento"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "Modalità" msgstr "Modalità"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "Accurata" msgstr "Accurata"
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "Veloce" msgstr "Veloce"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "Unità" msgstr "Unità"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "Secondo" msgstr "Secondo"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "Minuto" msgstr "Minuto"
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "Percentuale" msgstr "Percentuale"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "Valore" msgstr "Valore"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "Audio" msgstr "Audio"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "Ritardo/Anticipo in millisecondi" msgstr "Ritardo/Anticipo in millisecondi"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "Solo formati audio nativi" msgstr "Solo formati audio nativi"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "Sottotitoli" msgstr "Sottotitoli"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "Carattere predefinito" msgstr "Carattere predefinito"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "Rete" msgstr "Rete"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "Client" msgstr "Client"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "Download buffering progressivo" msgstr "Download buffering progressivo"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "Server" msgstr "Server"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "Controlla la riproduzione da remoto" msgstr "Controlla la riproduzione da remoto"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "Porta in ascolto" msgstr "Porta in ascolto"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr "Lancia l'applicazione web in sottofondo"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Richiede GTK compilato con il supporto a Broadway"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Porta per l'applicazione web"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Preferisci stream adattivo"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Qualità massima"
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "Aggiustamenti" msgstr "Aggiustamenti"
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "Aspetto" msgstr "Aspetto"
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "Tema scuro" msgstr "Tema scuro"
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "Ombreggiatura della finestra" msgstr "Ombreggiatura della finestra"
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "Disabilita per aumentare le prestazioni in modalità finestra" msgstr "Disabilita per aumentare le prestazioni in modalità finestra"
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "Ordine dei plugin" msgstr "Ordine dei plugin"
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "Altera l'ordine predefinito dei plugin di GStreamer" msgstr "Altera l'ordine predefinito dei plugin di GStreamer"
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "Usa playbin3" msgstr "Usa playbin3"
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "Richiede il riavvio del player" msgstr "Richiede il riavvio del player"
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "Sperimentale" msgstr "Sperimentale"
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "Usa PipeWire per l'uscita audio" msgstr "Usa PipeWire per l'uscita audio"
@@ -438,22 +417,22 @@ msgstr "Un riproduttore multimediale per GNOME basato su GStreamer"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated #. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305 #: src/dialogs.js:305
msgid "translator-credits" msgid "translator-credits"
msgstr "" msgstr "Uniformbuffer"
#: src/revealers.js:170 #: src/revealers.js:170
#, javascript-format #, javascript-format
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "Termina alle: %s" msgstr "Termina alle: %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "Indeterminato" msgstr "Indeterminato"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "Canali" msgstr "Canali"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "Disabilitato" msgstr "Disabilitato"

377
po/ja.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Japanese\n" "Language-Team: Japanese\n"
"Language: ja_JP\n" "Language: ja_JP\n"
@@ -18,442 +18,421 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr "ファイルを開く…"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr "URIを開く…"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
msgstr "" msgstr "設定"
#: ui/clapper.ui:20 #: ui/clapper.ui:20
msgid "Shortcuts" msgid "Shortcuts"
msgstr "" msgstr "ショートカット"
#: ui/clapper.ui:26 #: ui/clapper.ui:26
msgid "About Clapper" msgid "About Clapper"
msgstr "" msgstr "Clapperについて"
#: ui/elapsed-time-button.ui:27 #: ui/elapsed-time-button.ui:27
msgid "Speed" msgid "Speed"
msgstr "" msgstr "速度"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr "標準"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr "一般"
#: ui/help-overlay.ui:13 #: ui/help-overlay.ui:13
msgid "Show shortcuts" msgid "Show shortcuts"
msgstr "" msgstr "ショートカットを表示する"
#: ui/help-overlay.ui:19 #: ui/help-overlay.ui:19
msgid "Toggle fullscreen" msgid "Toggle fullscreen"
msgstr "" msgstr "フルスクリーン切り替え"
#: ui/help-overlay.ui:20 #: ui/help-overlay.ui:20
msgid "Double tap | Double click" msgid "Double tap | Double click"
msgstr "" msgstr "ダブルタップ | ダブルクリック"
#: ui/help-overlay.ui:26 #: ui/help-overlay.ui:26
msgid "Leave fullscreen" msgid "Leave fullscreen"
msgstr "" msgstr "フルスクリーンを終了"
#: ui/help-overlay.ui:32 #: ui/help-overlay.ui:32
msgid "Reveal OSD (fullscreen only)" msgid "Reveal OSD (fullscreen only)"
msgstr "" msgstr "OSDを表示 (全画面表示の場合のみ)"
#: ui/help-overlay.ui:33 #: ui/help-overlay.ui:33
msgid "Tap" msgid "Tap"
msgstr "" msgstr "タップ"
#: ui/help-overlay.ui:39 #: ui/help-overlay.ui:39
msgid "Quit" msgid "Quit"
msgstr "" msgstr "終了"
#: ui/help-overlay.ui:47 #: ui/help-overlay.ui:47
msgid "Media" msgid "Media"
msgstr "" msgstr "メディア"
#: ui/help-overlay.ui:50 #: ui/help-overlay.ui:50
msgid "Open files" msgid "Open files"
msgstr "" msgstr "ファイルを開く"
#: ui/help-overlay.ui:56 src/dialogs.js:137 #: ui/help-overlay.ui:56 src/dialogs.js:137
msgid "Open URI" msgid "Open URI"
msgstr "" msgstr "URIを開く"
#: ui/help-overlay.ui:64 #: ui/help-overlay.ui:64
msgid "Playlist" msgid "Playlist"
msgstr "" msgstr "プレイリスト"
#: ui/help-overlay.ui:67 #: ui/help-overlay.ui:67
msgid "Next item" msgid "Next item"
msgstr "" msgstr "次の項目"
#: ui/help-overlay.ui:68 #: ui/help-overlay.ui:68
msgid "Double tap (right side)" msgid "Double tap (right side)"
msgstr "" msgstr "ダブルタップ(右端)"
#: ui/help-overlay.ui:74 #: ui/help-overlay.ui:74
msgid "Previous item" msgid "Previous item"
msgstr "" msgstr "前の項目"
#: ui/help-overlay.ui:75 #: ui/help-overlay.ui:75
msgid "Double tap (left side)" msgid "Double tap (left side)"
msgstr "" msgstr "ダブルタップ(左端)"
#: ui/help-overlay.ui:81 #: ui/help-overlay.ui:81
msgid "Change repeat mode" msgid "Change repeat mode"
msgstr "" msgstr "リピートモードを変更"
#: ui/help-overlay.ui:87 #: ui/help-overlay.ui:87
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr "ファイルへエクスポート"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr "プレイバック"
#: ui/help-overlay.ui:98 #: ui/help-overlay.ui:98
msgid "Toggle play" msgid "Toggle play"
msgstr "" msgstr "一時停止・再生"
#: ui/help-overlay.ui:99 #: ui/help-overlay.ui:99
msgid "Long press | Right click" msgid "Long press | Right click"
msgstr "" msgstr "Long press | Right click"
#: ui/help-overlay.ui:105 #: ui/help-overlay.ui:105
msgid "Seek forward" msgid "Seek forward"
msgstr "" msgstr "早送り"
#: ui/help-overlay.ui:106 #: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right" msgid "Swipe right | Scroll right"
msgstr "" msgstr "右スワイプ | 右スクロール"
#: ui/help-overlay.ui:112 #: ui/help-overlay.ui:112
msgid "Seek backward" msgid "Seek backward"
msgstr "" msgstr "巻き戻し"
#: ui/help-overlay.ui:113 #: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left" msgid "Swipe left | Scroll left"
msgstr "" msgstr "左スワイプ | 左スクロール"
#: ui/help-overlay.ui:119 #: ui/help-overlay.ui:119
msgid "Volume up" msgid "Volume up"
msgstr "" msgstr "音量を上げる"
#: ui/help-overlay.ui:120 #: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up" msgid "Swipe up | Scroll up"
msgstr "" msgstr "上スワイプ | 上スクロール"
#: ui/help-overlay.ui:126 #: ui/help-overlay.ui:126
msgid "Volume down" msgid "Volume down"
msgstr "" msgstr "音量を下げる"
#: ui/help-overlay.ui:127 #: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down" msgid "Swipe down | Scroll down"
msgstr "" msgstr "下スワイプ | 下スクロール"
#: ui/help-overlay.ui:133 #: ui/help-overlay.ui:133
msgid "Toggle mute" msgid "Toggle mute"
msgstr "" msgstr "ミュート切り替え"
#: ui/help-overlay.ui:139 #: ui/help-overlay.ui:139
msgid "Next chapter" msgid "Next chapter"
msgstr "" msgstr "次のチャプターへ"
#: ui/help-overlay.ui:145 #: ui/help-overlay.ui:145
msgid "Previous chapter" msgid "Previous chapter"
msgstr "" msgstr "前のチャプターへ\""
#: ui/preferences-plugin-ranking-subpage.ui:11 #: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders" msgid "Decoders"
msgstr "" msgstr "デコーダー"
#: ui/preferences-plugin-ranking-subpage.ui:18 #: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr "設定へ戻る"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr "挙動"
#: ui/preferences-window.ui:18
msgid "Auto fullscreen"
msgstr "自動的にフルスクリーンに切り替える"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr "フローティングモードを除き、プレイリストを入れ替えた場合に自動的にフルスクリーンにする"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr "前回再生したメディアを続きから再生するか尋ねる"
#: ui/preferences-window.ui:31
msgid "Float on all workspaces"
msgstr "すべてのワークスペースにフロートを配置する"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr "このオプションはGnomeでのみ機能します"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr "再生終了後"
#: ui/preferences-window.ui:43
msgid "Do nothing"
msgstr "何もしない"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:44
msgid "Do nothing" msgid "Freeze last frame"
msgstr "" msgstr "最後のフレームで停止する"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:46
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr "アプリを閉じる"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr "音量"
#: ui/preferences-window.ui:58
msgid "Custom initial value"
msgstr "初期音量を設定する"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr "前回使用した音量を使用するのではなく、起動時に音量をカスタム値に設定します"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr "音量(%)"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr "シーキング"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr "モード"
#: ui/preferences-window.ui:83
msgid "Accurate"
msgstr "精密"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:85
msgid "Fast" msgid "Fast"
msgstr "" msgstr "高速"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr "ユニット"
#: ui/preferences-window.ui:97
msgid "Second"
msgstr "秒"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:98
msgid "Second" msgid "Minute"
msgstr "" msgstr ""
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:100
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr "パーセント"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr "オ−ディオ"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr "オフセット(ミリ秒)"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr "ネイティブオーディオフォーマットのみを使用する"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr "字幕"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr "既定のフォント"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr "ネットワーク"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr "クライアント"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr "プログレッシブなバッファリングを使用する"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr "サーバー"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr "プレーヤーをリモートでコントロールする"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr "待ち受けポート"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background" msgid "Tweaks"
msgstr "" msgstr "詳細設定"
#: ui/preferences-window.ui:184 #: ui/preferences-window.ui:192
msgid "Requires GTK compiled with Broadway backend" msgid "Appearance"
msgstr "" msgstr "外観"
#: ui/preferences-window.ui:190 #: ui/preferences-window.ui:195
msgid "Web application port" msgid "Dark theme"
msgstr "" msgstr "ダークテーマ"
#: ui/preferences-window.ui:204 #: ui/preferences-window.ui:201
msgid "Prefer adaptive streaming" msgid "Render window shadows"
msgstr "" msgstr "ウィンドウの影をレンダリングする"
#: ui/preferences-window.ui:210 #: ui/preferences-window.ui:202
msgid "Max quality" msgid "Disable to increase performance when windowed"
msgstr "" msgstr "無効化するとウィンドウモードでのパフォーマンスが向上します"
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr "プライグインの優先順位"
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr "GStreamerプラグインの優先順位を変更します"
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr "playbin3を使用"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr "プレイヤーの再起動が必要です"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
msgstr "試験運用機能"
#: ui/preferences-window.ui:228 #: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr "オーディオ出力にPipeWireを使用する"
#: src/buttons.js:201 #: src/buttons.js:201
#, javascript-format #, javascript-format
msgid "Decoder: %s" msgid "Decoder: %s"
msgstr "" msgstr "デコーダー: %s"
#: src/dialogs.js:152 #: src/dialogs.js:152
msgid "Enter or drop URI here" msgid "Enter or drop URI here"
msgstr "" msgstr "ここにURIを入力またはドロップ"
#: src/dialogs.js:157 #: src/dialogs.js:157
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr "キャンセル"
#: src/dialogs.js:158 #: src/dialogs.js:158
msgid "Open" msgid "Open"
msgstr "" msgstr "開く"
#: src/dialogs.js:226 #: src/dialogs.js:226
msgid "Title" msgid "Title"
msgstr "" msgstr "タイトル"
#: src/dialogs.js:227 #: src/dialogs.js:227
msgid "Completed" msgid "Completed"
msgstr "" msgstr "再生済み"
#: src/dialogs.js:235 #: src/dialogs.js:235
msgid "Resume playback?" msgid "Resume playback?"
msgstr "" msgstr "前回の続きから再生しますか?"
#: src/dialogs.js:289 #: src/dialogs.js:289
#, javascript-format #, javascript-format
msgid "GTK version: %s" msgid "GTK version: %s"
msgstr "" msgstr "GTKバージョン: %s"
#: src/dialogs.js:290 #: src/dialogs.js:290
#, javascript-format #, javascript-format
msgid "Adwaita version: %s" msgid "Adwaita version: %s"
msgstr "" msgstr "Adwaitaバージョン: %s"
#: src/dialogs.js:291 #: src/dialogs.js:291
#, javascript-format #, javascript-format
msgid "GStreamer version: %s" msgid "GStreamer version: %s"
msgstr "" msgstr "GStreamer バージョン: %s"
#: src/dialogs.js:292 #: src/dialogs.js:292
#, javascript-format #, javascript-format
msgid "GJS version: %s" msgid "GJS version: %s"
msgstr "" msgstr "GJS バージョン: %s"
#: src/dialogs.js:300 #: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer" msgid "A GNOME media player powered by GStreamer"
msgstr "" msgstr "GStreamerを使用したGNOME向けのメディアプレーヤー"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated #. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305 #: src/dialogs.js:305
msgid "translator-credits" msgid "translator-credits"
msgstr "" msgstr "翻訳者"
#: src/revealers.js:170 #: src/revealers.js:170
#, javascript-format #, javascript-format
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr "再生終了時刻: %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr "不明"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr "チャンネル"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr "Disabled"

131
po/ko.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:24\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Korean\n" "Language-Team: Korean\n"
"Language: ko_KR\n" "Language: ko_KR\n"
@@ -18,11 +18,11 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr ""
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -41,12 +41,11 @@ msgstr ""
msgid "Speed" msgid "Speed"
msgstr "" msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr ""
@@ -118,7 +117,7 @@ msgstr ""
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr ""
@@ -182,203 +181,183 @@ msgstr ""
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr ""
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr ""
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "" msgstr ""
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr ""
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "" msgstr ""
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr ""
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr ""
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "" msgstr ""
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "" msgstr ""
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr ""
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr ""
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "" msgstr ""
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "" msgstr ""
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr ""
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "" msgstr ""
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "" msgstr ""
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr ""
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr ""
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr ""
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr ""
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr ""
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr ""
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr ""
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr ""
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr ""
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr ""
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "" msgstr ""
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "" msgstr ""
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "" msgstr ""
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "" msgstr ""
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "" msgstr ""
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "" msgstr ""
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "" msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "" msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr ""
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr ""
@@ -445,15 +424,15 @@ msgstr ""
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr ""
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr ""
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""

173
po/nl.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 16:21\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Dutch\n" "Language-Team: Dutch\n"
"Language: nl_NL\n" "Language: nl_NL\n"
@@ -18,11 +18,11 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "Bestanden openen…" msgstr "Bestanden openen…"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "URI openen…" msgstr "URI openen…"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -39,14 +39,13 @@ msgstr "Over Clapper"
#: ui/elapsed-time-button.ui:27 #: ui/elapsed-time-button.ui:27
msgid "Speed" msgid "Speed"
msgstr "" msgstr "Snelheid"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "Normaal" msgstr "Normaal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "Algemeen" msgstr "Algemeen"
@@ -118,7 +117,7 @@ msgstr "Herhaalmodus wijzigen"
msgid "Export to file" msgid "Export to file"
msgstr "Exporteren naar bestand" msgstr "Exporteren naar bestand"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "Afspelen" msgstr "Afspelen"
@@ -164,7 +163,7 @@ msgstr "Omlaag vegen/scrollen"
#: ui/help-overlay.ui:133 #: ui/help-overlay.ui:133
msgid "Toggle mute" msgid "Toggle mute"
msgstr "" msgstr "Geluid dempen"
#: ui/help-overlay.ui:139 #: ui/help-overlay.ui:139
msgid "Next chapter" msgid "Next chapter"
@@ -182,258 +181,238 @@ msgstr "Decodering"
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "Terug naar voorkeuren" msgstr "Terug naar voorkeuren"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "Gedrag" msgstr "Gedrag"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "Beeldvullende modus automatisch inschakelen" msgstr "Beeldvullende modus automatisch inschakelen"
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Schakel de beeldvullende modus automatisch in als de afspeellijst wordt vervangen (behalve in de zwevende modus)" msgstr "Schakel de beeldvullende modus automatisch in als de afspeellijst wordt vervangen (behalve in de zwevende modus)"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "Vragen om onlangs afgespeelde media te hervatten" msgstr "Vragen om onlangs afgespeelde media te hervatten"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "Zweven op alle werkbladen" msgstr "Zweven op alle werkbladen"
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "Deze optie werkt alleen op GNOME" msgstr "Deze optie werkt alleen op GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "Actie na het afspelen:" msgstr "Actie na het afspelen:"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "Niets doen" msgstr "Niets doen"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "Laatste frame bevriezen" msgstr "Laatste frame bevriezen"
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "Toepassing afsluiten" msgstr "Toepassing afsluiten"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "Volume" msgstr "Volume"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "Aangepaste initiële waarde" msgstr "Aangepaste initiële waarde"
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "Stel een aangepast volumeniveau in bij het opstarten in plaats van het vorige te herstellen" msgstr "Stel een aangepast volumeniveau in bij het opstarten in plaats van het vorige te herstellen"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "Volumeniveau" msgstr "Volumeniveau"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "Spoelen" msgstr "Spoelen"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "Modus" msgstr "Modus"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "Nauwkeurig" msgstr "Nauwkeurig"
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "Snel" msgstr "Snel"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "Eenheid" msgstr "Eenheid"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "Seconde" msgstr "Seconde"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "Minuut" msgstr "Minuut"
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "Percentage" msgstr "Percentage"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "Waarde" msgstr "Waarde"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "Audio" msgstr "Audio"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "Verschuiving (in milliseconden)" msgstr "Verschuiving (in milliseconden)"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "Alleen ingebouwde audioformaten" msgstr "Alleen ingebouwde audioformaten"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "Ondertiteling" msgstr "Ondertiteling"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "Standaardlettertype" msgstr "Standaardlettertype"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "Netwerk" msgstr "Netwerk"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "Client" msgstr "Client"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "Progressieve downloadbuffering" msgstr "Progressieve downloadbuffering"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "Server" msgstr "Server"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "Speler op afstand bedienen" msgstr "Speler op afstand bedienen"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "Luisteren op poort:" msgstr "Luisteren op poort:"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr "Webtoepassing op achtergrond uitvoeren"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Vereist GTK met het Broadway-backend"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Webtoepassingspoort"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Adaptief streamen"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Maximumkwaliteit"
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "Aanpassingen" msgstr "Aanpassingen"
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "Vormgeving" msgstr "Vormgeving"
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "Donker thema" msgstr "Donker thema"
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "Vensterschaduwen tonen" msgstr "Vensterschaduwen tonen"
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "Schakel uit om de prestaties te verbeteren in de zwevende modus" msgstr "Schakel uit om de prestaties te verbeteren in de zwevende modus"
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "Plug-involgorde" msgstr "Plug-involgorde"
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "Pas de standaardvolgorde van GStreamer-plug-ins aan" msgstr "Pas de standaardvolgorde van GStreamer-plug-ins aan"
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "" msgstr "playbin3 gebruiken"
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "" msgstr "Herstart de speler om de wijziging toe te passen"
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr "Experimenteel"
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr "PipeWire gebruiken voor audio-uitvoer"
#: src/buttons.js:201 #: src/buttons.js:201
#, javascript-format #, javascript-format
msgid "Decoder: %s" msgid "Decoder: %s"
msgstr "" msgstr "Decoder: %s"
#: src/dialogs.js:152 #: src/dialogs.js:152
msgid "Enter or drop URI here" msgid "Enter or drop URI here"
msgstr "" msgstr "Voer een uri in of sleep een uri hierheen"
#: src/dialogs.js:157 #: src/dialogs.js:157
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr "Annuleren"
#: src/dialogs.js:158 #: src/dialogs.js:158
msgid "Open" msgid "Open"
msgstr "" msgstr "Openen"
#: src/dialogs.js:226 #: src/dialogs.js:226
msgid "Title" msgid "Title"
msgstr "" msgstr "Titel"
#: src/dialogs.js:227 #: src/dialogs.js:227
msgid "Completed" msgid "Completed"
msgstr "" msgstr "Voltooid"
#: src/dialogs.js:235 #: src/dialogs.js:235
msgid "Resume playback?" msgid "Resume playback?"
msgstr "" msgstr "Afspelen hervatten?"
#: src/dialogs.js:289 #: src/dialogs.js:289
#, javascript-format #, javascript-format
msgid "GTK version: %s" msgid "GTK version: %s"
msgstr "" msgstr "GTK versie: %s"
#: src/dialogs.js:290 #: src/dialogs.js:290
#, javascript-format #, javascript-format
msgid "Adwaita version: %s" msgid "Adwaita version: %s"
msgstr "" msgstr "Adwaita-versie: %s"
#: src/dialogs.js:291 #: src/dialogs.js:291
#, javascript-format #, javascript-format
msgid "GStreamer version: %s" msgid "GStreamer version: %s"
msgstr "" msgstr "GStreamer-versie: %s"
#: src/dialogs.js:292 #: src/dialogs.js:292
#, javascript-format #, javascript-format
msgid "GJS version: %s" msgid "GJS version: %s"
msgstr "" msgstr "GJS-versie: %s"
#: src/dialogs.js:300 #: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer" msgid "A GNOME media player powered by GStreamer"
msgstr "" msgstr "Een door GStreamer aangedreven GNOME-mediaspeler"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated #. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305 #: src/dialogs.js:305
@@ -445,15 +424,15 @@ msgstr "Heimen Stoffels <vistausss@fastmail.com>"
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "Eindigt op: %s" msgstr "Eindigt op: %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr "onbekend"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr "Kanalen"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr "Uitgeschakeld"

131
po/no.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Norwegian\n" "Language-Team: Norwegian\n"
"Language: no_NO\n" "Language: no_NO\n"
@@ -18,11 +18,11 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr ""
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -41,12 +41,11 @@ msgstr ""
msgid "Speed" msgid "Speed"
msgstr "" msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr ""
@@ -118,7 +117,7 @@ msgstr ""
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr ""
@@ -182,203 +181,183 @@ msgstr ""
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr ""
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr ""
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "" msgstr ""
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr ""
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "" msgstr ""
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr ""
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr ""
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "" msgstr ""
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "" msgstr ""
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr ""
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr ""
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "" msgstr ""
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "" msgstr ""
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr ""
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "" msgstr ""
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "" msgstr ""
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr ""
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr ""
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr ""
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr ""
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr ""
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr ""
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr ""
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr ""
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr ""
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr ""
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "" msgstr ""
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "" msgstr ""
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "" msgstr ""
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "" msgstr ""
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "" msgstr ""
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "" msgstr ""
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "" msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "" msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr ""
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr ""
@@ -445,15 +424,15 @@ msgstr ""
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr ""
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr ""
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""

135
po/pl.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-15 08:41\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Polish\n" "Language-Team: Polish\n"
"Language: pl_PL\n" "Language: pl_PL\n"
@@ -18,12 +18,12 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "Otwórz pliki..." msgstr "Otwórz pliki"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "Otwórz URI..." msgstr "Otwórz URI"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
@@ -41,12 +41,11 @@ msgstr "O programie"
msgid "Speed" msgid "Speed"
msgstr "Prędkość" msgstr "Prędkość"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "Normalny" msgstr "Normalny"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "Główne" msgstr "Główne"
@@ -118,7 +117,7 @@ msgstr "Zmień tryb powtarzania"
msgid "Export to file" msgid "Export to file"
msgstr "Eksportuj do pliku" msgstr "Eksportuj do pliku"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "Odtwarzanie" msgstr "Odtwarzanie"
@@ -182,203 +181,183 @@ msgstr "Dekodery"
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "Wróć do preferencji" msgstr "Wróć do preferencji"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "Zachowanie" msgstr "Zachowanie"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "Automatyczny tryb pełnoekranowy" msgstr "Automatyczny tryb pełnoekranowy"
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Wejdź do trybu pełnoekranowego, gdy lista odtwarzania zostanie zastąpiona z wyjątkiem trybu pływającego" msgstr "Wejdź do trybu pełnoekranowego, gdy lista odtwarzania zostanie zastąpiona z wyjątkiem trybu pływającego"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "Pytaj o wznowienie ostatnich mediów" msgstr "Pytaj o wznowienie ostatnich mediów"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "Pływaj na wszystkich obszarach roboczych" msgstr "Pływaj na wszystkich obszarach roboczych"
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "Ta opcja działa tylko na GNOME" msgstr "Ta opcja działa tylko na GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "Po odtwarzaniu" msgstr "Po odtwarzaniu"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "Nic nie rób" msgstr "Nic nie rób"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "Zamroź ostatnią klatkę" msgstr "Zamroź ostatnią klatkę"
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "Zamknij aplikację" msgstr "Zamknij aplikację"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "Głośność" msgstr "Głośność"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "Wartość początkowa" msgstr "Wartość początkowa"
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "Ustaw własną głośność początkową zamiast ją przywracać" msgstr "Ustaw własną głośność początkową zamiast ją przywracać"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "Procent głośności" msgstr "Procent głośności"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "Przewijanie" msgstr "Przewijanie"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "Tryb" msgstr "Tryb"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "Dokładny" msgstr "Dokładny"
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "Szybki" msgstr "Szybki"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "Jednostka" msgstr "Jednostka"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "Sekunda" msgstr "Sekunda"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "Minuta" msgstr "Minuta"
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "Procent" msgstr "Procent"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "Wartość" msgstr "Wartość"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "Audio" msgstr "Audio"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "Przesunięcie w milisekundach" msgstr "Przesunięcie w milisekundach"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "Tylko natywne formaty audio" msgstr "Tylko natywne formaty audio"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "Napisy" msgstr "Napisy"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "Domyślna czcionka" msgstr "Domyślna czcionka"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "Sieć" msgstr "Sieć"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "Klient" msgstr "Klient"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "Buforuj pobierając progresywnie" msgstr "Buforuj pobierając progresywnie"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "Serwer" msgstr "Serwer"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "Zdalne sterowanie odtwarzaczem" msgstr "Zdalne sterowanie odtwarzaczem"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "Port połączeń przychodzących" msgstr "Port połączeń przychodzących"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr "Uruchom aplikację webową w tle"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Wymaga GTK skompilowanego z backendem Broadway"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Port aplikacji webowej"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Preferuj adaptacyjne streamowanie"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Maksymalna jakość"
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "Dostrajanie" msgstr "Dostrajanie"
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "Wygląd" msgstr "Wygląd"
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "Ciemny motyw" msgstr "Ciemny motyw"
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "Renderuj cienie okna" msgstr "Renderuj cienie okna"
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "Wyłącz, aby zwiększyć wydajność w trybie okienkowym" msgstr "Wyłącz, aby zwiększyć wydajność w trybie okienkowym"
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "Ranking pluginów" msgstr "Ranking pluginów"
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "Zmień domyślne rangi pluginów GStreamera" msgstr "Zmień domyślne rangi pluginów GStreamera"
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "Użyj playbin3" msgstr "Użyj playbin3"
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "Wymaga restartu odtwarzacza" msgstr "Wymaga restartu odtwarzacza"
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "Eksperyment" msgstr "Eksperyment"
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "Użyj PipeWire do wyprowadzenia dźwięku" msgstr "Użyj PipeWire do wyprowadzenia dźwięku"
@@ -445,15 +424,15 @@ msgstr "Rafał Dzięgiel <rafostar.github@gmail.com>"
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "Koniec o: %s" msgstr "Koniec o: %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "Nieokreślony" msgstr "Nieokreślony"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "Kanały" msgstr "Kanały"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "Wyłączony" msgstr "Wyłączony"

339
po/pt.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-10-21 00:29\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Portuguese\n" "Language-Team: Portuguese\n"
"Language: pt_PT\n" "Language: pt_PT\n"
@@ -18,12 +18,12 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "Abrir Arquivos..." msgstr "Abrir ficheiros…"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "Abrir URI..." msgstr "Abrir URI"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
@@ -41,12 +41,11 @@ msgstr "Sobre o Clapper"
msgid "Speed" msgid "Speed"
msgstr "Velocidade" msgstr "Velocidade"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "Predefinido" msgstr "Predefinido"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "Geral" msgstr "Geral"
@@ -104,356 +103,336 @@ msgstr "Toque duplo (lado direito)"
#: ui/help-overlay.ui:74 #: ui/help-overlay.ui:74
msgid "Previous item" msgid "Previous item"
msgstr "" msgstr "Item anterior"
#: ui/help-overlay.ui:75 #: ui/help-overlay.ui:75
msgid "Double tap (left side)" msgid "Double tap (left side)"
msgstr "" msgstr "Toque duplo (lado esquerdo)"
#: ui/help-overlay.ui:81 #: ui/help-overlay.ui:81
msgid "Change repeat mode" msgid "Change repeat mode"
msgstr "" msgstr "Alterar modo de repetição"
#: ui/help-overlay.ui:87 #: ui/help-overlay.ui:87
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr "Exportar para ficheiro"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr "Reproduzir"
#: ui/help-overlay.ui:98 #: ui/help-overlay.ui:98
msgid "Toggle play" msgid "Toggle play"
msgstr "" msgstr "Alternar reprodução"
#: ui/help-overlay.ui:99 #: ui/help-overlay.ui:99
msgid "Long press | Right click" msgid "Long press | Right click"
msgstr "" msgstr "Toque longo | Clique com o botão direito"
#: ui/help-overlay.ui:105 #: ui/help-overlay.ui:105
msgid "Seek forward" msgid "Seek forward"
msgstr "" msgstr "Procurar para a frente"
#: ui/help-overlay.ui:106 #: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right" msgid "Swipe right | Scroll right"
msgstr "" msgstr "Deslizar para a direita | Deslocar para direita"
#: ui/help-overlay.ui:112 #: ui/help-overlay.ui:112
msgid "Seek backward" msgid "Seek backward"
msgstr "" msgstr "Procurar para trás"
#: ui/help-overlay.ui:113 #: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left" msgid "Swipe left | Scroll left"
msgstr "" msgstr "Deslizar para a esquerda | Deslocar para a esquerda"
#: ui/help-overlay.ui:119 #: ui/help-overlay.ui:119
msgid "Volume up" msgid "Volume up"
msgstr "" msgstr "Aumentar o volume"
#: ui/help-overlay.ui:120 #: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up" msgid "Swipe up | Scroll up"
msgstr "" msgstr "Deslizar para cima | Deslocar para cima"
#: ui/help-overlay.ui:126 #: ui/help-overlay.ui:126
msgid "Volume down" msgid "Volume down"
msgstr "" msgstr "Diminuir o volume"
#: ui/help-overlay.ui:127 #: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down" msgid "Swipe down | Scroll down"
msgstr "" msgstr "Deslizar para baixo | Deslocar para baixo"
#: ui/help-overlay.ui:133 #: ui/help-overlay.ui:133
msgid "Toggle mute" msgid "Toggle mute"
msgstr "" msgstr "Ativar/Desativar Som"
#: ui/help-overlay.ui:139 #: ui/help-overlay.ui:139
msgid "Next chapter" msgid "Next chapter"
msgstr "" msgstr "Capítulo seguinte"
#: ui/help-overlay.ui:145 #: ui/help-overlay.ui:145
msgid "Previous chapter" msgid "Previous chapter"
msgstr "" msgstr "Capítulo anterior"
#: ui/preferences-plugin-ranking-subpage.ui:11 #: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders" msgid "Decoders"
msgstr "" msgstr "Descodificadores"
#: ui/preferences-plugin-ranking-subpage.ui:18 #: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr "Voltar para as preferências"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr "Comportamento"
#: ui/preferences-window.ui:18
msgid "Auto fullscreen"
msgstr "Ecrã inteiro automático"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr "Entrar em ecrã inteiro quando a lista de reprodução é substituída, excepto no modo flutuante"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr "Pedir para retomar o ficheiro recente"
#: ui/preferences-window.ui:31
msgid "Float on all workspaces"
msgstr "Flutuar em todas as áreas de trabalho"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr "Esta opção apenas funciona no GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr "Após reprodução"
#: ui/preferences-window.ui:43
msgid "Do nothing"
msgstr "Não fazer nada"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:44
msgid "Do nothing" msgid "Freeze last frame"
msgstr "" msgstr "Suster o fotograma"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:46
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr "Fechar a aplicação"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr "Volume"
#: ui/preferences-window.ui:58
msgid "Custom initial value"
msgstr "Valor inicial personalizado"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr "Definir volume personalizado no arranque ao invés de restaurá-lo"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr "Percentagem de volume"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr "Procurando"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr "Modo"
#: ui/preferences-window.ui:83
msgid "Accurate"
msgstr "Preciso"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:85
msgid "Fast" msgid "Fast"
msgstr "" msgstr "Rápido"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr "Unidade"
#: ui/preferences-window.ui:97
msgid "Second"
msgstr "Segundo"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:98
msgid "Second" msgid "Minute"
msgstr "" msgstr "Minuto"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:100
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr "Percentagem"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr "Valor"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr "Áudio"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr "Deslocamento em milissegundos"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr "Apenas formatos de áudio nativos"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr "Legendas"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr "Tipo de letra predefinida"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr "Rede"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr "Cliente"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr "Buffering de transferência progressiva"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr "Servidor"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr "Controlar reprodutor remotamente"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr "Porta de escuta"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background" msgid "Tweaks"
msgstr "" msgstr "Ajustes"
#: ui/preferences-window.ui:184 #: ui/preferences-window.ui:192
msgid "Requires GTK compiled with Broadway backend" msgid "Appearance"
msgstr "" msgstr "Aparência"
#: ui/preferences-window.ui:190 #: ui/preferences-window.ui:195
msgid "Web application port" msgid "Dark theme"
msgstr "" msgstr "Tema escuro"
#: ui/preferences-window.ui:204 #: ui/preferences-window.ui:201
msgid "Prefer adaptive streaming" msgid "Render window shadows"
msgstr "" msgstr "Renderizar sombras das janelas"
#: ui/preferences-window.ui:210 #: ui/preferences-window.ui:202
msgid "Max quality" msgid "Disable to increase performance when windowed"
msgstr "" msgstr "Desativar para aumentar o desempenho quando em janela"
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr "Classificação do plugin"
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr "Altera as classificações predefinidas dos plugins GStreamer"
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr "Usar playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr "Requer o reinício do reprodutor"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
msgstr "Experimental"
#: ui/preferences-window.ui:228 #: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr "Usar o PipeWire para a saída áudio"
#: src/buttons.js:201 #: src/buttons.js:201
#, javascript-format #, javascript-format
msgid "Decoder: %s" msgid "Decoder: %s"
msgstr "" msgstr "Descodificador: %s"
#: src/dialogs.js:152 #: src/dialogs.js:152
msgid "Enter or drop URI here" msgid "Enter or drop URI here"
msgstr "" msgstr "Introduzir ou largar o URI aqui"
#: src/dialogs.js:157 #: src/dialogs.js:157
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr "Cancelar"
#: src/dialogs.js:158 #: src/dialogs.js:158
msgid "Open" msgid "Open"
msgstr "" msgstr "Abrir"
#: src/dialogs.js:226 #: src/dialogs.js:226
msgid "Title" msgid "Title"
msgstr "" msgstr "Título"
#: src/dialogs.js:227 #: src/dialogs.js:227
msgid "Completed" msgid "Completed"
msgstr "" msgstr "Concluído"
#: src/dialogs.js:235 #: src/dialogs.js:235
msgid "Resume playback?" msgid "Resume playback?"
msgstr "" msgstr "Retomar a reprodução?"
#: src/dialogs.js:289 #: src/dialogs.js:289
#, javascript-format #, javascript-format
msgid "GTK version: %s" msgid "GTK version: %s"
msgstr "" msgstr "Versão do GTK: %s"
#: src/dialogs.js:290 #: src/dialogs.js:290
#, javascript-format #, javascript-format
msgid "Adwaita version: %s" msgid "Adwaita version: %s"
msgstr "" msgstr "Versão do Adwaita: %s"
#: src/dialogs.js:291 #: src/dialogs.js:291
#, javascript-format #, javascript-format
msgid "GStreamer version: %s" msgid "GStreamer version: %s"
msgstr "" msgstr "Versão do GStreamer: %s"
#: src/dialogs.js:292 #: src/dialogs.js:292
#, javascript-format #, javascript-format
msgid "GJS version: %s" msgid "GJS version: %s"
msgstr "" msgstr "Versão do GJS: %s"
#: src/dialogs.js:300 #: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer" msgid "A GNOME media player powered by GStreamer"
msgstr "" msgstr "Um reprodutor multimédia GNOME desenvolvido por GStreamer"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated #. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305 #: src/dialogs.js:305
msgid "translator-credits" msgid "translator-credits"
msgstr "" msgstr "Hugo Carvalho <hugokarvalho@hotmail.com>"
#: src/revealers.js:170 #: src/revealers.js:170
#, javascript-format #, javascript-format
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr "Termina às: %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr "Indeterminado"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr "Canais"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr "Desativado"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-10-11 10:33\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n" "Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n" "Language: pt_BR\n"
@@ -18,11 +18,11 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "Abrir Arquivos" msgstr "Abrir Arquivos"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "Abrir URI" msgstr "Abrir URI"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -41,12 +41,11 @@ msgstr "Sobre o Clapper"
msgid "Speed" msgid "Speed"
msgstr "Velocidade" msgstr "Velocidade"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "Normal" msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "Geral" msgstr "Geral"
@@ -118,7 +117,7 @@ msgstr "Alternar modo de repetição"
msgid "Export to file" msgid "Export to file"
msgstr "Exportar arquivo" msgstr "Exportar arquivo"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "Reprodução" msgstr "Reprodução"
@@ -182,203 +181,183 @@ msgstr "Decodificadores"
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "Voltar para as preferências" msgstr "Voltar para as preferências"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "Comportamento" msgstr "Comportamento"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "Tela cheia automaticamente" msgstr "Tela cheia automaticamente"
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Insira em tela cheia quando a lista de reprodução for substituída, exceto o modo flutuante" msgstr "Insira em tela cheia quando a lista de reprodução for substituída, exceto o modo flutuante"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "Pedir para retomar o video recente" msgstr "Pedir para retomar o video recente"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "Flutuar em todas as áreas de trabalho" msgstr "Flutuar em todas as áreas de trabalho"
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "Esta opção só funciona no GNOME" msgstr "Esta opção só funciona no GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "Pós reprodução" msgstr "Pós reprodução"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "Não fazer nada" msgstr "Não fazer nada"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "Congelar o último quadro" msgstr "Congelar o último quadro"
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "Fechar aplicativo" msgstr "Fechar aplicativo"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "Volume" msgstr "Volume"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "Valor inicial personalizado" msgstr "Valor inicial personalizado"
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "Definir volume personalizado na inicialização ao invés de restaurá-lo" msgstr "Definir volume personalizado na inicialização ao invés de restaurá-lo"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "Percentual do volume" msgstr "Percentual do volume"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "Buscando" msgstr "Buscando"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "Modo" msgstr "Modo"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "Preciso" msgstr "Preciso"
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "Rápido" msgstr "Rápido"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "Unidade" msgstr "Unidade"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "Segundo" msgstr "Segundo"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "Minuto" msgstr "Minuto"
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "Porcentagem" msgstr "Porcentagem"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "Valor" msgstr "Valor"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "Audio" msgstr "Audio"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "tempo de desvanecimento em milissegundos" msgstr "tempo de desvanecimento em milissegundos"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "Apenas formatos de áudio nativos" msgstr "Apenas formatos de áudio nativos"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "Legendas" msgstr "Legendas"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "Fonte padrão" msgstr "Fonte padrão"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "Rede" msgstr "Rede"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "Cliente" msgstr "Cliente"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "buffering progressivo de download" msgstr "buffering progressivo de download"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "Servidor" msgstr "Servidor"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "Controle o video remotamente " msgstr "Controle o video remotamente "
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "Porta de escuta" msgstr "Porta de escuta"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr "Executar web app em segundo plano"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Requer GTK compilado com backend de Broadway"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Porta do aplicativo Web"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Preferir streaming adaptável"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Qualidade Máxima"
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "Ajustes" msgstr "Ajustes"
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "Aparência" msgstr "Aparência"
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "Tema Escuro" msgstr "Tema Escuro"
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "Renderizar sombras das janelas" msgstr "Renderizar sombras das janelas"
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "Desabilite para aumentar o desempenho em placas gráficas mais fracas." msgstr "Desabilite para aumentar o desempenho em placas gráficas mais fracas."
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "Classificação do plugin" msgstr "Classificação do plugin"
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "Altera os ranks padrão dos plugins do GStreamer" msgstr "Altera os ranks padrão dos plugins do GStreamer"
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "Usar playbin3" msgstr "Usar playbin3"
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "Requer reinicialização do Clapper" msgstr "Requer reinicialização do Clapper"
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "Experimental" msgstr "Experimental"
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "Usar PipeWire para saída de áudio" msgstr "Usar PipeWire para saída de áudio"
@@ -445,15 +424,15 @@ msgstr "KevenDoriaLinuxBR"
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "termina em %s" msgstr "termina em %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "Indeterminado" msgstr "Indeterminado"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "Canais" msgstr "Canais"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "Desabilitado" msgstr "Desabilitado"

131
po/ro.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:24\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Romanian\n" "Language-Team: Romanian\n"
"Language: ro_RO\n" "Language: ro_RO\n"
@@ -18,11 +18,11 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr ""
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -41,12 +41,11 @@ msgstr ""
msgid "Speed" msgid "Speed"
msgstr "" msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr ""
@@ -118,7 +117,7 @@ msgstr ""
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr ""
@@ -182,203 +181,183 @@ msgstr ""
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr ""
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr ""
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "" msgstr ""
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr ""
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "" msgstr ""
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr ""
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr ""
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "" msgstr ""
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "" msgstr ""
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr ""
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr ""
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "" msgstr ""
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "" msgstr ""
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr ""
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "" msgstr ""
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "" msgstr ""
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr ""
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr ""
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr ""
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr ""
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr ""
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr ""
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr ""
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr ""
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr ""
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr ""
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "" msgstr ""
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "" msgstr ""
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "" msgstr ""
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "" msgstr ""
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "" msgstr ""
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "" msgstr ""
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "" msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "" msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr ""
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr ""
@@ -445,15 +424,15 @@ msgstr ""
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr ""
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr ""
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""

135
po/ru.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-17 08:56\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Russian\n" "Language-Team: Russian\n"
"Language: ru_RU\n" "Language: ru_RU\n"
@@ -18,12 +18,12 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "Открыть файлы ..." msgstr "Открыть файлы"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "Открыть URI..." msgstr "Открыть URI"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
@@ -41,12 +41,11 @@ msgstr "О приложении"
msgid "Speed" msgid "Speed"
msgstr "Скорость" msgstr "Скорость"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "Обычная" msgstr "Обычная"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "Общие" msgstr "Общие"
@@ -118,7 +117,7 @@ msgstr "Изменить режим повторения"
msgid "Export to file" msgid "Export to file"
msgstr "Экспорт в файл" msgstr "Экспорт в файл"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "Воспроизведение" msgstr "Воспроизведение"
@@ -182,203 +181,183 @@ msgstr "Декодеры"
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "Вернуться к настройкам" msgstr "Вернуться к настройкам"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "Поведение" msgstr "Поведение"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "Автоматический полноэкранный режим" msgstr "Автоматический полноэкранный режим"
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "Переход в полноэкранный режим при замене списка воспроизведения, кроме плавающего режима" msgstr "Переход в полноэкранный режим при замене списка воспроизведения, кроме плавающего режима"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "Спрашивать о возобновление недавние медиа" msgstr "Спрашивать о возобновление недавние медиа"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "Показывать «плавающий режим» на всех рабочих столах" msgstr "Показывать «плавающий режим» на всех рабочих столах"
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "Эта опция работает только в GNOME" msgstr "Эта опция работает только в GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "После воспроизведения" msgstr "После воспроизведения"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "Ничего не делать" msgstr "Ничего не делать"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "Заморозить последний кадр" msgstr "Заморозить последний кадр"
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "Закрыть приложение" msgstr "Закрыть приложение"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "Громкость" msgstr "Громкость"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "Пользовательское начальное значение" msgstr "Пользовательское начальное значение"
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "Установите настраиваемую громкость при запуске вместо ее восстановления" msgstr "Установите настраиваемую громкость при запуске вместо ее восстановления"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "Процент громкости" msgstr "Процент громкости"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "Перемотка" msgstr "Перемотка"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "Режим" msgstr "Режим"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "Точный" msgstr "Точный"
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "Быстрый" msgstr "Быстрый"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "Ед. изм" msgstr "Ед. изм"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "Секунды" msgstr "Секунды"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "Минуты" msgstr "Минуты"
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "Проценты" msgstr "Проценты"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "Значение" msgstr "Значение"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "Аудио" msgstr "Аудио"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "Смещение в миллисекундах" msgstr "Смещение в миллисекундах"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "Только нативные аудиоформаты" msgstr "Только нативные аудиоформаты"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "Субтитры" msgstr "Субтитры"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "Шрифт по умолчанию" msgstr "Шрифт по умолчанию"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "Сеть" msgstr "Сеть"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "Клиент" msgstr "Клиент"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "Прогрессивная буферизация загрузки" msgstr "Прогрессивная буферизация загрузки"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "Сервер" msgstr "Сервер"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "Удаленное управление плеером" msgstr "Удаленное управление плеером"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "Порт прослушивания" msgstr "Порт прослушивания"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr "Запустить веб-приложение в фоновом режиме"
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr "Требуется GTK, скомпилированный с бэкэндом Broadway"
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr "Порт веб-приложения"
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr "Предпочитайте адаптивную потоковую передачу"
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr "Максимальное качество"
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "Твики" msgstr "Твики"
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "Внешний вид" msgstr "Внешний вид"
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "Тёмная тема" msgstr "Тёмная тема"
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "Рендеринг оконных теней" msgstr "Рендеринг оконных теней"
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "Отключить, чтобы повысить производительность в оконном режиме" msgstr "Отключить, чтобы повысить производительность в оконном режиме"
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "Рейтинг плагинов" msgstr "Рейтинг плагинов"
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "Изменить ранги плагинов GStreamer по умолчанию" msgstr "Изменить ранги плагинов GStreamer по умолчанию"
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "Использовать playbin3" msgstr "Использовать playbin3"
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "Требуется перезапуск плеера" msgstr "Требуется перезапуск плеера"
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "Экспериментально" msgstr "Экспериментально"
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "Использовать PipeWire для вывода звука" msgstr "Использовать PipeWire для вывода звука"
@@ -445,15 +424,15 @@ msgstr "Игорь Дятлов"
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "Окончание: %s" msgstr "Окончание: %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "Неопределенный" msgstr "Неопределенный"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "Каналы" msgstr "Каналы"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "Отключено" msgstr "Отключено"

131
po/sr.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:25\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Serbian (Cyrillic)\n" "Language-Team: Serbian (Cyrillic)\n"
"Language: sr_SP\n" "Language: sr_SP\n"
@@ -18,11 +18,11 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr ""
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -41,12 +41,11 @@ msgstr ""
msgid "Speed" msgid "Speed"
msgstr "" msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr ""
@@ -118,7 +117,7 @@ msgstr ""
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr ""
@@ -182,203 +181,183 @@ msgstr ""
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr ""
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr ""
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "" msgstr ""
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr ""
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "" msgstr ""
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr ""
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr ""
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "" msgstr ""
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "" msgstr ""
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr ""
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr ""
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "" msgstr ""
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "" msgstr ""
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr ""
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "" msgstr ""
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "" msgstr ""
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr ""
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr ""
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr ""
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr ""
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr ""
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr ""
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr ""
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr ""
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr ""
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr ""
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "" msgstr ""
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "" msgstr ""
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "" msgstr ""
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "" msgstr ""
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "" msgstr ""
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "" msgstr ""
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "" msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "" msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr ""
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr ""
@@ -445,15 +424,15 @@ msgstr ""
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr ""
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr ""
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""

377
po/sv.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:24\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Swedish\n" "Language-Team: Swedish\n"
"Language: sv_SE\n" "Language: sv_SE\n"
@@ -18,442 +18,421 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr "Öppna filer…"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr "Öppna URL…"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
msgstr "" msgstr "Inställningar"
#: ui/clapper.ui:20 #: ui/clapper.ui:20
msgid "Shortcuts" msgid "Shortcuts"
msgstr "" msgstr "Tangentbordsgenvägar"
#: ui/clapper.ui:26 #: ui/clapper.ui:26
msgid "About Clapper" msgid "About Clapper"
msgstr "" msgstr "Om Clapper"
#: ui/elapsed-time-button.ui:27 #: ui/elapsed-time-button.ui:27
msgid "Speed" msgid "Speed"
msgstr "" msgstr "Hastighet"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr "Allmänt"
#: ui/help-overlay.ui:13 #: ui/help-overlay.ui:13
msgid "Show shortcuts" msgid "Show shortcuts"
msgstr "" msgstr "Visa tangentbordsgenvägar"
#: ui/help-overlay.ui:19 #: ui/help-overlay.ui:19
msgid "Toggle fullscreen" msgid "Toggle fullscreen"
msgstr "" msgstr "Växla helskärmsläge"
#: ui/help-overlay.ui:20 #: ui/help-overlay.ui:20
msgid "Double tap | Double click" msgid "Double tap | Double click"
msgstr "" msgstr "Dubbeltryck | Dubbelklicka"
#: ui/help-overlay.ui:26 #: ui/help-overlay.ui:26
msgid "Leave fullscreen" msgid "Leave fullscreen"
msgstr "" msgstr "Lämna helskärmsläge"
#: ui/help-overlay.ui:32 #: ui/help-overlay.ui:32
msgid "Reveal OSD (fullscreen only)" msgid "Reveal OSD (fullscreen only)"
msgstr "" msgstr "Visa OSD (endast helskärmsläge)"
#: ui/help-overlay.ui:33 #: ui/help-overlay.ui:33
msgid "Tap" msgid "Tap"
msgstr "" msgstr "Tryck"
#: ui/help-overlay.ui:39 #: ui/help-overlay.ui:39
msgid "Quit" msgid "Quit"
msgstr "" msgstr "Avsluta"
#: ui/help-overlay.ui:47 #: ui/help-overlay.ui:47
msgid "Media" msgid "Media"
msgstr "" msgstr "Media"
#: ui/help-overlay.ui:50 #: ui/help-overlay.ui:50
msgid "Open files" msgid "Open files"
msgstr "" msgstr "Öppna filer"
#: ui/help-overlay.ui:56 src/dialogs.js:137 #: ui/help-overlay.ui:56 src/dialogs.js:137
msgid "Open URI" msgid "Open URI"
msgstr "" msgstr "Öppna URI"
#: ui/help-overlay.ui:64 #: ui/help-overlay.ui:64
msgid "Playlist" msgid "Playlist"
msgstr "" msgstr "Spellista"
#: ui/help-overlay.ui:67 #: ui/help-overlay.ui:67
msgid "Next item" msgid "Next item"
msgstr "" msgstr "Nästa föremål"
#: ui/help-overlay.ui:68 #: ui/help-overlay.ui:68
msgid "Double tap (right side)" msgid "Double tap (right side)"
msgstr "" msgstr "Dubbeltryck (höger sida)"
#: ui/help-overlay.ui:74 #: ui/help-overlay.ui:74
msgid "Previous item" msgid "Previous item"
msgstr "" msgstr "Föregående föremål"
#: ui/help-overlay.ui:75 #: ui/help-overlay.ui:75
msgid "Double tap (left side)" msgid "Double tap (left side)"
msgstr "" msgstr "Dubbeltryck (vänster sida)"
#: ui/help-overlay.ui:81 #: ui/help-overlay.ui:81
msgid "Change repeat mode" msgid "Change repeat mode"
msgstr "" msgstr "Ändra upprepningsläge"
#: ui/help-overlay.ui:87 #: ui/help-overlay.ui:87
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr "Exportera till fil"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr "Uppspelning"
#: ui/help-overlay.ui:98 #: ui/help-overlay.ui:98
msgid "Toggle play" msgid "Toggle play"
msgstr "" msgstr "Spela/pausa"
#: ui/help-overlay.ui:99 #: ui/help-overlay.ui:99
msgid "Long press | Right click" msgid "Long press | Right click"
msgstr "" msgstr "Långtryck | Högerklicka"
#: ui/help-overlay.ui:105 #: ui/help-overlay.ui:105
msgid "Seek forward" msgid "Seek forward"
msgstr "" msgstr "Spola framåt"
#: ui/help-overlay.ui:106 #: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right" msgid "Swipe right | Scroll right"
msgstr "" msgstr "Svep höger | Skrolla höger"
#: ui/help-overlay.ui:112 #: ui/help-overlay.ui:112
msgid "Seek backward" msgid "Seek backward"
msgstr "" msgstr "Spola bakåt"
#: ui/help-overlay.ui:113 #: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left" msgid "Swipe left | Scroll left"
msgstr "" msgstr "Svep vänster | Skrolla vänster"
#: ui/help-overlay.ui:119 #: ui/help-overlay.ui:119
msgid "Volume up" msgid "Volume up"
msgstr "" msgstr "Höj volymen"
#: ui/help-overlay.ui:120 #: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up" msgid "Swipe up | Scroll up"
msgstr "" msgstr "Svep uppåt | Skrolla uppåt"
#: ui/help-overlay.ui:126 #: ui/help-overlay.ui:126
msgid "Volume down" msgid "Volume down"
msgstr "" msgstr "Sänk volymen"
#: ui/help-overlay.ui:127 #: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down" msgid "Swipe down | Scroll down"
msgstr "" msgstr "Svep nedåt | Skrolla nedåt"
#: ui/help-overlay.ui:133 #: ui/help-overlay.ui:133
msgid "Toggle mute" msgid "Toggle mute"
msgstr "" msgstr "Växla ljudet på/av"
#: ui/help-overlay.ui:139 #: ui/help-overlay.ui:139
msgid "Next chapter" msgid "Next chapter"
msgstr "" msgstr "Nästa kapitel"
#: ui/help-overlay.ui:145 #: ui/help-overlay.ui:145
msgid "Previous chapter" msgid "Previous chapter"
msgstr "" msgstr "Föregående kapitel"
#: ui/preferences-plugin-ranking-subpage.ui:11 #: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders" msgid "Decoders"
msgstr "" msgstr "Avkodare"
#: ui/preferences-plugin-ranking-subpage.ui:18 #: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr "Återgå till inställningarna"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr "Beteende"
#: ui/preferences-window.ui:18
msgid "Auto fullscreen"
msgstr "Automatiskt helskärmsläge"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr "Växla till fullskärmsläge när en spellista ersätts, förutom i flytande läge"
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr "Be att återuppta senaste media"
#: ui/preferences-window.ui:31
msgid "Float on all workspaces"
msgstr "Flyt på alla arbetsytor"
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:32
msgid "Float on all workspaces"
msgstr ""
#: ui/preferences-window.ui:33
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr "Det här alternativet fungerar endast i GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr "Efter uppspelning"
#: ui/preferences-window.ui:43
msgid "Do nothing"
msgstr "Gör ingenting"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:44
msgid "Do nothing" msgid "Freeze last frame"
msgstr "" msgstr "Frys sista bildruta"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:46
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr "Stäng appen"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr "Volym"
#: ui/preferences-window.ui:58
msgid "Custom initial value"
msgstr "Anpassat startvärde"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:59
msgid "Custom initial value"
msgstr ""
#: ui/preferences-window.ui:60
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr "Ställ in anpassad volym vid start istället för att återställa den"
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr "Volymprocent"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr "Spolning"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr "Läge"
#: ui/preferences-window.ui:83
msgid "Accurate"
msgstr "Riktig"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:84
msgid "Accurate"
msgstr ""
#: ui/preferences-window.ui:85
msgid "Fast" msgid "Fast"
msgstr "" msgstr "Snabbt"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr "Enhet"
#: ui/preferences-window.ui:97
msgid "Second"
msgstr "Sekund"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:98
msgid "Second" msgid "Minute"
msgstr "" msgstr "Minut"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:99
msgid "Minute"
msgstr ""
#: ui/preferences-window.ui:100
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr "Procent"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr "Värde"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr "Ljud"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr "Förskjutning i millisekunder"
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr "Endast inbyggda ljudformat"
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr "Undertexter"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr "Standardteckensnitt"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr "Nätverk"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr "Klient"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr "Progressiv nedladdningsbuffert"
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr "Server"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr "Fjärrstyra spelaren"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr "Lyssningsport"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background" msgid "Tweaks"
msgstr "" msgstr "Tweaks"
#: ui/preferences-window.ui:184 #: ui/preferences-window.ui:192
msgid "Requires GTK compiled with Broadway backend" msgid "Appearance"
msgstr "" msgstr "Utseende"
#: ui/preferences-window.ui:190 #: ui/preferences-window.ui:195
msgid "Web application port" msgid "Dark theme"
msgstr "" msgstr "Mörkt Tema"
#: ui/preferences-window.ui:204 #: ui/preferences-window.ui:201
msgid "Prefer adaptive streaming" msgid "Render window shadows"
msgstr "" msgstr "Rendera fönsterskuggor"
#: ui/preferences-window.ui:210 #: ui/preferences-window.ui:202
msgid "Max quality" msgid "Disable to increase performance when windowed"
msgstr "" msgstr "Inaktivera för att öka prestanda när fönsterläge är på"
#: ui/preferences-window.ui:213
msgid "Plugin ranking"
msgstr "Rangordning av plugin"
#: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins"
msgstr "Ändra standardrankningar för GStreamer-plugins"
#: ui/preferences-window.ui:219
msgid "Use playbin3"
msgstr "Använd playbin3"
#: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart"
msgstr "Kräver omstart av spelaren"
#: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental"
msgstr "Exprimentalt"
#: ui/preferences-window.ui:228 #: ui/preferences-window.ui:228
msgid "Tweaks"
msgstr ""
#: ui/preferences-window.ui:232
msgid "Appearance"
msgstr ""
#: ui/preferences-window.ui:235
msgid "Dark theme"
msgstr ""
#: ui/preferences-window.ui:241
msgid "Render window shadows"
msgstr ""
#: ui/preferences-window.ui:242
msgid "Disable to increase performance when windowed"
msgstr ""
#: ui/preferences-window.ui:253
msgid "Plugin ranking"
msgstr ""
#: ui/preferences-window.ui:254
msgid "Alter default ranks of GStreamer plugins"
msgstr ""
#: ui/preferences-window.ui:259
msgid "Use playbin3"
msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269
msgid "Requires player restart"
msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271
msgid "Experimental"
msgstr ""
#: ui/preferences-window.ui:268
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr "Använd PipeWire för Ljudutgång"
#: src/buttons.js:201 #: src/buttons.js:201
#, javascript-format #, javascript-format
msgid "Decoder: %s" msgid "Decoder: %s"
msgstr "" msgstr "Avkodare: %s"
#: src/dialogs.js:152 #: src/dialogs.js:152
msgid "Enter or drop URI here" msgid "Enter or drop URI here"
msgstr "" msgstr "Ange eller släpp URI här"
#: src/dialogs.js:157 #: src/dialogs.js:157
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr "Avbryt"
#: src/dialogs.js:158 #: src/dialogs.js:158
msgid "Open" msgid "Open"
msgstr "" msgstr "Öppna"
#: src/dialogs.js:226 #: src/dialogs.js:226
msgid "Title" msgid "Title"
msgstr "" msgstr "Titel"
#: src/dialogs.js:227 #: src/dialogs.js:227
msgid "Completed" msgid "Completed"
msgstr "" msgstr "Klar"
#: src/dialogs.js:235 #: src/dialogs.js:235
msgid "Resume playback?" msgid "Resume playback?"
msgstr "" msgstr "Återuppta uppspelningen?"
#: src/dialogs.js:289 #: src/dialogs.js:289
#, javascript-format #, javascript-format
msgid "GTK version: %s" msgid "GTK version: %s"
msgstr "" msgstr "GTK version: %s"
#: src/dialogs.js:290 #: src/dialogs.js:290
#, javascript-format #, javascript-format
msgid "Adwaita version: %s" msgid "Adwaita version: %s"
msgstr "" msgstr "Adwaita version: %s"
#: src/dialogs.js:291 #: src/dialogs.js:291
#, javascript-format #, javascript-format
msgid "GStreamer version: %s" msgid "GStreamer version: %s"
msgstr "" msgstr "GStreamer version: %s"
#: src/dialogs.js:292 #: src/dialogs.js:292
#, javascript-format #, javascript-format
msgid "GJS version: %s" msgid "GJS version: %s"
msgstr "" msgstr "GJS version: %s"
#: src/dialogs.js:300 #: src/dialogs.js:300
msgid "A GNOME media player powered by GStreamer" msgid "A GNOME media player powered by GStreamer"
msgstr "" msgstr "En media spelare för GNOME som drivs av GStreamer"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated #. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305 #: src/dialogs.js:305
msgid "translator-credits" msgid "translator-credits"
msgstr "" msgstr "SA ST (sastofficial)"
#: src/revealers.js:170 #: src/revealers.js:170
#, javascript-format #, javascript-format
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr "Slutar vid: %s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr "Obestämd"
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr "Kanaler"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr "Avstängd"

219
po/tr.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:24\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Turkish\n" "Language-Team: Turkish\n"
"Language: tr_TR\n" "Language: tr_TR\n"
@@ -18,367 +18,346 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr "Dosya Aç…"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr "URL Aç…"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
msgid "Preferences" msgid "Preferences"
msgstr "" msgstr "Tercihler"
#: ui/clapper.ui:20 #: ui/clapper.ui:20
msgid "Shortcuts" msgid "Shortcuts"
msgstr "" msgstr "Kısayollar"
#: ui/clapper.ui:26 #: ui/clapper.ui:26
msgid "About Clapper" msgid "About Clapper"
msgstr "" msgstr "Clapper Hakkında"
#: ui/elapsed-time-button.ui:27 #: ui/elapsed-time-button.ui:27
msgid "Speed" msgid "Speed"
msgstr "" msgstr "Hız"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr "Normal"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr "Genel"
#: ui/help-overlay.ui:13 #: ui/help-overlay.ui:13
msgid "Show shortcuts" msgid "Show shortcuts"
msgstr "" msgstr "Kısayolları göster"
#: ui/help-overlay.ui:19 #: ui/help-overlay.ui:19
msgid "Toggle fullscreen" msgid "Toggle fullscreen"
msgstr "" msgstr "Tam ekran"
#: ui/help-overlay.ui:20 #: ui/help-overlay.ui:20
msgid "Double tap | Double click" msgid "Double tap | Double click"
msgstr "" msgstr "Çift dokun | Çift tıkla"
#: ui/help-overlay.ui:26 #: ui/help-overlay.ui:26
msgid "Leave fullscreen" msgid "Leave fullscreen"
msgstr "" msgstr "Tam ekrandan çık"
#: ui/help-overlay.ui:32 #: ui/help-overlay.ui:32
msgid "Reveal OSD (fullscreen only)" msgid "Reveal OSD (fullscreen only)"
msgstr "" msgstr "Pencere Düğmelerini Göster (yalnızca tam ekran)"
#: ui/help-overlay.ui:33 #: ui/help-overlay.ui:33
msgid "Tap" msgid "Tap"
msgstr "" msgstr "Dokun"
#: ui/help-overlay.ui:39 #: ui/help-overlay.ui:39
msgid "Quit" msgid "Quit"
msgstr "" msgstr "Çık"
#: ui/help-overlay.ui:47 #: ui/help-overlay.ui:47
msgid "Media" msgid "Media"
msgstr "" msgstr "Ortam"
#: ui/help-overlay.ui:50 #: ui/help-overlay.ui:50
msgid "Open files" msgid "Open files"
msgstr "" msgstr "Dosyaları"
#: ui/help-overlay.ui:56 src/dialogs.js:137 #: ui/help-overlay.ui:56 src/dialogs.js:137
msgid "Open URI" msgid "Open URI"
msgstr "" msgstr "URL Aç"
#: ui/help-overlay.ui:64 #: ui/help-overlay.ui:64
msgid "Playlist" msgid "Playlist"
msgstr "" msgstr "Oynatma listesi"
#: ui/help-overlay.ui:67 #: ui/help-overlay.ui:67
msgid "Next item" msgid "Next item"
msgstr "" msgstr "Sonraki öğe"
#: ui/help-overlay.ui:68 #: ui/help-overlay.ui:68
msgid "Double tap (right side)" msgid "Double tap (right side)"
msgstr "" msgstr "Çift tıkla (sağ tarafa)"
#: ui/help-overlay.ui:74 #: ui/help-overlay.ui:74
msgid "Previous item" msgid "Previous item"
msgstr "" msgstr "Önceki öğe"
#: ui/help-overlay.ui:75 #: ui/help-overlay.ui:75
msgid "Double tap (left side)" msgid "Double tap (left side)"
msgstr "" msgstr "Çift tıkla (sol tarafa)"
#: ui/help-overlay.ui:81 #: ui/help-overlay.ui:81
msgid "Change repeat mode" msgid "Change repeat mode"
msgstr "" msgstr "Tekrarlı oynatma modunu değiştir"
#: ui/help-overlay.ui:87 #: ui/help-overlay.ui:87
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr "Dosyaya aktar"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr "Oynatma"
#: ui/help-overlay.ui:98 #: ui/help-overlay.ui:98
msgid "Toggle play" msgid "Toggle play"
msgstr "" msgstr "Oynatmayı başlat"
#: ui/help-overlay.ui:99 #: ui/help-overlay.ui:99
msgid "Long press | Right click" msgid "Long press | Right click"
msgstr "" msgstr "Uzun bas | Sağ tıkla"
#: ui/help-overlay.ui:105 #: ui/help-overlay.ui:105
msgid "Seek forward" msgid "Seek forward"
msgstr "" msgstr "İleri sar"
#: ui/help-overlay.ui:106 #: ui/help-overlay.ui:106
msgid "Swipe right | Scroll right" msgid "Swipe right | Scroll right"
msgstr "" msgstr "Sağa sürükle | Sağa kaydır"
#: ui/help-overlay.ui:112 #: ui/help-overlay.ui:112
msgid "Seek backward" msgid "Seek backward"
msgstr "" msgstr "Geri sar"
#: ui/help-overlay.ui:113 #: ui/help-overlay.ui:113
msgid "Swipe left | Scroll left" msgid "Swipe left | Scroll left"
msgstr "" msgstr "Sola sürükle | Sola kaydır"
#: ui/help-overlay.ui:119 #: ui/help-overlay.ui:119
msgid "Volume up" msgid "Volume up"
msgstr "" msgstr "Sesi artır"
#: ui/help-overlay.ui:120 #: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up" msgid "Swipe up | Scroll up"
msgstr "" msgstr "Yukarı sürükle | Yukarı kaydır"
#: ui/help-overlay.ui:126 #: ui/help-overlay.ui:126
msgid "Volume down" msgid "Volume down"
msgstr "" msgstr "Sesi kıs"
#: ui/help-overlay.ui:127 #: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down" msgid "Swipe down | Scroll down"
msgstr "" msgstr "Aşağı sürükle | Aşağı kaydır"
#: ui/help-overlay.ui:133 #: ui/help-overlay.ui:133
msgid "Toggle mute" msgid "Toggle mute"
msgstr "" msgstr "Sesi kapat"
#: ui/help-overlay.ui:139 #: ui/help-overlay.ui:139
msgid "Next chapter" msgid "Next chapter"
msgstr "" msgstr "Sonraki parça"
#: ui/help-overlay.ui:145 #: ui/help-overlay.ui:145
msgid "Previous chapter" msgid "Previous chapter"
msgstr "" msgstr "Önceki parça"
#: ui/preferences-plugin-ranking-subpage.ui:11 #: ui/preferences-plugin-ranking-subpage.ui:11
msgid "Decoders" msgid "Decoders"
msgstr "" msgstr "Çözücüler"
#: ui/preferences-plugin-ranking-subpage.ui:18 #: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr "Tercihlere geri dön"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr "Davranış"
#: ui/preferences-window.ui:18
msgid "Auto fullscreen"
msgstr "Otomatik tam ekran"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:19
msgid "Auto fullscreen"
msgstr ""
#: ui/preferences-window.ui:20
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr ""
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "" msgstr ""
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr ""
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr ""
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "" msgstr ""
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "" msgstr ""
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr ""
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr ""
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "" msgstr ""
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "" msgstr ""
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr ""
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "" msgstr ""
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "" msgstr ""
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr ""
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr ""
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr ""
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr ""
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr ""
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr ""
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr ""
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr ""
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr ""
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr ""
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "" msgstr ""
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "" msgstr ""
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "" msgstr ""
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "" msgstr ""
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "" msgstr ""
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "" msgstr ""
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "" msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "" msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr ""
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr ""
@@ -445,15 +424,15 @@ msgstr ""
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr ""
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr ""
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""

131
po/uk.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:24\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Ukrainian\n" "Language-Team: Ukrainian\n"
"Language: uk_UA\n" "Language: uk_UA\n"
@@ -18,11 +18,11 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr ""
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -41,12 +41,11 @@ msgstr ""
msgid "Speed" msgid "Speed"
msgstr "" msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr ""
@@ -118,7 +117,7 @@ msgstr ""
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr ""
@@ -182,203 +181,183 @@ msgstr ""
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr ""
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr ""
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "" msgstr ""
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr ""
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "" msgstr ""
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr ""
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr ""
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "" msgstr ""
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "" msgstr ""
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr ""
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr ""
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "" msgstr ""
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "" msgstr ""
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr ""
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "" msgstr ""
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "" msgstr ""
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr ""
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr ""
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr ""
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr ""
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr ""
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr ""
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr ""
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr ""
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr ""
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr ""
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "" msgstr ""
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "" msgstr ""
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "" msgstr ""
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "" msgstr ""
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "" msgstr ""
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "" msgstr ""
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "" msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "" msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr ""
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr ""
@@ -445,15 +424,15 @@ msgstr ""
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr ""
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr ""
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""

131
po/vi.po
View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:24\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Vietnamese\n" "Language-Team: Vietnamese\n"
"Language: vi_VN\n" "Language: vi_VN\n"
@@ -18,11 +18,11 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr ""
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -41,12 +41,11 @@ msgstr ""
msgid "Speed" msgid "Speed"
msgstr "" msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr ""
@@ -118,7 +117,7 @@ msgstr ""
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr ""
@@ -182,203 +181,183 @@ msgstr ""
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr ""
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr ""
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "" msgstr ""
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr ""
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "" msgstr ""
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr ""
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr ""
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "" msgstr ""
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "" msgstr ""
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr ""
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr ""
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "" msgstr ""
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "" msgstr ""
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr ""
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "" msgstr ""
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "" msgstr ""
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr ""
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr ""
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr ""
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr ""
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr ""
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr ""
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr ""
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr ""
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr ""
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr ""
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "" msgstr ""
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "" msgstr ""
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "" msgstr ""
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "" msgstr ""
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "" msgstr ""
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "" msgstr ""
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "" msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "" msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr ""
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr ""
@@ -445,15 +424,15 @@ msgstr ""
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr ""
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr ""
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-24 14:11\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Chinese Simplified\n" "Language-Team: Chinese Simplified\n"
"Language: zh_CN\n" "Language: zh_CN\n"
@@ -18,11 +18,11 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "打开文件…" msgstr "打开文件…"
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "打开 URI…" msgstr "打开 URI…"
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -39,24 +39,23 @@ msgstr "关于 Claper"
#: ui/elapsed-time-button.ui:27 #: ui/elapsed-time-button.ui:27
msgid "Speed" msgid "Speed"
msgstr "" msgstr "速度"
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "一般" msgstr "一般"
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr "常规​​​​​"
#: ui/help-overlay.ui:13 #: ui/help-overlay.ui:13
msgid "Show shortcuts" msgid "Show shortcuts"
msgstr "" msgstr "显示快捷键"
#: ui/help-overlay.ui:19 #: ui/help-overlay.ui:19
msgid "Toggle fullscreen" msgid "Toggle fullscreen"
msgstr "" msgstr "切换全屏"
#: ui/help-overlay.ui:20 #: ui/help-overlay.ui:20
msgid "Double tap | Double click" msgid "Double tap | Double click"
@@ -112,15 +111,15 @@ msgstr ""
#: ui/help-overlay.ui:81 #: ui/help-overlay.ui:81
msgid "Change repeat mode" msgid "Change repeat mode"
msgstr "" msgstr "更改循环模式"
#: ui/help-overlay.ui:87 #: ui/help-overlay.ui:87
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr "导出至文件"
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr "播放"
#: ui/help-overlay.ui:98 #: ui/help-overlay.ui:98
msgid "Toggle play" msgid "Toggle play"
@@ -128,7 +127,7 @@ msgstr ""
#: ui/help-overlay.ui:99 #: ui/help-overlay.ui:99
msgid "Long press | Right click" msgid "Long press | Right click"
msgstr "" msgstr "长按 | 右键点击"
#: ui/help-overlay.ui:105 #: ui/help-overlay.ui:105
msgid "Seek forward" msgid "Seek forward"
@@ -148,23 +147,23 @@ msgstr ""
#: ui/help-overlay.ui:119 #: ui/help-overlay.ui:119
msgid "Volume up" msgid "Volume up"
msgstr "" msgstr "提高音量"
#: ui/help-overlay.ui:120 #: ui/help-overlay.ui:120
msgid "Swipe up | Scroll up" msgid "Swipe up | Scroll up"
msgstr "" msgstr "向上滑动 | 向上滚动"
#: ui/help-overlay.ui:126 #: ui/help-overlay.ui:126
msgid "Volume down" msgid "Volume down"
msgstr "" msgstr "降低音量"
#: ui/help-overlay.ui:127 #: ui/help-overlay.ui:127
msgid "Swipe down | Scroll down" msgid "Swipe down | Scroll down"
msgstr "" msgstr "向下滑动 | 向下滚动"
#: ui/help-overlay.ui:133 #: ui/help-overlay.ui:133
msgid "Toggle mute" msgid "Toggle mute"
msgstr "" msgstr "切换静音"
#: ui/help-overlay.ui:139 #: ui/help-overlay.ui:139
msgid "Next chapter" msgid "Next chapter"
@@ -180,205 +179,185 @@ msgstr "解码器"
#: ui/preferences-plugin-ranking-subpage.ui:18 #: ui/preferences-plugin-ranking-subpage.ui:18
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr "返回首选项"
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "行为" msgstr "行为"
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "自动全屏" msgstr "自动全屏"
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr ""
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "" msgstr ""
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "此选项仅适用于 GNOME" msgstr "此选项仅适用于 GNOME"
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr "播放结束后"
#: ui/preferences-window.ui:43
msgid "Do nothing"
msgstr "不执行任何操作"
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:44
msgid "Do nothing" msgid "Freeze last frame"
msgstr "" msgstr "停留在最后一帧"
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:45
msgid "Freeze last frame"
msgstr ""
#: ui/preferences-window.ui:46
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr "关闭应用程序"
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "音量" msgstr "音量"
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "自定义初始值" msgstr "自定义初始值"
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr ""
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "音量百分比" msgstr "音量百分比"
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr "定位播放"
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "模式" msgstr "模式"
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "精确" msgstr "精确"
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "快速" msgstr "快速"
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "单位" msgstr "单位"
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "秒钟" msgstr "秒钟"
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "分钟" msgstr "分钟"
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "百分比" msgstr "百分比"
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "值" msgstr "值"
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "音频" msgstr "音频"
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr ""
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr ""
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "字幕" msgstr "字幕"
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "默认字体" msgstr "默认字体"
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "网络" msgstr "网络"
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "客户端" msgstr "客户端"
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr ""
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr "服务器"
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "远程控制播放器" msgstr "远程控制播放器"
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "监听端口" msgstr "监听端口"
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "调" msgstr "调"
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "界面" msgstr "界面"
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "暗色主题" msgstr "暗色主题"
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "渲染窗口阴影" msgstr "渲染窗口阴影"
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "" msgstr ""
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "" msgstr ""
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "使用 playbin3" msgstr "使用 playbin3"
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "需要重启播放器" msgstr "需要重启播放器"
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "实验性功能" msgstr "实验性功能"
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "使用 PipeWire 输出音频" msgstr "使用 PipeWire 输出音频"
@@ -438,22 +417,22 @@ msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated #. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/dialogs.js:305 #: src/dialogs.js:305
msgid "translator-credits" msgid "translator-credits"
msgstr "" msgstr "刘韬"
#: src/revealers.js:170 #: src/revealers.js:170
#, javascript-format #, javascript-format
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr "结束于:%s"
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "声道" msgstr "声道"
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr "禁用"

View File

@@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: clapper\n" "Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-09-14 16:35+0200\n" "POT-Creation-Date: 2022-05-26 18:41+0200\n"
"PO-Revision-Date: 2021-09-14 15:24\n" "PO-Revision-Date: 2022-05-26 16:50\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Chinese Traditional\n" "Language-Team: Chinese Traditional\n"
"Language: zh_TW\n" "Language: zh_TW\n"
@@ -18,11 +18,11 @@ msgstr ""
"X-Crowdin-File-ID: 31\n" "X-Crowdin-File-ID: 31\n"
#: ui/clapper.ui:6 #: ui/clapper.ui:6
msgid "Open Files..." msgid "Open Files"
msgstr "" msgstr ""
#: ui/clapper.ui:10 #: ui/clapper.ui:10
msgid "Open URI..." msgid "Open URI"
msgstr "" msgstr ""
#: ui/clapper.ui:16 ui/preferences-window.ui:4 #: ui/clapper.ui:16 ui/preferences-window.ui:4
@@ -41,12 +41,11 @@ msgstr ""
msgid "Speed" msgid "Speed"
msgstr "" msgstr ""
#: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:83 #: ui/elapsed-time-button.ui:41 ui/preferences-window.ui:82
#: ui/preferences-window.ui:215
msgid "Normal" msgid "Normal"
msgstr "" msgstr ""
#: ui/help-overlay.ui:10 ui/preferences-window.ui:12 #: ui/help-overlay.ui:10 ui/preferences-window.ui:11
msgid "General" msgid "General"
msgstr "" msgstr ""
@@ -118,7 +117,7 @@ msgstr ""
msgid "Export to file" msgid "Export to file"
msgstr "" msgstr ""
#: ui/help-overlay.ui:95 ui/preferences-window.ui:119 #: ui/help-overlay.ui:95 ui/preferences-window.ui:118
msgid "Playback" msgid "Playback"
msgstr "" msgstr ""
@@ -182,203 +181,183 @@ msgstr ""
msgid "Return to the preferences" msgid "Return to the preferences"
msgstr "" msgstr ""
#: ui/preferences-window.ui:16 #: ui/preferences-window.ui:15
msgid "Behavior" msgid "Behavior"
msgstr "" msgstr ""
#: ui/preferences-window.ui:19 #: ui/preferences-window.ui:18
msgid "Auto fullscreen" msgid "Auto fullscreen"
msgstr "" msgstr ""
#: ui/preferences-window.ui:20 #: ui/preferences-window.ui:19
msgid "Enter fullscreen when playlist is replaced except floating mode" msgid "Enter fullscreen when playlist is replaced except floating mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:26 #: ui/preferences-window.ui:25
msgid "Ask to resume recent media" msgid "Ask to resume recent media"
msgstr "" msgstr ""
#: ui/preferences-window.ui:32 #: ui/preferences-window.ui:31
msgid "Float on all workspaces" msgid "Float on all workspaces"
msgstr "" msgstr ""
#: ui/preferences-window.ui:33 #: ui/preferences-window.ui:32
msgid "This option only works on GNOME" msgid "This option only works on GNOME"
msgstr "" msgstr ""
#: ui/preferences-window.ui:39 #: ui/preferences-window.ui:38
msgid "After playback" msgid "After playback"
msgstr "" msgstr ""
#: ui/preferences-window.ui:44 #: ui/preferences-window.ui:43
msgid "Do nothing" msgid "Do nothing"
msgstr "" msgstr ""
#: ui/preferences-window.ui:45 #: ui/preferences-window.ui:44
msgid "Freeze last frame" msgid "Freeze last frame"
msgstr "" msgstr ""
#: ui/preferences-window.ui:46 #: ui/preferences-window.ui:45
msgid "Close the app" msgid "Close the app"
msgstr "" msgstr ""
#: ui/preferences-window.ui:56 #: ui/preferences-window.ui:55
msgid "Volume" msgid "Volume"
msgstr "" msgstr ""
#: ui/preferences-window.ui:59 #: ui/preferences-window.ui:58
msgid "Custom initial value" msgid "Custom initial value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:60 #: ui/preferences-window.ui:59
msgid "Set custom volume at startup instead of restoring it" msgid "Set custom volume at startup instead of restoring it"
msgstr "" msgstr ""
#: ui/preferences-window.ui:64 #: ui/preferences-window.ui:63
msgid "Volume percentage" msgid "Volume percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:75 #: ui/preferences-window.ui:74
msgid "Seeking" msgid "Seeking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:78 #: ui/preferences-window.ui:77
msgid "Mode" msgid "Mode"
msgstr "" msgstr ""
#: ui/preferences-window.ui:84 #: ui/preferences-window.ui:83
msgid "Accurate" msgid "Accurate"
msgstr "" msgstr ""
#: ui/preferences-window.ui:85 #: ui/preferences-window.ui:84
msgid "Fast" msgid "Fast"
msgstr "" msgstr ""
#: ui/preferences-window.ui:93 #: ui/preferences-window.ui:92
msgid "Unit" msgid "Unit"
msgstr "" msgstr ""
#: ui/preferences-window.ui:98 #: ui/preferences-window.ui:97
msgid "Second" msgid "Second"
msgstr "" msgstr ""
#: ui/preferences-window.ui:99 #: ui/preferences-window.ui:98
msgid "Minute" msgid "Minute"
msgstr "" msgstr ""
#: ui/preferences-window.ui:100 #: ui/preferences-window.ui:99
msgid "Percentage" msgid "Percentage"
msgstr "" msgstr ""
#: ui/preferences-window.ui:108 #: ui/preferences-window.ui:107
msgid "Value" msgid "Value"
msgstr "" msgstr ""
#: ui/preferences-window.ui:123 #: ui/preferences-window.ui:122
msgid "Audio" msgid "Audio"
msgstr "" msgstr ""
#: ui/preferences-window.ui:126 #: ui/preferences-window.ui:125
msgid "Offset in milliseconds" msgid "Offset in milliseconds"
msgstr "" msgstr ""
#: ui/preferences-window.ui:133 #: ui/preferences-window.ui:132
msgid "Only native audio formats" msgid "Only native audio formats"
msgstr "" msgstr ""
#: ui/preferences-window.ui:141 #: ui/preferences-window.ui:140
msgid "Subtitles" msgid "Subtitles"
msgstr "" msgstr ""
#: ui/preferences-window.ui:144 #: ui/preferences-window.ui:143
msgid "Default font" msgid "Default font"
msgstr "" msgstr ""
#: ui/preferences-window.ui:154 #: ui/preferences-window.ui:153
msgid "Network" msgid "Network"
msgstr "" msgstr ""
#: ui/preferences-window.ui:158 #: ui/preferences-window.ui:157
msgid "Client" msgid "Client"
msgstr "" msgstr ""
#: ui/preferences-window.ui:161 #: ui/preferences-window.ui:160
msgid "Progressive download buffering" msgid "Progressive download buffering"
msgstr "" msgstr ""
#: ui/preferences-window.ui:169 #: ui/preferences-window.ui:168
msgid "Server" msgid "Server"
msgstr "" msgstr ""
#: ui/preferences-window.ui:172 #: ui/preferences-window.ui:171
msgid "Control player remotely" msgid "Control player remotely"
msgstr "" msgstr ""
#: ui/preferences-window.ui:176 #: ui/preferences-window.ui:175
msgid "Listening port" msgid "Listening port"
msgstr "" msgstr ""
#: ui/preferences-window.ui:183 #: ui/preferences-window.ui:188
msgid "Run web application in background"
msgstr ""
#: ui/preferences-window.ui:184
msgid "Requires GTK compiled with Broadway backend"
msgstr ""
#: ui/preferences-window.ui:190
msgid "Web application port"
msgstr ""
#: ui/preferences-window.ui:204
msgid "Prefer adaptive streaming"
msgstr ""
#: ui/preferences-window.ui:210
msgid "Max quality"
msgstr ""
#: ui/preferences-window.ui:228
msgid "Tweaks" msgid "Tweaks"
msgstr "" msgstr ""
#: ui/preferences-window.ui:232 #: ui/preferences-window.ui:192
msgid "Appearance" msgid "Appearance"
msgstr "" msgstr ""
#: ui/preferences-window.ui:235 #: ui/preferences-window.ui:195
msgid "Dark theme" msgid "Dark theme"
msgstr "" msgstr ""
#: ui/preferences-window.ui:241 #: ui/preferences-window.ui:201
msgid "Render window shadows" msgid "Render window shadows"
msgstr "" msgstr ""
#: ui/preferences-window.ui:242 #: ui/preferences-window.ui:202
msgid "Disable to increase performance when windowed" msgid "Disable to increase performance when windowed"
msgstr "" msgstr ""
#: ui/preferences-window.ui:253 #: ui/preferences-window.ui:213
msgid "Plugin ranking" msgid "Plugin ranking"
msgstr "" msgstr ""
#: ui/preferences-window.ui:254 #: ui/preferences-window.ui:214
msgid "Alter default ranks of GStreamer plugins" msgid "Alter default ranks of GStreamer plugins"
msgstr "" msgstr ""
#: ui/preferences-window.ui:259 #: ui/preferences-window.ui:219
msgid "Use playbin3" msgid "Use playbin3"
msgstr "" msgstr ""
#: ui/preferences-window.ui:260 ui/preferences-window.ui:269 #: ui/preferences-window.ui:220 ui/preferences-window.ui:229
msgid "Requires player restart" msgid "Requires player restart"
msgstr "" msgstr ""
#: ui/preferences-window.ui:262 ui/preferences-window.ui:271 #: ui/preferences-window.ui:222 ui/preferences-window.ui:231
msgid "Experimental" msgid "Experimental"
msgstr "" msgstr ""
#: ui/preferences-window.ui:268 #: ui/preferences-window.ui:228
msgid "Use PipeWire for audio output" msgid "Use PipeWire for audio output"
msgstr "" msgstr ""
@@ -445,15 +424,15 @@ msgstr ""
msgid "Ends at: %s" msgid "Ends at: %s"
msgstr "" msgstr ""
#: src/widget.js:227 src/widget.js:236 src/widget.js:242 src/widget.js:248 #: src/widget.js:226 src/widget.js:235 src/widget.js:241 src/widget.js:247
msgid "Undetermined" msgid "Undetermined"
msgstr "" msgstr ""
#: src/widget.js:243 #: src/widget.js:242
msgid "Channels" msgid "Channels"
msgstr "" msgstr ""
#: src/widget.js:261 #: src/widget.js:260
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr ""

View File

@@ -1,27 +1,92 @@
const { Gio, GObject, Gdk, Gtk } = imports.gi; const { Gio, GObject, Gtk } = imports.gi;
const { AppBase } = imports.src.appBase;
const { Widget } = imports.src.widget; const { Widget } = imports.src.widget;
const Debug = imports.src.debug; const Debug = imports.src.debug;
const FileOps = imports.src.fileOps;
const Misc = imports.src.misc;
const Actions = imports.src.actions;
const { debug } = Debug; const { debug } = Debug;
const { settings } = Misc;
var App = GObject.registerClass({ var App = GObject.registerClass({
GTypeName: 'ClapperApp', GTypeName: 'ClapperApp',
}, },
class ClapperApp extends AppBase class ClapperApp extends Gtk.Application
{ {
_init() _init()
{ {
super._init(); super._init({
application_id: Misc.appId,
flags: Gio.ApplicationFlags.HANDLES_OPEN,
});
this.flags |= Gio.ApplicationFlags.HANDLES_OPEN; this.doneFirstActivate = false;
this.isFileAppend = false;
this.mapSignal = null;
} }
vfunc_startup() vfunc_open(files, hint)
{ {
super.vfunc_startup(); super.vfunc_open(files, hint);
this.activate();
this._openFilesAsync(files).catch(debug);
}
vfunc_activate()
{
super.vfunc_activate();
if(!this.doneFirstActivate)
this._onFirstActivate();
this.active_window.present();
}
async _openFilesAsync(files)
{
const urisArr = [];
for(let file of files) {
const uri = file.get_uri();
if(!uri.startsWith('file:')) {
urisArr.push(uri);
continue;
}
/* If file is not a dir its URI will be returned in an array */
const uris = await FileOps.getDirFilesUrisPromise(file).catch(debug);
if(uris && uris.length)
urisArr.push(...uris);
}
const [playlist, subs] = Misc.parsePlaylistFiles(urisArr);
const { player } = this.active_window.get_child();
const action = (this.isFileAppend) ? 'append' : 'set';
if(playlist && playlist.length)
player[`${action}_playlist`](playlist);
if(subs)
player.set_subtitles(subs);
/* Restore default behavior */
this.isFileAppend = false;
}
_onFirstActivate()
{
const window = new Gtk.ApplicationWindow({
application: this,
title: Misc.appName,
});
window.add_css_class('adwrounded');
if(!settings.get_boolean('render-shadows'))
window.add_css_class('gpufriendly');
window.add_css_class('gpufriendlyfs');
const window = this.active_window;
const clapperWidget = new Widget(); const clapperWidget = new Widget();
const dummyHeaderbar = new Gtk.Box({ const dummyHeaderbar = new Gtk.Box({
can_focus: false, can_focus: false,
@@ -33,14 +98,20 @@ class ClapperApp extends AppBase
window.set_child(clapperWidget); window.set_child(clapperWidget);
window.set_titlebar(dummyHeaderbar); window.set_titlebar(dummyHeaderbar);
for(let name in Actions.actions) {
const simpleAction = new Gio.SimpleAction({ name });
simpleAction.connect('activate', (action) =>
Actions.handleAction(action, window)
);
this.add_action(simpleAction);
const accels = Actions.actions[name];
if(accels)
this.set_accels_for_action(`app.${name}`, accels);
}
this.mapSignal = window.connect('map', this._onWindowMap.bind(this)); this.mapSignal = window.connect('map', this._onWindowMap.bind(this));
} this.doneFirstActivate = true;
vfunc_open(files, hint)
{
super.vfunc_open(files, hint);
this._openFilesAsync(files).then(() => this.activate()).catch(debug);
} }
_onWindowMap(window) _onWindowMap(window)

View File

@@ -1,101 +0,0 @@
const { Gio, GLib, GObject, Gtk } = imports.gi;
const Debug = imports.src.debug;
const FileOps = imports.src.fileOps;
const Misc = imports.src.misc;
const Actions = imports.src.actions;
const { debug } = Debug;
const { settings } = Misc;
var AppBase = GObject.registerClass({
GTypeName: 'ClapperAppBase',
},
class ClapperAppBase extends Gtk.Application
{
_init()
{
super._init({
application_id: Misc.appId,
});
this.doneFirstActivate = false;
this.isFileAppend = false;
}
vfunc_startup()
{
super.vfunc_startup();
const window = new Gtk.ApplicationWindow({
application: this,
title: Misc.appName,
});
/* FIXME: AFAIK there is no way to detect theme rounded corners.
* Having 2/4 corners rounded in floating mode is not good. */
window.add_css_class('adwrounded');
if(!settings.get_boolean('render-shadows'))
window.add_css_class('gpufriendly');
window.add_css_class('gpufriendlyfs');
}
vfunc_activate()
{
super.vfunc_activate();
if(!this.doneFirstActivate)
this._onFirstActivate();
this.active_window.present_with_time(
Math.floor(GLib.get_monotonic_time() / 1000)
);
}
async _openFilesAsync(files)
{
const urisArr = [];
for(let file of files) {
const uri = file.get_uri();
if(!uri.startsWith('file:')) {
urisArr.push(uri);
continue;
}
/* If file is not a dir its URI will be returned in an array */
const uris = await FileOps.getDirFilesUrisPromise(file).catch(debug);
if(uris && uris.length)
urisArr.push(...uris);
}
const [playlist, subs] = Misc.parsePlaylistFiles(urisArr);
const { player } = this.active_window.get_child();
const action = (this.isFileAppend) ? 'append' : 'set';
if(playlist && playlist.length)
player[`${action}_playlist`](playlist);
if(subs)
player.set_subtitles(subs);
/* Restore default behavior */
this.isFileAppend = false;
}
_onFirstActivate()
{
for(let name in Actions.actions) {
const simpleAction = new Gio.SimpleAction({ name });
simpleAction.connect('activate', (action) =>
Actions.handleAction(action, this.active_window)
);
this.add_action(simpleAction);
const accels = Actions.actions[name];
if(accels)
this.set_accels_for_action(`app.${name}`, accels);
}
this.doneFirstActivate = true;
}
});

View File

@@ -1,25 +0,0 @@
const { GObject } = imports.gi;
const { AppBase } = imports.src.appBase;
const { HeaderBarRemote } = imports.src.headerbarRemote;
const { WidgetRemote } = imports.src.widgetRemote;
var AppRemote = GObject.registerClass({
GTypeName: 'ClapperAppRemote',
},
class ClapperAppRemote extends AppBase
{
vfunc_startup()
{
super.vfunc_startup();
const window = this.active_window;
const clapperWidget = new WidgetRemote();
window.set_child(clapperWidget);
const headerBar = new HeaderBarRemote();
window.set_titlebar(headerBar);
window.maximize();
}
});

View File

@@ -1,151 +0,0 @@
/* Copyright (C) 2012-present by fent
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
const jsVarStr = '[a-zA-Z_\\$][a-zA-Z_0-9]*';
const jsSingleQuoteStr = `'[^'\\\\]*(:?\\\\[\\s\\S][^'\\\\]*)*'`;
const jsDoubleQuoteStr = `"[^"\\\\]*(:?\\\\[\\s\\S][^"\\\\]*)*"`;
const jsQuoteStr = `(?:${jsSingleQuoteStr}|${jsDoubleQuoteStr})`;
const jsKeyStr = `(?:${jsVarStr}|${jsQuoteStr})`;
const jsPropStr = `(?:\\.${jsVarStr}|\\[${jsQuoteStr}\\])`;
const jsEmptyStr = `(?:''|"")`;
const reverseStr = ':function\\(a\\)\\{' +
'(?:return )?a\\.reverse\\(\\)' +
'\\}';
const sliceStr = ':function\\(a,b\\)\\{' +
'return a\\.slice\\(b\\)' +
'\\}';
const spliceStr = ':function\\(a,b\\)\\{' +
'a\\.splice\\(0,b\\)' +
'\\}';
const swapStr = ':function\\(a,b\\)\\{' +
'var c=a\\[0\\];a\\[0\\]=a\\[b(?:%a\\.length)?\\];a\\[b(?:%a\\.length)?\\]=c(?:;return a)?' +
'\\}';
const actionsObjRegexp = new RegExp(
`var (${jsVarStr})=\\{((?:(?:${
jsKeyStr}${reverseStr}|${
jsKeyStr}${sliceStr}|${
jsKeyStr}${spliceStr}|${
jsKeyStr}${swapStr
}),?\\r?\\n?)+)\\};`);
const actionsFuncRegexp = new RegExp(`${`function(?: ${jsVarStr})?\\(a\\)\\{` +
`a=a\\.split\\(${jsEmptyStr}\\);\\s*` +
`((?:(?:a=)?${jsVarStr}`}${
jsPropStr
}\\(a,\\d+\\);)+)` +
`return a\\.join\\(${jsEmptyStr}\\)` +
`\\}`);
const reverseRegexp = new RegExp(`(?:^|,)(${jsKeyStr})${reverseStr}`, 'm');
const sliceRegexp = new RegExp(`(?:^|,)(${jsKeyStr})${sliceStr}`, 'm');
const spliceRegexp = new RegExp(`(?:^|,)(${jsKeyStr})${spliceStr}`, 'm');
const swapRegexp = new RegExp(`(?:^|,)(${jsKeyStr})${swapStr}`, 'm');
const swapHeadAndPosition = (arr, position) => {
const first = arr[0];
arr[0] = arr[position % arr.length];
arr[position] = first;
return arr;
}
function decipher(sig, tokens) {
sig = sig.split('');
tokens = tokens.split(',');
for(let i = 0, len = tokens.length; i < len; i++) {
let token = tokens[i], pos;
switch (token[0]) {
case 'r':
sig = sig.reverse();
break;
case 'w':
pos = ~~token.slice(1);
sig = swapHeadAndPosition(sig, pos);
break;
case 's':
pos = ~~token.slice(1);
sig = sig.slice(pos);
break;
case 'p':
pos = ~~token.slice(1);
sig.splice(0, pos);
break;
}
}
return sig.join('');
};
function extractActions(body) {
const objResult = actionsObjRegexp.exec(body);
const funcResult = actionsFuncRegexp.exec(body);
if(!objResult || !funcResult)
return null;
const obj = objResult[1].replace(/\$/g, '\\$');
const objBody = objResult[2].replace(/\$/g, '\\$');
const funcBody = funcResult[1].replace(/\$/g, '\\$');
let result = reverseRegexp.exec(objBody);
const reverseKey = result && result[1]
.replace(/\$/g, '\\$')
.replace(/\$|^'|^"|'$|"$/g, '');
result = sliceRegexp.exec(objBody);
const sliceKey = result && result[1]
.replace(/\$/g, '\\$')
.replace(/\$|^'|^"|'$|"$/g, '');
result = spliceRegexp.exec(objBody);
const spliceKey = result && result[1]
.replace(/\$/g, '\\$')
.replace(/\$|^'|^"|'$|"$/g, '');
result = swapRegexp.exec(objBody);
const swapKey = result && result[1]
.replace(/\$/g, '\\$')
.replace(/\$|^'|^"|'$|"$/g, '');
const keys = `(${[reverseKey, sliceKey, spliceKey, swapKey].join('|')})`;
const myreg = `(?:a=)?${obj
}(?:\\.${keys}|\\['${keys}'\\]|\\["${keys}"\\])` +
`\\(a,(\\d+)\\)`;
const tokenizeRegexp = new RegExp(myreg, 'g');
const tokens = [];
while((result = tokenizeRegexp.exec(funcBody)) !== null) {
const key = result[1] || result[2] || result[3];
const pos = result[4];
switch (key) {
case swapKey:
tokens.push(`w${result[4]}`);
break;
case reverseKey:
tokens.push('r');
break;
case sliceKey:
tokens.push(`s${result[4]}`);
break;
case spliceKey:
tokens.push(`p${result[4]}`);
break;
}
}
return tokens.join(',');
}

View File

@@ -165,7 +165,7 @@ class ClapperElapsedTimeButton extends PopoverButtonBase
setInitialState() setInitialState()
{ {
this.label = '00:00/00:00'; this.label = `00${Misc.timeColon}0000${Misc.timeColon}00`;
} }
setFullscreenMode(isFullscreen, isMobileMonitor) setFullscreenMode(isFullscreen, isMobileMonitor)

6
src/controls.js vendored
View File

@@ -7,8 +7,6 @@ const Revealers = imports.src.revealers;
const { debug } = Debug; const { debug } = Debug;
const { settings } = Misc; const { settings } = Misc;
const INITIAL_ELAPSED = '00:00/00:00';
var Controls = GObject.registerClass({ var Controls = GObject.registerClass({
GTypeName: 'ClapperControls', GTypeName: 'ClapperControls',
}, },
@@ -29,7 +27,7 @@ class ClapperControls extends Gtk.Box
this.isMobile = false; this.isMobile = false;
this.showHours = false; this.showHours = false;
this.durationFormatted = '00:00'; this.durationFormatted = `00${Misc.timeColon}00`;
this.revealersArr = []; this.revealersArr = [];
this.chapters = null; this.chapters = null;
@@ -148,7 +146,7 @@ class ClapperControls extends Gtk.Box
value = value || 0; value = value || 0;
const elapsed = Misc.getFormattedTime(value, this.showHours) const elapsed = Misc.getFormattedTime(value, this.showHours)
+ '/' + this.durationFormatted; + '' + this.durationFormatted;
this.elapsedButton.label = elapsed; this.elapsedButton.label = elapsed;
} }

View File

@@ -1,70 +0,0 @@
const { Gio, GLib, GObject } = imports.gi;
const Debug = imports.src.debug;
const { debug } = Debug;
var Daemon = GObject.registerClass({
GTypeName: 'ClapperDaemon',
},
class ClapperDaemon extends Gio.SubprocessLauncher
{
_init()
{
const port = ARGV[0] || 8080;
/* FIXME: show output when debugging is on */
const flags = Gio.SubprocessFlags.STDOUT_SILENCE
| Gio.SubprocessFlags.STDERR_SILENCE;
super._init({ flags });
this.errMsg = 'exited with error or was forced to close';
this.loop = GLib.MainLoop.new(null, false);
this.broadwayd = this.spawnv(['gtk4-broadwayd', '--port=' + port]);
this.broadwayd.wait_async(null, this._onBroadwaydClosed.bind(this));
this.setenv('GDK_BACKEND', 'broadway', true);
const remoteApp = this.spawnv(['com.github.rafostar.Clapper.Remote']);
remoteApp.wait_async(null, this._onRemoteClosed.bind(this));
this.loop.run();
}
_checkProcResult(proc, result)
{
let hadError = false;
try {
hadError = proc.wait_finish(result);
}
catch(err) {
debug(err);
}
return hadError;
}
_onBroadwaydClosed(proc, result)
{
const hadError = this._checkProcResult(proc, result);
if(hadError)
debug(`broadwayd ${this.errMsg}`);
this.broadwayd = null;
this.loop.quit();
}
_onRemoteClosed(proc, result)
{
const hadError = this._checkProcResult(proc, result);
if(hadError)
debug(`remote app ${this.errMsg}`);
if(this.broadwayd)
this.broadwayd.force_exit();
}
});

View File

@@ -1,165 +0,0 @@
const Debug = imports.src.debug;
const FileOps = imports.src.fileOps;
const Misc = imports.src.misc;
const { debug } = Debug;
function generateDash(dashInfo)
{
debug('generating dash');
const bufferSec = Math.min(4, dashInfo.duration);
const dash = [
`<?xml version="1.0" encoding="UTF-8"?>`,
`<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"`,
` xmlns="urn:mpeg:dash:schema:mpd:2011"`,
` xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 DASH-MPD.xsd"`,
` type="static"`,
` mediaPresentationDuration="PT${dashInfo.duration}S"`,
` minBufferTime="PT${bufferSec}S"`,
` profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">`,
` <Period>`
];
for(let adaptation of dashInfo.adaptations)
dash.push(_addAdaptationSet(adaptation));
dash.push(
` </Period>`,
`</MPD>`
);
debug('dash generated');
return dash.join('\n');
}
function _addAdaptationSet(streamsArr)
{
/* We just need it for adaptation type,
* so any stream will do */
const { mimeInfo } = streamsArr[0];
const adaptArr = [
`contentType="${mimeInfo.content}"`,
`mimeType="${mimeInfo.type}"`,
`subsegmentAlignment="true"`,
`subsegmentStartsWithSAP="1"`,
];
const widthArr = [];
const heightArr = [];
const fpsArr = [];
const representations = [];
for(let stream of streamsArr) {
/* No point parsing if no URL */
if(!stream.url)
continue;
if(stream.width && stream.height) {
widthArr.push(stream.width);
heightArr.push(stream.height);
}
if(stream.fps)
fpsArr.push(stream.fps);
representations.push(_getStreamRepresentation(stream));
}
if(widthArr.length && heightArr.length) {
const maxWidth = Math.max.apply(null, widthArr);
const maxHeight = Math.max.apply(null, heightArr);
const par = _getPar(maxWidth, maxHeight);
adaptArr.push(`maxWidth="${maxWidth}"`);
adaptArr.push(`maxHeight="${maxHeight}"`);
adaptArr.push(`par="${par}"`);
}
if(fpsArr.length) {
const maxFps = Math.max.apply(null, fpsArr);
adaptArr.push(`maxFrameRate="${maxFps}"`);
}
const adaptationSet = [
` <AdaptationSet ${adaptArr.join(' ')}>`,
representations.join('\n'),
` </AdaptationSet>`
];
return adaptationSet.join('\n');
}
function _getStreamRepresentation(stream)
{
const repOptsArr = [
`id="${stream.itag}"`,
`codecs="${stream.mimeInfo.codecs}"`,
`bandwidth="${stream.bitrate}"`,
];
if(stream.width && stream.height) {
repOptsArr.push(`width="${stream.width}"`);
repOptsArr.push(`height="${stream.height}"`);
repOptsArr.push(`sar="1:1"`);
}
if(stream.fps)
repOptsArr.push(`frameRate="${stream.fps}"`);
const repArr = [
` <Representation ${repOptsArr.join(' ')}>`,
];
if(stream.audioChannels) {
const audioConfArr = [
`schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011"`,
`value="${stream.audioChannels}"`,
];
repArr.push(` <AudioChannelConfiguration ${audioConfArr.join(' ')}/>`);
}
repArr.push(
` <BaseURL>${stream.url}</BaseURL>`
);
if(stream.indexRange) {
const segRange = `${stream.indexRange.start}-${stream.indexRange.end}`;
repArr.push(
` <SegmentBase indexRange="${segRange}">`
);
if(stream.initRange) {
const initRange = `${stream.initRange.start}-${stream.initRange.end}`;
repArr.push(
` <Initialization range="${initRange}"/>`
);
}
repArr.push(
` </SegmentBase>`
);
}
repArr.push(
` </Representation>`
);
return repArr.join('\n');
}
function _getPar(width, height)
{
const gcd = _getGCD(width, height);
width /= gcd;
height /= gcd;
return `${width}:${height}`;
}
function _getGCD(width, height)
{
return (height)
? _getGCD(height, width % height)
: width;
}

View File

@@ -20,17 +20,6 @@ clapperDebugger.enabled = (
&& G_DEBUG_ENV.includes('Clapper') && G_DEBUG_ENV.includes('Clapper')
); );
const ytDebugger = new Debug.Debugger('YouTube', {
name_printer: new Ink.Printer({
font: Ink.Font.BOLD,
color: Ink.Color.RED
}),
time_printer: new Ink.Printer({
color: Ink.Color.LIGHT_BLUE
}),
high_precision: true,
});
function _logStructured(debuggerName, msg, level) function _logStructured(debuggerName, msg, level)
{ {
GLib.log_structured( GLib.log_structured(
@@ -52,14 +41,7 @@ function _debug(debuggerName, msg)
return; return;
} }
switch(debuggerName) { clapperDebugger.debug(msg);
case 'Clapper':
clapperDebugger.debug(msg);
break;
case 'YouTube':
ytDebugger.debug(msg);
break;
}
} }
function debug(msg) function debug(msg)
@@ -67,11 +49,6 @@ function debug(msg)
_debug('Clapper', msg); _debug('Clapper', msg);
} }
function ytDebug(msg)
{
_debug('YouTube', msg);
}
function warn(msg) function warn(msg)
{ {
_logStructured('Clapper', msg, GLib.LogLevelFlags.LEVEL_WARNING); _logStructured('Clapper', msg, GLib.LogLevelFlags.LEVEL_WARNING);

View File

@@ -1,11 +1,233 @@
const { GObject } = imports.gi; const { GObject, Gtk } = imports.gi;
const { HeaderBarBase } = imports.src.headerbarBase; const Debug = imports.src.debug;
const Misc = imports.src.misc;
const { debug } = Debug;
var HeaderBar = GObject.registerClass({ var HeaderBar = GObject.registerClass({
GTypeName: 'ClapperHeaderBar', GTypeName: 'ClapperHeaderBar',
}, },
class ClapperHeaderBar extends HeaderBarBase class ClapperHeaderBar extends Gtk.Box
{ {
_init()
{
super._init({
can_focus: false,
orientation: Gtk.Orientation.HORIZONTAL,
spacing: 6,
margin_top: 6,
margin_start: 6,
margin_end: 6,
});
this.add_css_class('osdheaderbar');
this.isMaximized = false;
this.isMenuOnLeft = true;
const uiBuilder = Misc.getBuilderForName('clapper.ui');
this.menuWidget = new Gtk.Box({
orientation: Gtk.Orientation.HORIZONTAL,
valign: Gtk.Align.CENTER,
spacing: 6,
});
this.menuButton = new Gtk.MenuButton({
icon_name: 'open-menu-symbolic',
valign: Gtk.Align.CENTER,
can_focus: false,
});
const menuToggleButton = this.menuButton.get_first_child();
menuToggleButton.add_css_class('osd');
const mainMenuModel = uiBuilder.get_object('mainMenu');
const mainMenuPopover = new HeaderBarPopover(mainMenuModel);
this.menuButton.set_popover(mainMenuPopover);
this.menuButton.add_css_class('circular');
this.menuWidget.append(this.menuButton);
this.extraButtonsBox = new Gtk.Box({
orientation: Gtk.Orientation.HORIZONTAL,
valign: Gtk.Align.CENTER,
});
this.extraButtonsBox.add_css_class('linked');
const floatButton = new Gtk.Button({
icon_name: 'pip-in-symbolic',
can_focus: false,
});
floatButton.add_css_class('osd');
floatButton.add_css_class('circular');
floatButton.add_css_class('linkedleft');
floatButton.connect('clicked',
this._onFloatButtonClicked.bind(this)
);
this.extraButtonsBox.append(floatButton);
const separator = new Gtk.Separator({
orientation: Gtk.Orientation.VERTICAL,
});
separator.add_css_class('linkseparator');
this.extraButtonsBox.append(separator);
const fullscreenButton = new Gtk.Button({
icon_name: 'view-fullscreen-symbolic',
can_focus: false,
});
fullscreenButton.add_css_class('osd');
fullscreenButton.add_css_class('circular');
fullscreenButton.add_css_class('linkedright');
fullscreenButton.connect('clicked',
this._onFullscreenButtonClicked.bind(this)
);
this.extraButtonsBox.append(fullscreenButton);
this.menuWidget.append(this.extraButtonsBox);
this.spacerWidget = new Gtk.Box({
hexpand: true,
});
this.minimizeWidget = this._getWindowButton('minimize');
this.maximizeWidget = this._getWindowButton('maximize');
this.closeWidget = this._getWindowButton('close');
const gtkSettings = Gtk.Settings.get_default();
this._onLayoutUpdate(gtkSettings);
gtkSettings.connect(
'notify::gtk-decoration-layout',
this._onLayoutUpdate.bind(this)
);
}
setMenuOnLeft(isOnLeft)
{
if(this.isMenuOnLeft === isOnLeft)
return;
if(isOnLeft) {
this.menuWidget.reorder_child_after(
this.extraButtonsBox, this.menuButton
);
}
else {
this.menuWidget.reorder_child_after(
this.menuButton, this.extraButtonsBox
);
}
this.isMenuOnLeft = isOnLeft;
}
setMaximized(isMaximized)
{
if(this.isMaximized === isMaximized)
return;
this.maximizeWidget.icon_name = (isMaximized)
? 'window-restore-symbolic'
: 'window-maximize-symbolic';
this.isMaximized = isMaximized;
}
_onLayoutUpdate(gtkSettings)
{
const gtkLayout = gtkSettings.gtk_decoration_layout;
this._replaceButtons(gtkLayout);
}
_replaceButtons(gtkLayout)
{
const modLayout = gtkLayout.replace(':', ',spacer,');
const layoutArr = modLayout.split(',');
let lastWidget = null;
let showMinimize = false;
let showMaximize = false;
let showClose = false;
let menuAdded = false;
let spacerAdded = false;
debug(`headerbar layout: ${modLayout}`);
for(let name of layoutArr) {
/* Menu might be named "appmenu" */
if(!menuAdded && (!name || name === 'appmenu' || name === 'icon'))
name = 'menu';
const widget = this[`${name}Widget`];
if(!widget) continue;
if(!widget.parent)
this.append(widget);
else
this.reorder_child_after(widget, lastWidget);
switch(name) {
case 'spacer':
spacerAdded = true;
break;
case 'minimize':
showMinimize = true;
break;
case 'maximize':
showMaximize = true;
break;
case 'close':
showClose = true;
break;
case 'menu':
this.setMenuOnLeft(!spacerAdded);
menuAdded = true;
break;
default:
break;
}
lastWidget = widget;
}
this.minimizeWidget.visible = showMinimize;
this.maximizeWidget.visible = showMaximize;
this.closeWidget.visible = showClose;
}
_getWindowButton(name)
{
const button = new Gtk.Button({
icon_name: `window-${name}-symbolic`,
valign: Gtk.Align.CENTER,
can_focus: false,
});
button.add_css_class('osd');
button.add_css_class('circular');
if(name === 'maximize')
name = 'toggle-maximized';
button.connect('clicked',
this._onWindowButtonActivate.bind(this, name)
);
return button;
}
_updateFloatIcon(isFloating)
{
const floatButton = this.extraButtonsBox.get_first_child();
if(!floatButton) return;
const iconName = (isFloating)
? 'pip-out-symbolic'
: 'pip-in-symbolic';
if(floatButton.icon_name !== iconName)
floatButton.icon_name = iconName;
}
_onWindowButtonActivate(action) _onWindowButtonActivate(action)
{ {
this.activate_action(`window.${action}`, null); this.activate_action(`window.${action}`, null);
@@ -29,3 +251,49 @@ class ClapperHeaderBar extends HeaderBarBase
this.root.fullscreen(); this.root.fullscreen();
} }
}); });
var HeaderBarPopover = GObject.registerClass({
GTypeName: 'ClapperHeaderBarPopover',
},
class ClapperHeaderBarPopover extends Gtk.PopoverMenu
{
_init(model)
{
super._init({
menu_model: model,
});
this.connect('map', this._onMap.bind(this));
this.connect('closed', this._onClosed.bind(this));
}
_onMap()
{
const { child } = this.root;
if(
!child
|| !child.player
|| !child.player.widget
)
return;
child.revealControls();
child.isPopoverOpen = true;
}
_onClosed()
{
const { child } = this.root;
if(
!child
|| !child.player
|| !child.player.widget
)
return;
child.revealControls();
child.isPopoverOpen = false;
}
});

View File

@@ -1,288 +0,0 @@
const { GObject, Gtk } = imports.gi;
const Debug = imports.src.debug;
const Misc = imports.src.misc;
const { debug } = Debug;
var HeaderBarBase = GObject.registerClass({
GTypeName: 'ClapperHeaderBarBase',
},
class ClapperHeaderBarBase extends Gtk.Box
{
_init()
{
super._init({
can_focus: false,
orientation: Gtk.Orientation.HORIZONTAL,
spacing: 6,
margin_top: 6,
margin_start: 6,
margin_end: 6,
});
this.add_css_class('osdheaderbar');
this.isMaximized = false;
this.isMenuOnLeft = true;
const uiBuilder = Misc.getBuilderForName('clapper.ui');
this.menuWidget = new Gtk.Box({
orientation: Gtk.Orientation.HORIZONTAL,
valign: Gtk.Align.CENTER,
spacing: 6,
});
this.menuButton = new Gtk.MenuButton({
icon_name: 'open-menu-symbolic',
valign: Gtk.Align.CENTER,
can_focus: false,
});
const menuToggleButton = this.menuButton.get_first_child();
menuToggleButton.add_css_class('osd');
const mainMenuModel = uiBuilder.get_object('mainMenu');
const mainMenuPopover = new HeaderBarPopover(mainMenuModel);
this.menuButton.set_popover(mainMenuPopover);
this.menuButton.add_css_class('circular');
this.menuWidget.append(this.menuButton);
this.extraButtonsBox = new Gtk.Box({
orientation: Gtk.Orientation.HORIZONTAL,
valign: Gtk.Align.CENTER,
});
this.extraButtonsBox.add_css_class('linked');
const floatButton = new Gtk.Button({
icon_name: 'pip-in-symbolic',
can_focus: false,
});
floatButton.add_css_class('osd');
floatButton.add_css_class('circular');
floatButton.add_css_class('linkedleft');
floatButton.connect('clicked',
this._onFloatButtonClicked.bind(this)
);
this.extraButtonsBox.append(floatButton);
const separator = new Gtk.Separator({
orientation: Gtk.Orientation.VERTICAL,
});
separator.add_css_class('linkseparator');
this.extraButtonsBox.append(separator);
const fullscreenButton = new Gtk.Button({
icon_name: 'view-fullscreen-symbolic',
can_focus: false,
});
fullscreenButton.add_css_class('osd');
fullscreenButton.add_css_class('circular');
fullscreenButton.add_css_class('linkedright');
fullscreenButton.connect('clicked',
this._onFullscreenButtonClicked.bind(this)
);
this.extraButtonsBox.append(fullscreenButton);
this.menuWidget.append(this.extraButtonsBox);
this.spacerWidget = new Gtk.Box({
hexpand: true,
});
this.minimizeWidget = this._getWindowButton('minimize');
this.maximizeWidget = this._getWindowButton('maximize');
this.closeWidget = this._getWindowButton('close');
const gtkSettings = Gtk.Settings.get_default();
this._onLayoutUpdate(gtkSettings);
gtkSettings.connect(
'notify::gtk-decoration-layout',
this._onLayoutUpdate.bind(this)
);
}
setMenuOnLeft(isOnLeft)
{
if(this.isMenuOnLeft === isOnLeft)
return;
if(isOnLeft) {
this.menuWidget.reorder_child_after(
this.extraButtonsBox, this.menuButton
);
}
else {
this.menuWidget.reorder_child_after(
this.menuButton, this.extraButtonsBox
);
}
this.isMenuOnLeft = isOnLeft;
}
setMaximized(isMaximized)
{
if(this.isMaximized === isMaximized)
return;
this.maximizeWidget.icon_name = (isMaximized)
? 'window-restore-symbolic'
: 'window-maximize-symbolic';
this.isMaximized = isMaximized;
}
_onLayoutUpdate(gtkSettings)
{
const gtkLayout = gtkSettings.gtk_decoration_layout;
this._replaceButtons(gtkLayout);
}
_replaceButtons(gtkLayout)
{
const modLayout = gtkLayout.replace(':', ',spacer,');
const layoutArr = modLayout.split(',');
let lastWidget = null;
let showMinimize = false;
let showMaximize = false;
let showClose = false;
let menuAdded = false;
let spacerAdded = false;
debug(`headerbar layout: ${modLayout}`);
for(let name of layoutArr) {
/* Menu might be named "appmenu" */
if(!menuAdded && (!name || name === 'appmenu' || name === 'icon'))
name = 'menu';
const widget = this[`${name}Widget`];
if(!widget) continue;
if(!widget.parent)
this.append(widget);
else
this.reorder_child_after(widget, lastWidget);
switch(name) {
case 'spacer':
spacerAdded = true;
break;
case 'minimize':
showMinimize = true;
break;
case 'maximize':
showMaximize = true;
break;
case 'close':
showClose = true;
break;
case 'menu':
this.setMenuOnLeft(!spacerAdded);
menuAdded = true;
break;
default:
break;
}
lastWidget = widget;
}
this.minimizeWidget.visible = showMinimize;
this.maximizeWidget.visible = showMaximize;
this.closeWidget.visible = showClose;
}
_getWindowButton(name)
{
const button = new Gtk.Button({
icon_name: `window-${name}-symbolic`,
valign: Gtk.Align.CENTER,
can_focus: false,
});
button.add_css_class('osd');
button.add_css_class('circular');
if(name === 'maximize')
name = 'toggle-maximized';
button.connect('clicked',
this._onWindowButtonActivate.bind(this, name)
);
return button;
}
_updateFloatIcon(isFloating)
{
const floatButton = this.extraButtonsBox.get_first_child();
if(!floatButton) return;
const iconName = (isFloating)
? 'pip-out-symbolic'
: 'pip-in-symbolic';
if(floatButton.icon_name !== iconName)
floatButton.icon_name = iconName;
}
_onWindowButtonActivate(action)
{
}
_onFloatButtonClicked(button)
{
}
_onFullscreenButtonClicked(button)
{
}
});
var HeaderBarPopover = GObject.registerClass({
GTypeName: 'ClapperHeaderBarPopover',
},
class ClapperHeaderBarPopover extends Gtk.PopoverMenu
{
_init(model)
{
super._init({
menu_model: model,
});
this.connect('map', this._onMap.bind(this));
this.connect('closed', this._onClosed.bind(this));
}
_onMap()
{
const { child } = this.root;
if(
!child
|| !child.player
|| !child.player.widget
)
return;
child.revealControls();
child.isPopoverOpen = true;
}
_onClosed()
{
const { child } = this.root;
if(
!child
|| !child.player
|| !child.player.widget
)
return;
child.revealControls();
child.isPopoverOpen = false;
}
});

View File

@@ -1,22 +0,0 @@
const { GObject } = imports.gi;
const { HeaderBarBase } = imports.src.headerbarBase;
var HeaderBarRemote = GObject.registerClass({
GTypeName: 'ClapperHeaderBarRemote',
},
class ClapperHeaderBarRemote extends HeaderBarBase
{
_init()
{
super._init();
this.extraButtonsBox.visible = false;
}
_onWindowButtonActivate(action)
{
if(action === 'toggle-maximized')
action = 'toggle_maximized';
this.root.child.sendWs(action);
}
});

View File

@@ -1,6 +1,6 @@
imports.gi.versions.Gdk = '4.0'; imports.gi.versions.Gdk = '4.0';
imports.gi.versions.Gtk = '4.0'; imports.gi.versions.Gtk = '4.0';
imports.gi.versions.Soup = '2.4'; imports.gi.versions.Soup = '3.0';
pkg.initGettext(); pkg.initGettext();
pkg.initFormat(); pkg.initFormat();
@@ -10,6 +10,7 @@ Debug.debug('imports');
const { GstClapper, Gtk, Adw } = imports.gi; const { GstClapper, Gtk, Adw } = imports.gi;
const { App } = imports.src.app; const { App } = imports.src.app;
const Misc = imports.src.misc;
function main(argv) function main(argv)
{ {
@@ -19,6 +20,10 @@ function main(argv)
Gtk.init(); Gtk.init();
Adw.init(); Adw.init();
/* U+2236 seems to break RTL languages, use U+003A instead */
if(Gtk.Widget.get_default_direction() === Gtk.TextDirection.RTL)
Misc.timeColon = ':';
Debug.debug('initialized'); Debug.debug('initialized');
new App().run(argv); new App().run(argv);

View File

@@ -1,6 +0,0 @@
const { Daemon } = imports.src.daemon;
function main()
{
new Daemon();
}

View File

@@ -1,19 +0,0 @@
imports.gi.versions.Gdk = '4.0';
imports.gi.versions.Gtk = '4.0';
imports.gi.versions.Soup = '2.4';
pkg.initGettext();
const Misc = imports.src.misc;
Misc.appId += '.Remote';
const { Gtk, Adw } = imports.gi;
const { AppRemote } = imports.src.appRemote;
function main(argv)
{
Gtk.init();
Adw.init();
new AppRemote().run(argv);
}

View File

@@ -9,6 +9,7 @@ var subsMimes = [
'application/x-subrip', 'application/x-subrip',
'text/x-ssa', 'text/x-ssa',
]; ];
var timeColon = '';
var settings = new Gio.Settings({ var settings = new Gio.Settings({
schema_id: appId, schema_id: appId,
@@ -161,8 +162,8 @@ function getFormattedTime(time, showHours)
time -= minutes * 60; time -= minutes * 60;
const seconds = ('0' + Math.floor(time)).slice(-2); const seconds = ('0' + Math.floor(time)).slice(-2);
const parsed = (hours) ? `${hours}:` : ''; const parsed = (hours) ? `${hours}${timeColon}` : '';
return parsed + `${minutes}:${seconds}`; return parsed + `${minutes}${timeColon}${seconds}`;
} }
function parsePlaylistFiles(filesArray) function parsePlaylistFiles(filesArray)
@@ -224,22 +225,3 @@ function getIsTouch(gesture)
return false; return false;
} }
} }
function encodeHTML(text)
{
return text.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&apos;');
}
function decodeURIPlus(uri)
{
return decodeURI(uri.replace(/\+/g, ' '));
}
function isHex(num)
{
return Boolean(num.match(/[0-9a-f]+$/i));
}

View File

@@ -1,10 +1,8 @@
const { Adw, Gdk, Gio, GObject, Gst, GstClapper, Gtk } = imports.gi; const { Adw, Gdk, Gio, GLib, GObject, Gst, GstClapper, Gtk } = imports.gi;
const ByteArray = imports.byteArray; const ByteArray = imports.byteArray;
const Debug = imports.src.debug; const Debug = imports.src.debug;
const Misc = imports.src.misc; const Misc = imports.src.misc;
const YouTube = imports.src.youtube;
const { PlaylistWidget } = imports.src.playlist; const { PlaylistWidget } = imports.src.playlist;
const { WebApp } = imports.src.webApp;
const { debug, warn } = Debug; const { debug, warn } = Debug;
const { settings } = Misc; const { settings } = Misc;
@@ -18,14 +16,28 @@ class ClapperPlayer extends GstClapper.Clapper
{ {
_init() _init()
{ {
const gtk4plugin = new GstClapper.ClapperGtk4Plugin(); let vsink = null;
const glsinkbin = Gst.ElementFactory.make('glsinkbin', null); const use_legacy_sink = GLib.getenv('CLAPPER_USE_LEGACY_SINK');
glsinkbin.sink = gtk4plugin.video_sink;
if(!use_legacy_sink || use_legacy_sink != '1') {
vsink = Gst.ElementFactory.make('clappersink', null);
this.clappersink = vsink;
}
if(!vsink) {
vsink = Gst.ElementFactory.make('glsinkbin', null);
const gtk4plugin = new GstClapper.ClapperGtk4Plugin();
warn('using legacy video sink');
this.clappersink = gtk4plugin.video_sink;
vsink.sink = this.clappersink;
}
super._init({ super._init({
signal_dispatcher: new GstClapper.ClapperGMainContextSignalDispatcher(), signal_dispatcher: new GstClapper.ClapperGMainContextSignalDispatcher(),
video_renderer: new GstClapper.ClapperVideoOverlayVideoRenderer({ video_renderer: new GstClapper.ClapperVideoOverlayVideoRenderer({
video_sink: glsinkbin, video_sink: vsink,
}), }),
mpris: new GstClapper.ClapperMpris({ mpris: new GstClapper.ClapperMpris({
own_name: `org.mpris.MediaPlayer2.${Misc.appName}`, own_name: `org.mpris.MediaPlayer2.${Misc.appName}`,
@@ -38,26 +50,22 @@ class ClapperPlayer extends GstClapper.Clapper
use_pipewire: settings.get_boolean('use-pipewire'), use_pipewire: settings.get_boolean('use-pipewire'),
}); });
this.widget = gtk4plugin.video_sink.widget; this.widget = this.clappersink.widget;
this.widget.add_css_class('videowidget'); this.widget.add_css_class('videowidget');
this.visualization_enabled = false; this.visualization_enabled = false;
this.webserver = null; this.webserver = null;
this.webapp = null;
this.ytClient = null;
this.playlistWidget = new PlaylistWidget(); this.playlistWidget = new PlaylistWidget();
this.seekDone = true; this.seekDone = true;
this.needsFastSeekRestore = false; this.needsFastSeekRestore = false;
this.customVideoTitle = null;
this.windowMapped = false; this.windowMapped = false;
this.quitOnStop = false; this.quitOnStop = false;
this.needsTocUpdate = true; this.needsTocUpdate = true;
this.set_all_plugins_ranks(); this.set_all_plugins_ranks();
this.set_initial_config();
this.set_and_bind_settings(); this.set_and_bind_settings();
this.connect('state-changed', this._onStateChanged.bind(this)); this.connect('state-changed', this._onStateChanged.bind(this));
@@ -89,13 +97,6 @@ class ClapperPlayer extends GstClapper.Clapper
settings.bind('subtitle-font', this.pipeline, 'subtitle-font-desc', flag); settings.bind('subtitle-font', this.pipeline, 'subtitle-font-desc', flag);
} }
set_initial_config()
{
/* FIXME: change into option in preferences */
const pipeline = this.get_pipeline();
pipeline.ring_buffer_max_size = 8 * 1024 * 1024;
}
set_all_plugins_ranks() set_all_plugins_ranks()
{ {
let data = {}; let data = {};
@@ -142,42 +143,19 @@ class ClapperPlayer extends GstClapper.Clapper
set_uri(uri) set_uri(uri)
{ {
this.customVideoTitle = null; if(Misc.getUriProtocol(uri) === 'file') {
const file = Misc.getFileFromLocalUri(uri);
if(!file) {
if(!this.playlistWidget.nextTrack())
debug('set media reached end of playlist');
if(Misc.getUriProtocol(uri) !== 'file') { return;
const [isYouTubeUri, videoId] = YouTube.checkYouTubeUri(uri); }
if(uri.endsWith('.claps')) {
this.load_playlist_file(file);
if(!isYouTubeUri) return;
return super.set_uri(uri); }
if(!this.ytClient)
this.ytClient = new YouTube.YouTubeClient();
const { root } = this.widget;
const surface = root.get_surface();
const monitor = root.display.get_monitor_at_surface(surface);
this.ytClient.getPlaybackDataAsync(videoId, monitor)
.then(data => {
this.customVideoTitle = data.title;
super.set_uri(data.uri);
})
.catch(debug);
return;
}
const file = Misc.getFileFromLocalUri(uri);
if(!file) {
if(!this.playlistWidget.nextTrack())
debug('set media reached end of playlist');
return;
}
if(uri.endsWith('.claps')) {
this.load_playlist_file(file);
return;
} }
super.set_uri(uri); super.set_uri(uri);
@@ -643,7 +621,7 @@ class ClapperPlayer extends GstClapper.Clapper
switch(key) { switch(key) {
case 'after-playback': case 'after-playback':
this.widget.keep_last_frame = (settings.get_int(key) === 1); this.clappersink.keep_last_frame = (settings.get_int(key) === 1);
break; break;
case 'seeking-mode': case 'seeking-mode':
switch(settings.get_int(key)) { switch(settings.get_int(key)) {
@@ -701,7 +679,6 @@ class ClapperPlayer extends GstClapper.Clapper
debug(`changed play flags: ${initialFlags} -> ${settingsFlags}`); debug(`changed play flags: ${initialFlags} -> ${settingsFlags}`);
break; break;
case 'webserver-enabled': case 'webserver-enabled':
case 'webapp-enabled':
const webserverEnabled = settings.get_boolean('webserver-enabled'); const webserverEnabled = settings.get_boolean('webserver-enabled');
if(webserverEnabled) { if(webserverEnabled) {
@@ -716,22 +693,8 @@ class ClapperPlayer extends GstClapper.Clapper
this.webserver.passMsgData = this.receiveWs.bind(this); this.webserver.passMsgData = this.receiveWs.bind(this);
} }
this.webserver.startListening(); this.webserver.startListening();
const webappEnabled = settings.get_boolean('webapp-enabled');
if(!this.webapp && !webappEnabled)
break;
if(webappEnabled) {
if(!this.webapp)
this.webapp = new WebApp();
this.webapp.startDaemonApp(settings.get_int('webapp-port'));
}
} }
else if(this.webserver) { else if(this.webserver) {
/* remote app will close when connection is lost
* which will cause the daemon to close too */
this.webserver.stopListening(); this.webserver.stopListening();
} }
break; break;

View File

@@ -1,51 +0,0 @@
const { GObject } = imports.gi;
const { WebClient } = imports.src.webClient;
var ClapperState = {
STOPPED: 0,
BUFFERING: 1,
PAUSED: 2,
PLAYING: 3,
};
var PlayerRemote = GObject.registerClass({
GTypeName: 'ClapperPlayerRemote',
},
class ClapperPlayerRemote extends GObject.Object
{
_init()
{
super._init();
this.webclient = new WebClient();
}
set_playlist(playlist)
{
const uris = [];
/* We can not send GioFiles via WebSocket */
for(let source of playlist)
uris.push(this._getSourceUri(source));
this.webclient.sendMessage({
action: 'set_playlist',
value: uris
});
}
set_subtitles(source)
{
this.webclient.sendMessage({
action: 'set_subtitles',
value: this._getSourceUri(source)
});
}
_getSourceUri(source)
{
return (source.get_uri != null)
? source.get_uri()
: source;
}
});

View File

@@ -59,8 +59,8 @@ class ClapperRevealerTop extends CustomRevealer
const initTime = GLib.DateTime.new_now_local().format('%X'); const initTime = GLib.DateTime.new_now_local().format('%X');
this.timeFormat = (initTime.length > 8) this.timeFormat = (initTime.length > 8)
? '%I:%M %p' ? `%I${Misc.timeColon}%M %p`
: '%H:%M'; : `%H${Misc.timeColon}%M`;
this.mediaTitle = new Gtk.Label({ this.mediaTitle = new Gtk.Label({
ellipsize: Pango.EllipsizeMode.END, ellipsize: Pango.EllipsizeMode.END,

View File

@@ -1,51 +0,0 @@
const { Gio, GObject } = imports.gi;
const Debug = imports.src.debug;
const Misc = imports.src.misc;
const { debug } = Debug;
var WebApp = GObject.registerClass({
GTypeName: 'ClapperWebApp',
},
class ClapperWebApp extends Gio.SubprocessLauncher
{
_init()
{
const flags = Gio.SubprocessFlags.STDOUT_SILENCE
| Gio.SubprocessFlags.STDERR_SILENCE;
super._init({ flags });
this.daemonApp = null;
}
startDaemonApp(port)
{
if(this.daemonApp)
return;
this.daemonApp = this.spawnv([Misc.appId + '.Daemon', String(port)]);
this.daemonApp.wait_async(null, this._onDaemonClosed.bind(this));
debug('daemon app started');
}
_onDaemonClosed(proc, result)
{
let hadError;
try {
hadError = proc.wait_finish(result);
}
catch(err) {
debug(err);
}
this.daemonApp = null;
if(hadError)
debug('daemon app exited with error or was forced to close');
debug('daemon app closed');
}
});

Some files were not shown because too many files have changed in this diff Show More