1 Commits

Author SHA1 Message Date
Rafał Dzięgiel
21d0ba654b WIP: clapper-gtk: Add new ClapperGtkEngageLayer widget 2024-05-03 09:29:02 +02:00
138 changed files with 839 additions and 7982 deletions

View File

@@ -1,58 +0,0 @@
on:
workflow_dispatch:
push:
branches:
- master
pull_request:
branches:
- master
name: "Documentation"
jobs:
documentation:
runs-on: ubuntu-latest
container:
image: registry.fedoraproject.org/fedora
options: --privileged
steps:
- name: Prepare
run: |
dnf -y install git gcc meson glib2-devel \
gstreamer1-devel gstreamer1-plugins-base-devel \
gtk4-devel libsoup3-devel libmicrodns-devel \
gobject-introspection-devel graphviz gi-docgen
- name: Checkout
uses: actions/checkout@v4
with:
persist-credentials: false
fetch-depth: 0
- name: Build
run: |
meson setup builddir -Dauto_features=enabled \
-Denhancers-loader=disabled \
-Dclapper-app=disabled -Dvapi=disabled -Ddoc=true \
-Dglimporter=auto -Dgluploader=auto -Drawimporter=auto
cd builddir
meson compile
- name: Commit files
if: ${{ success() && github.ref == 'refs/heads/master' }}
continue-on-error: true
run: |
git config --global --add safe.directory $GITHUB_WORKSPACE
git checkout gh-pages
rm -rf doc/clapper/*
rm -rf doc/clapper-gtk/*
mv builddir/doc/reference/clapper/clapper.toml doc/clapper/
mv builddir/doc/reference/clapper/clapper/* doc/clapper/
mv builddir/doc/reference/clapper-gtk/clapper-gtk.toml doc/clapper-gtk/
mv builddir/doc/reference/clapper-gtk/clapper-gtk/* doc/clapper-gtk/
git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git add doc/clapper/* doc/clapper-gtk/*
git commit -m "doc: Update" || true
- name: Push changes
uses: ad-m/github-push-action@master
if: ${{ success() && github.ref == 'refs/heads/master' }}
continue-on-error: true
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: gh-pages

View File

@@ -30,8 +30,8 @@ jobs:
platforms: arm64
- name: Prepare Runtime
run: |
flatpak --system install -y --noninteractive flathub org.freedesktop.Sdk.Extension.rust-stable/${{ matrix.arch }}/24.08
flatpak --system install -y --noninteractive flathub org.freedesktop.Sdk.Extension.llvm18/${{ matrix.arch }}/24.08
flatpak --system install -y --noninteractive flathub org.freedesktop.Sdk.Extension.rust-nightly/${{ matrix.arch }}/23.08
flatpak --system install -y --noninteractive flathub org.freedesktop.Sdk.Extension.llvm16/${{ matrix.arch }}/23.08
- name: Build
uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v6
with:

View File

@@ -1,90 +0,0 @@
on:
workflow_dispatch:
push:
branches:
- master
pull_request:
branches:
- master
name: "Windows"
jobs:
windows:
name: "Windows"
runs-on: windows-latest
strategy:
matrix:
arch: [x86_64]
defaults:
run:
shell: msys2 {0}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup MSYS2
uses: msys2/setup-msys2@v2
with:
msystem: MINGW64
update: true
install: |-
mingw-w64-${{ matrix.arch }}-meson
mingw-w64-${{ matrix.arch }}-gcc
mingw-w64-${{ matrix.arch }}-glib2
mingw-w64-${{ matrix.arch }}-gstreamer
mingw-w64-${{ matrix.arch }}-gst-plugins-base
mingw-w64-${{ matrix.arch }}-gst-plugins-good
mingw-w64-${{ matrix.arch }}-gst-plugins-bad
mingw-w64-${{ matrix.arch }}-gst-plugins-ugly
mingw-w64-${{ matrix.arch }}-gst-libav
mingw-w64-${{ matrix.arch }}-libpeas2
mingw-w64-${{ matrix.arch }}-libsoup3
mingw-w64-${{ matrix.arch }}-libmicrodns
mingw-w64-${{ matrix.arch }}-gtk4
mingw-w64-${{ matrix.arch }}-libadwaita
- name: Prepare
run: |
BUILD_PREFIX="$GITHUB_WORKSPACE/clapper-win-${{ matrix.arch }}"
mkdir -p $BUILD_PREFIX/bin
cp /mingw64/bin/gdbus.exe $BUILD_PREFIX/bin/
cp /mingw64/bin/gst-inspect-1.0.exe $BUILD_PREFIX/bin/
mkdir -p $BUILD_PREFIX/lib
cp -r /mingw64/lib/gio $BUILD_PREFIX/lib/
cp -r /mingw64/lib/gstreamer-1.0 $BUILD_PREFIX/lib/
cp -r /mingw64/lib/gdk-pixbuf-2.0 $BUILD_PREFIX/lib/
mkdir -p $BUILD_PREFIX/share/glib-2.0/schemas
cp -r /mingw64/share/glib-2.0/schemas/*.xml $BUILD_PREFIX/share/glib-2.0/schemas/
cp -r /mingw64/share/icons $BUILD_PREFIX/share/
mkdir -p $BUILD_PREFIX/share/xml/iso-codes
cp /mingw64/share/xml/iso-codes/iso_639.xml $BUILD_PREFIX/share/xml/iso-codes/
cd "$BUILD_PREFIX/lib/gstreamer-1.0"
rm -f \
libgstadpcmenc.dll libgstamfcodec.dll libgstdvbsubenc.dll libgstencoding.dll \
libgstfrei0r.dll libgstinter.dll libgstlame.dll libgstldac.dll libgstmpeg2enc.dll \
libgstmpegpsmux.dll libgstmpegtsmux.dll libgstmplex.dll libgstrealmedia.dll \
libgstsubenc.dll libgstsvtav1.dll libgstsvthevcenc.dll libgsttwolame.dll \
libgstvoamrwbenc.dll libgstwavenc.dll libgstx264.dll libgstx265.dll \
libgstxingmux.dll libgsty4menc.dll libgstzbar.dll
- name: Build
run: |
meson setup builddir --prefix=$GITHUB_WORKSPACE/clapper-win-${{ matrix.arch }}
cd builddir
meson compile
meson install
- name: Package
run: |
BUILD_PREFIX="$GITHUB_WORKSPACE/clapper-win-${{ matrix.arch }}"
ldd $BUILD_PREFIX/bin/clapper.exe | grep '\/mingw.*\.dll' -o | xargs -I{} cp -n "{}" $BUILD_PREFIX/bin
find $BUILD_PREFIX/lib/clapper-0.0/ -name '*\.dll' -type f -exec ldd "{}" \; | grep '\/mingw.*\.dll' -o | xargs -I{} cp -n "{}" $BUILD_PREFIX/bin
find $BUILD_PREFIX/lib/gstreamer-1.0/ -name '*\.dll' -type f -exec ldd "{}" \; | grep '\/mingw.*\.dll' -o | xargs -I{} cp -n "{}" $BUILD_PREFIX/bin
find $BUILD_PREFIX/lib/gio/ -name '*\.dll' -type f -exec ldd "{}" \; | grep '\/mingw.*\.dll' -o | xargs -I{} cp -n "{}" $BUILD_PREFIX/bin
- name: Upload
uses: actions/upload-artifact@v4
with:
name: clapper-win-${{ matrix.arch }}
path: clapper-win-${{ matrix.arch }}
if-no-files-found: error

View File

@@ -11,14 +11,14 @@ desktop environment using [GTK4](https://www.gtk.org/) toolkit, it has a clean a
This application aim is to offer all the essentials features you'd expect from a video player in a simple form.
<p align="center">
<img src="https://raw.githubusercontent.com/wiki/Rafostar/clapper/media/screenshot_01.png">
<img src="https://raw.githubusercontent.com/wiki/Rafostar/clapper/media/screenshot_03.png">
</p>
Clapper uses a playback queue where you can add multiple media files. Think of it like a playlist that you can build.
You can easily reorder items or remove them from the queue with a simple drag and drop operation.
<p align="center">
<img src="https://raw.githubusercontent.com/wiki/Rafostar/clapper/media/screenshot_03.png">
<img src="https://raw.githubusercontent.com/wiki/Rafostar/clapper/media/screenshot_04.png">
</p>
### Components

View File

@@ -16,7 +16,6 @@ custom_target('clapper-gtk-doc',
gi_docgen,
'generate',
gi_docgen_common_args,
'--add-include-path=@0@'.format(join_paths(meson.project_build_root(), 'src', 'lib', 'clapper')),
'--add-include-path=@0@'.format(join_paths(meson.project_build_root(), 'src', 'lib', 'clapper-gtk')),
'--config=@INPUT0@',
'--output-dir=@OUTPUT@',

View File

@@ -1,57 +0,0 @@
#!/usr/bin/env python3
import gi
gi.require_version('Adw', '1')
gi.require_version('Clapper', '0.0')
gi.require_version('ClapperGtk', '0.0')
gi.require_version('GLib', '2.0')
gi.require_version('Gtk', '4.0')
from gi.repository import Adw, Clapper, ClapperGtk, GLib, Gtk
import shutil
Clapper.init(None)
download_dir = GLib.build_filenamev([GLib.get_user_cache_dir(), "example_download_dir", None])
print('Using cache directory: {0}'.format(download_dir))
def on_download_complete(player, item, location):
# Media downloaded. Data from this file is still used for current playback (including seeking).
print('Download complete: {0} => {1}'.format(item.props.uri, location))
def on_activate(app):
win = Gtk.ApplicationWindow(application=app, default_width=640, default_height=396)
video = ClapperGtk.Video()
controls = ClapperGtk.SimpleControls(fullscreenable=False)
# Enable local storage caching and monitor it
video.props.player.set_download_dir(download_dir)
video.props.player.set_download_enabled(True)
video.props.player.connect('download-complete', on_download_complete)
# Configure playback
video.props.player.props.queue.set_progression_mode(Clapper.QueueProgressionMode.CAROUSEL)
video.props.player.set_autoplay(True)
# Assemble window
video.add_fading_overlay(controls)
win.set_child(video)
win.present()
# Create and add media for playback
item_1 = Clapper.MediaItem(uri='http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4')
item_2 = Clapper.MediaItem(uri='http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ElephantsDream.mp4')
video.props.player.props.queue.add_item(item_1)
video.props.player.props.queue.add_item(item_2)
# Create a new application
app = Adw.Application(application_id='com.example.ClapperDownloadCache')
app.connect('activate', on_activate)
# Run the application
app.run(None)
# Finally app should cleanup before exit. Possibly moving data to
# another dir if it wants to use it on next run and deleting what's
# left (so any unfinished downloads will also be removed).
print('Cleanup')
shutil.rmtree(download_dir)

View File

@@ -1,45 +0,0 @@
#!/usr/bin/env python3
import gi
gi.require_version('Adw', '1')
gi.require_version('Clapper', '0.0')
gi.require_version('ClapperGtk', '0.0')
gi.require_version('Gtk', '4.0')
from gi.repository import Adw, Clapper, ClapperGtk, Gtk
Clapper.init(None)
def on_toggle_fullscreen(video, win):
# Since this example uses only video inside normal window, all we
# need to toggle fullscreen is to invert its fullscreened property
win.props.fullscreened ^= True
def on_activate(app):
win = Gtk.ApplicationWindow(application=app, default_width=640, default_height=396)
video = ClapperGtk.Video()
controls = ClapperGtk.SimpleControls()
# This signal will be emitted when user requests fullscreen state change.
# It is app job to fullscreen video only (which might require something
# more than simply inverting fullscreen on the whole window).
video.connect('toggle-fullscreen', on_toggle_fullscreen, win)
# Create and add media for playback. First added media item to empty
# playback queue will be automatically selected.
item = Clapper.MediaItem(uri='http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4')
video.props.player.props.queue.add_item(item)
# Assemble window
video.add_fading_overlay(controls)
win.set_child(video)
win.present()
# Start playback
video.props.player.play()
# Create a new application
app = Adw.Application(application_id='com.example.ClapperSimple')
app.connect('activate', on_activate)
# Run the application
app.run(None)

View File

@@ -9,7 +9,7 @@ project('clapper', 'c',
)
glib_req = '>= 2.76.0'
gst_req = '>= 1.24.0'
gst_req = '>= 1.20.0'
gtk4_req = '>= 4.10.0'
adw_req = '>= 1.4.0'
@@ -85,11 +85,6 @@ libadwaita_dep = dependency('libadwaita-1',
required: false,
)
# Optional
peas_dep = dependency('libpeas-2',
required: false,
)
cc = meson.get_compiler('c')
libm = cc.find_library('m', required: false)
@@ -151,11 +146,6 @@ summary('introspection', build_gir ? 'Yes' : 'No', section: 'Build')
summary('vapi', build_vapi ? 'Yes' : 'No', section: 'Build')
summary('doc', build_doc ? 'Yes' : 'No', section: 'Build')
if build_clapper
foreach name : clapper_possible_functionalities
summary(name, clapper_available_functionalities.contains(name) ? 'Yes' : 'No', section: 'Functionalities')
endforeach
foreach name : clapper_possible_features
summary(name, clapper_available_features.contains(name) ? 'Yes' : 'No', section: 'Features')
endforeach
endif
foreach name : clapper_possible_features
summary(name, clapper_available_features.contains(name) ? 'Yes' : 'No', section: 'Features')
endforeach

View File

@@ -35,13 +35,6 @@ option('doc',
description: 'Build documentation'
)
# Functionalities
option('enhancers-loader',
type: 'feature',
value: 'enabled',
description: 'Ability to load libpeas based plugins that enhance capabilities'
)
# Features
option('discoverer',
type: 'feature',

View File

@@ -4,12 +4,12 @@
"runtime-version": "master",
"sdk": "org.gnome.Sdk",
"sdk-extensions": [
"org.freedesktop.Sdk.Extension.rust-stable",
"org.freedesktop.Sdk.Extension.llvm18"
"org.freedesktop.Sdk.Extension.rust-nightly",
"org.freedesktop.Sdk.Extension.llvm16"
],
"add-extensions": {
"org.freedesktop.Platform.ffmpeg-full": {
"version": "24.08",
"version": "23.08",
"directory": "lib/ffmpeg",
"add-ld-path": ".",
"no-autodownload": false,
@@ -29,19 +29,13 @@
"--filesystem=xdg-run/pipewire-0:ro",
"--filesystem=xdg-videos",
"--filesystem=xdg-run/gvfsd",
"--own-name=org.mpris.MediaPlayer2.Clapper.*",
"--own-name=org.mpris.MediaPlayer2.Clapper",
"--talk-name=org.gtk.vfs.*",
"--env=GST_PLUGIN_SYSTEM_PATH=/app/lib/gstreamer-1.0"
],
"build-options": {
"append-path": "/usr/lib/sdk/rust-stable/bin:/usr/lib/sdk/llvm18/bin",
"prepend-ld-library-path": "/usr/lib/sdk/llvm18/lib",
"env": {
"CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER": "clang",
"CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS": "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold",
"CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER": "clang",
"CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS": "-C link-arg=-fuse-ld=/usr/lib/sdk/rust-stable/bin/mold"
}
"append-path": "/usr/lib/sdk/rust-nightly/bin:/usr/lib/sdk/llvm16/bin",
"prepend-ld-library-path": "/usr/lib/sdk/llvm16/lib"
},
"modules": [
"flathub/shared-modules/gudev/gudev.json",
@@ -56,8 +50,7 @@
"testing/dav1d.json",
"testing/gstreamer.json",
"testing/gst-plugins-rs.json",
"testing/yt-dlp.json",
"testing/libpeas.json",
"testing/gtuber.json",
{
"name": "clapper",
"buildsystem": "meson",
@@ -67,8 +60,7 @@
"path": "../../."
}
]
},
"testing/clapper-enhancers.json"
}
],
"cleanup-commands": [
"mkdir -p /app/lib/ffmpeg",

View File

@@ -1,11 +1,11 @@
{
"app-id": "com.github.rafostar.Clapper",
"runtime": "org.gnome.Platform",
"runtime-version": "47",
"runtime-version": "45",
"sdk": "org.gnome.Sdk",
"add-extensions": {
"org.freedesktop.Platform.ffmpeg-full": {
"version": "24.08",
"version": "23.08",
"directory": "lib/ffmpeg",
"add-ld-path": ".",
"no-autodownload": false,
@@ -25,7 +25,7 @@
"--filesystem=xdg-run/pipewire-0:ro",
"--filesystem=xdg-videos",
"--filesystem=xdg-run/gvfsd",
"--own-name=org.mpris.MediaPlayer2.Clapper.*",
"--own-name=org.mpris.MediaPlayer2.Clapper",
"--talk-name=org.gtk.vfs.*",
"--env=GST_PLUGIN_SYSTEM_PATH=/app/lib/gstreamer-1.0"
],
@@ -40,20 +40,21 @@
"flathub/lib/libass.json",
"flathub/lib/uchardet.json",
"flathub/lib/libmicrodns.json",
"testing/gstreamer_stable.json",
"testing/yt-dlp.json",
"testing/libpeas.json",
"flathub/gstreamer-1.0/gstreamer.json",
"testing/gtuber.json",
{
"name": "clapper",
"buildsystem": "meson",
"config-opts": [
"-Dc_args=\"-DHAVE_GST_PATCHES=1\""
],
"sources": [
{
"type": "dir",
"path": "../../."
}
]
},
"testing/clapper-enhancers.json"
}
],
"cleanup-commands": [
"mkdir -p /app/lib/ffmpeg",

View File

@@ -1,14 +0,0 @@
{
"name": "clapper-enhancers",
"buildsystem": "meson",
"config-opts": [
"-Dauto_features=enabled"
],
"sources": [
{
"type": "git",
"url": "https://github.com/Rafostar/clapper-enhancers.git",
"branch": "main"
}
]
}

View File

@@ -1,99 +0,0 @@
{
"name": "gstreamer",
"buildsystem": "meson",
"config-opts": [
"--buildtype=release",
"--wrap-mode=nodownload",
"-Dbase=enabled",
"-Dgood=enabled",
"-Dbad=enabled",
"-Dugly=enabled",
"-Dlibav=enabled",
"-Dvaapi=enabled",
"-Dsharp=disabled",
"-Drs=disabled",
"-Dpython=disabled",
"-Ddevtools=disabled",
"-Dges=disabled",
"-Drtsp_server=disabled",
"-Dgst-examples=disabled",
"-Dqt5=disabled",
"-Dtests=disabled",
"-Dexamples=disabled",
"-Dintrospection=enabled",
"-Ddoc=disabled",
"-Dgtk_doc=disabled",
"-Dgpl=enabled",
"-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_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-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:webrtc=disabled",
"-Dgst-plugins-bad:wasapi=disabled",
"-Dgst-plugins-bad:wasapi2=disabled",
"-Dgst-plugins-bad:winks=disabled",
"-Dgst-plugins-bad:winscreencap=disabled",
"-Dgst-plugins-bad:assrender=enabled",
"-Dgst-plugins-bad:nvcodec=enabled",
"-Dgst-plugins-bad:v4l2codecs=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"
],
"sources": [
{
"type": "git",
"url": "https://gitlab.freedesktop.org/gstreamer/gstreamer.git",
"tag": "1.24.9",
"commit": "b309f90bfde36e6d175b70bfa0c941f2829dd6a5",
"disable-submodules": true
},
{
"type": "patch",
"path": "../flathub/gstreamer-1.0/gst-libav-stop-caching-codecs.patch"
},
{
"type": "patch",
"path": "../flathub/gstreamer-1.0/gst-plugins-base-autodetect-subtitle-text-encoding.patch"
},
{
"type": "patch",
"path": "../flathub/gstreamer-1.0/gst-plugins-good-matroska-fix-attachments-detection.patch"
},
{
"type": "patch",
"path": "../flathub/gstreamer-1.0/gst-plugins-good-dashdemux2-play-last-subfragment.patch"
},
{
"type": "patch",
"path": "../flathub/gstreamer-1.0/gst-plugins-bad-dashdemux-sidx-range-download.patch"
},
{
"type": "patch",
"path": "../flathub/gstreamer-1.0/gst-plugins-bad-dashdemux-improve-initial-representation-selection.patch"
}
]
}

View File

@@ -0,0 +1,20 @@
{
"name": "gtuber",
"buildsystem": "meson",
"config-opts": [
"-Dintrospection=disabled",
"-Dvapi=disabled",
"-Dgst-gtuber=enabled"
],
"cleanup": [
"/include",
"/lib/pkgconfig"
],
"sources": [
{
"type": "git",
"url": "https://github.com/Rafostar/gtuber.git",
"branch": "main"
}
]
}

View File

@@ -1,21 +0,0 @@
{
"name": "libpeas",
"buildsystem": "meson",
"config-opts": [
"--wrap-mode=nodownload",
"-Dgjs=false",
"-Dlua51=false",
"-Dintrospection=false"
],
"sources": [
{
"type": "archive",
"url": "https://download.gnome.org/sources/libpeas/2.0/libpeas-2.0.5.tar.xz",
"sha256": "376f2f73d731b54e13ddbab1d91b6382cf6a980524def44df62add15489de6dd",
"x-checker-data": {
"type": "gnome",
"name": "libpeas"
}
}
]
}

View File

@@ -1,19 +0,0 @@
{
"name": "yt-dlp",
"buildsystem": "simple",
"build-commands": [
"pip3 install -v --root-user-action=ignore --no-deps --prefix=/app *.whl"
],
"sources": [
{
"type": "file",
"url": "https://files.pythonhosted.org/packages/bb/68/548f9819b41d53561d4f3d39588111cf39993c066b6e5300b4ae118eb2e6/yt_dlp-2024.10.22-py3-none-any.whl",
"sha256": "ba166602ebe22a220e4dc1ead45bf00eb469ed812b22f4fb8bb54734f9b02084",
"x-checker-data": {
"type": "pypi",
"name": "yt-dlp",
"packagetype": "bdist_wheel"
}
}
]
}

View File

@@ -18,7 +18,6 @@
#include "config.h"
#include <math.h>
#include <glib/gi18n.h>
#include <gst/gst.h>
#include <clapper-gtk/clapper-gtk.h>
@@ -27,7 +26,6 @@
#include "clapper-app-file-dialog.h"
#include "clapper-app-uri-dialog.h"
#include "clapper-app-info-window.h"
#include "clapper-app-pipeline-window.h"
#include "clapper-app-preferences-window.h"
#include "clapper-app-about-window.h"
#include "clapper-app-utils.h"
@@ -46,9 +44,6 @@ struct _ClapperAppApplication
gboolean need_init_state;
};
#define parent_class clapper_app_application_parent_class
G_DEFINE_TYPE (ClapperAppApplication, clapper_app_application, GTK_TYPE_APPLICATION);
struct ClapperPluginFeatureData
{
const gchar *name;
@@ -68,147 +63,8 @@ typedef struct
const gchar *accels[3];
} ClapperAppShortcut;
static gboolean
clapper_app_options_get (const gchar *key, const gchar *format, GVariantDict *options,
GObject *src_object, GSettings *settings, gpointer output)
{
if (options && g_variant_dict_lookup (options, key, format, output)) {
return TRUE;
} else if (src_object) {
g_object_get (src_object, key, output, NULL);
return TRUE;
} else if (settings) {
g_settings_get (settings, key, format, output);
return TRUE;
}
return FALSE;
}
static gboolean
clapper_app_options_get_extra (const gchar *key, GVariantDict *options,
const gchar *extra_value, GSettings *settings, gchar **output)
{
if (options && g_variant_dict_lookup (options, key, "s", output)) {
return TRUE;
} else if (extra_value) {
*output = g_strdup (extra_value);
return TRUE;
} else if (settings) {
*output = g_settings_get_string (settings, key);
/* Ensure non-empty string */
if (*output) {
if (strlen (*output) > 0)
return TRUE;
else
g_clear_pointer (output, g_free);
}
}
return FALSE;
}
/*
* Apply options to @dest_window. Option providers will be used in args order.
* If any arg is %NULL it will not be used. For example, passing %NULL as
* @settings will avoid restoring values to @dest_window from GSettings.
*/
static void
clapper_app_apply_options_to_window (ClapperAppWindow *dest_window, GVariantDict *options,
ClapperAppWindow *src_window, GSettings *settings)
{
ClapperPlayer *dest_player;
ClapperAppWindowExtraOptions *src_extra_opts = NULL, *dest_extra_opts = NULL;
GObject *src_player_obj = NULL;
GObject *src_queue_obj = NULL;
gchar *option_str;
gdouble option_dbl;
gint option_int;
gboolean option_bool;
GST_DEBUG ("Applying options to window: %p", dest_window);
dest_player = clapper_app_window_get_player (dest_window);
dest_extra_opts = clapper_app_window_get_extra_options (dest_window);
if (src_window) {
src_player_obj = (GObject *) clapper_app_window_get_player (src_window);
src_queue_obj = (GObject *) clapper_player_get_queue (CLAPPER_PLAYER_CAST (src_player_obj));
src_extra_opts = clapper_app_window_get_extra_options (src_window);
}
/* Apply player values, clamp them to be within allowed range */
if (clapper_app_options_get ("volume", "d", options, src_player_obj, settings, &option_dbl))
clapper_player_set_volume (dest_player, PERCENTAGE_ROUND (CLAMP (option_dbl, 0, 2.0)));
if (clapper_app_options_get ("mute", "b", NULL, src_player_obj, settings, &option_bool))
clapper_player_set_mute (dest_player, option_bool);
if (clapper_app_options_get ("speed", "d", options, src_player_obj, settings, &option_dbl))
clapper_player_set_speed (dest_player, PERCENTAGE_ROUND (CLAMP (option_dbl, 0.05, 2.0)));
if (clapper_app_options_get ("adaptive-start-bitrate", "i", options, src_player_obj, settings, &option_int))
clapper_player_set_adaptive_start_bitrate (dest_player, option_int);
if (clapper_app_options_get ("progression-mode", "i", options, src_queue_obj, settings, &option_int))
clapper_queue_set_progression_mode (clapper_player_get_queue (dest_player), CLAMP (option_int, 0, 4));
if (clapper_app_options_get ("subtitles-enabled", "b", NULL, src_player_obj, settings, &option_bool))
clapper_player_set_subtitles_enabled (dest_player, option_bool);
if (clapper_app_options_get_extra ("video-filter", options,
(src_extra_opts) ? src_extra_opts->video_filter : NULL, NULL, &option_str)) {
clapper_player_set_video_filter (dest_player, clapper_app_utils_make_element (option_str));
g_free (dest_extra_opts->video_filter);
dest_extra_opts->video_filter = option_str;
}
if (clapper_app_options_get_extra ("audio-filter", options,
(src_extra_opts) ? src_extra_opts->audio_filter : NULL, NULL, &option_str)) {
clapper_player_set_audio_filter (dest_player, clapper_app_utils_make_element (option_str));
g_free (dest_extra_opts->audio_filter);
dest_extra_opts->audio_filter = option_str;
}
if (clapper_app_options_get_extra ("video-sink", options,
(src_extra_opts) ? src_extra_opts->video_sink : NULL, NULL, &option_str)) {
clapper_player_set_video_sink (dest_player, clapper_app_utils_make_element (option_str));
g_free (dest_extra_opts->video_sink);
dest_extra_opts->video_sink = option_str;
}
if (clapper_app_options_get_extra ("audio-sink", options,
(src_extra_opts) ? src_extra_opts->audio_sink : NULL, NULL, &option_str)) {
clapper_player_set_audio_sink (dest_player, clapper_app_utils_make_element (option_str));
g_free (dest_extra_opts->audio_sink);
dest_extra_opts->audio_sink = option_str;
}
/* Apply window options */
if ((options && g_variant_dict_contains (options, "fullscreen"))
|| (settings && g_settings_get_boolean (settings, "fullscreened")))
gtk_window_fullscreen (GTK_WINDOW (dest_window));
else if (settings && g_settings_get_boolean (settings, "maximized"))
gtk_window_maximize (GTK_WINDOW (dest_window));
GST_DEBUG ("Options applied");
}
static inline void
_store_settings_from_window (ClapperAppApplication *self, ClapperAppWindow *app_window)
{
ClapperPlayer *player = clapper_app_window_get_player (app_window);
ClapperQueue *queue = clapper_player_get_queue (player);
GtkWindow *window = GTK_WINDOW (app_window);
GST_DEBUG ("Storing current configuration to GSettings");
g_settings_set_double (self->settings, "volume", clapper_player_get_volume (player));
g_settings_set_boolean (self->settings, "mute", clapper_player_get_mute (player));
g_settings_set_double (self->settings, "speed", clapper_player_get_speed (player));
g_settings_set_int (self->settings, "adaptive-start-bitrate",
CLAMP (clapper_player_get_adaptive_bandwidth (player) * 0.8, 0, G_MAXINT));
g_settings_set_boolean (self->settings, "subtitles-enabled", clapper_player_get_subtitles_enabled (player));
g_settings_set_int (self->settings, "progression-mode", clapper_queue_get_progression_mode (queue));
g_settings_set_boolean (self->settings, "maximized", gtk_window_is_maximized (window));
g_settings_set_boolean (self->settings, "fullscreened", gtk_window_is_fullscreen (window));
GST_DEBUG ("Configuration stored");
}
#define parent_class clapper_app_application_parent_class
G_DEFINE_TYPE (ClapperAppApplication, clapper_app_application, GTK_TYPE_APPLICATION);
static inline void
_set_initial_plugin_feature_ranks (void)
@@ -334,26 +190,6 @@ add_uri (GSimpleAction *action, GVariant *param, gpointer user_data)
clapper_app_uri_dialog_open_uri (gtk_app);
}
static void
new_window (GSimpleAction *action, GVariant *param, gpointer user_data)
{
GtkApplication *gtk_app = GTK_APPLICATION (user_data);
GtkWidget *stack = gtk_window_get_child (gtk_application_get_active_window (gtk_app));
const gchar *child_name = gtk_stack_get_visible_child_name (GTK_STACK (stack));
/* Do not allow to open new windows during initial state,
* there already is a free one to use */
if (g_strcmp0 (child_name, "initial_state") != 0) {
ClapperAppWindow *src_window, *dest_window;
src_window = CLAPPER_APP_WINDOW_CAST (gtk_application_get_active_window (gtk_app));
dest_window = CLAPPER_APP_WINDOW_CAST (clapper_app_window_new (gtk_app));
clapper_app_apply_options_to_window (dest_window, NULL, src_window, NULL);
gtk_window_present (GTK_WINDOW (dest_window));
}
}
static void
show_preferences (GSimpleAction *action, GVariant *param, gpointer user_data)
{
@@ -379,32 +215,6 @@ show_info (GSimpleAction *action, GVariant *param, gpointer user_data)
gtk_window_present (GTK_WINDOW (info_window));
}
static void
show_pipeline (GSimpleAction *action, GVariant *param, gpointer user_data)
{
GtkApplication *gtk_app = GTK_APPLICATION (user_data);
GtkWidget *pipeline_window;
GtkWindow *window;
ClapperPlayer *player;
window = gtk_application_get_active_window (gtk_app);
/* Already open */
if (CLAPPER_APP_IS_PIPELINE_WINDOW (window))
return;
while (window && !CLAPPER_APP_IS_WINDOW (window))
window = gtk_window_get_transient_for (window);
if (G_UNLIKELY (window == NULL))
return;
player = clapper_app_window_get_player (CLAPPER_APP_WINDOW (window));
pipeline_window = clapper_app_pipeline_window_new (gtk_app, player);
gtk_window_present (GTK_WINDOW (pipeline_window));
}
static void
show_about (GSimpleAction *action, GVariant *param, gpointer user_data)
{
@@ -415,12 +225,55 @@ show_about (GSimpleAction *action, GVariant *param, gpointer user_data)
gtk_window_present (GTK_WINDOW (about_window));
}
static inline void
_restore_settings_to_window (ClapperAppApplication *self, ClapperAppWindow *app_window)
{
ClapperPlayer *player = clapper_app_window_get_player (app_window);
ClapperQueue *queue = clapper_player_get_queue (player);
GST_DEBUG ("Restoring saved GSettings values to: %" GST_PTR_FORMAT, app_window);
clapper_player_set_volume (player, PERCENTAGE_ROUND (g_settings_get_double (self->settings, "volume")));
clapper_player_set_mute (player, g_settings_get_boolean (self->settings, "mute"));
clapper_player_set_speed (player, PERCENTAGE_ROUND (g_settings_get_double (self->settings, "speed")));
clapper_player_set_subtitles_enabled (player, g_settings_get_boolean (self->settings, "subtitles-enabled"));
clapper_queue_set_progression_mode (queue, g_settings_get_int (self->settings, "progression-mode"));
if (g_settings_get_boolean (self->settings, "fullscreened"))
gtk_window_fullscreen (GTK_WINDOW (app_window));
else if (g_settings_get_boolean (self->settings, "maximized"))
gtk_window_maximize (GTK_WINDOW (app_window));
GST_DEBUG ("Configuration restored");
}
static inline void
_store_settings_from_window (ClapperAppApplication *self, ClapperAppWindow *app_window)
{
ClapperPlayer *player = clapper_app_window_get_player (app_window);
ClapperQueue *queue = clapper_player_get_queue (player);
GtkWindow *window = GTK_WINDOW (app_window);
GST_DEBUG ("Storing current configuration to GSettings");
g_settings_set_double (self->settings, "volume", clapper_player_get_volume (player));
g_settings_set_boolean (self->settings, "mute", clapper_player_get_mute (player));
g_settings_set_double (self->settings, "speed", clapper_player_get_speed (player));
g_settings_set_boolean (self->settings, "subtitles-enabled", clapper_player_get_subtitles_enabled (player));
g_settings_set_int (self->settings, "progression-mode", clapper_queue_get_progression_mode (queue));
g_settings_set_boolean (self->settings, "maximized", gtk_window_is_maximized (window));
g_settings_set_boolean (self->settings, "fullscreened", gtk_window_is_fullscreen (window));
GST_DEBUG ("Configuration stored");
}
GApplication *
clapper_app_application_new (void)
{
return g_object_new (CLAPPER_APP_TYPE_APPLICATION,
"application-id", CLAPPER_APP_ID,
"flags", G_APPLICATION_HANDLES_OPEN | G_APPLICATION_HANDLES_COMMAND_LINE,
"flags", G_APPLICATION_HANDLES_OPEN,
NULL);
}
@@ -453,18 +306,14 @@ static void
clapper_app_application_activate (GApplication *app)
{
ClapperAppApplication *self = CLAPPER_APP_APPLICATION_CAST (app);
GtkApplication *gtk_app = GTK_APPLICATION (app);
GtkWindow *window;
GST_INFO ("Activate");
G_APPLICATION_CLASS (parent_class)->activate (app);
/* When activated through DBus command line does not run,
* so create our first window here instead */
if (!(window = gtk_application_get_active_window (gtk_app))) {
window = GTK_WINDOW (clapper_app_window_new (gtk_app));
clapper_app_apply_options_to_window (CLAPPER_APP_WINDOW_CAST (window),
NULL, NULL, self->settings);
if (!(window = gtk_application_get_active_window (GTK_APPLICATION (app)))) {
window = GTK_WINDOW (clapper_app_window_new (GTK_APPLICATION (app)));
_restore_settings_to_window (self, CLAPPER_APP_WINDOW_CAST (window));
}
if (self->need_init_state) {
@@ -482,8 +331,6 @@ clapper_app_application_local_command_line (GApplication *app,
gchar **argv = *arguments;
guint i;
GST_INFO ("Handling local command line");
/* NOTE: argv is never NULL, so no need to check */
for (i = 0; argv[i]; ++i) {
@@ -497,43 +344,6 @@ clapper_app_application_local_command_line (GApplication *app,
return G_APPLICATION_CLASS (parent_class)->local_command_line (app, arguments, exit_status);
}
static gint
clapper_app_application_command_line (GApplication *app, GApplicationCommandLine *cmd_line)
{
ClapperAppApplication *self = CLAPPER_APP_APPLICATION_CAST (app);
ClapperAppWindow *src_window = NULL, *dest_window = NULL;
GtkApplication *gtk_app = GTK_APPLICATION (app);
GVariantDict *options;
GFile **files = NULL;
GSettings *settings;
gint n_files = 0;
GST_INFO ("Handling command line");
options = g_application_command_line_get_options_dict (cmd_line);
dest_window = CLAPPER_APP_WINDOW_CAST (gtk_application_get_active_window (gtk_app));
/* Restore settings only once by making them %NULL when run again */
settings = (!dest_window) ? self->settings : NULL;
if (!dest_window || g_variant_dict_contains (options, "new-window")) {
src_window = dest_window;
dest_window = CLAPPER_APP_WINDOW_CAST (clapper_app_window_new (gtk_app));
}
clapper_app_apply_options_to_window (dest_window, options, src_window, settings);
if (clapper_app_utils_files_from_command_line (cmd_line, &files, &n_files)) {
g_application_open (app, files, n_files,
(g_variant_dict_contains (options, "enqueue")) ? "add-only" : "");
clapper_app_utils_files_free (files);
} else {
g_application_activate (app);
}
return EXIT_SUCCESS;
}
static gboolean
_is_claps_file (GFile *file)
{
@@ -702,40 +512,20 @@ clapper_app_application_constructed (GObject *object)
GApplication *app = G_APPLICATION (self);
guint i;
const GOptionEntry app_options[] = {
{ "new-window", 'n', 0, G_OPTION_ARG_NONE, NULL, _("Create a new window"), NULL },
{ "enqueue", 0, 0, G_OPTION_ARG_NONE, NULL, _("Add media to queue in primary application instance"), NULL },
{ "volume", 0, 0, G_OPTION_ARG_DOUBLE, NULL, _("Audio volume to set (0 - 2.0 range)"), NULL },
{ "speed", 0, 0, G_OPTION_ARG_DOUBLE, NULL, _("Playback speed to set (0.05 - 2.0 range)"), NULL },
{ "adaptive-start-bitrate", 0, 0, G_OPTION_ARG_INT, NULL, _("Initial bitrate for adaptive streaming"), NULL },
{ "progression-mode", 0, 0, G_OPTION_ARG_INT, NULL, _("Initial queue progression mode (0=none, 1=consecutive, 2=repeat-item, 3=carousel, 4=shuffle)"), NULL },
{ "fullscreen", 'f', 0, G_OPTION_ARG_NONE, NULL, _("Set window to be fullscreen"), NULL },
{ "video-filter", 0, 0, G_OPTION_ARG_STRING, NULL, _("Video filter to use (\"none\" to disable)"), NULL },
{ "audio-filter", 0, 0, G_OPTION_ARG_STRING, NULL, _("Audio filter to use (\"none\" to disable)"), NULL },
{ "video-sink", 0, 0, G_OPTION_ARG_STRING, NULL, _("Video sink to use"), NULL },
{ "audio-sink", 0, 0, G_OPTION_ARG_STRING, NULL, _("Audio sink to use"), NULL },
{ NULL }
};
static const GActionEntry app_actions[] = {
static const GActionEntry app_entries[] = {
{ "add-files", add_files, NULL, NULL, NULL },
{ "add-uri", add_uri, NULL, NULL, NULL },
{ "new-window", new_window, NULL, NULL, NULL },
{ "info", show_info, NULL, NULL, NULL },
{ "pipeline", show_pipeline, NULL, NULL, NULL },
{ "preferences", show_preferences, NULL, NULL, NULL },
{ "about", show_about, NULL, NULL, NULL },
};
static const ClapperAppShortcut app_shortcuts[] = {
{ "app.add-files", { "<Control>o", NULL, NULL }},
{ "app.add-uri", { "<Control>u", NULL, NULL }},
{ "app.new-window", { "<Control>n", NULL, NULL }},
{ "app.info", { "<Control>i", NULL, NULL }},
{ "app.pipeline", { "<Control><Shift>p", NULL, NULL }},
{ "app.preferences", { "<Control>comma", NULL, NULL }},
{ "app.about", { "F1", NULL, NULL }},
{ "win.toggle-fullscreen", { "F11", "f", NULL }},
{ "win.unfullscreen", { "Escape", NULL, NULL }},
{ "win.auto-resize", { "<Super>r", NULL, NULL }},
{ "win.show-help-overlay", { "<Control>question", NULL, NULL }},
{ "window.close", { "<Control>q", "q", NULL }},
};
@@ -752,14 +542,11 @@ clapper_app_application_constructed (GObject *object)
plugin_feature_ranks_settings_changed_cb (self->settings, NULL, NULL);
g_action_map_add_action_entries (G_ACTION_MAP (app),
app_actions, G_N_ELEMENTS (app_actions), app);
app_entries, G_N_ELEMENTS (app_entries), app);
for (i = 0; i < G_N_ELEMENTS (app_shortcuts); ++i)
gtk_application_set_accels_for_action (GTK_APPLICATION (app), app_shortcuts[i].action, app_shortcuts[i].accels);
g_application_set_option_context_parameter_string (app, "[URI1|FILE1] [URI2|FILE2] …");
g_application_add_main_option_entries (app, app_options);
g_application_add_option_group (app, gst_init_get_option_group ());
G_OBJECT_CLASS (parent_class)->constructed (object);
@@ -794,6 +581,5 @@ clapper_app_application_class_init (ClapperAppApplicationClass *klass)
application_class->activate = clapper_app_application_activate;
application_class->local_command_line = clapper_app_application_local_command_line;
application_class->command_line = clapper_app_application_command_line;
application_class->open = clapper_app_application_open;
}

View File

@@ -80,15 +80,8 @@ _dialog_add_mime_types (GtkFileDialog *dialog, const gchar *filter_name,
GtkFileFilter *filter = gtk_file_filter_new ();
guint i;
/* XXX: Windows does not support mime-types file
* filters, so use file extensions instead */
for (i = 0; mime_types[i]; ++i) {
#ifndef G_OS_WIN32
for (i = 0; mime_types[i]; ++i)
gtk_file_filter_add_mime_type (filter, mime_types[i]);
#else
gtk_file_filter_add_suffix (filter, mime_types[i]);
#endif
}
gtk_file_filter_set_name (filter, filter_name);
g_list_store_append (filters, filter);
@@ -106,11 +99,7 @@ clapper_app_file_dialog_open_files (GtkApplication *gtk_app)
GtkFileDialog *dialog = gtk_file_dialog_new ();
_dialog_add_mime_types (dialog, "Media Files",
#ifndef G_OS_WIN32
clapper_app_utils_get_mime_types ());
#else
clapper_app_utils_get_extensions ());
#endif
gtk_file_dialog_set_modal (dialog, TRUE);
gtk_file_dialog_set_title (dialog, "Add Files");
@@ -129,11 +118,7 @@ clapper_app_file_dialog_open_subtitles (GtkApplication *gtk_app, ClapperMediaIte
GtkFileDialog *dialog = gtk_file_dialog_new ();
_dialog_add_mime_types (dialog, "Subtitles",
#ifndef G_OS_WIN32
clapper_app_utils_get_subtitles_mime_types ());
#else
clapper_app_utils_get_subtitles_extensions ());
#endif
gtk_file_dialog_set_modal (dialog, TRUE);
gtk_file_dialog_set_title (dialog, "Open Subtitles");

View File

@@ -101,15 +101,6 @@ has_streams_closure (ClapperAppInfoWindow *self, guint n_streams)
return (n_streams > 0);
}
static gboolean
close_cb (GtkWidget *widget, GVariant *args G_GNUC_UNUSED,
gpointer user_data G_GNUC_UNUSED)
{
gtk_window_close (GTK_WINDOW (widget));
return TRUE;
}
GtkWidget *
clapper_app_info_window_new (GtkApplication *gtk_app, ClapperPlayer *player)
{
@@ -209,8 +200,6 @@ clapper_app_info_window_class_init (ClapperAppInfoWindowClass *klass)
g_object_class_install_properties (gobject_class, PROP_LAST, param_specs);
gtk_widget_class_add_binding (widget_class, GDK_KEY_Escape, 0, close_cb, NULL);
gtk_widget_class_bind_template_child (widget_class, ClapperAppInfoWindow, vstreams_list);
gtk_widget_class_bind_template_child (widget_class, ClapperAppInfoWindow, astreams_list);
gtk_widget_class_bind_template_child (widget_class, ClapperAppInfoWindow, sstreams_list);

View File

@@ -1,830 +0,0 @@
/* Clapper Application
* Copyright (C) 2024 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* 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/>.
*/
#include <gst/gst.h>
#include <graphviz/cgraph.h>
#include <graphviz/gvc.h>
#include <librsvg/rsvg.h>
#include <math.h>
#include "clapper-app-pipeline-viewer.h"
#define GST_CAT_DEFAULT clapper_app_pipeline_viewer_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
struct _ClapperAppPipelineViewer
{
GtkWidget parent;
GtkAdjustment *hadjustment;
GtkAdjustment *vadjustment;
GdkTexture *preview_texture;
GdkTexture *texture;
RsvgHandle *handle;
gdouble intrinsic_w;
gdouble intrinsic_h;
graphene_rect_t viewport;
gdouble zoom;
gboolean zooming;
gdouble pointer_x;
gdouble pointer_y;
gdouble drag_adj_x;
gdouble drag_adj_y;
gint allocated_width;
gint allocated_height;
ClapperPlayer *player;
GCancellable *cancellable;
gboolean running;
gboolean pending_preview;
gboolean pending_refresh;
guint refresh_id;
};
enum
{
PROP_0,
PROP_HADJUSTMENT,
PROP_VADJUSTMENT,
PROP_HSCROLL_POLICY,
PROP_VSCROLL_POLICY,
PROP_LAST
};
static void
_scrollable_iface_init (GtkScrollableInterface *iface)
{
}
#define parent_class clapper_app_pipeline_viewer_parent_class
G_DEFINE_TYPE_WITH_CODE (ClapperAppPipelineViewer, clapper_app_pipeline_viewer, GTK_TYPE_WIDGET,
G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, _scrollable_iface_init));
static void clapper_app_pipeline_viewer_preview (ClapperAppPipelineViewer *self);
static void clapper_app_pipeline_viewer_refresh (ClapperAppPipelineViewer *self);
typedef struct
{
ClapperPlayer *player;
RsvgHandle *handle;
gdouble intrinsic_w;
gdouble intrinsic_h;
graphene_rect_t viewport;
gdouble zoom;
gint scale_factor;
} ClapperAppPipelineViewerData;
static ClapperAppPipelineViewerData *
_thread_data_create (ClapperAppPipelineViewer *self)
{
ClapperAppPipelineViewerData *data;
data = g_new (ClapperAppPipelineViewerData, 1);
data->player = gst_object_ref (self->player);
data->handle = (self->handle) ? g_object_ref (self->handle) : NULL;
data->intrinsic_w = self->intrinsic_w;
data->intrinsic_h = self->intrinsic_h;
graphene_rect_init_from_rect (&data->viewport, &self->viewport);
data->zoom = self->zoom;
data->scale_factor = gtk_widget_get_scale_factor (GTK_WIDGET (self));
GST_TRACE ("Created render data: %p", data);
return data;
}
static void
_thread_data_free (ClapperAppPipelineViewerData *data)
{
GST_TRACE ("Freeing render data: %p", data);
gst_object_unref (data->player);
g_clear_object (&data->handle);
g_free (data);
}
static inline void
_set_cancelled_error (GError **error)
{
g_set_error (error, G_IO_ERROR,
G_IO_ERROR_CANCELLED, "Cancelled");
}
static inline void
_cancel_cancellable (ClapperAppPipelineViewer *self)
{
g_cancellable_cancel (self->cancellable);
g_object_unref (self->cancellable);
self->cancellable = g_cancellable_new ();
}
static void
_invalidate_viewport (ClapperAppPipelineViewer *self)
{
g_clear_object (&self->texture);
_cancel_cancellable (self);
gtk_widget_queue_resize (GTK_WIDGET (self));
}
static void
_refresh_viewport (ClapperAppPipelineViewer *self)
{
self->viewport.origin.x = gtk_adjustment_get_value (self->hadjustment);
self->viewport.origin.y = gtk_adjustment_get_value (self->vadjustment);
self->viewport.size.width = gtk_widget_get_width ((GtkWidget *) self);
self->viewport.size.height = gtk_widget_get_height ((GtkWidget *) self);
clapper_app_pipeline_viewer_refresh (self);
gtk_widget_queue_resize (GTK_WIDGET (self));
self->refresh_id = 0;
}
static void
_set_refresh_viewport_timeout (ClapperAppPipelineViewer *self)
{
/* Wait a bit while adjustment still moves, then refresh */
g_clear_handle_id (&self->refresh_id, g_source_remove);
self->refresh_id = g_timeout_add_once (200, (GSourceOnceFunc) _refresh_viewport, self);
}
static RsvgHandle *
_load_pipeline_graph (ClapperAppPipelineViewer *self, ClapperPlayer *player,
GstDebugGraphDetails details, GCancellable *cancellable, GError **error)
{
RsvgHandle *handle = NULL;
gchar *dot_data, *img_data = NULL;
guint size = 0;
dot_data = clapper_player_make_pipeline_graph (player, details);
if (!g_cancellable_is_cancelled (cancellable)) {
Agraph_t *graph;
GVC_t *gvc;
graph = agmemread (dot_data);
gvc = gvContext ();
gvLayout (gvc, graph, "dot");
gvRenderData (gvc, graph, "svg", &img_data, &size);
agclose (graph);
gvFreeContext (gvc);
} else if (*error == NULL) {
_set_cancelled_error (error);
}
g_free (dot_data);
if (img_data) {
if (!g_cancellable_is_cancelled (cancellable))
handle = rsvg_handle_new_from_data ((const guint8 *) img_data, size, error);
else if (*error == NULL)
_set_cancelled_error (error);
g_free (img_data);
}
return handle;
}
static inline GdkTexture *
_create_texture_from_surface (cairo_surface_t *surface)
{
GdkTexture *texture;
GBytes *bytes;
bytes = g_bytes_new_with_free_func (cairo_image_surface_get_data (surface),
cairo_image_surface_get_height (surface) * cairo_image_surface_get_stride (surface),
(GDestroyNotify) cairo_surface_destroy,
cairo_surface_reference (surface));
texture = gdk_memory_texture_new (
cairo_image_surface_get_width (surface),
cairo_image_surface_get_height (surface),
GDK_MEMORY_DEFAULT,
bytes,
cairo_image_surface_get_stride (surface));
g_bytes_unref (bytes);
return texture;
}
static GdkTexture *
_render_texture (RsvgHandle *handle, const graphene_rect_t *viewport, gint render_w, gint render_h,
gint scale_factor, GCancellable *cancellable, GError **error)
{
GdkTexture *texture = NULL;
cairo_surface_t *surface;
cairo_t *cr;
gint x, y, w, h;
x = floor (viewport->origin.x * scale_factor);
y = floor (viewport->origin.y * scale_factor);
w = ceil (viewport->size.width * scale_factor);
h = ceil (viewport->size.height * scale_factor);
GST_DEBUG ("Creating surface, bb: (%i,%i,%i,%i)", x, y, w, h);
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
cr = cairo_create (surface);
if (!g_cancellable_is_cancelled (cancellable)) {
if (rsvg_handle_render_document (handle, cr, &(RsvgRectangle) {-x, -y, render_w, render_h}, error))
texture = _create_texture_from_surface (surface);
} else if (error == NULL) {
_set_cancelled_error (error);
}
cairo_destroy (cr);
cairo_surface_destroy (surface);
return texture;
}
static void
_preview_in_thread (GTask *task, ClapperAppPipelineViewer *self,
ClapperAppPipelineViewerData *data, GCancellable *cancellable)
{
GdkTexture *texture = NULL;
GError *error = NULL;
g_clear_object (&data->handle);
if ((data->handle = _load_pipeline_graph (self,
data->player, GST_DEBUG_GRAPH_SHOW_ALL, cancellable, &error))) {
rsvg_handle_set_dpi (data->handle, 90);
rsvg_handle_get_intrinsic_size_in_pixels (data->handle,
&data->intrinsic_w, &data->intrinsic_h);
texture = _render_texture (data->handle,
&GRAPHENE_RECT_INIT (0, 0, data->intrinsic_w, data->intrinsic_h),
ceil (data->intrinsic_w), ceil (data->intrinsic_h),
1, cancellable, &error);
}
if (texture)
g_task_return_pointer (task, texture, (GDestroyNotify) g_object_unref);
else
g_task_return_error (task, error);
}
static void
_refresh_in_thread (GTask *task, ClapperAppPipelineViewer *self,
ClapperAppPipelineViewerData *data, GCancellable *cancellable)
{
GdkTexture *texture;
GError *error = NULL;
gint render_w, render_h;
render_w = ceil (data->zoom * data->intrinsic_w * data->scale_factor);
render_h = ceil (data->zoom * data->intrinsic_h * data->scale_factor);
texture = _render_texture (data->handle, &data->viewport, render_w, render_h,
data->scale_factor, cancellable, &error);
if (texture)
g_task_return_pointer (task, texture, (GDestroyNotify) g_object_unref);
else
g_task_return_error (task, error);
}
static inline void
_finish_texture_task (ClapperAppPipelineViewer *self, GTask *task, GdkTexture **texture)
{
GError *error = NULL;
gboolean cancelled = FALSE;
g_clear_object (texture);
*texture = (GdkTexture *) g_task_propagate_pointer (task, &error);
if (error) {
if (error->domain != G_IO_ERROR || error->code != G_IO_ERROR_CANCELLED) {
GST_ERROR ("Error: %s", (error->message)
? error->message : "Could not render pipeline graph");
} else {
GST_DEBUG ("Refresh cancelled");
cancelled = TRUE;
}
g_error_free (error);
}
/* Resize will also trigger redraw. We need to always call resize,
* because regenerated image has slightly different dimensions each time. */
if (!cancelled)
gtk_widget_queue_resize (GTK_WIDGET (self));
self->running = FALSE;
if (self->pending_preview) {
clapper_app_pipeline_viewer_preview (self);
self->pending_preview = FALSE;
} else if (self->pending_refresh) {
clapper_app_pipeline_viewer_refresh (self);
self->pending_refresh = FALSE;
}
}
static void
clapper_app_pipeline_viewer_preview_cb (ClapperAppPipelineViewer *self,
GAsyncResult *res, gpointer user_data G_GNUC_UNUSED)
{
GTask *task = G_TASK (res);
ClapperAppPipelineViewerData *data;
data = (ClapperAppPipelineViewerData *) g_task_get_task_data (task);
g_clear_object (&self->handle);
self->handle = g_object_ref (data->handle);
self->intrinsic_w = data->intrinsic_w;
self->intrinsic_h = data->intrinsic_h;
_finish_texture_task (self, task, &self->preview_texture);
}
static void
clapper_app_pipeline_viewer_refresh_cb (ClapperAppPipelineViewer *self,
GAsyncResult *res, gpointer user_data G_GNUC_UNUSED)
{
_finish_texture_task (self, G_TASK (res), &self->texture);
}
static void
clapper_app_pipeline_viewer_preview (ClapperAppPipelineViewer *self)
{
GTask *task;
_cancel_cancellable (self);
if (self->running) {
self->pending_preview = TRUE;
return;
}
self->running = TRUE;
task = g_task_new (self, self->cancellable,
(GAsyncReadyCallback) clapper_app_pipeline_viewer_preview_cb, NULL);
g_task_set_task_data (task, _thread_data_create (self),
(GDestroyNotify) _thread_data_free);
g_task_run_in_thread (task, (GTaskThreadFunc) _preview_in_thread);
g_object_unref (task);
}
static void
clapper_app_pipeline_viewer_refresh (ClapperAppPipelineViewer *self)
{
GTask *task;
g_clear_object (&self->texture);
_cancel_cancellable (self);
if (self->running) {
self->pending_refresh = TRUE;
return;
}
self->running = TRUE;
task = g_task_new (self, self->cancellable,
(GAsyncReadyCallback) clapper_app_pipeline_viewer_refresh_cb, NULL);
g_task_set_task_data (task, _thread_data_create (self),
(GDestroyNotify) _thread_data_free);
g_task_run_in_thread (task, (GTaskThreadFunc) _refresh_in_thread);
g_object_unref (task);
}
static void
motion_cb (GtkEventControllerMotion *motion,
gdouble x, gdouble y, ClapperAppPipelineViewer *self)
{
self->pointer_x = x;
self->pointer_y = y;
}
static gboolean
scroll_cb (GtkEventControllerScroll *scroll,
gdouble dx, gdouble dy, ClapperAppPipelineViewer *self)
{
gdouble scale_factor, calc_scale, multiplier;
gdouble event_x, event_y, x = 0, y = 0;
scale_factor = (dy > 0) ? 0.9 : (dy < 0) ? 1.1 : 0;
if (scale_factor == 0)
return TRUE;
calc_scale = CLAMP (self->zoom * scale_factor, 0.1, 10.0);
if (G_APPROX_VALUE (calc_scale, self->zoom, FLT_EPSILON))
return TRUE;
GST_LOG_OBJECT (self, "Zoom to: %.2lf", calc_scale);
multiplier = calc_scale / self->zoom;
event_x = self->pointer_x - gtk_adjustment_get_value (self->hadjustment) * multiplier;
event_y = self->pointer_y - gtk_adjustment_get_value (self->vadjustment) * multiplier;
x = self->pointer_x * multiplier - event_x;
y = self->pointer_y * multiplier - event_y;
/* Do not act on adjustment changes here */
self->zooming = TRUE;
self->zoom = calc_scale;
_invalidate_viewport (self);
gtk_adjustment_set_upper (self->hadjustment, G_MAXDOUBLE);
gtk_adjustment_set_upper (self->vadjustment, G_MAXDOUBLE);
gtk_adjustment_set_value (self->hadjustment, x);
gtk_adjustment_set_value (self->vadjustment, y);
_set_refresh_viewport_timeout (self);
self->zooming = FALSE;
return TRUE;
}
static void
drag_begin_cb (GtkGestureDrag *drag, gdouble start_x, gdouble start_y,
ClapperAppPipelineViewer *self)
{
GdkCursor *cursor;
GST_DEBUG_OBJECT (self, "Drag begin");
cursor = gdk_cursor_new_from_name ("all-scroll", NULL);
gtk_widget_set_cursor (GTK_WIDGET (self), cursor);
g_object_unref (cursor);
self->drag_adj_x = gtk_adjustment_get_value (self->hadjustment);
self->drag_adj_y = gtk_adjustment_get_value (self->vadjustment);
}
static void
drag_update_cb (GtkGestureDrag *drag, gdouble offset_x, gdouble offset_y,
ClapperAppPipelineViewer *self)
{
gtk_adjustment_set_value (self->hadjustment, self->drag_adj_x - offset_x);
gtk_adjustment_set_value (self->vadjustment, self->drag_adj_y - offset_y);
}
static void
drag_end_cb (GtkGestureDrag *drag, gdouble offset_x, gdouble offset_y,
ClapperAppPipelineViewer *self)
{
GdkCursor *cursor;
GST_DEBUG_OBJECT (self, "Drag end");
cursor = gdk_cursor_new_from_name ("default", NULL);
gtk_widget_set_cursor (GTK_WIDGET (self), cursor);
g_object_unref (cursor);
}
static void
_adjustment_value_changed_cb (GtkAdjustment *adjustment, ClapperAppPipelineViewer *self)
{
if (self->zooming)
return;
_invalidate_viewport (self);
_set_refresh_viewport_timeout (self);
gtk_widget_queue_allocate ((GtkWidget *) self);
}
static void
_on_widget_size_changed (ClapperAppPipelineViewer *self)
{
if (!self->preview_texture)
return;
_invalidate_viewport (self);
_set_refresh_viewport_timeout (self);
}
static inline void
_set_adjustment (ClapperAppPipelineViewer *self,
GtkAdjustment **dest_adjustment, GtkAdjustment *adjustment)
{
if (*dest_adjustment)
g_signal_handlers_disconnect_by_func (*dest_adjustment, _adjustment_value_changed_cb, self);
if (!adjustment)
adjustment = gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
g_clear_object (dest_adjustment);
*dest_adjustment = g_object_ref_sink (adjustment);
g_signal_connect (*dest_adjustment, "value-changed", G_CALLBACK (_adjustment_value_changed_cb), self);
}
static inline void
_set_adjustment_values (ClapperAppPipelineViewer *self, GtkAdjustment *adjustment,
gboolean is_rtl, gint viewport_size, gint upper)
{
gdouble value = gtk_adjustment_get_value (adjustment);
/* We clamp to the left in RTL mode */
if (adjustment == self->hadjustment && is_rtl) {
gdouble dist = gtk_adjustment_get_upper (adjustment) - value - gtk_adjustment_get_page_size (adjustment);
value = upper - dist - viewport_size;
}
gtk_adjustment_configure (adjustment, value, 0, upper,
viewport_size * 0.1, viewport_size * 0.9, viewport_size);
}
void
clapper_app_pipeline_viewer_set_player (ClapperAppPipelineViewer *self, ClapperPlayer *player)
{
gst_object_replace ((GstObject **) &self->player, GST_OBJECT_CAST (player));
clapper_app_pipeline_viewer_preview (self);
}
static void
clapper_app_pipeline_viewer_size_allocate (GtkWidget *widget,
gint width, gint height, gint baseline)
{
ClapperAppPipelineViewer *self = CLAPPER_APP_PIPELINE_VIEWER_CAST (widget);
gint sizes[2] = { width, height };
gboolean visible, is_rtl;
visible = gtk_widget_get_visible (widget);
is_rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL);
/* Update both at once, then notify */
g_object_freeze_notify (G_OBJECT (self->hadjustment));
g_object_freeze_notify (G_OBJECT (self->vadjustment));
if (visible) {
gint min = 0, nat = 0;
if (width != self->allocated_width || height != self->allocated_height)
_on_widget_size_changed (self);
gtk_widget_measure (widget, GTK_ORIENTATION_VERTICAL, -1, &min, &nat, NULL, NULL);
sizes[1] = MAX (sizes[1], nat);
gtk_widget_measure (widget, GTK_ORIENTATION_HORIZONTAL, sizes[1], &min, &nat, NULL, NULL);
sizes[0] = MAX (sizes[0], nat);
}
_set_adjustment_values (self, self->hadjustment, is_rtl, width, sizes[0]);
_set_adjustment_values (self, self->vadjustment, is_rtl, height, sizes[1]);
self->allocated_width = width;
self->allocated_height = height;
g_object_thaw_notify (G_OBJECT (self->hadjustment));
g_object_thaw_notify (G_OBJECT (self->vadjustment));
}
static void
clapper_app_pipeline_viewer_measure (GtkWidget *widget, GtkOrientation orientation,
gint for_size, gint *minimum, gint *natural,
gint *minimum_baseline, gint *natural_baseline)
{
ClapperAppPipelineViewer *self = CLAPPER_APP_PIPELINE_VIEWER_CAST (widget);
if (self->preview_texture) {
gdouble size;
size = (orientation == GTK_ORIENTATION_HORIZONTAL)
? self->intrinsic_w
: self->intrinsic_h;
*minimum = *natural = ceil (self->zoom * size);
} else {
GTK_WIDGET_CLASS (parent_class)->measure (widget, orientation,
for_size, minimum, natural, minimum_baseline, natural_baseline);
}
}
static GtkSizeRequestMode
clapper_app_pipeline_viewer_get_request_mode (GtkWidget *widget)
{
return GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH;
}
static void
clapper_app_pipeline_viewer_snapshot (GtkWidget *widget, GtkSnapshot *snapshot)
{
ClapperAppPipelineViewer *self = CLAPPER_APP_PIPELINE_VIEWER_CAST (widget);
gint w, h, offset_x, offset_y;
gint widget_w, widget_h;
if (!self->preview_texture)
return;
GST_ERROR ("SNAPSHOT");
w = ceil (self->zoom * self->intrinsic_w);
h = ceil (self->zoom * self->intrinsic_h);
widget_w = gtk_widget_get_width (widget);
widget_h = gtk_widget_get_height (widget);
if (widget_w > w)
offset_x = floor ((gdouble) (widget_w - w) / 2);
else
offset_x = -floor (gtk_adjustment_get_value (self->hadjustment));
if (widget_h > h)
offset_y = floor ((gdouble) (widget_h - h) / 2);
else
offset_y = -floor (gtk_adjustment_get_value (self->vadjustment));
gtk_snapshot_push_clip (snapshot, &GRAPHENE_RECT_INIT (0, 0, widget_w, widget_h));
gtk_snapshot_save (snapshot);
gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (offset_x, offset_y));
if (self->texture)
gtk_snapshot_append_texture (snapshot, self->texture, &self->viewport);
else
gtk_snapshot_append_texture (snapshot, self->preview_texture, &GRAPHENE_RECT_INIT (0, 0, w, h));
gtk_snapshot_restore (snapshot);
gtk_snapshot_pop (snapshot);
}
static void
clapper_app_pipeline_viewer_unrealize (GtkWidget *widget)
{
ClapperAppPipelineViewer *self = CLAPPER_APP_PIPELINE_VIEWER_CAST (widget);
GST_TRACE_OBJECT (self, "Unrealize");
g_clear_handle_id (&self->refresh_id, g_source_remove);
_cancel_cancellable (self);
GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
}
static void
clapper_app_pipeline_viewer_init (ClapperAppPipelineViewer *self)
{
GtkEventController *controller;
_set_adjustment (self, &self->hadjustment, NULL);
_set_adjustment (self, &self->vadjustment, NULL);
graphene_rect_init (&self->viewport, 0, 0, 1, 1);
self->zoom = 0.5;
self->cancellable = g_cancellable_new ();
controller = gtk_event_controller_motion_new ();
g_signal_connect (controller, "motion", G_CALLBACK (motion_cb), self);
gtk_widget_add_controller (GTK_WIDGET (self), controller);
controller = gtk_event_controller_scroll_new (GTK_EVENT_CONTROLLER_SCROLL_VERTICAL);
gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_CAPTURE);
g_signal_connect (controller, "scroll", G_CALLBACK (scroll_cb), self);
gtk_widget_add_controller (GTK_WIDGET (self), controller);
controller = GTK_EVENT_CONTROLLER (gtk_gesture_drag_new ());
gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (controller), FALSE);
g_signal_connect (controller, "drag-begin", G_CALLBACK (drag_begin_cb), self);
g_signal_connect (controller, "drag-update", G_CALLBACK (drag_update_cb), self);
g_signal_connect (controller, "drag-end", G_CALLBACK (drag_end_cb), self);
gtk_widget_add_controller (GTK_WIDGET (self), controller);
}
static void
clapper_app_pipeline_viewer_dispose (GObject *object)
{
ClapperAppPipelineViewer *self = CLAPPER_APP_PIPELINE_VIEWER_CAST (object);
if (self->hadjustment) {
g_signal_handlers_disconnect_by_func (self->hadjustment, _adjustment_value_changed_cb, self);
g_clear_object (&self->hadjustment);
}
if (self->vadjustment) {
g_signal_handlers_disconnect_by_func (self->vadjustment, _adjustment_value_changed_cb, self);
g_clear_object (&self->vadjustment);
}
g_clear_object (&self->preview_texture);
g_clear_object (&self->texture);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
clapper_app_pipeline_viewer_finalize (GObject *object)
{
ClapperAppPipelineViewer *self = CLAPPER_APP_PIPELINE_VIEWER_CAST (object);
GST_TRACE_OBJECT (self, "Finalize");
g_clear_object (&self->cancellable);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static void
clapper_app_pipeline_viewer_get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
ClapperAppPipelineViewer *self = CLAPPER_APP_PIPELINE_VIEWER_CAST (object);
switch (prop_id) {
case PROP_HADJUSTMENT:
g_value_set_object (value, self->hadjustment);
break;
case PROP_VADJUSTMENT:
g_value_set_object (value, self->vadjustment);
break;
case PROP_HSCROLL_POLICY:
case PROP_VSCROLL_POLICY:
g_value_set_enum (value, GTK_SCROLL_NATURAL);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
clapper_app_pipeline_viewer_set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec)
{
ClapperAppPipelineViewer *self = CLAPPER_APP_PIPELINE_VIEWER_CAST (object);
switch (prop_id) {
case PROP_HADJUSTMENT:
_set_adjustment (self, &self->hadjustment, g_value_get_object (value));
break;
case PROP_VADJUSTMENT:
_set_adjustment (self, &self->vadjustment, g_value_get_object (value));
break;
case PROP_HSCROLL_POLICY:
case PROP_VSCROLL_POLICY:
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
clapper_app_pipeline_viewer_class_init (ClapperAppPipelineViewerClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GtkWidgetClass *widget_class = (GtkWidgetClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperapppipelineviewer", 0,
"Clapper App Pipeline Viewer");
gobject_class->get_property = clapper_app_pipeline_viewer_get_property;
gobject_class->set_property = clapper_app_pipeline_viewer_set_property;
gobject_class->dispose = clapper_app_pipeline_viewer_dispose;
gobject_class->finalize = clapper_app_pipeline_viewer_finalize;
g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment");
g_object_class_override_property (gobject_class, PROP_VADJUSTMENT, "vadjustment");
g_object_class_override_property (gobject_class, PROP_HSCROLL_POLICY, "hscroll-policy");
g_object_class_override_property (gobject_class, PROP_VSCROLL_POLICY, "vscroll-policy");
widget_class->size_allocate = clapper_app_pipeline_viewer_size_allocate;
widget_class->measure = clapper_app_pipeline_viewer_measure;
widget_class->get_request_mode = clapper_app_pipeline_viewer_get_request_mode;
widget_class->snapshot = clapper_app_pipeline_viewer_snapshot;
widget_class->unrealize = clapper_app_pipeline_viewer_unrealize;
gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_IMG);
}

View File

@@ -1,41 +0,0 @@
/* Clapper Application
* Copyright (C) 2024 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* 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/>.
*/
#pragma once
#include <glib.h>
#include <glib-object.h>
#include <gio/gio.h>
#include <gtk/gtk.h>
#include <clapper/clapper.h>
G_BEGIN_DECLS
#define CLAPPER_APP_TYPE_PIPELINE_VIEWER (clapper_app_pipeline_viewer_get_type())
#define CLAPPER_APP_PIPELINE_VIEWER_CAST(obj) ((ClapperAppPipelineViewer *)(obj))
G_DECLARE_FINAL_TYPE (ClapperAppPipelineViewer, clapper_app_pipeline_viewer, CLAPPER_APP, PIPELINE_VIEWER, GtkWidget)
void clapper_app_pipeline_viewer_set_player (ClapperAppPipelineViewer *pipeline_viewer, ClapperPlayer *player);
gboolean clapper_app_pipeline_viewer_focus (ClapperAppPipelineViewer *pipeline_viewer, const graphene_rect_t *viewport, gdouble zoom);
void clapper_app_pipeline_viewer_invalidate_viewport (ClapperAppPipelineViewer *pipeline_viewer);
gdouble clapper_app_pipeline_viewer_get_zoom (ClapperAppPipelineViewer *pipeline_viewer);
G_END_DECLS

View File

@@ -1,103 +0,0 @@
/* Clapper Application
* Copyright (C) 2024 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* 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/>.
*/
#include "config.h"
#include "clapper-app-pipeline-window.h"
#include "clapper-app-pipeline-viewer.h"
#define GST_CAT_DEFAULT clapper_app_pipeline_window_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
struct _ClapperAppPipelineWindow
{
AdwWindow parent;
ClapperAppPipelineViewer *pipeline_viewer;
};
#define parent_class clapper_app_pipeline_window_parent_class
G_DEFINE_TYPE (ClapperAppPipelineWindow, clapper_app_pipeline_window, ADW_TYPE_WINDOW);
static gboolean
close_cb (GtkWidget *widget, GVariant *args G_GNUC_UNUSED,
gpointer user_data G_GNUC_UNUSED)
{
gtk_window_close (GTK_WINDOW (widget));
return TRUE;
}
GtkWidget *
clapper_app_pipeline_window_new (GtkApplication *gtk_app, ClapperPlayer *player)
{
ClapperAppPipelineWindow *window;
window = g_object_new (CLAPPER_APP_TYPE_PIPELINE_WINDOW,
"application", gtk_app,
"transient-for", gtk_application_get_active_window (gtk_app),
NULL);
clapper_app_pipeline_viewer_set_player (window->pipeline_viewer, player);
return GTK_WIDGET (window);
}
static void
clapper_app_pipeline_window_init (ClapperAppPipelineWindow *self)
{
gtk_widget_init_template (GTK_WIDGET (self));
}
static void
clapper_app_pipeline_window_dispose (GObject *object)
{
gtk_widget_dispose_template (GTK_WIDGET (object), CLAPPER_APP_TYPE_PIPELINE_WINDOW);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
clapper_app_pipeline_window_finalize (GObject *object)
{
ClapperAppPipelineWindow *self = CLAPPER_APP_PIPELINE_WINDOW_CAST (object);
GST_TRACE_OBJECT (self, "Finalize");
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static void
clapper_app_pipeline_window_class_init (ClapperAppPipelineWindowClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GtkWidgetClass *widget_class = (GtkWidgetClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperapppipelinewindow", 0,
"Clapper App Pipeline Window");
gobject_class->dispose = clapper_app_pipeline_window_dispose;
gobject_class->finalize = clapper_app_pipeline_window_finalize;
gtk_widget_class_set_template_from_resource (widget_class,
CLAPPER_APP_RESOURCE_PREFIX "/ui/clapper-app-pipeline-window.ui");
gtk_widget_class_add_binding (widget_class, GDK_KEY_Escape, 0, close_cb, NULL);
gtk_widget_class_bind_template_child (widget_class, ClapperAppPipelineWindow, pipeline_viewer);
//gtk_widget_class_bind_template_callback (widget_class, refresh_button_clicked_cb);
}

View File

@@ -1,36 +0,0 @@
/* Clapper Application
* Copyright (C) 2024 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* 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/>.
*/
#pragma once
#include <glib.h>
#include <glib-object.h>
#include <gtk/gtk.h>
#include <adwaita.h>
#include <clapper/clapper.h>
G_BEGIN_DECLS
#define CLAPPER_APP_TYPE_PIPELINE_WINDOW (clapper_app_pipeline_window_get_type())
#define CLAPPER_APP_PIPELINE_WINDOW_CAST(obj) ((ClapperAppPipelineWindow *)(obj))
G_DECLARE_FINAL_TYPE (ClapperAppPipelineWindow, clapper_app_pipeline_window, CLAPPER_APP, PIPELINE_WINDOW, AdwWindow)
G_GNUC_INTERNAL
GtkWidget * clapper_app_pipeline_window_new (GtkApplication *gtk_app, ClapperPlayer *player);
G_END_DECLS

View File

@@ -1,42 +0,0 @@
/* Clapper Application
* Copyright (C) 2024 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* 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/>.
*/
#include "clapper-app-types.h"
#include "clapper-app-headerbar.h"
#include "clapper-app-media-item-box.h"
#include "clapper-app-property-row.h"
#include "clapper-app-queue-list.h"
#include "clapper-app-queue-progression-model.h"
#include "clapper-app-window-state-buttons.h"
/*
* clapper_app_types_init:
*
* Ensure private types that appear in UI files in order for
* GtkBuilder to be able to find them when building templates.
*/
inline void
clapper_app_types_init (void)
{
g_type_ensure (CLAPPER_APP_TYPE_HEADERBAR);
g_type_ensure (CLAPPER_APP_TYPE_MEDIA_ITEM_BOX);
g_type_ensure (CLAPPER_APP_TYPE_PROPERTY_ROW);
g_type_ensure (CLAPPER_APP_TYPE_QUEUE_LIST);
g_type_ensure (CLAPPER_APP_TYPE_QUEUE_PROGRESSION_MODEL);
g_type_ensure (CLAPPER_APP_TYPE_WINDOW_STATE_BUTTONS);
}

View File

@@ -1,27 +0,0 @@
/* Clapper Application
* Copyright (C) 2024 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* 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/>.
*/
#pragma once
#include <glib.h>
G_BEGIN_DECLS
G_GNUC_INTERNAL
void clapper_app_types_init (void);
G_END_DECLS

View File

@@ -23,30 +23,6 @@
#include "clapper-app-utils.h"
#include "clapper-app-media-item-box.h"
/* Useful only on Windows */
#ifdef G_OS_WIN32
const gchar *const *
clapper_app_utils_get_extensions (void)
{
static const gchar *const all_extensions[] = {
"avi", "claps", "m2ts", "mkv", "mov",
"mp4", "webm", "wmv", NULL
};
return all_extensions;
}
const gchar *const *
clapper_app_utils_get_subtitles_extensions (void)
{
static const gchar *const subs_extensions[] = {
"srt", "vtt", NULL
};
return subs_extensions;
}
#endif
const gchar *const *
clapper_app_utils_get_mime_types (void)
{
@@ -110,21 +86,9 @@ clapper_app_utils_is_subtitles_file (GFile *file)
G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE,
G_FILE_QUERY_INFO_NONE,
NULL, NULL))) {
const gchar *content_type = NULL;
if (g_file_info_has_attribute (info,
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE)) {
content_type = g_file_info_get_content_type (info);
} else if (g_file_info_has_attribute (info,
G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE)) {
content_type = g_file_info_get_attribute_string (info,
G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE);
}
is_subs = (content_type && g_strv_contains (
is_subs = g_strv_contains (
clapper_app_utils_get_subtitles_mime_types (),
content_type));
g_file_info_get_content_type (info));
g_object_unref (info);
}
@@ -221,30 +185,6 @@ clapper_app_utils_files_from_string (const gchar *string, GFile ***files, gint *
return success;
}
gboolean
clapper_app_utils_files_from_command_line (GApplicationCommandLine *cmd_line, GFile ***files, gint *n_files)
{
GSList *slist = NULL;
gchar **argv;
gint i, argc = 0;
gboolean success;
argv = g_application_command_line_get_arguments (cmd_line, &argc);
for (i = 1; i < argc; ++i)
slist = g_slist_append (slist, g_application_command_line_create_file_for_arg (cmd_line, argv[i]));
g_strfreev (argv);
if (!slist)
return FALSE;
success = clapper_app_utils_files_from_slist (slist, files, n_files);
g_slist_free_full (slist, g_object_unref);
return success;
}
static inline gboolean
_files_from_file (GFile *file, GFile ***files, gint *n_files)
{
@@ -384,29 +324,3 @@ parse_overrides:
g_free (stored_overrides);
}
GstElement *
clapper_app_utils_make_element (const gchar *string)
{
gchar *char_loc;
if (strcmp (string, "none") == 0)
return NULL;
char_loc = strchr (string, ' ');
if (char_loc) {
GstElement *element;
GError *error = NULL;
element = gst_parse_bin_from_description (string, TRUE, &error);
if (error) {
GST_ERROR ("Bin parse error: \"%s\", reason: %s", string, error->message);
g_error_free (error);
}
return element;
}
return gst_element_factory_make (string, NULL);
}

View File

@@ -26,14 +26,6 @@ G_BEGIN_DECLS
typedef void (* ClapperAppUtilsIterRanks) (const gchar *feature_name, GstRank rank, gboolean from_env, gpointer user_data);
#ifdef G_OS_WIN32
G_GNUC_INTERNAL
const gchar *const * clapper_app_utils_get_extensions (void);
G_GNUC_INTERNAL
const gchar *const * clapper_app_utils_get_subtitles_extensions (void);
#endif
G_GNUC_INTERNAL
const gchar *const * clapper_app_utils_get_mime_types (void);
@@ -58,9 +50,6 @@ gboolean clapper_app_utils_files_from_slist (GSList *file_list, GFile ***files,
G_GNUC_INTERNAL
gboolean clapper_app_utils_files_from_string (const gchar *string, GFile ***files, gint *n_files);
G_GNUC_INTERNAL
gboolean clapper_app_utils_files_from_command_line (GApplicationCommandLine *cmd_line, GFile ***files, gint *n_files);
G_GNUC_INTERNAL
gboolean clapper_app_utils_files_from_value (const GValue *value, GFile ***files, gint *n_files);
@@ -70,7 +59,4 @@ void clapper_app_utils_files_free (GFile **files);
G_GNUC_INTERNAL
void clapper_app_utils_iterate_plugin_feature_ranks (GSettings *settings, ClapperAppUtilsIterRanks callback, gpointer user_data);
G_GNUC_INTERNAL
GstElement * clapper_app_utils_make_element (const gchar *string);
G_END_DECLS

View File

@@ -28,9 +28,6 @@
#include "clapper-app-file-dialog.h"
#include "clapper-app-utils.h"
#define MIN_WINDOW_WIDTH 352
#define MIN_WINDOW_HEIGHT 198
#define DEFAULT_WINDOW_WIDTH 1024
#define DEFAULT_WINDOW_HEIGHT 576
@@ -43,8 +40,6 @@
#define PERCENTAGE_ROUND(a) (round ((gdouble) a / 0.01) * 0.01)
#define AXIS_WINS_OVER(a,b) ((a > 0 && a - 0.3 > b) || (a < 0 && a + 0.3 < b))
#define MIN_STEP_DELAY 12000
#define GST_CAT_DEFAULT clapper_app_window_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
@@ -64,7 +59,6 @@ struct _ClapperAppWindow
GSettings *settings;
guint seek_timeout;
guint resize_tick_id;
gboolean key_held;
gboolean scrolling;
@@ -80,36 +74,6 @@ struct _ClapperAppWindow
#define parent_class clapper_app_window_parent_class
G_DEFINE_TYPE (ClapperAppWindow, clapper_app_window, GTK_TYPE_APPLICATION_WINDOW)
typedef struct
{
gint dest_width, dest_height;
gint64 last_tick;
} ClapperAppWindowResizeData;
#if CLAPPER_HAVE_MPRIS
static guint16 instance_count = 0;
#endif
static inline GQuark
clapper_app_window_extra_options_get_quark (void)
{
return g_quark_from_static_string ("clapper-app-window-extra-options-quark");
}
static void
clapper_app_window_extra_options_free (ClapperAppWindowExtraOptions *extra_opts)
{
GST_TRACE ("Freeing window extra options: %p", extra_opts);
g_free (extra_opts->video_filter);
g_free (extra_opts->audio_filter);
g_free (extra_opts->video_sink);
g_free (extra_opts->audio_sink);
g_free (extra_opts);
}
static void
_media_item_title_changed_cb (ClapperMediaItem *item,
GParamSpec *pspec G_GNUC_UNUSED, ClapperAppWindow *self)
@@ -151,15 +115,6 @@ _queue_current_item_changed_cb (ClapperQueue *queue,
gst_clear_object (&current_item);
}
static void
_player_adaptive_bandwidth_changed_cb (ClapperPlayer *player,
GParamSpec *pspec G_GNUC_UNUSED, gpointer *user_data G_GNUC_UNUSED)
{
/* Do not take whole bandwidth */
clapper_player_set_adaptive_start_bitrate (player,
clapper_player_get_adaptive_bandwidth (player) * 0.8);
}
static gboolean
_get_seek_method_mapping (GValue *value,
GVariant *variant, gpointer user_data G_GNUC_UNUSED)
@@ -269,16 +224,12 @@ _open_subtitles_cb (ClapperGtkExtraMenuButton *button G_GNUC_UNUSED,
}
static void
click_pressed_cb (GtkGestureClick *click, gint n_press,
right_click_pressed_cb (GtkGestureClick *click, gint n_press,
gdouble x, gdouble y, ClapperAppWindow *self)
{
GdkCursor *cursor;
const gchar *cursor_name = NULL;
if (gtk_gesture_single_get_current_button (
GTK_GESTURE_SINGLE (click)) != GDK_BUTTON_SECONDARY)
return;
GST_LOG_OBJECT (self, "Right click pressed");
if ((cursor = gtk_widget_get_cursor (self->video)))
@@ -293,152 +244,9 @@ click_pressed_cb (GtkGestureClick *click, gint n_press,
}
}
static gboolean
_resize_tick (GtkWidget *widget, GdkFrameClock *frame_clock,
ClapperAppWindowResizeData *resize_data)
{
gint64 now = gdk_frame_clock_get_frame_time (frame_clock);
if (now - resize_data->last_tick >= MIN_STEP_DELAY) {
ClapperAppWindow *self = CLAPPER_APP_WINDOW_CAST (widget);
gint win_width, win_height;
GST_LOG_OBJECT (self, "Resize step, last: %" G_GINT64_FORMAT
", now: %" G_GINT64_FORMAT, resize_data->last_tick, now);
gtk_window_get_default_size (GTK_WINDOW (self), &win_width, &win_height);
if (win_width != resize_data->dest_width) {
gint width_diff = ABS (win_width - resize_data->dest_width);
gint step_size = (width_diff > 180) ? 120 : MAX (width_diff / 4, 1);
win_width += (win_width > resize_data->dest_width) ? -step_size : step_size;
}
if (win_height != resize_data->dest_height) {
gint height_diff = ABS (win_height - resize_data->dest_height);
gint step_size = (height_diff > 180) ? 120 : MAX (height_diff / 4, 1);
win_height += (win_height > resize_data->dest_height) ? -step_size : step_size;
}
gtk_window_set_default_size (GTK_WINDOW (self), win_width, win_height);
if (win_width == resize_data->dest_width
&& win_height == resize_data->dest_height) {
GST_DEBUG_OBJECT (self, "Window resize finish");
self->resize_tick_id = 0;
return G_SOURCE_REMOVE;
}
resize_data->last_tick = now;
}
return G_SOURCE_CONTINUE;
}
static void
_calculate_win_resize (gint win_w, gint win_h,
gint vid_w, gint vid_h, gint *dest_w, gint *dest_h)
{
gdouble win_aspect = (gdouble) win_w / win_h;
gdouble vid_aspect = (gdouble) vid_w / vid_h;
if (win_aspect < vid_aspect) {
while (!G_APPROX_VALUE (fmod (win_w, vid_aspect), 0, FLT_EPSILON))
win_w++;
win_h = round ((gdouble) win_w / vid_aspect);
if (win_h < MIN_WINDOW_HEIGHT) {
_calculate_win_resize (G_MAXINT, MIN_WINDOW_HEIGHT, vid_w, vid_h, dest_w, dest_h);
return;
}
} else {
while (!G_APPROX_VALUE (fmod (win_h * vid_aspect, 1.0), 0, FLT_EPSILON))
win_h++;
win_w = round ((gdouble) win_h * vid_aspect);
if (win_w < MIN_WINDOW_WIDTH) {
_calculate_win_resize (MIN_WINDOW_WIDTH, G_MAXINT, vid_w, vid_h, dest_w, dest_h);
return;
}
}
*dest_w = win_w;
*dest_h = win_h;
}
static void
_resize_window (ClapperAppWindow *self)
{
ClapperPlayer *player;
ClapperStreamList *vstreams;
ClapperVideoStream *vstream;
GdkToplevelState toplevel_state, disallowed;
if (self->resize_tick_id != 0)
return;
toplevel_state = gdk_toplevel_get_state (GDK_TOPLEVEL (
gtk_native_get_surface (GTK_NATIVE (self))));
disallowed = (GDK_TOPLEVEL_STATE_MINIMIZED
| GDK_TOPLEVEL_STATE_MAXIMIZED
| GDK_TOPLEVEL_STATE_FULLSCREEN
| GDK_TOPLEVEL_STATE_TILED);
if ((toplevel_state & disallowed) > 0) {
GST_DEBUG_OBJECT (self, "Cannot resize window in disallowed state");
return;
}
player = clapper_app_window_get_player (self);
vstreams = clapper_player_get_video_streams (player);
vstream = CLAPPER_VIDEO_STREAM_CAST (
clapper_stream_list_get_current_stream (vstreams));
if (vstream) {
gint video_width = clapper_video_stream_get_width (vstream);
gint video_height = clapper_video_stream_get_height (vstream);
if (G_LIKELY (video_width > 0 && video_height > 0)) {
gint win_width, win_height, dest_width, dest_height;
gtk_window_get_default_size (GTK_WINDOW (self), &win_width, &win_height);
_calculate_win_resize (win_width, win_height,
video_width, video_height, &dest_width, &dest_height);
/* Only begin resize when not already at perfect size */
if (dest_width != win_width || dest_height != win_height) {
ClapperAppWindowResizeData *resize_data;
resize_data = g_new0 (ClapperAppWindowResizeData, 1);
resize_data->dest_width = dest_width;
resize_data->dest_height = dest_height;
GST_DEBUG_OBJECT (self, "Window resize start, dest: %ix%i",
resize_data->dest_width, resize_data->dest_height);
self->resize_tick_id = gtk_widget_add_tick_callback (GTK_WIDGET (self),
(GtkTickCallback) _resize_tick, resize_data, g_free);
}
}
gst_object_unref (vstream);
}
}
static void
_handle_middle_click (ClapperAppWindow *self, GtkGestureClick *click)
{
_resize_window (self);
gtk_gesture_set_state (GTK_GESTURE (click), GTK_EVENT_SEQUENCE_CLAIMED);
}
static void
_handle_right_click (ClapperAppWindow *self, GtkGestureClick *click)
right_click_released_cb (GtkGestureClick *click, gint n_press,
gdouble x, gdouble y, ClapperAppWindow *self)
{
GdkSurface *surface;
GdkEventSequence *sequence;
@@ -459,22 +267,6 @@ _handle_right_click (ClapperAppWindow *self, GtkGestureClick *click)
gtk_gesture_set_state (GTK_GESTURE (click), GTK_EVENT_SEQUENCE_CLAIMED);
}
static void
click_released_cb (GtkGestureClick *click, gint n_press,
gdouble x, gdouble y, ClapperAppWindow *self)
{
switch (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (click))) {
case GDK_BUTTON_MIDDLE:
_handle_middle_click (self, click);
break;
case GDK_BUTTON_SECONDARY:
_handle_right_click (self, click);
break;
default:
break;
}
}
static void
drag_begin_cb (GtkGestureDrag *drag,
gdouble start_x, gdouble start_y, ClapperAppWindow *self)
@@ -1074,23 +866,6 @@ toggle_fullscreen (GSimpleAction *action, GVariant *param, gpointer user_data)
video_toggle_fullscreen_cb (CLAPPER_GTK_VIDEO_CAST (self->video), self);
}
static void
unfullscreen (GSimpleAction *action, GVariant *param, gpointer user_data)
{
GtkWindow *window = GTK_WINDOW (user_data);
if (gtk_window_is_fullscreen (window)) {
ClapperAppWindow *self = CLAPPER_APP_WINDOW_CAST (window);
video_toggle_fullscreen_cb (CLAPPER_GTK_VIDEO_CAST (self->video), self);
}
}
static void
auto_resize (GSimpleAction *action, GVariant *param, gpointer user_data)
{
_resize_window (CLAPPER_APP_WINDOW_CAST (user_data));
}
static void
show_help_overlay (GSimpleAction *action, GVariant *param, gpointer user_data)
{
@@ -1128,13 +903,6 @@ clapper_app_window_get_player (ClapperAppWindow *self)
return clapper_gtk_video_get_player (CLAPPER_GTK_VIDEO_CAST (self->video));
}
ClapperAppWindowExtraOptions *
clapper_app_window_get_extra_options (ClapperAppWindow *self)
{
return g_object_get_qdata ((GObject *) self,
clapper_app_window_extra_options_get_quark ());
}
void
clapper_app_window_ensure_no_initial_state (ClapperAppWindow *self)
{
@@ -1196,21 +964,10 @@ clapper_app_window_unrealize (GtkWidget *widget)
static void
clapper_app_window_init (ClapperAppWindow *self)
{
ClapperAppWindowExtraOptions *extra_opts;
GtkSettings *settings;
GtkWidget *dummy_titlebar;
gint distance = 0;
gtk_widget_set_size_request (GTK_WIDGET (self),
MIN_WINDOW_WIDTH, MIN_WINDOW_HEIGHT);
extra_opts = g_new0 (ClapperAppWindowExtraOptions, 1);
GST_TRACE ("Created window extra options: %p", extra_opts);
g_object_set_qdata_full ((GObject *) self,
clapper_app_window_extra_options_get_quark (),
extra_opts, (GDestroyNotify) clapper_app_window_extra_options_free);
gtk_widget_init_template (GTK_WIDGET (self));
/* Make double tap easier to perform */
@@ -1240,30 +997,25 @@ clapper_app_window_constructed (GObject *object)
ClapperPlayer *player = clapper_app_window_get_player (self);
ClapperQueue *queue = clapper_player_get_queue (player);
ClapperGtkExtraMenuButton *button;
GstElement *element;
AdwStyleManager *manager;
static const GActionEntry win_entries[] = {
{ "toggle-fullscreen", toggle_fullscreen, NULL, NULL, NULL },
{ "unfullscreen", unfullscreen, NULL, NULL, NULL },
{ "auto-resize", auto_resize, NULL, NULL, NULL },
{ "show-help-overlay", show_help_overlay, NULL, NULL, NULL },
};
#if (CLAPPER_HAVE_MPRIS || CLAPPER_HAVE_SERVER || CLAPPER_HAVE_DISCOVERER)
ClapperFeature *feature = NULL;
#endif
#if CLAPPER_HAVE_MPRIS
gchar mpris_name[45];
g_snprintf (mpris_name, sizeof (mpris_name),
"org.mpris.MediaPlayer2.Clapper.instance%" G_GUINT16_FORMAT, instance_count++);
#endif
self->settings = g_settings_new (CLAPPER_APP_ID);
self->last_volume = PERCENTAGE_ROUND (g_settings_get_double (self->settings, "volume"));
#if CLAPPER_HAVE_MPRIS
feature = CLAPPER_FEATURE (clapper_mpris_new (
mpris_name, CLAPPER_APP_NAME, CLAPPER_APP_ID));
"org.mpris.MediaPlayer2.Clapper",
"Clapper", CLAPPER_APP_ID));
clapper_mpris_set_queue_controllable (CLAPPER_MPRIS (feature), TRUE);
clapper_player_add_feature (player, feature);
gst_object_unref (feature);
@@ -1286,15 +1038,16 @@ clapper_app_window_constructed (GObject *object)
/* FIXME: Allow setting sink/filter elements from prefs window
* (this should include parsing bin descriptions) */
element = gst_element_factory_make ("scaletempo", NULL);
if (G_LIKELY (element != NULL))
clapper_player_set_audio_filter (player, element);
clapper_player_set_autoplay (player, TRUE);
/* No need to also call these here, as they only change
/* No need to also call this here, as item is selected
* after application window is contructed */
g_signal_connect (queue, "notify::current-item",
G_CALLBACK (_queue_current_item_changed_cb), self);
g_signal_connect (player, "notify::adaptive-bandwidth",
G_CALLBACK (_player_adaptive_bandwidth_changed_cb), NULL);
g_settings_bind (self->settings, "audio-offset",
player, "audio-offset", G_SETTINGS_BIND_GET);
@@ -1332,11 +1085,6 @@ clapper_app_window_dispose (GObject *object)
{
ClapperAppWindow *self = CLAPPER_APP_WINDOW_CAST (object);
if (self->resize_tick_id != 0) {
gtk_widget_remove_tick_callback (GTK_WIDGET (self), self->resize_tick_id);
self->resize_tick_id = 0;
}
g_clear_handle_id (&self->seek_timeout, g_source_remove);
gtk_widget_dispose_template (GTK_WIDGET (object), CLAPPER_APP_TYPE_WINDOW);
@@ -1396,8 +1144,8 @@ clapper_app_window_class_init (ClapperAppWindowClass *klass)
gtk_widget_class_bind_template_callback (widget_class, key_pressed_cb);
gtk_widget_class_bind_template_callback (widget_class, key_released_cb);
gtk_widget_class_bind_template_callback (widget_class, click_pressed_cb);
gtk_widget_class_bind_template_callback (widget_class, click_released_cb);
gtk_widget_class_bind_template_callback (widget_class, right_click_pressed_cb);
gtk_widget_class_bind_template_callback (widget_class, right_click_released_cb);
gtk_widget_class_bind_template_callback (widget_class, drag_begin_cb);
gtk_widget_class_bind_template_callback (widget_class, drag_update_cb);

View File

@@ -27,15 +27,6 @@ G_BEGIN_DECLS
#define CLAPPER_APP_TYPE_WINDOW (clapper_app_window_get_type())
#define CLAPPER_APP_WINDOW_CAST(obj) ((ClapperAppWindow *)(obj))
typedef struct
{
gchar *video_filter;
gchar *audio_filter;
gchar *video_sink;
gchar *audio_sink;
} ClapperAppWindowExtraOptions;
G_DECLARE_FINAL_TYPE (ClapperAppWindow, clapper_app_window, CLAPPER_APP, WINDOW, GtkApplicationWindow)
G_GNUC_INTERNAL
@@ -47,9 +38,6 @@ GtkWidget * clapper_app_window_get_video (ClapperAppWindow *window);
G_GNUC_INTERNAL
ClapperPlayer * clapper_app_window_get_player (ClapperAppWindow *window);
G_GNUC_INTERNAL
ClapperAppWindowExtraOptions * clapper_app_window_get_extra_options (ClapperAppWindow *window);
G_GNUC_INTERNAL
void clapper_app_window_ensure_no_initial_state (ClapperAppWindow *window);

View File

@@ -7,7 +7,6 @@
<file preprocess="xml-stripblanks">ui/clapper-app-headerbar.ui</file>
<file preprocess="xml-stripblanks">ui/clapper-app-help-overlay.ui</file>
<file preprocess="xml-stripblanks">ui/clapper-app-info-window.ui</file>
<file preprocess="xml-stripblanks">ui/clapper-app-pipeline-window.ui</file>
<file preprocess="xml-stripblanks">ui/clapper-app-queue-list.ui</file>
<file preprocess="xml-stripblanks">ui/clapper-app-queue-list-item.ui</file>
<file preprocess="xml-stripblanks">ui/clapper-app-queue-progression-item.ui</file>

View File

@@ -1,3 +1,8 @@
window.app {
min-width: 352px;
min-height: 198px;
}
window .initialstate {
padding-left: 6px;
padding-right: 6px;
@@ -18,10 +23,6 @@ window.info .subcontent streamlist preferencesgroup {
margin-bottom: 8px;
}
window.pipeline scrolledwindow {
background-color: white;
}
window.preferences .subcontent {
margin: 16px;
}

View File

@@ -14,8 +14,3 @@ Type=Application
Keywords=Video;Movie;Film;Clip;Series;Player;Playlist;DVD;TV;Disc;Album;Music;GNOME;Clapper;
# Translators: Do NOT translate or transliterate this text (these are enum types)!
X-Purism-FormFactor=Workstation;Mobile;
Actions=new-window;
[Desktop Action new-window]
Name=New Window
Exec=clapper --new-window

View File

@@ -49,10 +49,6 @@
<default>1.0</default>
<summary>Stores last speed value to apply on startup</summary>
</key>
<key name="adaptive-start-bitrate" type="i">
<default>1600000</default>
<summary>Stores initial adaptive streaming bitrate to apply on startup</summary>
</key>
<key name="progression-mode" type="i">
<default>1</default>
<summary>Stores last queue progression mode used to apply on startup</summary>

View File

@@ -1,3 +1,7 @@
if not ['linux'].contains(host_machine.system())
subdir_done()
endif
appstream_util = find_program('appstream-util', required: false)
if appstream_util.found()
test('Validate appstream file',
@@ -25,31 +29,22 @@ endif
install_subdir('icons',
install_dir: join_paths(prefix, datadir)
)
install_subdir('mime',
install_dir: join_paths(prefix, datadir)
)
install_subdir('applications',
install_dir: join_paths(prefix, datadir)
)
install_subdir('metainfo',
install_dir: join_paths(prefix, datadir)
)
is_linux = ['linux'].contains(host_machine.system())
is_windows = ['windows'].contains(host_machine.system())
if is_linux
install_subdir('applications',
install_dir: join_paths(prefix, datadir)
)
subdir('dbus-1')
endif
if not is_windows
install_subdir('mime',
install_dir: join_paths(prefix, datadir)
)
endif
subdir('glib-2.0/schemas')
subdir('dbus-1')
gnome.post_install(
glib_compile_schemas: true,
gtk_update_icon_cache: true,
update_desktop_database: is_linux,
update_mime_database: not is_windows,
update_desktop_database: true,
update_mime_database: true,
)

View File

@@ -34,23 +34,18 @@
<screenshots>
<screenshot type="default">
<image type="source">https://raw.githubusercontent.com/wiki/Rafostar/clapper/media/screenshot_01.png</image>
<caption>Modern player with minimalist look</caption>
</screenshot>
<screenshot>
<image type="source">https://raw.githubusercontent.com/wiki/Rafostar/clapper/media/screenshot_02.png</image>
<caption>See actual title of what you are watching</caption>
</screenshot>
<screenshot>
<image type="source">https://raw.githubusercontent.com/wiki/Rafostar/clapper/media/screenshot_03.png</image>
<caption>Queue multiple media in any order you like</caption>
</screenshot>
<screenshot>
<image type="source">https://raw.githubusercontent.com/wiki/Rafostar/clapper/media/screenshot_04.png</image>
<caption>Play either local or network content</caption>
</screenshot>
<screenshot>
<image type="source">https://raw.githubusercontent.com/wiki/Rafostar/clapper/media/screenshot_05.png</image>
<caption>Enjoy adaptive UI that fits any screen size</caption>
</screenshot>
</screenshots>
<!-- Linux Phone Apps parses categories from XML -->
@@ -263,7 +258,7 @@
</description>
</release>
</releases>
<content_rating type="oars-1.1"/>
<content_rating type="oars-1.1" />
<branding>
<color type="primary" scheme_preference="light">#8484ee</color>
<color type="primary" scheme_preference="dark">#1a1a74</color>

View File

@@ -25,7 +25,6 @@
#include <clapper/clapper.h>
#include "clapper-app-application.h"
#include "clapper-app-types.h"
gint
main (gint argc, gchar **argv)
@@ -47,8 +46,6 @@ main (gint argc, gchar **argv)
gtk_init ();
adw_init ();
clapper_app_types_init ();
g_set_application_name ("Clapper");
application = clapper_app_application_new ();

View File

@@ -15,10 +15,6 @@ clapperapp_deps = [
libadwaita_dep,
glib_dep,
gobject_dep,
libm,
dependency('libcgraph', required: false),
dependency('libgvc', required: false),
dependency('librsvg-2.0', version: '>= 2.52', required: false),
]
foreach dep : clapperapp_deps
@@ -65,15 +61,12 @@ clapperapp_sources = [
'clapper-app-info-window.c',
'clapper-app-list-item-utils.c',
'clapper-app-media-item-box.c',
'clapper-app-pipeline-viewer.c',
'clapper-app-pipeline-window.c',
'clapper-app-preferences-window.c',
'clapper-app-property-row.c',
'clapper-app-queue-list.c',
'clapper-app-queue-progression-item.c',
'clapper-app-queue-progression-model.c',
'clapper-app-queue-selection.c',
'clapper-app-types.c',
'clapper-app-uri-dialog.c',
'clapper-app-utils.c',
'clapper-app-window.c',
@@ -94,18 +87,5 @@ executable(
c_args: clapperapp_c_args,
install: true,
install_dir: bindir,
win_subsystem: 'windows',
)
if ['windows'].contains(host_machine.system())
executable(
meson.project_name() + '-console',
clapperapp_sources,
dependencies: clapperapp_deps,
include_directories: clapperapp_conf_inc,
c_args: clapperapp_c_args,
install: true,
install_dir: bindir,
win_subsystem: 'console',
)
endif
build_clapperapp = true

View File

@@ -1 +1 @@
ar ast ca cs de es eu fa fi fr he hr hu it ja lt nl oc pl pt pt_BR ru sk sv tr zh_CN
ar ast ca cs de es eu fa fi fr he hr hu it ja lt nl pl pt pt_BR ru sk sv tr zh_CN

View File

@@ -10,7 +10,6 @@ src/bin/clapper-app/ui/clapper-app-uri-dialog.ui
src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui
src/bin/clapper-app/clapper-app-about-window.c
src/bin/clapper-app/clapper-app-application.c
src/bin/clapper-app/clapper-app-info-window.c
src/bin/clapper-app/clapper-app-list-item-utils.c
src/bin/clapper-app/clapper-app-preferences-window.c

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-21 20:22+0200\n"
"PO-Revision-Date: 2024-04-26 11:01\n"
"PO-Revision-Date: 2024-04-21 20:51\n"
"Last-Translator: \n"
"Language-Team: Catalan\n"
"Language: ca_ES\n"
@@ -270,7 +270,7 @@ msgstr "Comença per afegir multimèdia a la cua de reproducció"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15
msgid "Seeking"
msgstr "Desplaçament"
msgstr "Cerca"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18
msgid "Method"

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-21 20:22+0200\n"
"PO-Revision-Date: 2024-08-12 08:36\n"
"PO-Revision-Date: 2024-04-21 20:51\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"Language: cs_CZ\n"
@@ -20,7 +20,7 @@ msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14
msgid "Codec"
msgstr "Kodek"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24
msgid "Channels"
@@ -28,21 +28,21 @@ msgstr "Kanály"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36
msgid "Sample Format"
msgstr "Vzorkovací Formát"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46
msgid "Sample Rate"
msgstr "Vzorkovací Frekvence"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51
msgid "Bitrate"
msgstr "Datový Tok"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24
msgid "Language"
msgstr "Jazyk"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:80
@@ -52,7 +52,7 @@ msgstr "Předvolby"
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:187
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:84
msgid "Keyboard Shortcuts"
msgstr "Klávesové Zkratky"
msgstr ""
#. TRANSLATORS: Please do not translate application name
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:194
@@ -71,7 +71,7 @@ msgstr "Zobrazit klávesové zkratky"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19
msgid "Open preferences"
msgstr "Otevřít předvolby"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25
msgid "Toggle fullscreen"
@@ -94,17 +94,17 @@ msgstr "Média"
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:55
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178
msgid "Add Files…"
msgstr "Přidat Soubory…"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:65
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182
msgid "Add URI…"
msgstr "Přidat URI…"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57
msgid "Queue"
msgstr "Fronta"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68
@@ -118,7 +118,7 @@ msgstr "Předchozí položka"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88
msgid "Change progression mode"
msgstr "Změnit způsob postupování"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76
@@ -131,7 +131,7 @@ msgstr "Přepnout přehrávání"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100
msgid "Tap | Left click"
msgstr "Klepnutím | Levým tlačítkem"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115
@@ -141,12 +141,12 @@ msgstr "Přetočit vpřed"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132
msgid "Double tap (right side) | Scroll right"
msgstr "Dvojitě klepnout (pravá strana) | Posun vpravo"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124
msgid "Double tap (left side) | Scroll left"
msgstr "Dvojitě klepnout (levá strana) | Posun vlevo"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131
@@ -159,7 +159,7 @@ msgstr "Zesílit"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139
msgid "Scroll up"
msgstr "Posun nahoru"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145
msgid "Volume down"
@@ -167,7 +167,7 @@ msgstr "Zeslabit"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146
msgid "Scroll down"
msgstr "Posun dolů"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152
msgid "Toggle mute"
@@ -175,11 +175,11 @@ msgstr "Vypnout/zapnout zvuk"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158
msgid "Speed up"
msgstr "Zrychlit"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164
msgid "Speed down"
msgstr "Zpomalit"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178
@@ -193,7 +193,7 @@ msgstr "Předchozí kapitola"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13
msgid "Info"
msgstr "Informace"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14
@@ -202,20 +202,20 @@ msgstr "Název"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49
msgid "Container Format"
msgstr "Formát Kontejneru"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63
msgid "Duration"
msgstr "Doba Trvání"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81
msgid "Streams"
msgstr "Kanály"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84
#: src/bin/clapper-app/clapper-app-list-item-utils.c:36
msgid "Video"
msgstr "Video"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80
@@ -231,42 +231,42 @@ msgstr "Titulky"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155
msgid "Video Playback"
msgstr "Přehrávání Videa"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199
msgid "Decoder"
msgstr "Dekodér"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211
msgid "Filter"
msgstr "Filtr"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223
msgid "Sink"
msgstr "Sink"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196
msgid "Audio Playback"
msgstr "Přehrávání Audia"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247
msgid "Video Streams"
msgstr "Video Kanály"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290
msgid "Audio Streams"
msgstr "Audio Kanály"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333
msgid "Subtitle Streams"
msgstr "Titulkové Kanály"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:46
msgid "Start by adding media to playback queue"
msgstr "Začněte přidáním média do přehrávací fronty"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15
msgid "Seeking"
@@ -274,11 +274,11 @@ msgstr "Přetáčení"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18
msgid "Method"
msgstr "Způsob"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19
msgid "A preferred method used for seeking"
msgstr "Upřednostňovaný způsob použitý pro přetáčení"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32
msgid "Value"
@@ -286,7 +286,7 @@ msgstr "Hodnota"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33
msgid "Value used for seeking forward/backward"
msgstr "Hodnota použitá pro přetáčení dopředu/dozadu"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46
msgid "Unit"
@@ -294,7 +294,7 @@ msgstr "Jednotka"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47
msgid "An unit of a seek forward/backward value"
msgstr "Jednotka hodnoty pro přetáčení dopředu/dozadu"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51
msgid "Second"
@@ -310,7 +310,7 @@ msgstr "Procenta"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63
msgid "Features"
msgstr "Funkce"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66
msgid "Server"
@@ -323,15 +323,15 @@ msgstr "Vzdáleně ovládat přehrávač"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103
msgid "Offset"
msgstr "Posun"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84
msgid "Synchronisation offset in seconds between the audio and video streams"
msgstr "Synchronizační posun v sekundách mezi audio a video kanály"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104
msgid "Synchronisation offset in seconds between the subtitle and video streams"
msgstr "Synchronizační posun v sekundách mezi titulkovými a video kanály"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118
msgid "Default font"
@@ -339,7 +339,7 @@ msgstr "Výchozí styl písma"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119
msgid "Text font used for subtitles when media does not explicitly specify one"
msgstr "Písmo používané pro titulky, když jej médium výslovně neupřesní"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137
msgid "Tweaks"
@@ -355,48 +355,48 @@ msgstr "Změna výchozího pořadí zásuvných modulů GStreameru"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164
msgid "Plugin Ranking"
msgstr "Pořadí Pluginů"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182
msgid "Available plugins"
msgstr "Dostupné pluginy"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183
msgid "Select a plugin and its feature to override rank for. When multiple elements have similiar capabilities, the one with highest value is preferred."
msgstr "Vyberte plugin a jeho funkci, pro kterou chcete přepsat pořadí. Pokud má více prvků podobnou schopnost, je preferována ta s nejvyšší hodnotou."
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186
msgid "Plugin"
msgstr "Plugin"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195
msgid "Plugin feature"
msgstr "Funkce pluginy"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213
msgid "Add override"
msgstr "Přidat přepsání"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229
msgid "Rank overrides"
msgstr "Pořadí přepsání"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23
msgid "Add"
msgstr "Přidat"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87
msgid "Queue progression"
msgstr "Postup fronty"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6
msgid "Add URI"
msgstr "Přidat URI"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7
msgid "Insert an URI to be added to playback queue"
msgstr "Vložte URI, která bude přidána do fronty přehrávání"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18
msgid "Enter or drop URI here"
@@ -408,15 +408,15 @@ msgstr "Zrušit"
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24
msgid "Resolution"
msgstr "Rozlišení"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39
msgid "Framerate"
msgstr "Snímky za sekundu"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63
msgid "Pixel Format"
msgstr "Formát Pixelu"
msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/bin/clapper-app/clapper-app-about-window.c:43
@@ -425,11 +425,11 @@ msgstr "Vojtěch Perník <translations@pervoj.cz>"
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Hardware"
msgstr "Hardware"
msgstr ""
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Software"
msgstr "Software"
msgstr ""
#: src/bin/clapper-app/clapper-app-preferences-window.c:441
msgid "Accurate"
@@ -445,25 +445,25 @@ msgstr "Rychlý"
#: src/bin/clapper-app/clapper-app-utils.c:66
msgid "No progression"
msgstr "Žádný postup"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:67
msgid "Consecutive"
msgstr "Po sobě"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:68
msgid "Repeat item"
msgstr "Opakovat položku"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:69
msgid "Carousel"
msgstr "Opakovat frontu"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:70
msgid "Shuffle"
msgstr "Náhodně"
msgstr ""
#: src/bin/clapper-app/clapper-app-window.c:828
msgid "Drop on title bar to play now or anywhere else to enqueue."
msgstr "Přetáhněte na titulní lištu pro okamžité přehrání nebo kdekoliv jinde pro zařazení."
msgstr ""

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-21 20:22+0200\n"
"PO-Revision-Date: 2024-09-07 11:10\n"
"PO-Revision-Date: 2024-04-21 20:51\n"
"Last-Translator: \n"
"Language-Team: Persian\n"
"Language: fa_IR\n"
@@ -20,7 +20,7 @@ msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14
msgid "Codec"
msgstr "رمزینه"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24
msgid "Channels"
@@ -28,21 +28,21 @@ msgstr "کانال‌ها"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36
msgid "Sample Format"
msgstr "قالب نمونه"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46
msgid "Sample Rate"
msgstr "نرخ نمونه‌"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51
msgid "Bitrate"
msgstr "نرخ بیت"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24
msgid "Language"
msgstr "زبان"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:80
@@ -52,13 +52,13 @@ msgstr "ترجیحات"
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:187
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:84
msgid "Keyboard Shortcuts"
msgstr "میان‌برهای صفحه‌کلید"
msgstr ""
#. TRANSLATORS: Please do not translate application name
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:194
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:91
msgid "About Clapper"
msgstr "دربارهٔ کلپِر"
msgstr "دربارهٔ کلَپِر"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11
@@ -71,7 +71,7 @@ msgstr "نمایش میان‌برها"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19
msgid "Open preferences"
msgstr "گشودن ترجیحات"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25
msgid "Toggle fullscreen"
@@ -94,17 +94,17 @@ msgstr "رسانه"
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:55
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178
msgid "Add Files…"
msgstr "افزودن پرونده‌ها…"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:65
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182
msgid "Add URI…"
msgstr "افزودن نشانی…"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57
msgid "Queue"
msgstr "صف"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68
@@ -118,7 +118,7 @@ msgstr "مورد قبل"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88
msgid "Change progression mode"
msgstr "تغییر خالت پیشرفت"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76
@@ -131,7 +131,7 @@ msgstr "تغییر پخش"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100
msgid "Tap | Left click"
msgstr "ضربه | کلیک راست"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115
@@ -141,12 +141,12 @@ msgstr "پیمایش به جلو"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132
msgid "Double tap (right side) | Scroll right"
msgstr "دوبار ضربه (سمت راست) | لغزش راست"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124
msgid "Double tap (left side) | Scroll left"
msgstr "دوبار ضربه (سمت چپ) | لغزش چپ"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131
@@ -159,7 +159,7 @@ msgstr "افزایش صدا"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139
msgid "Scroll up"
msgstr "لغزش به بالا"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145
msgid "Volume down"
@@ -167,7 +167,7 @@ msgstr "کاهش صدا"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146
msgid "Scroll down"
msgstr "لغزش به پایین"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152
msgid "Toggle mute"
@@ -175,11 +175,11 @@ msgstr "تغییر وضعیت بیصدا"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158
msgid "Speed up"
msgstr "سرعت بخشیدن"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164
msgid "Speed down"
msgstr "کاهش سرعت"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178
@@ -193,7 +193,7 @@ msgstr "بخش قبلی"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13
msgid "Info"
msgstr "اطّلاعات"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14
@@ -202,26 +202,26 @@ msgstr "عنوان"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49
msgid "Container Format"
msgstr "قالب بارگنج"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63
msgid "Duration"
msgstr "مدّت"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81
msgid "Streams"
msgstr "جریان‌ها"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84
#: src/bin/clapper-app/clapper-app-list-item-utils.c:36
msgid "Video"
msgstr "ویدیو"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80
#: src/bin/clapper-app/clapper-app-list-item-utils.c:39
msgid "Audio"
msgstr "صدا"
msgstr "صوتی"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100
@@ -231,42 +231,42 @@ msgstr "زیرنویس‌ها"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155
msgid "Video Playback"
msgstr "پخش ویدیو"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199
msgid "Decoder"
msgstr "رمزگشا"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211
msgid "Filter"
msgstr "پالایه"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223
msgid "Sink"
msgstr "سینک"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196
msgid "Audio Playback"
msgstr "پخش صدا"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247
msgid "Video Streams"
msgstr "جریان‌های ویدیویی"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290
msgid "Audio Streams"
msgstr "جریان‌های صوتی"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333
msgid "Subtitle Streams"
msgstr "جریان‌های زیرنویس"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:46
msgid "Start by adding media to playback queue"
msgstr "آغزا با افزودن رسانه به صف پخش"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15
msgid "Seeking"
@@ -274,11 +274,11 @@ msgstr "پوییدن"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18
msgid "Method"
msgstr "روش"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19
msgid "A preferred method used for seeking"
msgstr "روشی ترجیحی برای جویش"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32
msgid "Value"
@@ -286,7 +286,7 @@ msgstr "مقدار"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33
msgid "Value used for seeking forward/backward"
msgstr "یکای استفاده شده برای جویش به پیش و پ"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46
msgid "Unit"
@@ -294,7 +294,7 @@ msgstr "واحد"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47
msgid "An unit of a seek forward/backward value"
msgstr "یکای مقدار جویش به پیش و پس"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51
msgid "Second"
@@ -310,97 +310,97 @@ msgstr "درصد"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63
msgid "Features"
msgstr "ویژگی‌ها"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66
msgid "Server"
msgstr "کارساز"
msgstr "سرور"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67
msgid "Control player remotely"
msgstr "واپایش پخش‌کننده از راه دور"
msgstr "کنترل پخش‌کننده از راه دور"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103
msgid "Offset"
msgstr "انحراف از مبدأ"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84
msgid "Synchronisation offset in seconds between the audio and video streams"
msgstr "همگام‌سازی انحراف از مبدأ به ثانیه بین جریان‌های ویدیو و صدا"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104
msgid "Synchronisation offset in seconds between the subtitle and video streams"
msgstr "همگام‌سازی انحراف از مبدأ به ثانیه بین جریان‌های ویدیو و زیرنویس"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118
msgid "Default font"
msgstr "قلم پیش‌گزیده"
msgstr "قلم پیش فرض"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119
msgid "Text font used for subtitles when media does not explicitly specify one"
msgstr "قلم متن استفاده شده برای زیرنویس هنگامی که رسانه قلمی خاص را مشخّص نکرده"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137
msgid "Tweaks"
msgstr "سیخونک‌ها"
msgstr "دستكاري"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144
msgid "Plugin ranking"
msgstr "رتبه دهی افزایه"
msgstr "پیکربندی پلاگین"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145
msgid "Alter default ranks of GStreamer plugins"
msgstr "تغییر رتبه دهی پیش‌گزیده برای افزایه‌های جی‌استریمر"
msgstr "تغییر پیکربندی پیش فرض پلاگین های GStreamer"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164
msgid "Plugin Ranking"
msgstr "رتبه دهی افزایه"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182
msgid "Available plugins"
msgstr "افزایه‌های موجود"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183
msgid "Select a plugin and its feature to override rank for. When multiple elements have similiar capabilities, the one with highest value is preferred."
msgstr "گزینش افزایه و ویژگیش برای پایمالی رتبه دهیش. هنگامی که چندین عنصر قابلیت‌ّای مشابهی دارند، آنی که بیش‌ترین رتبه را دارد ترجیح داده می‌شود."
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186
msgid "Plugin"
msgstr "افزایه"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195
msgid "Plugin feature"
msgstr "ویژگی افزایه"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213
msgid "Add override"
msgstr "افزودن پایمالی"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229
msgid "Rank overrides"
msgstr "پایمالی‌های رتبه دهی"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23
msgid "Add"
msgstr "افزودن"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87
msgid "Queue progression"
msgstr "پیشرفت صف"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6
msgid "Add URI"
msgstr "افزودن نشانی"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7
msgid "Insert an URI to be added to playback queue"
msgstr "درج نشانی برای افزودن به صف پخش"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18
msgid "Enter or drop URI here"
msgstr "ورود یا انداختن ناشنی"
msgstr "رها کردن یا واردکردن URI"
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22
msgid "Cancel"
@@ -408,33 +408,32 @@ msgstr "لغو"
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24
msgid "Resolution"
msgstr "تفکیک‌پذیری"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39
msgid "Framerate"
msgstr "نرخ قاب"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63
msgid "Pixel Format"
msgstr "قالب پیکسلی"
msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/bin/clapper-app/clapper-app-about-window.c:43
msgid "translator-credits"
msgstr "سجاد موسوی نژاد <ssmns@outlook.com>\n"
"دانیال بهزادی <dani.behzi@ubuntu.com>"
msgstr "سجاد موسوی نژاد <ssmns@outlook.com>"
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Hardware"
msgstr "سخت‌افزاری"
msgstr ""
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Software"
msgstr "نرم‌افزاری"
msgstr ""
#: src/bin/clapper-app/clapper-app-preferences-window.c:441
msgid "Accurate"
msgstr "دقیق"
msgstr "دقت"
#: src/bin/clapper-app/clapper-app-preferences-window.c:443
msgid "Normal"
@@ -446,25 +445,25 @@ msgstr "تند"
#: src/bin/clapper-app/clapper-app-utils.c:66
msgid "No progression"
msgstr "بدون پیشرفت"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:67
msgid "Consecutive"
msgstr "متوالی"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:68
msgid "Repeat item"
msgstr "تکرار مورد"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:69
msgid "Carousel"
msgstr "چرخ فلک"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:70
msgid "Shuffle"
msgstr "بر زدن"
msgstr ""
#: src/bin/clapper-app/clapper-app-window.c:828
msgid "Drop on title bar to play now or anywhere else to enqueue."
msgstr "انداختن روی نوار عنوان برای پخش اکنون یا هر جای دیگری برای صف کردن."
msgstr ""

View File

@@ -1,469 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-21 20:22+0200\n"
"PO-Revision-Date: 2024-07-09 18:54\n"
"Last-Translator: \n"
"Language-Team: Hindi\n"
"Language: hi_IN\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: hi\n"
"X-Crowdin-File: /master/src/bin/clapper-app/po/clapper-app.pot\n"
"X-Crowdin-File-ID: 48\n"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14
msgid "Codec"
msgstr "कोडेक"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24
msgid "Channels"
msgstr "चैनल"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36
msgid "Sample Format"
msgstr "सैंपल प्रारूप"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46
msgid "Sample Rate"
msgstr "सैंपल दर"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51
msgid "Bitrate"
msgstr "बिटरेट"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24
msgid "Language"
msgstr "भाषा"
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:80
msgid "Preferences"
msgstr "प्राथमिकताएं"
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:187
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:84
msgid "Keyboard Shortcuts"
msgstr "कीबोर्ड शॉर्टकट"
#. TRANSLATORS: Please do not translate application name
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:194
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:91
msgid "About Clapper"
msgstr "क्लैपर के बारे में"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11
msgid "General"
msgstr "सामान्य"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13
msgid "Show shortcuts"
msgstr "शॉर्टकट दिखाएं"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19
msgid "Open preferences"
msgstr "प्राथमिकताएं खोलें"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25
msgid "Toggle fullscreen"
msgstr "पूर्णस्क्रीन टॉगल करें"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26
msgid "Double tap | Double click"
msgstr "डबल टैप | डबल क्लिक"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32
msgid "Quit"
msgstr "बंद करें"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32
msgid "Media"
msgstr "मीडिया"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:55
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178
msgid "Add Files…"
msgstr "फाइलें जोड़ें…"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:65
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182
msgid "Add URI…"
msgstr "यूआरआई जोड़ें…"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57
msgid "Queue"
msgstr "कतार"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68
msgid "Next item"
msgstr "अगला मद"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82
msgid "Previous item"
msgstr "पिछला मद"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88
msgid "Change progression mode"
msgstr "प्रगति मोड बदलें"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76
msgid "Playback"
msgstr "प्लेबैक"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99
msgid "Toggle play"
msgstr "चजाना टॉगल करें"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100
msgid "Tap | Left click"
msgstr "टैप | बायां क्लिक"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115
msgid "Seek forward"
msgstr "आगे तलाशें"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132
msgid "Double tap (right side) | Scroll right"
msgstr "डबल टैप (दायीं ओर) | दाएं स्क्रॉल करें"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124
msgid "Double tap (left side) | Scroll left"
msgstr "डबल टैप (बायीं ओर) | बाएं स्क्रॉल करें"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131
msgid "Seek backward"
msgstr "पीछे तलाशें"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138
msgid "Volume up"
msgstr "आवाज बढ़ाएं"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139
msgid "Scroll up"
msgstr "ऊपर स्क्रॉल"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145
msgid "Volume down"
msgstr "आवाज घटाएं"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146
msgid "Scroll down"
msgstr "नीचे स्क्रॉल"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152
msgid "Toggle mute"
msgstr "मूक टॉगल करें"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158
msgid "Speed up"
msgstr "गति बढ़ाएं"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164
msgid "Speed down"
msgstr "गति घटाएं"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178
msgid "Next chapter"
msgstr "अगला अध्याय"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192
msgid "Previous chapter"
msgstr "पिछला अध्याय"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13
msgid "Info"
msgstr "जानकारी"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14
msgid "Title"
msgstr "शीर्षक"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49
msgid "Container Format"
msgstr "कंटेनर प्रारूप"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63
msgid "Duration"
msgstr "अवधि"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81
msgid "Streams"
msgstr "स्ट्रीम"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84
#: src/bin/clapper-app/clapper-app-list-item-utils.c:36
msgid "Video"
msgstr "वीडियो"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80
#: src/bin/clapper-app/clapper-app-list-item-utils.c:39
msgid "Audio"
msgstr "ऑडियो"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100
#: src/bin/clapper-app/clapper-app-list-item-utils.c:42
msgid "Subtitles"
msgstr "उपशीर्षक"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155
msgid "Video Playback"
msgstr "वीडियो प्लेबैक"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199
msgid "Decoder"
msgstr "डिकोडर"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211
msgid "Filter"
msgstr "फिल्टर"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223
msgid "Sink"
msgstr "सिंक"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196
msgid "Audio Playback"
msgstr "ऑडियो प्लेबैक"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247
msgid "Video Streams"
msgstr "वीडियो स्ट्रीम"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290
msgid "Audio Streams"
msgstr "ऑडियो स्ट्रीम"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333
msgid "Subtitle Streams"
msgstr "उपशीर्षक स्ट्रीम"
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:46
msgid "Start by adding media to playback queue"
msgstr "प्लेबैक कतार में मीडिया जोड़कर प्रारंभ करें"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15
msgid "Seeking"
msgstr "तलाश"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18
msgid "Method"
msgstr "विधि"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19
msgid "A preferred method used for seeking"
msgstr "तलाशने की वरीय विधि"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32
msgid "Value"
msgstr "मान"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33
msgid "Value used for seeking forward/backward"
msgstr "आगे/पीछे तलाशने हेतु मान"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46
msgid "Unit"
msgstr "इकाई"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47
msgid "An unit of a seek forward/backward value"
msgstr "आगे/पीछे तलाशने हेतु मान की इकाई"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51
msgid "Second"
msgstr "सेकंड"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52
msgid "Minute"
msgstr "मिनट"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53
msgid "Percentage"
msgstr "प्रतिशत"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63
msgid "Features"
msgstr "विशेषताएं"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66
msgid "Server"
msgstr "सर्वर"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67
msgid "Control player remotely"
msgstr "प्लेयर को रिमोट से नियंत्रित करें"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103
msgid "Offset"
msgstr "ऑफसेट"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84
msgid "Synchronisation offset in seconds between the audio and video streams"
msgstr "ऑडियो और वीडियो स्ट्रीम के बीच सेकंड में समन्वयन ऑफसेट"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104
msgid "Synchronisation offset in seconds between the subtitle and video streams"
msgstr "उपशीर्षक और वीडियो स्ट्रीम के बीच सेकंड में समन्वयन ऑफसेट"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118
msgid "Default font"
msgstr "तयशुदा फॉन्ट"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119
msgid "Text font used for subtitles when media does not explicitly specify one"
msgstr "उपशीर्षकों हेतु प्रयुक्त टेक्स्ट फॉन्ट जब मीडिया स्पष्ट रूप से निर्दिष्ट नहीं करता है"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137
msgid "Tweaks"
msgstr "ट्विक्स"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144
msgid "Plugin ranking"
msgstr "प्लगइन रैंकिंग"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145
msgid "Alter default ranks of GStreamer plugins"
msgstr "GStreamer प्लगइन्स की तयशुदा रैंक बदलें"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164
msgid "Plugin Ranking"
msgstr "प्लगइन रैंकिंग"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182
msgid "Available plugins"
msgstr "उपलब्ध प्लगइन"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183
msgid "Select a plugin and its feature to override rank for. When multiple elements have similiar capabilities, the one with highest value is preferred."
msgstr "रैंक को ओवरराइड करने के लिए प्लगइन और उसकी खासियत चुनें। जब कई तत्वों में समान क्षमताएं होती हैं, तो सबसे अधिक मान वाले को प्राथमिकता दी जाती है।"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186
msgid "Plugin"
msgstr "प्लगइन"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195
msgid "Plugin feature"
msgstr "प्लगइन सुविधा"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213
msgid "Add override"
msgstr "ओवरराइड जोड़ें"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229
msgid "Rank overrides"
msgstr "रैंक ओवरराइड"
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23
msgid "Add"
msgstr "जोड़ें"
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87
msgid "Queue progression"
msgstr "कतार प्रगति"
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6
msgid "Add URI"
msgstr "यूआरआई जोड़ें"
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7
msgid "Insert an URI to be added to playback queue"
msgstr "प्लेबैक कतार में जोड़ने के लिए यूआरआई डालें"
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18
msgid "Enter or drop URI here"
msgstr "यहां यूआरआई दर्ज करें या छोड़ें"
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22
msgid "Cancel"
msgstr "रद्द करें"
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24
msgid "Resolution"
msgstr "रिजोल्यूशन"
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39
msgid "Framerate"
msgstr "फ्रेमरेट"
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63
msgid "Pixel Format"
msgstr "पिक्सल प्रारूप"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/bin/clapper-app/clapper-app-about-window.c:43
msgid "translator-credits"
msgstr "Scrambled777 <weblate.scrambled777@simplelogin.com>"
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Hardware"
msgstr "हार्डवेयर"
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Software"
msgstr "सॉफ्टवेयर"
#: src/bin/clapper-app/clapper-app-preferences-window.c:441
msgid "Accurate"
msgstr "सटीक"
#: src/bin/clapper-app/clapper-app-preferences-window.c:443
msgid "Normal"
msgstr "साधारण"
#: src/bin/clapper-app/clapper-app-preferences-window.c:445
msgid "Fast"
msgstr "तेज"
#: src/bin/clapper-app/clapper-app-utils.c:66
msgid "No progression"
msgstr "प्रगति नहीं"
#: src/bin/clapper-app/clapper-app-utils.c:67
msgid "Consecutive"
msgstr "लगातार"
#: src/bin/clapper-app/clapper-app-utils.c:68
msgid "Repeat item"
msgstr "मद दोहराएं"
#: src/bin/clapper-app/clapper-app-utils.c:69
msgid "Carousel"
msgstr "कैरोसेल"
#: src/bin/clapper-app/clapper-app-utils.c:70
msgid "Shuffle"
msgstr "शफल"
#: src/bin/clapper-app/clapper-app-window.c:828
msgid "Drop on title bar to play now or anywhere else to enqueue."
msgstr "अभी चलाने के लिए शीर्षक पट्टी पर छोड़ें या कतार में लगाने के लिए कहीं और छोड़ें।"

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-21 20:22+0200\n"
"PO-Revision-Date: 2024-10-05 12:47\n"
"PO-Revision-Date: 2024-04-21 20:51\n"
"Last-Translator: \n"
"Language-Team: Norwegian\n"
"Language: no_NO\n"
@@ -20,450 +20,450 @@ msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14
msgid "Codec"
msgstr "Codec"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24
msgid "Channels"
msgstr "Kanaler"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36
msgid "Sample Format"
msgstr "Samplingsformat"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46
msgid "Sample Rate"
msgstr "Samplingsfrekvens"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51
msgid "Bitrate"
msgstr "Bitrate"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24
msgid "Language"
msgstr "Språk"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:80
msgid "Preferences"
msgstr "Brukervalg"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:187
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:84
msgid "Keyboard Shortcuts"
msgstr "Tastatursnarveier"
msgstr ""
#. TRANSLATORS: Please do not translate application name
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:194
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:91
msgid "About Clapper"
msgstr "Om Clapper"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11
msgid "General"
msgstr "Generelt"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13
msgid "Show shortcuts"
msgstr "Vis tastatursnarveier"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19
msgid "Open preferences"
msgstr "Åpne brukervalg"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25
msgid "Toggle fullscreen"
msgstr "Slå på/av fullskjermsmodus"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26
msgid "Double tap | Double click"
msgstr "Dobbelttrykk | Dobbeltklikk"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32
msgid "Quit"
msgstr "Avslutt"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32
msgid "Media"
msgstr "Medium"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:55
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178
msgid "Add Files…"
msgstr "Legg til filer…"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:65
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182
msgid "Add URI…"
msgstr "Legg til URI…"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57
msgid "Queue"
msgstr ""
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68
msgid "Next item"
msgstr "Neste element"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82
msgid "Previous item"
msgstr "Forrige element"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88
msgid "Change progression mode"
msgstr "Endre progresjonsmodus"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76
msgid "Playback"
msgstr "Avspilling"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99
msgid "Toggle play"
msgstr "Spill av eller pause"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100
msgid "Tap | Left click"
msgstr "Trykk | Venstreklikk"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115
msgid "Seek forward"
msgstr "Søk fremover"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132
msgid "Double tap (right side) | Scroll right"
msgstr "Dobbelttrykk (på høyre side) | Rull til høyre"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124
msgid "Double tap (left side) | Scroll left"
msgstr "Dobbelttrykk (på venstre side) | Rull til venstre"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131
msgid "Seek backward"
msgstr "Søk bakover"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138
msgid "Volume up"
msgstr "Øk volym"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139
msgid "Scroll up"
msgstr "Rull opp"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145
msgid "Volume down"
msgstr "Senk volym"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146
msgid "Scroll down"
msgstr "Rull ned"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152
msgid "Toggle mute"
msgstr "Demp/avdemp"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158
msgid "Speed up"
msgstr "Øk farten"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164
msgid "Speed down"
msgstr "Senk farten"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178
msgid "Next chapter"
msgstr "Neste kapittel"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192
msgid "Previous chapter"
msgstr "Forrige kapittel"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13
msgid "Info"
msgstr "Informasjon"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14
msgid "Title"
msgstr "Tittel"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49
msgid "Container Format"
msgstr "Konteinerformat"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63
msgid "Duration"
msgstr "Lengde"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81
msgid "Streams"
msgstr "Strømmer"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84
#: src/bin/clapper-app/clapper-app-list-item-utils.c:36
msgid "Video"
msgstr "Video"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80
#: src/bin/clapper-app/clapper-app-list-item-utils.c:39
msgid "Audio"
msgstr "Lyd"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100
#: src/bin/clapper-app/clapper-app-list-item-utils.c:42
msgid "Subtitles"
msgstr "Undertekstning"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155
msgid "Video Playback"
msgstr "Videoavspilling"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199
msgid "Decoder"
msgstr "Dekoder"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211
msgid "Filter"
msgstr "Filter"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223
msgid "Sink"
msgstr "Vask"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196
msgid "Audio Playback"
msgstr "Lydavspilling"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247
msgid "Video Streams"
msgstr "Videostrømmer"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290
msgid "Audio Streams"
msgstr "Lydstrømmer"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333
msgid "Subtitle Streams"
msgstr "Undertekstingsstrømmer"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:46
msgid "Start by adding media to playback queue"
msgstr "Start ved å legge til medier i avspillingskøen"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15
msgid "Seeking"
msgstr "Søkning"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18
msgid "Method"
msgstr "Metode"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19
msgid "A preferred method used for seeking"
msgstr "En foretrukket metode brukt for å søke"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32
msgid "Value"
msgstr "Verdi"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33
msgid "Value used for seeking forward/backward"
msgstr "Verdi brukt for å søke fremover/bakover"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46
msgid "Unit"
msgstr "Enhet"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47
msgid "An unit of a seek forward/backward value"
msgstr "En enhet av en søkningsverdi"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51
msgid "Second"
msgstr "Sekund"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52
msgid "Minute"
msgstr "Minutt"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53
msgid "Percentage"
msgstr "Prosentdel"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63
msgid "Features"
msgstr "Funksjoner"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66
msgid "Server"
msgstr "Server"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67
msgid "Control player remotely"
msgstr "Fjernstyring av spilleren"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103
msgid "Offset"
msgstr "Forskyvning"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84
msgid "Synchronisation offset in seconds between the audio and video streams"
msgstr "Synkroniseringsforskyvning i sekunder mellom lyd- og videostrømmene"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104
msgid "Synchronisation offset in seconds between the subtitle and video streams"
msgstr "Synkroniseringsforskyvning i sekunder mellom untertekst- og videostrømmene"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118
msgid "Default font"
msgstr "Standard skrifttype"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119
msgid "Text font used for subtitles when media does not explicitly specify one"
msgstr "Skrifttype som brukes for undertekster når mediet ikke angir en skrifttype"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137
msgid "Tweaks"
msgstr "Justeringer"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144
msgid "Plugin ranking"
msgstr "Tilleggsrangering"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145
msgid "Alter default ranks of GStreamer plugins"
msgstr "Endre den standarde rangeringen av GStreamer-tillegg"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164
msgid "Plugin Ranking"
msgstr "Tilleggsrangering"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182
msgid "Available plugins"
msgstr "Tilgjengelige tillegg"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183
msgid "Select a plugin and its feature to override rank for. When multiple elements have similiar capabilities, the one with highest value is preferred."
msgstr "Velg et tillegg og funskjonen dets for å overstyre rangen. Når flere elementer har lignende egenskaper, skal det med den høyeste verdien brukes."
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186
msgid "Plugin"
msgstr "Tillegg"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195
msgid "Plugin feature"
msgstr "Tilleggsfunksjon"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213
msgid "Add override"
msgstr "Legg till overstyring"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229
msgid "Rank overrides"
msgstr "Rangoverstyringer"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23
msgid "Add"
msgstr "Legg til"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87
msgid "Queue progression"
msgstr "Køprogresjon"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6
msgid "Add URI"
msgstr "Legg til URI"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7
msgid "Insert an URI to be added to playback queue"
msgstr "Tast inn en URI for å legge den til i avspillingskøen"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18
msgid "Enter or drop URI here"
msgstr "Tast inn eller slipp URI her"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22
msgid "Cancel"
msgstr "Avbryt"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24
msgid "Resolution"
msgstr "Oppløsning"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39
msgid "Framerate"
msgstr "Bildefrekvens"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63
msgid "Pixel Format"
msgstr "Pikselformat"
msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/bin/clapper-app/clapper-app-about-window.c:43
msgid "translator-credits"
msgstr "Sunniva Løvstad <clapper@turtle.garden>"
msgstr ""
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Hardware"
msgstr "Maskinvare"
msgstr ""
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Software"
msgstr "Programvare"
msgstr ""
#: src/bin/clapper-app/clapper-app-preferences-window.c:441
msgid "Accurate"
msgstr "Nøyaktig"
msgstr ""
#: src/bin/clapper-app/clapper-app-preferences-window.c:443
msgid "Normal"
msgstr "Normal"
msgstr ""
#: src/bin/clapper-app/clapper-app-preferences-window.c:445
msgid "Fast"
msgstr "Rask"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:66
msgid "No progression"
msgstr "Ingen progresjon"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:67
msgid "Consecutive"
msgstr "Konsekutiv"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:68
msgid "Repeat item"
msgstr "Gjenta element"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:69
msgid "Carousel"
msgstr "Gjenta kø"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:70
msgid "Shuffle"
msgstr "Omstokking"
msgstr ""
#: src/bin/clapper-app/clapper-app-window.c:828
msgid "Drop on title bar to play now or anywhere else to enqueue."
msgstr "Slipp på tittellinjen for å spille av nå, eller hvor som helst annet for å legg til i køen."
msgstr ""

View File

@@ -1,469 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-21 20:22+0200\n"
"PO-Revision-Date: 2024-06-14 10:59\n"
"Last-Translator: \n"
"Language-Team: Occitan\n"
"Language: oc_FR\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: oc\n"
"X-Crowdin-File: /master/src/bin/clapper-app/po/clapper-app.pot\n"
"X-Crowdin-File-ID: 48\n"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14
msgid "Codec"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24
msgid "Channels"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36
msgid "Sample Format"
msgstr "Frequéncia d'escandalhatge"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46
msgid "Sample Rate"
msgstr "Taus d'escandalhatge"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51
msgid "Bitrate"
msgstr "Debit"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24
msgid "Language"
msgstr "Lenga"
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:80
msgid "Preferences"
msgstr "Preferéncias"
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:187
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:84
msgid "Keyboard Shortcuts"
msgstr "Acorchis de clavièr"
#. TRANSLATORS: Please do not translate application name
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:194
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:91
msgid "About Clapper"
msgstr "A prepaus de Clapper"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:10
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:11
msgid "General"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:13
msgid "Show shortcuts"
msgstr "Afichar los acorchis"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19
msgid "Open preferences"
msgstr "Dobrir las preferéncias"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25
msgid "Toggle fullscreen"
msgstr "Bascular en mòde ecran complèt"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26
msgid "Double tap | Double click"
msgstr "Doble tòc | Doble clic"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32
msgid "Quit"
msgstr "Quitar"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:40
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:32
msgid "Media"
msgstr "Mèdia"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:43
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:55
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178
msgid "Add Files…"
msgstr "Apondre de fichièrs…"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:65
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182
msgid "Add URI…"
msgstr "Apondre una URI…"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57
msgid "Queue"
msgstr "Fila d'espèra"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68
msgid "Next item"
msgstr "Element seguent"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82
msgid "Previous item"
msgstr "Element precedent"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88
msgid "Change progression mode"
msgstr "Modificar lo mòde de progression"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76
msgid "Playback"
msgstr "Lectura"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99
msgid "Toggle play"
msgstr "Bascular la lectura"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100
msgid "Tap | Left click"
msgstr "Tòc | Clic esquèr"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115
msgid "Seek forward"
msgstr "Avançar"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132
msgid "Double tap (right side) | Scroll right"
msgstr "Doble tòc (costat drech) | Defilament drech"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124
msgid "Double tap (left side) | Scroll left"
msgstr "Doble tòc (costat esquèr) | Defilament esquèr"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131
msgid "Seek backward"
msgstr "Recular"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138
msgid "Volume up"
msgstr "Montar lo son"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139
msgid "Scroll up"
msgstr "Defilar cap amont"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145
msgid "Volume down"
msgstr "Demesir lo son"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146
msgid "Scroll down"
msgstr "Defilar cap aval"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152
msgid "Toggle mute"
msgstr "Activar / Desactivar lo mòde mut"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158
msgid "Speed up"
msgstr "Accelerar"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164
msgid "Speed down"
msgstr "Alentir"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178
msgid "Next chapter"
msgstr "Capítol seguent"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192
msgid "Previous chapter"
msgstr "Capítol precedent"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13
msgid "Info"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14
msgid "Title"
msgstr "Títol"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49
msgid "Container Format"
msgstr "Format del contenedor"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63
msgid "Duration"
msgstr "Durada"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81
msgid "Streams"
msgstr "Fluxes"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84
#: src/bin/clapper-app/clapper-app-list-item-utils.c:36
msgid "Video"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80
#: src/bin/clapper-app/clapper-app-list-item-utils.c:39
msgid "Audio"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100
#: src/bin/clapper-app/clapper-app-list-item-utils.c:42
msgid "Subtitles"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155
msgid "Video Playback"
msgstr "Lectura vidèo"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199
msgid "Decoder"
msgstr "Descodador"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211
msgid "Filter"
msgstr "Filtre"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223
msgid "Sink"
msgstr "Receptor"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196
msgid "Audio Playback"
msgstr "Lectura àudio"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247
msgid "Video Streams"
msgstr "Fluxes de vidèo"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290
msgid "Audio Streams"
msgstr "Fluxes dàudio"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333
msgid "Subtitle Streams"
msgstr "Fluxes de sostítol"
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:46
msgid "Start by adding media to playback queue"
msgstr "Començatz per apondre de mèdias a la fila despèra"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15
msgid "Seeking"
msgstr "Recèrca"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18
msgid "Method"
msgstr "Metòde"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19
msgid "A preferred method used for seeking"
msgstr "Metòde preferit dutilizar per se desplaçar"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32
msgid "Value"
msgstr "Valor"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33
msgid "Value used for seeking forward/backward"
msgstr "Valor utilizada per avançar/recular"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46
msgid "Unit"
msgstr "Unitat"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47
msgid "An unit of a seek forward/backward value"
msgstr "Una unitat per la valor davançament/reculada"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51
msgid "Second"
msgstr "Segonda"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:52
msgid "Minute"
msgstr "Minuta"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:53
msgid "Percentage"
msgstr "Percentatge"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63
msgid "Features"
msgstr "Foncionalitats"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66
msgid "Server"
msgstr "Servidor"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67
msgid "Control player remotely"
msgstr "Contrarotlar lo lectura a distància"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103
msgid "Offset"
msgstr "Decalatge"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84
msgid "Synchronisation offset in seconds between the audio and video streams"
msgstr "Descalatge de la sincronizacion en segonda entre lo flux àudio e lo flux vidèo"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104
msgid "Synchronisation offset in seconds between the subtitle and video streams"
msgstr "Descalatge de la sincronizacion en segonda entre lo flux de sostítol e lo flux vidèo"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118
msgid "Default font"
msgstr "Polissa per defaut"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119
msgid "Text font used for subtitles when media does not explicitly specify one"
msgstr "Polissa utiliza pels sostítols quand lo mèdia nespecifica pas explicitament una."
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137
msgid "Tweaks"
msgstr "Ajustaments"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:144
msgid "Plugin ranking"
msgstr "Classament lempeuton"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145
msgid "Alter default ranks of GStreamer plugins"
msgstr "Alterar las foncionalitats per defaut dels empeutons GStreamer"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164
msgid "Plugin Ranking"
msgstr "Nòta de lempeuton"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182
msgid "Available plugins"
msgstr "Empeutons disponibles"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183
msgid "Select a plugin and its feature to override rank for. When multiple elements have similiar capabilities, the one with highest value is preferred."
msgstr "Seleccionar un empeuton e sas foncionalitats de subrecargar. Quand mai dun element an de foncionalitats similaras, aquela amb la valor mai nauta es preferida."
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186
msgid "Plugin"
msgstr "Empeuton"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195
msgid "Plugin feature"
msgstr "Foncionalitat de lemeuton"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213
msgid "Add override"
msgstr "Apondre una subrecarga"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229
msgid "Rank overrides"
msgstr "Classament de las subrecargas"
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23
msgid "Add"
msgstr "Apondre"
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87
msgid "Queue progression"
msgstr "Progression de la fila"
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6
msgid "Add URI"
msgstr "Apondre una URI"
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7
msgid "Insert an URI to be added to playback queue"
msgstr "Inserir una URI dapondre a la fila despèra"
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18
msgid "Enter or drop URI here"
msgstr "Picatz o depausatz una URI aicí"
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:22
msgid "Cancel"
msgstr "Anullar"
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24
msgid "Resolution"
msgstr "Resolucion"
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39
msgid "Framerate"
msgstr "Cadéncia"
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63
msgid "Pixel Format"
msgstr "Format de pixèl"
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/bin/clapper-app/clapper-app-about-window.c:43
msgid "translator-credits"
msgstr "Quentin PAGÈS"
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Hardware"
msgstr "Material"
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Software"
msgstr "Logicial"
#: src/bin/clapper-app/clapper-app-preferences-window.c:441
msgid "Accurate"
msgstr "Precís"
#: src/bin/clapper-app/clapper-app-preferences-window.c:443
msgid "Normal"
msgstr ""
#: src/bin/clapper-app/clapper-app-preferences-window.c:445
msgid "Fast"
msgstr "Rapid"
#: src/bin/clapper-app/clapper-app-utils.c:66
msgid "No progression"
msgstr "Cap de progression"
#: src/bin/clapper-app/clapper-app-utils.c:67
msgid "Consecutive"
msgstr "Consecutiu"
#: src/bin/clapper-app/clapper-app-utils.c:68
msgid "Repeat item"
msgstr "Repetir lelement"
#: src/bin/clapper-app/clapper-app-utils.c:69
msgid "Carousel"
msgstr "Vira-vira"
#: src/bin/clapper-app/clapper-app-utils.c:70
msgid "Shuffle"
msgstr "Aleatòri"
#: src/bin/clapper-app/clapper-app-window.c:828
msgid "Drop on title bar to play now or anywhere else to enqueue."
msgstr "Depausar per la barra de títol per jogar ara o endacòm mai per metre en espèra."

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-21 20:22+0200\n"
"PO-Revision-Date: 2024-04-26 04:23\n"
"PO-Revision-Date: 2024-04-21 20:51\n"
"Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n"
@@ -20,7 +20,7 @@ msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14
msgid "Codec"
msgstr "Codec"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24
msgid "Channels"
@@ -28,21 +28,21 @@ msgstr "Canais"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36
msgid "Sample Format"
msgstr "Formato de amostra"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46
msgid "Sample Rate"
msgstr "Taxa de amostragem"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51
msgid "Bitrate"
msgstr "Taxa de bits (Bitrate)"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24
msgid "Language"
msgstr "Idioma"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:80
@@ -52,7 +52,7 @@ msgstr "Preferências"
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:187
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:84
msgid "Keyboard Shortcuts"
msgstr "Atalhos de teclado"
msgstr ""
#. TRANSLATORS: Please do not translate application name
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:194
@@ -71,15 +71,15 @@ msgstr "Mostrar atalhos"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19
msgid "Open preferences"
msgstr "Abrir preferências"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25
msgid "Toggle fullscreen"
msgstr "Ativar/Desativar tela cheia"
msgstr "Tela Cheia"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:26
msgid "Double tap | Double click"
msgstr "Toque duplo | Clique duplo"
msgstr "Toque duplo duplo Clique duplo"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:32
msgid "Quit"
@@ -94,31 +94,31 @@ msgstr "Mídia"
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:55
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178
msgid "Add Files…"
msgstr "Adicionar arquivos…"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:65
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182
msgid "Add URI…"
msgstr "Adicionar URI…"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57
msgid "Queue"
msgstr "Fila"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68
msgid "Next item"
msgstr "Próximo item"
msgstr "Próximo"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:75
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:82
msgid "Previous item"
msgstr "Item anterior"
msgstr "Anterior"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88
msgid "Change progression mode"
msgstr "Mudar modo de progressão"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76
@@ -127,31 +127,31 @@ msgstr "Reprodução"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99
msgid "Toggle play"
msgstr "Alternar reproduzir/pausar"
msgstr "Alternar video"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100
msgid "Tap | Left click"
msgstr "Toque | Clique esquerdo"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115
msgid "Seek forward"
msgstr "Avançar"
msgstr "Avançar para frente"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132
msgid "Double tap (right side) | Scroll right"
msgstr "Toque duplo (lado direito) | Rolar para a direita"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124
msgid "Double tap (left side) | Scroll left"
msgstr "Toque duplo (lado esquerdo) | Rolar para a esquerda"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131
msgid "Seek backward"
msgstr "Retroceder"
msgstr "Volta video"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:138
msgid "Volume up"
@@ -159,7 +159,7 @@ msgstr "Aumentar o volume"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139
msgid "Scroll up"
msgstr "Rolar para cima"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145
msgid "Volume down"
@@ -167,33 +167,33 @@ msgstr "Diminuir o volume"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146
msgid "Scroll down"
msgstr "Rolar para baixo"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152
msgid "Toggle mute"
msgstr "Ativar/Desativar som"
msgstr "Ativar/Desativar Som"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158
msgid "Speed up"
msgstr "Acelerar"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164
msgid "Speed down"
msgstr "Desacelerar"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178
msgid "Next chapter"
msgstr "Próximo capítulo"
msgstr "Próximo Capítulo"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:185
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:192
msgid "Previous chapter"
msgstr "Capítulo anterior"
msgstr "Capítulo Anterior"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13
msgid "Info"
msgstr "Informações"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14
@@ -202,26 +202,26 @@ msgstr "Título"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49
msgid "Container Format"
msgstr "Formato de contêiner"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63
msgid "Duration"
msgstr "Duração"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81
msgid "Streams"
msgstr "Fluxos de dados"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84
#: src/bin/clapper-app/clapper-app-list-item-utils.c:36
msgid "Video"
msgstr "Vídeo"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80
#: src/bin/clapper-app/clapper-app-list-item-utils.c:39
msgid "Audio"
msgstr "Áudio"
msgstr "Audio"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:130
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:100
@@ -231,54 +231,54 @@ msgstr "Legendas"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155
msgid "Video Playback"
msgstr "Reprodução de vídeo"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199
msgid "Decoder"
msgstr "Decodificador"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211
msgid "Filter"
msgstr "Filtro"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223
msgid "Sink"
msgstr "Sink"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196
msgid "Audio Playback"
msgstr "Reprodução de áudio"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247
msgid "Video Streams"
msgstr "Fluxos de vídeo"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290
msgid "Audio Streams"
msgstr "Fluxos de áudio"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333
msgid "Subtitle Streams"
msgstr "Fluxos de legendas"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:46
msgid "Start by adding media to playback queue"
msgstr "Comece adicionando alguma mídia à fila de reprodução"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15
msgid "Seeking"
msgstr "Avançar/Retroceder"
msgstr "Buscando"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18
msgid "Method"
msgstr "Método"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19
msgid "A preferred method used for seeking"
msgstr "Um método preferencial usado para avançar/retroceder"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32
msgid "Value"
@@ -286,7 +286,7 @@ msgstr "Valor"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33
msgid "Value used for seeking forward/backward"
msgstr "Valor usado para avançar/retroceder"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46
msgid "Unit"
@@ -294,7 +294,7 @@ msgstr "Unidade"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47
msgid "An unit of a seek forward/backward value"
msgstr "Uma unidade para o valor usado para avançar/retroceder"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51
msgid "Second"
@@ -310,7 +310,7 @@ msgstr "Porcentagem"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63
msgid "Features"
msgstr "Funcionalidades"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66
msgid "Server"
@@ -318,20 +318,20 @@ msgstr "Servidor"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:67
msgid "Control player remotely"
msgstr "Controlar o reprodutor de vídeo remotamente"
msgstr "Controle o video remotamente "
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103
msgid "Offset"
msgstr "Desvio"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84
msgid "Synchronisation offset in seconds between the audio and video streams"
msgstr "Desvio de sincronização em segundos entre os fluxos de áudio e de vídeo"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104
msgid "Synchronisation offset in seconds between the subtitle and video streams"
msgstr "Desvio de sincronização em segundos entre os fluxos de vídeo e de legendas"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118
msgid "Default font"
@@ -339,7 +339,7 @@ msgstr "Fonte padrão"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119
msgid "Text font used for subtitles when media does not explicitly specify one"
msgstr "Fonte de texto usada para as legendas quando a mídia não especificar alguma explicitamente"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137
msgid "Tweaks"
@@ -351,52 +351,52 @@ msgstr "Classificação do plugin"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:145
msgid "Alter default ranks of GStreamer plugins"
msgstr "Alterar as classificações padrão de plugins do GStreamer"
msgstr "Altera os ranks padrão dos plugins do GStreamer"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164
msgid "Plugin Ranking"
msgstr "Classificação dos plugins"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182
msgid "Available plugins"
msgstr "Plugins disponíveis"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183
msgid "Select a plugin and its feature to override rank for. When multiple elements have similiar capabilities, the one with highest value is preferred."
msgstr "Escolha um plugin e sua funcionalidade para alterar sua classificação. Quando múltiplos elementos possuem funcionalidades similares, aquele com o maior valor de classificação tem a preferência."
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186
msgid "Plugin"
msgstr "Plugin"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195
msgid "Plugin feature"
msgstr "Funcionalidade do plugin"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213
msgid "Add override"
msgstr "Adicionar alteração"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229
msgid "Rank overrides"
msgstr "Alterações de classificação"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23
msgid "Add"
msgstr "Adicionar"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87
msgid "Queue progression"
msgstr "Progressão da fila"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6
msgid "Add URI"
msgstr "Adicionar URI"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7
msgid "Insert an URI to be added to playback queue"
msgstr "Insira um URI para ser adicionado à fila de reprodução"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18
msgid "Enter or drop URI here"
@@ -408,29 +408,28 @@ msgstr "Cancelar"
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24
msgid "Resolution"
msgstr "Resolução"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39
msgid "Framerate"
msgstr "Taxa de quadros"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63
msgid "Pixel Format"
msgstr "Formato de pixel"
msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/bin/clapper-app/clapper-app-about-window.c:43
msgid "translator-credits"
msgstr "KevenDoriaLinuxBR\n"
"Filipe Motta <luizfilipemotta@gmail.com>"
msgstr "KevenDoriaLinuxBR"
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Hardware"
msgstr "Hardware"
msgstr ""
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Software"
msgstr "Software"
msgstr ""
#: src/bin/clapper-app/clapper-app-preferences-window.c:441
msgid "Accurate"
@@ -446,25 +445,25 @@ msgstr "Rápido"
#: src/bin/clapper-app/clapper-app-utils.c:66
msgid "No progression"
msgstr "Sem progressão"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:67
msgid "Consecutive"
msgstr "Consecutiva"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:68
msgid "Repeat item"
msgstr "Repetir item"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:69
msgid "Carousel"
msgstr "Repetir tudo"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:70
msgid "Shuffle"
msgstr "Aleatório"
msgstr ""
#: src/bin/clapper-app/clapper-app-window.c:828
msgid "Drop on title bar to play now or anywhere else to enqueue."
msgstr "Solte na barra de título para reproduzir agora ou em qualquer outro lugar para adicionar à fila."
msgstr ""

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-21 20:22+0200\n"
"PO-Revision-Date: 2024-08-11 15:57\n"
"PO-Revision-Date: 2024-04-21 20:51\n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
@@ -20,7 +20,7 @@ msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14
msgid "Codec"
msgstr "Кодек"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24
msgid "Channels"
@@ -28,21 +28,21 @@ msgstr "Каналы"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36
msgid "Sample Format"
msgstr "Формат семпла"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46
msgid "Sample Rate"
msgstr "Частота дискретизации"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51
msgid "Bitrate"
msgstr "Битрейт"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24
msgid "Language"
msgstr "Язык"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:80
@@ -52,7 +52,7 @@ msgstr "Параметры"
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:187
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:84
msgid "Keyboard Shortcuts"
msgstr "Сочетания клавиш"
msgstr ""
#. TRANSLATORS: Please do not translate application name
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:194
@@ -71,7 +71,7 @@ msgstr "Комбинации клавиш"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19
msgid "Open preferences"
msgstr "Открыть настройки"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25
msgid "Toggle fullscreen"
@@ -94,17 +94,17 @@ msgstr "Медиа"
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:55
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178
msgid "Add Files…"
msgstr "Добавить файлы…"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:65
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182
msgid "Add URI…"
msgstr "Открыть по ссылке…"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57
msgid "Queue"
msgstr "Дорожка"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68
@@ -118,7 +118,7 @@ msgstr "Предыдущий элемент"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88
msgid "Change progression mode"
msgstr "Изменить режим повтора"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76
@@ -131,7 +131,7 @@ msgstr "Управление воспроизведением"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100
msgid "Tap | Left click"
msgstr "Тап | Левая кнопка мыши"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115
@@ -141,12 +141,12 @@ msgstr "Перемотка вперед"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132
msgid "Double tap (right side) | Scroll right"
msgstr "Двойной тап (правая сторона) | Скролл вправо"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124
msgid "Double tap (left side) | Scroll left"
msgstr "Двойной тап (левая сторона) | Скролл влево"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131
@@ -159,7 +159,7 @@ msgstr "Увеличить громкость"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139
msgid "Scroll up"
msgstr "Скролл вверх"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145
msgid "Volume down"
@@ -167,7 +167,7 @@ msgstr "Уменьшить громкость"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146
msgid "Scroll down"
msgstr "Скролл вниз"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152
msgid "Toggle mute"
@@ -175,11 +175,11 @@ msgstr "Отключить звук"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158
msgid "Speed up"
msgstr "Ускорить"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164
msgid "Speed down"
msgstr "Замедлить"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178
@@ -193,7 +193,7 @@ msgstr "Предыдущая глава"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13
msgid "Info"
msgstr "Информация"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14
@@ -202,20 +202,20 @@ msgstr "Заголовок"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49
msgid "Container Format"
msgstr "Формат контейнера"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63
msgid "Duration"
msgstr "Длительность"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81
msgid "Streams"
msgstr "Потоки"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84
#: src/bin/clapper-app/clapper-app-list-item-utils.c:36
msgid "Video"
msgstr "Видео"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80
@@ -231,42 +231,42 @@ msgstr "Субтитры"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155
msgid "Video Playback"
msgstr "Воспроизведение видео"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199
msgid "Decoder"
msgstr "Декодер"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211
msgid "Filter"
msgstr "Фильтр"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223
msgid "Sink"
msgstr "Приемник"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196
msgid "Audio Playback"
msgstr "Воспроизведение звука"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247
msgid "Video Streams"
msgstr "Видеопотоки"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290
msgid "Audio Streams"
msgstr "Аудиопотоки"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333
msgid "Subtitle Streams"
msgstr "Потоки субтитров"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:46
msgid "Start by adding media to playback queue"
msgstr "Начните с добавления медиа в очередь воспроизведения"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15
msgid "Seeking"
@@ -274,11 +274,11 @@ msgstr "Перемотка"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18
msgid "Method"
msgstr "Метод"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19
msgid "A preferred method used for seeking"
msgstr "Предпочтительный метод, используемый для поиска"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32
msgid "Value"
@@ -286,7 +286,7 @@ msgstr "Значение"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33
msgid "Value used for seeking forward/backward"
msgstr "Значение, используемое для поиска вперед/назад"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46
msgid "Unit"
@@ -294,7 +294,7 @@ msgstr "Ед. изм"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47
msgid "An unit of a seek forward/backward value"
msgstr "Единица поиска вперёд/назад"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51
msgid "Second"
@@ -310,7 +310,7 @@ msgstr "Проценты"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63
msgid "Features"
msgstr "Дополнительные настройки"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66
msgid "Server"
@@ -323,15 +323,15 @@ msgstr "Удаленное управление плеером"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103
msgid "Offset"
msgstr "Задержка"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84
msgid "Synchronisation offset in seconds between the audio and video streams"
msgstr "Задержка синхронизации в секундах между аудио- и видеопотоками"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104
msgid "Synchronisation offset in seconds between the subtitle and video streams"
msgstr "Задержка синхронизации в секундах между потоком субтитров и видеопотоком"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118
msgid "Default font"
@@ -339,7 +339,7 @@ msgstr "Шрифт по умолчанию"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119
msgid "Text font used for subtitles when media does not explicitly specify one"
msgstr "Шрифт, используемый для субтитров, если не указан какой именно"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137
msgid "Tweaks"
@@ -355,48 +355,48 @@ msgstr "Изменить ранги плагинов GStreamer по умолча
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164
msgid "Plugin Ranking"
msgstr "Ранжирование плагинов"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182
msgid "Available plugins"
msgstr "Доступные плагины"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183
msgid "Select a plugin and its feature to override rank for. When multiple elements have similiar capabilities, the one with highest value is preferred."
msgstr "Выберите плагин и его функцию, чтобы переопределить ранжирование. Когда несколько элементов имеют схожие возможности, предпочтение имеет один с наибольшим значением."
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186
msgid "Plugin"
msgstr "Плагин"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195
msgid "Plugin feature"
msgstr "Настройка плагина"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213
msgid "Add override"
msgstr "Добавить переопределение"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229
msgid "Rank overrides"
msgstr "Переопределение ранжирования"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23
msgid "Add"
msgstr "Добавить"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87
msgid "Queue progression"
msgstr "Прогресс очереди"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6
msgid "Add URI"
msgstr "Открыть по ссылке"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7
msgid "Insert an URI to be added to playback queue"
msgstr "Вставьте URI, который будет добавлен в очередь воспроизведения"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18
msgid "Enter or drop URI here"
@@ -408,15 +408,15 @@ msgstr "Отмена"
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24
msgid "Resolution"
msgstr "Разрешение"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39
msgid "Framerate"
msgstr "Частота кадров"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63
msgid "Pixel Format"
msgstr "Формат пикселей"
msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/bin/clapper-app/clapper-app-about-window.c:43
@@ -425,11 +425,11 @@ msgstr "Игорь Дятлов"
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Hardware"
msgstr "Аппаратное"
msgstr ""
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Software"
msgstr "Программное"
msgstr ""
#: src/bin/clapper-app/clapper-app-preferences-window.c:441
msgid "Accurate"
@@ -445,25 +445,25 @@ msgstr "Быстрый"
#: src/bin/clapper-app/clapper-app-utils.c:66
msgid "No progression"
msgstr "Нет прогрессии"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:67
msgid "Consecutive"
msgstr "Последовательно"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:68
msgid "Repeat item"
msgstr "Повторить элемент"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:69
msgid "Carousel"
msgstr "Повтор очереди"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:70
msgid "Shuffle"
msgstr "Случайно"
msgstr ""
#: src/bin/clapper-app/clapper-app-window.c:828
msgid "Drop on title bar to play now or anywhere else to enqueue."
msgstr "Перетащите на строку заголовка, чтобы воспроизвести сейчас или где-нибудь ещё, чтобы попасть в очередь."
msgstr ""

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-21 20:22+0200\n"
"PO-Revision-Date: 2024-05-20 11:58\n"
"PO-Revision-Date: 2024-04-21 20:51\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
@@ -20,7 +20,7 @@ msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:14
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:14
msgid "Codec"
msgstr "编解码器"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:24
msgid "Channels"
@@ -28,21 +28,21 @@ msgstr "声道"
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:36
msgid "Sample Format"
msgstr "采样格式"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:46
msgid "Sample Rate"
msgstr "采样率"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:58
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:51
msgid "Bitrate"
msgstr "比特率"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-audio-stream-list-item.ui:70
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:24
msgid "Language"
msgstr "语言"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:183
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:80
@@ -52,7 +52,7 @@ msgstr "首选项"
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:187
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:84
msgid "Keyboard Shortcuts"
msgstr "键盘快捷键"
msgstr ""
#. TRANSLATORS: Please do not translate application name
#: src/bin/clapper-app/ui/clapper-app-headerbar.ui:194
@@ -71,7 +71,7 @@ msgstr "显示快捷键"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:19
msgid "Open preferences"
msgstr "打开首选项"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:25
msgid "Toggle fullscreen"
@@ -94,17 +94,17 @@ msgstr "媒体"
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:55
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:178
msgid "Add Files…"
msgstr "添加文件…"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:49
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:65
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:182
msgid "Add URI…"
msgstr "添加URI..."
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:57
msgid "Queue"
msgstr "队列"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:61
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:68
@@ -118,12 +118,12 @@ msgstr "上一项"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:88
msgid "Change progression mode"
msgstr "切换播放模式"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:96
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:76
msgid "Playback"
msgstr "放"
msgstr "放"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:99
msgid "Toggle play"
@@ -131,7 +131,7 @@ msgstr "切换播放"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:100
msgid "Tap | Left click"
msgstr "单击 | 左键点击"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:107
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:115
@@ -141,12 +141,12 @@ msgstr "快进"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:108
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:132
msgid "Double tap (right side) | Scroll right"
msgstr "双击(右侧) | 向右滚动"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:116
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:124
msgid "Double tap (left side) | Scroll left"
msgstr "双击(左侧) | 向左滚动"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:123
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:131
@@ -159,7 +159,7 @@ msgstr "提高音量"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:139
msgid "Scroll up"
msgstr "向上滚动"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:145
msgid "Volume down"
@@ -167,7 +167,7 @@ msgstr "降低音量"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:146
msgid "Scroll down"
msgstr "向下滚动"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:152
msgid "Toggle mute"
@@ -175,11 +175,11 @@ msgstr "切换静音"
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:158
msgid "Speed up"
msgstr "加速"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:164
msgid "Speed down"
msgstr "减速"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:171
#: src/bin/clapper-app/ui/clapper-app-help-overlay.ui:178
@@ -193,7 +193,7 @@ msgstr "上一章节"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:13
msgid "Info"
msgstr "信息"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:35
#: src/bin/clapper-app/ui/clapper-app-subtitle-stream-list-item.ui:14
@@ -202,20 +202,20 @@ msgstr "标题"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:49
msgid "Container Format"
msgstr "封装格式"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:63
msgid "Duration"
msgstr "时长"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:81
msgid "Streams"
msgstr "串流"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:84
#: src/bin/clapper-app/clapper-app-list-item-utils.c:36
msgid "Video"
msgstr "视频"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:107
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:80
@@ -231,42 +231,42 @@ msgstr "字幕"
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:155
msgid "Video Playback"
msgstr "视频回放"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:158
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:199
msgid "Decoder"
msgstr "解码器"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:170
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:211
msgid "Filter"
msgstr "过滤器"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:182
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:223
msgid "Sink"
msgstr "Sink"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:196
msgid "Audio Playback"
msgstr "音频回放"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:247
msgid "Video Streams"
msgstr "视频流"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:290
msgid "Audio Streams"
msgstr "音频流"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-info-window.ui:333
msgid "Subtitle Streams"
msgstr "字幕流"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-initial-state.ui:46
msgid "Start by adding media to playback queue"
msgstr "添加媒体到播放队列即可开始"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:15
msgid "Seeking"
@@ -274,11 +274,11 @@ msgstr "定位播放"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:18
msgid "Method"
msgstr "快进/快退方式"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:19
msgid "A preferred method used for seeking"
msgstr "快进/快退的偏好方式"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:32
msgid "Value"
@@ -286,7 +286,7 @@ msgstr "值"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:33
msgid "Value used for seeking forward/backward"
msgstr "用于快进/快退的数值"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:46
msgid "Unit"
@@ -294,7 +294,7 @@ msgstr "单位"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:47
msgid "An unit of a seek forward/backward value"
msgstr "快进/快退数值的单位"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:51
msgid "Second"
@@ -310,7 +310,7 @@ msgstr "百分比"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:63
msgid "Features"
msgstr "功能"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:66
msgid "Server"
@@ -323,15 +323,15 @@ msgstr "远程控制播放器"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:83
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:103
msgid "Offset"
msgstr "偏移"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:84
msgid "Synchronisation offset in seconds between the audio and video streams"
msgstr "音频流和视频流之间的同步偏移秒数"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:104
msgid "Synchronisation offset in seconds between the subtitle and video streams"
msgstr "字幕流和视频流之间的同步偏移秒数"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:118
msgid "Default font"
@@ -339,7 +339,7 @@ msgstr "默认字体"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:119
msgid "Text font used for subtitles when media does not explicitly specify one"
msgstr "媒体未特别指定时,用于字幕的字体"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:137
msgid "Tweaks"
@@ -355,48 +355,48 @@ msgstr "更改 GStreamer 插件的默认等级"
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:164
msgid "Plugin Ranking"
msgstr "插件排序"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:182
msgid "Available plugins"
msgstr "可用插件"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:183
msgid "Select a plugin and its feature to override rank for. When multiple elements have similiar capabilities, the one with highest value is preferred."
msgstr "选择一个插件及其用于覆盖等级的功能。当多个元素具有相似的功能时,具有最高值的插件功能会优先使用。"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:186
msgid "Plugin"
msgstr "插件"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:195
msgid "Plugin feature"
msgstr "插件功能"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:213
msgid "Add override"
msgstr "添加覆盖"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-preferences-window.ui:229
msgid "Rank overrides"
msgstr "覆盖排序"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:60
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:23
msgid "Add"
msgstr "添加"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-queue-list.ui:87
msgid "Queue progression"
msgstr "播放列队"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:6
msgid "Add URI"
msgstr "添加"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:7
msgid "Insert an URI to be added to playback queue"
msgstr "插入要添加到播放队列的URI"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-uri-dialog.ui:18
msgid "Enter or drop URI here"
@@ -408,15 +408,15 @@ msgstr "取消"
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:24
msgid "Resolution"
msgstr "分辨率"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:39
msgid "Framerate"
msgstr "帧率"
msgstr ""
#: src/bin/clapper-app/ui/clapper-app-video-stream-list-item.ui:63
msgid "Pixel Format"
msgstr "像素格式"
msgstr ""
#. TRANSLATORS: Put your name(s) here for credits or leave untranslated
#: src/bin/clapper-app/clapper-app-about-window.c:43
@@ -426,11 +426,11 @@ msgstr "刘韬\n"
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Hardware"
msgstr "硬件"
msgstr ""
#: src/bin/clapper-app/clapper-app-info-window.c:86
msgid "Software"
msgstr "软件"
msgstr ""
#: src/bin/clapper-app/clapper-app-preferences-window.c:441
msgid "Accurate"
@@ -438,7 +438,7 @@ msgstr "精确"
#: src/bin/clapper-app/clapper-app-preferences-window.c:443
msgid "Normal"
msgstr "标准"
msgstr "一般"
#: src/bin/clapper-app/clapper-app-preferences-window.c:445
msgid "Fast"
@@ -446,25 +446,25 @@ msgstr "快速"
#: src/bin/clapper-app/clapper-app-utils.c:66
msgid "No progression"
msgstr "单集"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:67
msgid "Consecutive"
msgstr "连续"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:68
msgid "Repeat item"
msgstr "单集循环"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:69
msgid "Carousel"
msgstr "队列循环"
msgstr ""
#: src/bin/clapper-app/clapper-app-utils.c:70
msgid "Shuffle"
msgstr "随机"
msgstr ""
#: src/bin/clapper-app/clapper-app-window.c:828
msgid "Drop on title bar to play now or anywhere else to enqueue."
msgstr "拖放到标题栏即刻播放或拖放任何其他位置加入队列。"
msgstr ""

View File

@@ -178,12 +178,6 @@
</child>
</template>
<menu id="app_menu">
<section>
<item>
<attribute name="label" translatable="yes">New Window</attribute>
<attribute name="action">app.new-window</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">Preferences</attribute>

View File

@@ -10,8 +10,8 @@
<property name="title" translatable="yes">General</property>
<child>
<object class="GtkShortcutsShortcut">
<property name="title" translatable="yes">New window</property>
<property name="accelerator">&lt;Ctrl&gt;n</property>
<property name="title" translatable="yes">Show shortcuts</property>
<property name="accelerator">&lt;Ctrl&gt;question</property>
</object>
</child>
<child>
@@ -20,12 +20,6 @@
<property name="accelerator">&lt;Ctrl&gt;comma</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="title" translatable="yes">Show shortcuts</property>
<property name="accelerator">&lt;Ctrl&gt;question</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="title" translatable="yes">Toggle fullscreen</property>
@@ -33,19 +27,6 @@
<property name="accelerator">F11 f</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="title" translatable="yes">Unfullscreen</property>
<property name="accelerator">Escape</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="title" translatable="yes">Auto window resize</property>
<property name="subtitle" translatable="yes">Middle click</property>
<property name="accelerator">&lt;Super&gt;r</property>
</object>
</child>
<child>
<object class="GtkShortcutsShortcut">
<property name="title" translatable="yes">Quit</property>

View File

@@ -232,16 +232,6 @@
</child>
</object>
</child>
<child>
<object class="GtkButton">
<property name="halign">center</property>
<property name="label" translatable="yes">Show Pipeline</property>
<property name="action-name">app.pipeline</property>
<style>
<class name="pill"/>
</style>
</object>
</child>
</object>
</child>
</object>

View File

@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface domain="clapper-app">
<template class="ClapperAppPipelineWindow" parent="AdwWindow">
<property name="title" translatable="yes">Pipeline</property>
<property name="width-request">280</property>
<property name="height-request">280</property>
<property name="default-width">1400</property>
<property name="default-height">720</property>
<property name="modal">true</property>
<property name="content">
<object class="AdwToolbarView">
<child type="top">
<object class="AdwHeaderBar"/>
</child>
<property name="content">
<object class="GtkScrolledWindow">
<child>
<object class="ClapperAppPipelineViewer" id="pipeline_viewer"/>
</child>
</object>
</property>
</object>
</property>
<style>
<class name="pipeline"/>
</style>
</template>
</interface>

View File

@@ -47,9 +47,9 @@
</child>
<child>
<object class="GtkGestureClick">
<property name="button">0</property>
<signal name="pressed" handler="click_pressed_cb"/>
<signal name="released" handler="click_released_cb"/>
<property name="button">3</property>
<signal name="pressed" handler="right_click_pressed_cb"/>
<signal name="released" handler="right_click_released_cb"/>
</object>
</child>
<child>
@@ -68,5 +68,8 @@
<signal name="drop" handler="drop_cb"/>
</object>
</child>
<style>
<class name="app"/>
</style>
</template>
</interface>

View File

@@ -27,7 +27,6 @@
#include <glib-object.h>
#include <gtk/gtk.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
#include <clapper-gtk/clapper-gtk-container.h>
G_BEGIN_DECLS
@@ -35,25 +34,18 @@ G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_BILLBOARD (clapper_gtk_billboard_get_type())
#define CLAPPER_GTK_BILLBOARD_CAST(obj) ((ClapperGtkBillboard *)(obj))
CLAPPER_GTK_API
G_DECLARE_FINAL_TYPE (ClapperGtkBillboard, clapper_gtk_billboard, CLAPPER_GTK, BILLBOARD, ClapperGtkContainer)
CLAPPER_GTK_API
GtkWidget * clapper_gtk_billboard_new (void);
CLAPPER_GTK_API
void clapper_gtk_billboard_post_message (ClapperGtkBillboard *billboard, const gchar *icon_name, const gchar *message);
CLAPPER_GTK_API
void clapper_gtk_billboard_pin_message (ClapperGtkBillboard *billboard, const gchar *icon_name, const gchar *message);
CLAPPER_GTK_API
void clapper_gtk_billboard_unpin_pinned_message (ClapperGtkBillboard *billboard);
CLAPPER_GTK_API
void clapper_gtk_billboard_announce_volume (ClapperGtkBillboard *billboard);
CLAPPER_GTK_API
void clapper_gtk_billboard_announce_speed (ClapperGtkBillboard *billboard);
G_END_DECLS

View File

@@ -27,14 +27,11 @@
#include <glib-object.h>
#include <gtk/gtk.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_CONTAINER (clapper_gtk_container_get_type())
#define CLAPPER_GTK_CONTAINER_CAST(obj) ((ClapperGtkContainer *)(obj))
CLAPPER_GTK_API
G_DECLARE_DERIVABLE_TYPE (ClapperGtkContainer, clapper_gtk_container, CLAPPER_GTK, CONTAINER, GtkWidget)
struct _ClapperGtkContainerClass
@@ -45,37 +42,26 @@ struct _ClapperGtkContainerClass
gpointer padding[4];
};
CLAPPER_GTK_API
GtkWidget * clapper_gtk_container_new (void);
CLAPPER_GTK_API
void clapper_gtk_container_set_child (ClapperGtkContainer *container, GtkWidget *child);
CLAPPER_GTK_API
GtkWidget * clapper_gtk_container_get_child (ClapperGtkContainer *container);
CLAPPER_GTK_API
void clapper_gtk_container_set_width_target (ClapperGtkContainer *container, gint width);
CLAPPER_GTK_API
gint clapper_gtk_container_get_width_target (ClapperGtkContainer *container);
CLAPPER_GTK_API
void clapper_gtk_container_set_height_target (ClapperGtkContainer *container, gint height);
CLAPPER_GTK_API
gint clapper_gtk_container_get_height_target (ClapperGtkContainer *container);
CLAPPER_GTK_API
void clapper_gtk_container_set_adaptive_width (ClapperGtkContainer *container, gint width);
CLAPPER_GTK_API
gint clapper_gtk_container_get_adaptive_width (ClapperGtkContainer *container);
CLAPPER_GTK_API
void clapper_gtk_container_set_adaptive_height (ClapperGtkContainer *container, gint height);
CLAPPER_GTK_API
gint clapper_gtk_container_get_adaptive_height (ClapperGtkContainer *container);
G_END_DECLS

View File

@@ -0,0 +1,102 @@
/* Clapper GTK Integration Library
* Copyright (C) 2024 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 Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser 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.
*/
/**
* ClapperGtkEngageLayer:
*
* A layer with big `play` button, engaging user to start the playback.
*
* #ClapperGtkEngageLayer widget is meant to be overlaid on top of
* [class@ClapperGtk.Video] as a normal (non-fading) overlay. It takes
* care of fading itself once clicked and/or when playback is started.
*
* Since: 0.8
*/
#include "config.h"
#include <clapper/clapper.h>
#include "clapper-gtk-engage-layer.h"
#define GST_CAT_DEFAULT clapper_gtk_engage_layer_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
struct _ClapperGtkEngageLayer
{
ClapperGtkLeadContainer parent;
};
#define parent_class clapper_gtk_engage_layer_parent_class
G_DEFINE_TYPE (ClapperGtkEngageLayer, clapper_gtk_engage_layer, CLAPPER_GTK_TYPE_LEAD_CONTAINER)
static void
adapt_cb (ClapperGtkContainer *container, gboolean adapt,
ClapperGtkEngageLayer *self)
{
GST_DEBUG_OBJECT (self, "Adapted: %s", (adapt) ? "yes" : "no");
}
/**
* clapper_gtk_engage_layer_new:
*
* Creates a new #ClapperGtkEngageLayer instance.
*
* Returns: a new playback engage layer #GtkWidget.
*
* Since: 0.8
*/
GtkWidget *
clapper_gtk_engage_layer_new (void)
{
return g_object_new (CLAPPER_GTK_TYPE_ENGAGE_LAYER, NULL);
}
static void
clapper_gtk_engage_layer_init (ClapperGtkEngageLayer *self)
{
gtk_widget_init_template (GTK_WIDGET (self));
}
static void
clapper_gtk_engage_layer_dispose (GObject *object)
{
gtk_widget_dispose_template (GTK_WIDGET (object), CLAPPER_GTK_TYPE_ENGAGE_LAYER);
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
clapper_gtk_engage_layer_class_init (ClapperGtkEngageLayerClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GtkWidgetClass *widget_class = (GtkWidgetClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clappergtkengagelayer", 0,
"Clapper GTK Engage Layer");
gobject_class->dispose = clapper_gtk_engage_layer_dispose;
gtk_widget_class_set_template_from_resource (widget_class,
CLAPPER_GTK_RESOURCE_PREFIX "/ui/clapper-gtk-engage-layer.ui");
gtk_widget_class_bind_template_callback (widget_class, adapt_cb);
gtk_widget_class_set_css_name (widget_class, "clapper-gtk-engage-layer");
}

View File

@@ -1,4 +1,4 @@
/* Clapper Playback Library
/* Clapper GTK Integration Library
* Copyright (C) 2024 Rafał Dzięgiel <rafostar.github@gmail.com>
*
* This library is free software; you can redistribute it and/or
@@ -19,24 +19,23 @@
#pragma once
#if !defined(__CLAPPER_GTK_INSIDE__) && !defined(CLAPPER_GTK_COMPILATION)
#error "Only <clapper-gtk/clapper-gtk.h> can be included directly."
#endif
#include <glib.h>
#include <glib-object.h>
#include <gtk/gtk.h>
#include <clapper-gtk/clapper-gtk-lead-container.h>
G_BEGIN_DECLS
G_GNUC_INTERNAL
void clapper_enhancers_loader_initialize (void);
#define CLAPPER_GTK_TYPE_ENGAGE_LAYER (clapper_gtk_engage_layer_get_type())
#define CLAPPER_GTK_ENGAGE_LAYER_CAST(obj) ((ClapperGtkEngageLayer *)(obj))
G_GNUC_INTERNAL
gboolean clapper_enhancers_loader_has_enhancers (GType iface_type);
G_DECLARE_FINAL_TYPE (ClapperGtkEngageLayer, clapper_gtk_engage_layer, CLAPPER_GTK, ENGAGE_LAYER, ClapperGtkLeadContainer)
G_GNUC_INTERNAL
gchar ** clapper_enhancers_loader_get_schemes (GType iface_type);
G_GNUC_INTERNAL
gboolean clapper_enhancers_loader_check (GType iface_type, const gchar *scheme, const gchar *host, const gchar **name);
G_GNUC_INTERNAL
GObject * clapper_enhancers_loader_create_enhancer_for_uri (GType iface_type, GUri *uri);
GtkWidget * clapper_gtk_engage_layer_new (void);
G_END_DECLS

View File

@@ -30,7 +30,6 @@
#include <clapper/clapper.h>
#include "clapper-gtk-extra-menu-button.h"
#include "clapper-gtk-stream-check-button-private.h"
#include "clapper-gtk-utils-private.h"
#define PERCENTAGE_ROUND(a) (round ((gdouble) a / 0.01) * 0.01)
@@ -454,9 +453,6 @@ clapper_gtk_extra_menu_button_init (ClapperGtkExtraMenuButton *self)
{ "open-subtitle-stream", open_subtitle_stream, NULL, NULL, NULL },
};
/* Ensure private types */
g_type_ensure (CLAPPER_GTK_TYPE_STREAM_CHECK_BUTTON);
gtk_widget_init_template (GTK_WIDGET (self));
self->action_group = g_simple_action_group_new ();

View File

@@ -27,35 +27,25 @@
#include <glib-object.h>
#include <gtk/gtk.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_EXTRA_MENU_BUTTON (clapper_gtk_extra_menu_button_get_type())
#define CLAPPER_GTK_EXTRA_MENU_BUTTON_CAST(obj) ((ClapperGtkExtraMenuButton *)(obj))
CLAPPER_GTK_API
G_DECLARE_FINAL_TYPE (ClapperGtkExtraMenuButton, clapper_gtk_extra_menu_button, CLAPPER_GTK, EXTRA_MENU_BUTTON, GtkWidget)
CLAPPER_GTK_API
GtkWidget * clapper_gtk_extra_menu_button_new (void);
CLAPPER_GTK_API
void clapper_gtk_extra_menu_button_set_volume_visible (ClapperGtkExtraMenuButton *button, gboolean visible);
CLAPPER_GTK_API
gboolean clapper_gtk_extra_menu_button_get_volume_visible (ClapperGtkExtraMenuButton *button);
CLAPPER_GTK_API
void clapper_gtk_extra_menu_button_set_speed_visible (ClapperGtkExtraMenuButton *button, gboolean visible);
CLAPPER_GTK_API
gboolean clapper_gtk_extra_menu_button_get_speed_visible (ClapperGtkExtraMenuButton *button);
CLAPPER_GTK_API
void clapper_gtk_extra_menu_button_set_can_open_subtitles (ClapperGtkExtraMenuButton *button, gboolean allowed);
CLAPPER_GTK_API
gboolean clapper_gtk_extra_menu_button_get_can_open_subtitles (ClapperGtkExtraMenuButton *button);
G_END_DECLS

View File

@@ -27,7 +27,6 @@
#include <glib-object.h>
#include <gtk/gtk.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
#include <clapper-gtk/clapper-gtk-enums.h>
#include <clapper-gtk/clapper-gtk-container.h>
@@ -36,7 +35,6 @@ G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_LEAD_CONTAINER (clapper_gtk_lead_container_get_type())
#define CLAPPER_GTK_LEAD_CONTAINER_CAST(obj) ((ClapperGtkLeadContainer *)(obj))
CLAPPER_GTK_API
G_DECLARE_DERIVABLE_TYPE (ClapperGtkLeadContainer, clapper_gtk_lead_container, CLAPPER_GTK, LEAD_CONTAINER, ClapperGtkContainer)
struct _ClapperGtkLeadContainerClass
@@ -47,19 +45,14 @@ struct _ClapperGtkLeadContainerClass
gpointer padding[4];
};
CLAPPER_GTK_API
GtkWidget * clapper_gtk_lead_container_new (void);
CLAPPER_GTK_API
void clapper_gtk_lead_container_set_leading (ClapperGtkLeadContainer *lead_container, gboolean leading);
CLAPPER_GTK_API
gboolean clapper_gtk_lead_container_get_leading (ClapperGtkLeadContainer *lead_container);
CLAPPER_GTK_API
void clapper_gtk_lead_container_set_blocked_actions (ClapperGtkLeadContainer *lead_container, ClapperGtkVideoActionMask actions);
CLAPPER_GTK_API
ClapperGtkVideoActionMask clapper_gtk_lead_container_get_blocked_actions (ClapperGtkLeadContainer *lead_container);
G_END_DECLS

View File

@@ -27,17 +27,13 @@
#include <glib-object.h>
#include <gtk/gtk.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_NEXT_ITEM_BUTTON (clapper_gtk_next_item_button_get_type())
#define CLAPPER_GTK_NEXT_ITEM_BUTTON_CAST(obj) ((ClapperGtkNextItemButton *)(obj))
CLAPPER_GTK_API
G_DECLARE_FINAL_TYPE (ClapperGtkNextItemButton, clapper_gtk_next_item_button, CLAPPER_GTK, NEXT_ITEM_BUTTON, GtkButton)
CLAPPER_GTK_API
GtkWidget * clapper_gtk_next_item_button_new (void);
G_END_DECLS

View File

@@ -27,17 +27,13 @@
#include <glib-object.h>
#include <gtk/gtk.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_PREVIOUS_ITEM_BUTTON (clapper_gtk_previous_item_button_get_type())
#define CLAPPER_GTK_PREVIOUS_ITEM_BUTTON_CAST(obj) ((ClapperGtkPreviousItemButton *)(obj))
CLAPPER_GTK_API
G_DECLARE_FINAL_TYPE (ClapperGtkPreviousItemButton, clapper_gtk_previous_item_button, CLAPPER_GTK, PREVIOUS_ITEM_BUTTON, GtkButton)
CLAPPER_GTK_API
GtkWidget * clapper_gtk_previous_item_button_new (void);
G_END_DECLS

View File

@@ -28,29 +28,21 @@
#include <gtk/gtk.h>
#include <clapper/clapper.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_SEEK_BAR (clapper_gtk_seek_bar_get_type())
#define CLAPPER_GTK_SEEK_BAR_CAST(obj) ((ClapperGtkSeekBar *)(obj))
CLAPPER_GTK_API
G_DECLARE_FINAL_TYPE (ClapperGtkSeekBar, clapper_gtk_seek_bar, CLAPPER_GTK, SEEK_BAR, GtkWidget)
CLAPPER_GTK_API
GtkWidget * clapper_gtk_seek_bar_new (void);
CLAPPER_GTK_API
void clapper_gtk_seek_bar_set_reveal_labels (ClapperGtkSeekBar *seek_bar, gboolean reveal);
CLAPPER_GTK_API
gboolean clapper_gtk_seek_bar_get_reveal_labels (ClapperGtkSeekBar *seek_bar);
CLAPPER_GTK_API
void clapper_gtk_seek_bar_set_seek_method (ClapperGtkSeekBar *seek_bar, ClapperPlayerSeekMethod method);
CLAPPER_GTK_API
ClapperPlayerSeekMethod clapper_gtk_seek_bar_get_seek_method (ClapperGtkSeekBar *seek_bar);
G_END_DECLS

View File

@@ -26,8 +26,6 @@
#include <glib.h>
#include <glib-object.h>
#include <gtk/gtk.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
#include <clapper-gtk/clapper-gtk-container.h>
#include <clapper-gtk/clapper-gtk-extra-menu-button.h>
@@ -36,25 +34,18 @@ G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_SIMPLE_CONTROLS (clapper_gtk_simple_controls_get_type())
#define CLAPPER_GTK_SIMPLE_CONTROLS_CAST(obj) ((ClapperGtkSimpleControls *)(obj))
CLAPPER_GTK_API
G_DECLARE_FINAL_TYPE (ClapperGtkSimpleControls, clapper_gtk_simple_controls, CLAPPER_GTK, SIMPLE_CONTROLS, ClapperGtkContainer)
CLAPPER_GTK_API
GtkWidget * clapper_gtk_simple_controls_new (void);
CLAPPER_GTK_API
void clapper_gtk_simple_controls_set_fullscreenable (ClapperGtkSimpleControls *controls, gboolean fullscreenable);
CLAPPER_GTK_API
gboolean clapper_gtk_simple_controls_get_fullscreenable (ClapperGtkSimpleControls *controls);
CLAPPER_GTK_API
void clapper_gtk_simple_controls_set_seek_method (ClapperGtkSimpleControls *controls, ClapperPlayerSeekMethod method);
CLAPPER_GTK_API
ClapperPlayerSeekMethod clapper_gtk_simple_controls_get_seek_method (ClapperGtkSimpleControls *controls);
CLAPPER_GTK_API
ClapperGtkExtraMenuButton * clapper_gtk_simple_controls_get_extra_menu_button (ClapperGtkSimpleControls *controls);
G_END_DECLS

View File

@@ -26,8 +26,6 @@
#include <glib.h>
#include <glib-object.h>
#include <gtk/gtk.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
#include <clapper-gtk/clapper-gtk-lead-container.h>
G_BEGIN_DECLS
@@ -35,19 +33,14 @@ G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_TITLE_HEADER (clapper_gtk_title_header_get_type())
#define CLAPPER_GTK_TITLE_HEADER_CAST(obj) ((ClapperGtkTitleHeader *)(obj))
CLAPPER_GTK_API
G_DECLARE_FINAL_TYPE (ClapperGtkTitleHeader, clapper_gtk_title_header, CLAPPER_GTK, TITLE_HEADER, ClapperGtkLeadContainer)
CLAPPER_GTK_API
GtkWidget * clapper_gtk_title_header_new (void);
CLAPPER_GTK_API
const gchar * clapper_gtk_title_header_get_current_title (ClapperGtkTitleHeader *header);
CLAPPER_GTK_API
void clapper_gtk_title_header_set_fallback_to_uri (ClapperGtkTitleHeader *header, gboolean enabled);
CLAPPER_GTK_API
gboolean clapper_gtk_title_header_get_fallback_to_uri (ClapperGtkTitleHeader *header);
G_END_DECLS

View File

@@ -28,32 +28,23 @@
#include <gtk/gtk.h>
#include <clapper/clapper.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_TITLE_LABEL (clapper_gtk_title_label_get_type())
#define CLAPPER_GTK_TITLE_LABEL_CAST(obj) ((ClapperGtkTitleLabel *)(obj))
CLAPPER_GTK_API
G_DECLARE_FINAL_TYPE (ClapperGtkTitleLabel, clapper_gtk_title_label, CLAPPER_GTK, TITLE_LABEL, GtkWidget)
CLAPPER_GTK_API
GtkWidget * clapper_gtk_title_label_new (void);
CLAPPER_GTK_API
void clapper_gtk_title_label_set_media_item (ClapperGtkTitleLabel *label, ClapperMediaItem *item);
CLAPPER_GTK_API
ClapperMediaItem * clapper_gtk_title_label_get_media_item (ClapperGtkTitleLabel *label);
CLAPPER_GTK_API
const gchar * clapper_gtk_title_label_get_current_title (ClapperGtkTitleLabel *label);
CLAPPER_GTK_API
void clapper_gtk_title_label_set_fallback_to_uri (ClapperGtkTitleLabel *label, gboolean enabled);
CLAPPER_GTK_API
gboolean clapper_gtk_title_label_get_fallback_to_uri (ClapperGtkTitleLabel *label);
G_END_DECLS

View File

@@ -27,17 +27,13 @@
#include <glib-object.h>
#include <gtk/gtk.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_TOGGLE_FULLSCREEN_BUTTON (clapper_gtk_toggle_fullscreen_button_get_type())
#define CLAPPER_GTK_TOGGLE_FULLSCREEN_BUTTON_CAST(obj) ((ClapperGtkToggleFullscreenButton *)(obj))
CLAPPER_GTK_API
G_DECLARE_FINAL_TYPE (ClapperGtkToggleFullscreenButton, clapper_gtk_toggle_fullscreen_button, CLAPPER_GTK, TOGGLE_FULLSCREEN_BUTTON, GtkButton)
CLAPPER_GTK_API
GtkWidget * clapper_gtk_toggle_fullscreen_button_new (void);
G_END_DECLS

View File

@@ -27,17 +27,13 @@
#include <glib-object.h>
#include <gtk/gtk.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_TOGGLE_PLAY_BUTTON (clapper_gtk_toggle_play_button_get_type())
#define CLAPPER_GTK_TOGGLE_PLAY_BUTTON_CAST(obj) ((ClapperGtkTogglePlayButton *)(obj))
CLAPPER_GTK_API
G_DECLARE_FINAL_TYPE (ClapperGtkTogglePlayButton, clapper_gtk_toggle_play_button, CLAPPER_GTK, TOGGLE_PLAY_BUTTON, GtkButton)
CLAPPER_GTK_API
GtkWidget * clapper_gtk_toggle_play_button_new (void);
G_END_DECLS

View File

@@ -27,11 +27,8 @@
#include <gtk/gtk.h>
#include <clapper/clapper.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
G_BEGIN_DECLS
CLAPPER_GTK_API
ClapperPlayer * clapper_gtk_get_player_from_ancestor (GtkWidget *widget);
G_END_DECLS

View File

@@ -1065,7 +1065,7 @@ _player_missing_plugin_cb (ClapperPlayer *player, const gchar *name,
{
/* Some media files have custom/proprietary metadata,
* it should be safe to simply ignore these */
if (strstr (name, "meta/") != NULL)
if (g_str_has_prefix (name, "meta/"))
return;
/* XXX: Playbin2 seems to not emit state change here,
@@ -1108,11 +1108,6 @@ _fading_overlay_revealed_cb (GtkRevealer *revealer,
*
* Creates a new #ClapperGtkVideo instance.
*
* Newly created video widget will also set some default GStreamer elements
* on its [class@Clapper.Player]. This includes Clapper own video sink and
* a "scaletempo" element as audio filter. Both can still be changed after
* construction by setting corresponding player properties.
*
* Returns: a new video #GtkWidget.
*/
GtkWidget *
@@ -1389,10 +1384,6 @@ clapper_gtk_video_init (ClapperGtkVideo *self)
self->touch_fade_delay = DEFAULT_TOUCH_FADE_DELAY;
self->auto_inhibit = DEFAULT_AUTO_INHIBIT;
/* Ensure private types */
g_type_ensure (CLAPPER_GTK_TYPE_STATUS);
g_type_ensure (CLAPPER_GTK_TYPE_BUFFERING_ANIMATION);
gtk_widget_init_template (GTK_WIDGET (self));
gtk_gesture_group (self->touch_gesture, self->click_gesture);
@@ -1402,7 +1393,7 @@ static void
clapper_gtk_video_constructed (GObject *object)
{
ClapperGtkVideo *self = CLAPPER_GTK_VIDEO_CAST (object);
GstElement *afilter, *vsink;
GstElement *vsink = gst_element_factory_make ("clappersink", NULL);
ClapperQueue *queue;
self->player = clapper_player_new ();
@@ -1413,8 +1404,6 @@ clapper_gtk_video_constructed (GObject *object)
g_signal_connect (self->player, "notify::video-sink",
G_CALLBACK (_video_sink_changed_cb), self);
vsink = gst_element_factory_make ("clappersink", NULL);
/* FIXME: This is a temporary workaround for lack
* of DMA_DRM negotiation support in sink itself */
if (G_LIKELY (vsink != NULL)) {
@@ -1429,13 +1418,9 @@ clapper_gtk_video_constructed (GObject *object)
vsink = bin;
}
}
clapper_player_set_video_sink (self->player, vsink);
}
afilter = gst_element_factory_make ("scaletempo", NULL);
if (G_LIKELY (afilter != NULL))
clapper_player_set_audio_filter (self->player, afilter);
clapper_player_set_video_sink (self->player, vsink);
g_signal_connect (self->player, "error",
G_CALLBACK (_player_error_cb), self);
@@ -1462,24 +1447,6 @@ clapper_gtk_video_dispose (GObject *object)
g_clear_handle_id (&self->fade_timeout, g_source_remove);
/* Something else might still be holding a reference on the player,
* thus we should disconnect everything before disposing template */
if (self->player) {
ClapperQueue *queue = clapper_player_get_queue (self->player);
g_signal_handlers_disconnect_by_func (self->player,
_player_state_changed_cb, self);
g_signal_handlers_disconnect_by_func (self->player,
_video_sink_changed_cb, self);
g_signal_handlers_disconnect_by_func (self->player,
_player_error_cb, self);
g_signal_handlers_disconnect_by_func (self->player,
_player_missing_plugin_cb, self);
g_signal_handlers_disconnect_by_func (queue,
_queue_current_item_changed_cb, self);
}
gtk_widget_dispose_template (GTK_WIDGET (object), CLAPPER_GTK_TYPE_VIDEO);
g_clear_pointer (&self->overlay, gtk_widget_unparent);
@@ -1583,7 +1550,7 @@ clapper_gtk_video_class_init (ClapperGtkVideoClass *klass)
*/
param_specs[PROP_FADE_DELAY] = g_param_spec_uint ("fade-delay",
NULL, NULL, 1, G_MAXUINT, DEFAULT_FADE_DELAY,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* ClapperGtkVideo:touch-fade-delay:
@@ -1593,7 +1560,7 @@ clapper_gtk_video_class_init (ClapperGtkVideoClass *klass)
*/
param_specs[PROP_TOUCH_FADE_DELAY] = g_param_spec_uint ("touch-fade-delay",
NULL, NULL, 1, G_MAXUINT, DEFAULT_TOUCH_FADE_DELAY,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
G_PARAM_READABLE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
/**
* ClapperGtkVideo:auto-inhibit:

View File

@@ -28,47 +28,33 @@
#include <gtk/gtk.h>
#include <clapper/clapper.h>
#include <clapper-gtk/clapper-gtk-visibility.h>
G_BEGIN_DECLS
#define CLAPPER_GTK_TYPE_VIDEO (clapper_gtk_video_get_type())
#define CLAPPER_GTK_VIDEO_CAST(obj) ((ClapperGtkVideo *)(obj))
CLAPPER_GTK_API
G_DECLARE_FINAL_TYPE (ClapperGtkVideo, clapper_gtk_video, CLAPPER_GTK, VIDEO, GtkWidget)
CLAPPER_GTK_API
GtkWidget * clapper_gtk_video_new (void);
CLAPPER_GTK_API
void clapper_gtk_video_add_overlay (ClapperGtkVideo *video, GtkWidget *widget);
CLAPPER_GTK_API
void clapper_gtk_video_add_fading_overlay (ClapperGtkVideo *video, GtkWidget *widget);
CLAPPER_GTK_API
ClapperPlayer * clapper_gtk_video_get_player (ClapperGtkVideo *video);
CLAPPER_GTK_API
void clapper_gtk_video_set_fade_delay (ClapperGtkVideo *video, guint delay);
CLAPPER_GTK_API
guint clapper_gtk_video_get_fade_delay (ClapperGtkVideo *video);
CLAPPER_GTK_API
void clapper_gtk_video_set_touch_fade_delay (ClapperGtkVideo *video, guint delay);
CLAPPER_GTK_API
guint clapper_gtk_video_get_touch_fade_delay (ClapperGtkVideo *video);
CLAPPER_GTK_API
void clapper_gtk_video_set_auto_inhibit (ClapperGtkVideo *video, gboolean inhibit);
CLAPPER_GTK_API
gboolean clapper_gtk_video_get_auto_inhibit (ClapperGtkVideo *video);
CLAPPER_GTK_API
gboolean clapper_gtk_video_get_inhibited (ClapperGtkVideo *video);
G_END_DECLS

View File

@@ -2,6 +2,7 @@
<gresources>
<gresource prefix="/com/github/rafostar/Clapper/clapper-gtk">
<file preprocess="xml-stripblanks">ui/clapper-gtk-billboard.ui</file>
<file preprocess="xml-stripblanks">ui/clapper-gtk-engage-layer.ui</file>
<file preprocess="xml-stripblanks">ui/clapper-gtk-extra-menu-button.ui</file>
<file preprocess="xml-stripblanks">ui/clapper-gtk-seek-bar.ui</file>
<file preprocess="xml-stripblanks">ui/clapper-gtk-simple-controls.ui</file>

View File

@@ -26,6 +26,7 @@
#include <clapper-gtk/clapper-gtk-billboard.h>
#include <clapper-gtk/clapper-gtk-container.h>
#include <clapper-gtk/clapper-gtk-engage-layer.h>
#include <clapper-gtk/clapper-gtk-extra-menu-button.h>
#include <clapper-gtk/clapper-gtk-lead-container.h>
#include <clapper-gtk/clapper-gtk-next-item-button.h>

View File

@@ -5,23 +5,17 @@ clapper-gtk-video button.osd,
clapper-gtk-video box.osd,
clapper-gtk-video clapper-gtk-title-header.osd,
clapper-gtk-video .osd popover contents,
clapper-gtk-video .osd popover arrow,
clapper-gtk-video windowcontrols.osd button image {
clapper-gtk-video .osd popover arrow {
background-color: rgba(38,38,38,0.8);
}
clapper-gtk-video button.osd:hover,
clapper-gtk-video button.osd:checked,
clapper-gtk-video windowcontrols.osd button:hover image,
clapper-gtk-video windowcontrols.osd button:checked image {
clapper-gtk-video button.osd:checked {
background-color: rgba(63,63,63,0.8);
}
clapper-gtk-video button.osd:active,
clapper-gtk-video windowcontrols.osd button:active image {
clapper-gtk-video button.osd:active {
background-color: rgba(82,82,82,0.8);
}
clapper-gtk-video box.osd listview.osd,
clapper-gtk-video windowcontrols.osd,
clapper-gtk-video clapper-gtk-status.osd {
clapper-gtk-video box.osd listview.osd {
background-color: transparent;
}

View File

@@ -39,19 +39,6 @@ configure_file(
configuration: config_h,
)
visibility_conf = configuration_data()
visibility_conf.set(
'CLAPPER_API',
'CLAPPER_GTK',
)
clappergtk_visibility_header = configure_file(
input: '../shared/clapper-api-visibility.h.in',
output: 'clapper-gtk-visibility.h',
configuration: visibility_conf,
)
version_conf = configuration_data()
version_conf.set(
@@ -93,6 +80,7 @@ clappergtk_headers = [
'clapper-gtk-enums.h',
'clapper-gtk-billboard.h',
'clapper-gtk-container.h',
'clapper-gtk-engage-layer.h',
'clapper-gtk-extra-menu-button.h',
'clapper-gtk-lead-container.h',
'clapper-gtk-next-item-button.h',
@@ -106,13 +94,13 @@ clappergtk_headers = [
'clapper-gtk-utils.h',
'clapper-gtk-video.h',
clappergtk_version_header,
clappergtk_visibility_header,
]
clappergtk_sources = [
'clapper-gtk-billboard.c',
'clapper-gtk-buffering-animation.c',
'clapper-gtk-buffering-paintable.c',
'clapper-gtk-container.c',
'clapper-gtk-engage-layer.c',
'clapper-gtk-extra-menu-button.c',
'clapper-gtk-lead-container.c',
'clapper-gtk-limited-layout.c',
@@ -136,17 +124,11 @@ clappergtk_c_args = [
'-DGST_USE_UNSTABLE_API',
]
if get_option('default_library') == 'static'
clappergtk_c_args += ['-DCLAPPER_GTK_STATIC_COMPILATION']
endif
clappergtk_headers_dir = join_paths(includedir, clapper_api_name, 'clapper-gtk')
clappergtk_enums = gnome.mkenums_simple(
'clapper-gtk-enum-types',
sources: clappergtk_headers,
decorator: 'CLAPPER_GTK_API',
header_prefix: '#include <clapper-gtk/clapper-gtk-visibility.h>',
identifier_prefix: 'ClapperGtk',
symbol_prefix: 'clapper_gtk',
install_header: true,
@@ -235,7 +217,6 @@ clappergtk_dep = declare_dependency(
include_directories: clappergtk_conf_inc,
dependencies: clappergtk_deps,
sources: [
clappergtk_visibility_header,
clappergtk_version_header,
clappergtk_enums[1],
],

View File

@@ -1 +1 @@
ar ast ca cs de es eu fa fi fr he hr hu it ja lt nl oc pl pt pt_BR ru sk sv tr zh_CN
ar ast ca cs de es eu fa fi fr he hr hu it ja lt nl pl pt pt_BR ru sk sv tr zh_CN

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-12 19:52+0200\n"
"PO-Revision-Date: 2024-08-12 08:36\n"
"PO-Revision-Date: 2024-04-12 18:47\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"Language: cs_CZ\n"
@@ -20,7 +20,7 @@ msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:9
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:227
msgid "Video"
msgstr "Video"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:17
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:228
@@ -34,33 +34,33 @@ msgstr "Titulky"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:28
msgid "Show Subtitles"
msgstr "Zobrazit Titulky"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:32
msgid "Open…"
msgstr "Otevřít…"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:75
msgid "Mute"
msgstr "Ztlumit"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:119
msgid "Reset"
msgstr "Resetovat"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-status.c:79
msgid "Unplayable Content"
msgstr "Nepřehratelný Obsah"
msgstr ""
#. TRANSLATORS: Please do not try to translate "GStreamer" (it is a library name).
#: src/lib/clapper-gtk/clapper-gtk-status.c:89
#, c-format
msgid "Your GStreamer installation is missing a plugin: %s"
msgstr "Vaší instalaci GStreamer chybí plugin: %s"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-status.c:90
msgid "Missing Plugin"
msgstr "Chybějící Plugin"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:82
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:126
@@ -73,9 +73,9 @@ msgstr "Kanály"
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:91
msgid "No media"
msgstr "Žádná média"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:103
msgid "Unknown title"
msgstr "Neznámý název"
msgstr ""

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-12 19:52+0200\n"
"PO-Revision-Date: 2024-09-07 11:10\n"
"PO-Revision-Date: 2024-04-12 18:48\n"
"Last-Translator: \n"
"Language-Team: Persian\n"
"Language: fa_IR\n"
@@ -20,12 +20,12 @@ msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:9
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:227
msgid "Video"
msgstr "ویدیو"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:17
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:228
msgid "Audio"
msgstr "صدا"
msgstr "صوتی"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:25
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:229
@@ -34,38 +34,38 @@ msgstr "زیرنویس‌ها"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:28
msgid "Show Subtitles"
msgstr "نمایش زیرنویس"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:32
msgid "Open…"
msgstr "گشودن…"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:75
msgid "Mute"
msgstr "خموش"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:119
msgid "Reset"
msgstr "بازنشانی"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-status.c:79
msgid "Unplayable Content"
msgstr "محتوای غیر قابل پخش"
msgstr ""
#. TRANSLATORS: Please do not try to translate "GStreamer" (it is a library name).
#: src/lib/clapper-gtk/clapper-gtk-status.c:89
#, c-format
msgid "Your GStreamer installation is missing a plugin: %s"
msgstr "نصب جی‌استریمرتان افزایه‌ای را ندارد: %s"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-status.c:90
msgid "Missing Plugin"
msgstr "افزایه ناموجود"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:82
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:126
msgid "Undetermined"
msgstr "تشخیص داده نشده"
msgstr "نامشخص"
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:82
msgid "Channels"
@@ -73,9 +73,9 @@ msgstr "کانال‌ها"
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:91
msgid "No media"
msgstr "بدون رسانه"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:103
msgid "Unknown title"
msgstr "عنوان ناشناس"
msgstr ""

View File

@@ -1,81 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-12 19:52+0200\n"
"PO-Revision-Date: 2024-07-09 18:54\n"
"Last-Translator: \n"
"Language-Team: Hindi\n"
"Language: hi_IN\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: hi\n"
"X-Crowdin-File: /master/src/lib/clapper-gtk/po/clapper-gtk.pot\n"
"X-Crowdin-File-ID: 46\n"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:9
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:227
msgid "Video"
msgstr "वीडियो"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:17
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:228
msgid "Audio"
msgstr "ऑडियो"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:25
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:229
msgid "Subtitles"
msgstr "उपशीर्षक"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:28
msgid "Show Subtitles"
msgstr "उपशीर्षक दिखाएं"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:32
msgid "Open…"
msgstr "खोलें…"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:75
msgid "Mute"
msgstr "मूक"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:119
msgid "Reset"
msgstr "रीसेट"
#: src/lib/clapper-gtk/clapper-gtk-status.c:79
msgid "Unplayable Content"
msgstr "चलाने योग्य सामग्री नहीं"
#. TRANSLATORS: Please do not try to translate "GStreamer" (it is a library name).
#: src/lib/clapper-gtk/clapper-gtk-status.c:89
#, c-format
msgid "Your GStreamer installation is missing a plugin: %s"
msgstr "आपके GStreamer स्थापना में एक प्लगइन गायब है: %s"
#: src/lib/clapper-gtk/clapper-gtk-status.c:90
msgid "Missing Plugin"
msgstr "गायब प्लगइन"
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:82
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:126
msgid "Undetermined"
msgstr "अनिर्धारित"
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:82
msgid "Channels"
msgstr "चैनल"
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:91
msgid "No media"
msgstr "मीडिया नहीं"
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:103
msgid "Unknown title"
msgstr "अज्ञात शीर्षक"

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-12 19:52+0200\n"
"PO-Revision-Date: 2024-10-05 12:47\n"
"PO-Revision-Date: 2024-04-12 18:47\n"
"Last-Translator: \n"
"Language-Team: Norwegian\n"
"Language: no_NO\n"
@@ -20,62 +20,62 @@ msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:9
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:227
msgid "Video"
msgstr "Video"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:17
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:228
msgid "Audio"
msgstr "Lyd"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:25
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:229
msgid "Subtitles"
msgstr "Undertekstning"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:28
msgid "Show Subtitles"
msgstr "Vis undertekster"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:32
msgid "Open…"
msgstr "Åpne…"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:75
msgid "Mute"
msgstr "Demp"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:119
msgid "Reset"
msgstr "Tilbakestill"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-status.c:79
msgid "Unplayable Content"
msgstr "Uavspillelig innhold"
msgstr ""
#. TRANSLATORS: Please do not try to translate "GStreamer" (it is a library name).
#: src/lib/clapper-gtk/clapper-gtk-status.c:89
#, c-format
msgid "Your GStreamer installation is missing a plugin: %s"
msgstr "GStreamer-innstallasjon din mangler et tillegg: %s"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-status.c:90
msgid "Missing Plugin"
msgstr "Manglende tillegg"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:82
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:126
msgid "Undetermined"
msgstr "Ubestemt"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:82
msgid "Channels"
msgstr "Kanaler"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:91
msgid "No media"
msgstr "Ingen medier"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:103
msgid "Unknown title"
msgstr "Ukjent tittel"
msgstr ""

View File

@@ -1,81 +0,0 @@
msgid ""
msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-12 19:52+0200\n"
"PO-Revision-Date: 2024-06-12 15:00\n"
"Last-Translator: \n"
"Language-Team: Occitan\n"
"Language: oc_FR\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: oc\n"
"X-Crowdin-File: /master/src/lib/clapper-gtk/po/clapper-gtk.pot\n"
"X-Crowdin-File-ID: 46\n"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:9
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:227
msgid "Video"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:17
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:228
msgid "Audio"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:25
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:229
msgid "Subtitles"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:28
msgid "Show Subtitles"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:32
msgid "Open…"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:75
msgid "Mute"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:119
msgid "Reset"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-status.c:79
msgid "Unplayable Content"
msgstr ""
#. TRANSLATORS: Please do not try to translate "GStreamer" (it is a library name).
#: src/lib/clapper-gtk/clapper-gtk-status.c:89
#, c-format
msgid "Your GStreamer installation is missing a plugin: %s"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-status.c:90
msgid "Missing Plugin"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:82
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:126
msgid "Undetermined"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:82
msgid "Channels"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:91
msgid "No media"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:103
msgid "Unknown title"
msgstr ""

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-12 19:52+0200\n"
"PO-Revision-Date: 2024-04-26 03:26\n"
"PO-Revision-Date: 2024-04-12 18:48\n"
"Last-Translator: \n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n"
@@ -20,12 +20,12 @@ msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:9
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:227
msgid "Video"
msgstr "Vídeo"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:17
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:228
msgid "Audio"
msgstr "Áudio"
msgstr "Audio"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:25
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:229
@@ -34,33 +34,33 @@ msgstr "Legendas"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:28
msgid "Show Subtitles"
msgstr "Mostrar legendas"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:32
msgid "Open…"
msgstr "Abrir…"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:75
msgid "Mute"
msgstr "Desativar som"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:119
msgid "Reset"
msgstr "Redefinir"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-status.c:79
msgid "Unplayable Content"
msgstr "Conteúdo não reproduzível"
msgstr ""
#. TRANSLATORS: Please do not try to translate "GStreamer" (it is a library name).
#: src/lib/clapper-gtk/clapper-gtk-status.c:89
#, c-format
msgid "Your GStreamer installation is missing a plugin: %s"
msgstr "Há um plugin faltando na sua instalação do GStreamer: %s"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-status.c:90
msgid "Missing Plugin"
msgstr "Plugin faltante"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:82
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:126
@@ -73,9 +73,9 @@ msgstr "Canais"
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:91
msgid "No media"
msgstr "Nenhuma mídia"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:103
msgid "Unknown title"
msgstr "Título desconhecido"
msgstr ""

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-12 19:52+0200\n"
"PO-Revision-Date: 2024-08-03 08:27\n"
"PO-Revision-Date: 2024-04-12 18:47\n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
@@ -20,7 +20,7 @@ msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:9
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:227
msgid "Video"
msgstr "Видео"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:17
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:228
@@ -34,33 +34,33 @@ msgstr "Субтитры"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:28
msgid "Show Subtitles"
msgstr "Показать субтитры"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:32
msgid "Open…"
msgstr "Открыть…"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:75
msgid "Mute"
msgstr "Без звука"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:119
msgid "Reset"
msgstr "Сброс"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-status.c:79
msgid "Unplayable Content"
msgstr "Невоспроизводимый контент"
msgstr ""
#. TRANSLATORS: Please do not try to translate "GStreamer" (it is a library name).
#: src/lib/clapper-gtk/clapper-gtk-status.c:89
#, c-format
msgid "Your GStreamer installation is missing a plugin: %s"
msgstr "В вашей установке GStreamer отсутствует модуль: %s"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-status.c:90
msgid "Missing Plugin"
msgstr "Отсутствующий плагин"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:82
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:126
@@ -73,9 +73,9 @@ msgstr "Каналы"
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:91
msgid "No media"
msgstr "Нет медиафайлов"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:103
msgid "Unknown title"
msgstr "Неизвестное название"
msgstr ""

View File

@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: clapper\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-04-12 19:52+0200\n"
"PO-Revision-Date: 2024-05-20 10:17\n"
"PO-Revision-Date: 2024-04-12 18:48\n"
"Last-Translator: \n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
@@ -20,7 +20,7 @@ msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:9
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:227
msgid "Video"
msgstr "视频"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:17
#: src/lib/clapper-gtk/clapper-gtk-extra-menu-button.c:228
@@ -34,33 +34,33 @@ msgstr "字幕"
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:28
msgid "Show Subtitles"
msgstr "显示字幕"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:32
msgid "Open…"
msgstr "打开…"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:75
msgid "Mute"
msgstr "静音"
msgstr ""
#: src/lib/clapper-gtk/ui/clapper-gtk-extra-menu-button.ui:119
msgid "Reset"
msgstr "重置"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-status.c:79
msgid "Unplayable Content"
msgstr "无法播放的内容"
msgstr ""
#. TRANSLATORS: Please do not try to translate "GStreamer" (it is a library name).
#: src/lib/clapper-gtk/clapper-gtk-status.c:89
#, c-format
msgid "Your GStreamer installation is missing a plugin: %s"
msgstr "您的 GStreamer 安装缺少一个插件: %s"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-status.c:90
msgid "Missing Plugin"
msgstr "缺少插件"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:82
#: src/lib/clapper-gtk/clapper-gtk-stream-check-button.c:126
@@ -73,9 +73,9 @@ msgstr "声道"
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:91
msgid "No media"
msgstr "无媒体"
msgstr ""
#: src/lib/clapper-gtk/clapper-gtk-title-label.c:103
msgid "Unknown title"
msgstr "未知标题"
msgstr ""

View File

@@ -18,7 +18,7 @@
<property name="halign">start</property>
<property name="valign">center</property>
<property name="transition-type">crossfade</property>
<property name="transition-duration">300</property>
<property name="transition-duration">500</property>
<property name="visible">false</property>
<signal name="notify::child-revealed" handler="revealer_revealed_cb"/>
<child>
@@ -86,7 +86,7 @@
<property name="halign">start</property>
<property name="valign">fill</property>
<property name="transition-type">slide-right</property>
<property name="transition-duration">200</property>
<property name="transition-duration" bind-source="progress_revealer" bind-property="transition-duration" bind-flags="sync-create"/>
<property name="reveal-child" bind-source="progress_revealer" bind-property="reveal-child" bind-flags="invert-boolean">false</property>
<child>
<object class="GtkLabel" id="progress_label">
@@ -113,7 +113,7 @@
<property name="halign">center</property>
<property name="valign">center</property>
<property name="transition-type">crossfade</property>
<property name="transition-duration">300</property>
<property name="transition-duration">500</property>
<signal name="notify::child-revealed" handler="revealer_revealed_cb"/>
<child>
<object class="ClapperGtkContainer">

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface domain="clapper-gtk">
<template class="ClapperGtkEngageLayer" parent="ClapperGtkLeadContainer">
<property name="blocked-actions">toggle-play|reveal-overlays</property>
<child>
<object class="ClapperGtkTogglePlayButton">
<property name="halign">center</property>
<property name="valign">center</property>
<style>
<class name="osd"/>
<class name="flat"/>
<class name="circular"/>
</style>
</object>
</child>
</template>
</interface>

View File

@@ -6,9 +6,6 @@
<property name="adaptive-width">560</property>
<property name="adaptive-height">400</property>
<signal name="adapt" handler="adapt_cb"/>
<style>
<class name="osd"/>
</style>
<child>
<object class="GtkBox" id="status_box">
<property name="orientation">vertical</property>

View File

@@ -47,8 +47,6 @@ void clapper_app_bus_post_refresh_timeline (ClapperAppBus *app_bus, GstObject *s
void clapper_app_bus_post_simple_signal (ClapperAppBus *app_bus, GstObject *src, guint signal_id);
void clapper_app_bus_post_object_desc_signal (ClapperAppBus *app_bus, GstObject *src, guint signal_id, GstObject *object, const gchar *desc);
void clapper_app_bus_post_desc_with_details_signal (ClapperAppBus *app_bus, GstObject *src, guint signal_id, const gchar *desc, const gchar *details);
void clapper_app_bus_post_error_signal (ClapperAppBus *app_bus, GstObject *src, guint signal_id, GError *error, const gchar *debug_info);

View File

@@ -43,7 +43,6 @@ enum
CLAPPER_APP_BUS_STRUCTURE_REFRESH_STREAMS,
CLAPPER_APP_BUS_STRUCTURE_REFRESH_TIMELINE,
CLAPPER_APP_BUS_STRUCTURE_SIMPLE_SIGNAL,
CLAPPER_APP_BUS_STRUCTURE_OBJECT_DESC_SIGNAL,
CLAPPER_APP_BUS_STRUCTURE_DESC_WITH_DETAILS_SIGNAL,
CLAPPER_APP_BUS_STRUCTURE_ERROR_SIGNAL
};
@@ -54,7 +53,6 @@ static ClapperBusQuark _structure_quarks[] = {
{"refresh-streams", 0},
{"refresh-timeline", 0},
{"simple-signal", 0},
{"object-desc-signal", 0},
{"desc-with-details-signal", 0},
{"error-signal", 0},
{NULL, 0}
@@ -65,7 +63,6 @@ enum
CLAPPER_APP_BUS_FIELD_UNKNOWN = 0,
CLAPPER_APP_BUS_FIELD_PSPEC,
CLAPPER_APP_BUS_FIELD_SIGNAL_ID,
CLAPPER_APP_BUS_FIELD_OBJECT,
CLAPPER_APP_BUS_FIELD_DESC,
CLAPPER_APP_BUS_FIELD_DETAILS,
CLAPPER_APP_BUS_FIELD_ERROR,
@@ -76,7 +73,6 @@ static ClapperBusQuark _field_quarks[] = {
{"unknown", 0},
{"pspec", 0},
{"signal-id", 0},
{"object", 0},
{"desc", 0},
{"details", 0},
{"error", 0},
@@ -181,37 +177,6 @@ _handle_simple_signal_msg (GstMessage *msg, const GstStructure *structure)
g_signal_emit (_MESSAGE_SRC_GOBJECT (msg), signal_id, 0);
}
void
clapper_app_bus_post_object_desc_signal (ClapperAppBus *self,
GstObject *src, guint signal_id,
GstObject *object, const gchar *desc)
{
GstStructure *structure = gst_structure_new_id (_STRUCTURE_QUARK (OBJECT_DESC_SIGNAL),
_FIELD_QUARK (SIGNAL_ID), G_TYPE_UINT, signal_id,
_FIELD_QUARK (OBJECT), GST_TYPE_OBJECT, object,
_FIELD_QUARK (DESC), G_TYPE_STRING, desc,
NULL);
gst_bus_post (GST_BUS_CAST (self), gst_message_new_application (src, structure));
}
static inline void
_handle_object_desc_signal_msg (GstMessage *msg, const GstStructure *structure)
{
guint signal_id = 0;
GstObject *object = NULL;
gchar *desc = NULL;
gst_structure_id_get (structure,
_FIELD_QUARK (SIGNAL_ID), G_TYPE_UINT, &signal_id,
_FIELD_QUARK (OBJECT), GST_TYPE_OBJECT, &object,
_FIELD_QUARK (DESC), G_TYPE_STRING, &desc,
NULL);
g_signal_emit (_MESSAGE_SRC_GOBJECT (msg), signal_id, 0, object, desc);
gst_object_unref (object);
g_free (desc);
}
void
clapper_app_bus_post_desc_with_details_signal (ClapperAppBus *self,
GstObject *src, guint signal_id,
@@ -288,8 +253,6 @@ clapper_app_bus_message_func (GstBus *bus, GstMessage *msg, gpointer user_data G
_handle_refresh_timeline_msg (msg, structure);
else if (quark == _STRUCTURE_QUARK (SIMPLE_SIGNAL))
_handle_simple_signal_msg (msg, structure);
else if (quark == _STRUCTURE_QUARK (OBJECT_DESC_SIGNAL))
_handle_object_desc_signal_msg (msg, structure);
else if (quark == _STRUCTURE_QUARK (ERROR_SIGNAL))
_handle_error_signal_msg (msg, structure);
else if (quark == _STRUCTURE_QUARK (DESC_WITH_DETAILS_SIGNAL))

View File

@@ -25,8 +25,6 @@
#include <glib.h>
#include <glib-object.h>
#include <clapper/clapper-visibility.h>
#include <clapper/clapper-stream.h>
G_BEGIN_DECLS
@@ -34,28 +32,20 @@ G_BEGIN_DECLS
#define CLAPPER_TYPE_AUDIO_STREAM (clapper_audio_stream_get_type())
#define CLAPPER_AUDIO_STREAM_CAST(obj) ((ClapperAudioStream *)(obj))
CLAPPER_API
G_DECLARE_FINAL_TYPE (ClapperAudioStream, clapper_audio_stream, CLAPPER, AUDIO_STREAM, ClapperStream)
CLAPPER_API
gchar * clapper_audio_stream_get_codec (ClapperAudioStream *stream);
CLAPPER_API
guint clapper_audio_stream_get_bitrate (ClapperAudioStream *stream);
CLAPPER_API
gchar * clapper_audio_stream_get_sample_format (ClapperAudioStream *stream);
CLAPPER_API
gint clapper_audio_stream_get_sample_rate (ClapperAudioStream *stream);
CLAPPER_API
gint clapper_audio_stream_get_channels (ClapperAudioStream *stream);
CLAPPER_API
gchar * clapper_audio_stream_get_lang_code (ClapperAudioStream *stream);
CLAPPER_API
gchar * clapper_audio_stream_get_lang_name (ClapperAudioStream *stream);
G_END_DECLS

View File

@@ -1,388 +0,0 @@
/* Clapper Playback Library
* Copyright (C) 2024 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 Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser 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 "config.h"
#include <gst/gst.h>
#include <libpeas.h>
#include "clapper-enhancers-loader-private.h"
#define ENHANCER_INTERFACES "X-Interfaces"
#define ENHANCER_SCHEMES "X-Schemes"
#define ENHANCER_HOSTS "X-Hosts"
#define ENHANCER_IFACE_NAME_FROM_TYPE(type) (g_type_name (type) + 7) // strip "Clapper" prefix
#define GST_CAT_DEFAULT clapper_enhancers_loader_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
static PeasEngine *_engine = NULL;
static GMutex load_lock;
/*
* clapper_enhancers_loader_initialize:
*
* Initializes #PeasEngine with directories that store enhancers.
*/
void
clapper_enhancers_loader_initialize (void)
{
const gchar *enhancers_path;
gchar **dir_paths;
guint i;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperenhancersloader", 0,
"Clapper Enhancer Loader");
enhancers_path = g_getenv ("CLAPPER_ENHANCERS_PATH");
if (!enhancers_path || *enhancers_path == '\0')
enhancers_path = CLAPPER_ENHANCERS_PATH;
GST_INFO ("Initializing Clapper enhancers with path: \"%s\"", enhancers_path);
_engine = peas_engine_new ();
/* Peas loaders are loaded lazily, so it should be fine
* to just enable them all here (even if not installed) */
peas_engine_enable_loader (_engine, "python");
peas_engine_enable_loader (_engine, "gjs");
dir_paths = g_strsplit (enhancers_path, G_SEARCHPATH_SEPARATOR_S, 0);
for (i = 0; dir_paths[i]; ++i)
peas_engine_add_search_path (_engine, dir_paths[i], NULL);
g_strfreev (dir_paths);
if (gst_debug_category_get_threshold (GST_CAT_DEFAULT) >= GST_LEVEL_INFO) {
GListModel *list = (GListModel *) _engine;
guint n_items = g_list_model_get_n_items (list);
for (i = 0; i < n_items; ++i) {
PeasPluginInfo *info = (PeasPluginInfo *) g_list_model_get_item (list, i);
GST_INFO ("Found enhancer: %s (%s)", peas_plugin_info_get_name (info),
peas_plugin_info_get_external_data (info, ENHANCER_INTERFACES));
g_object_unref (info);
}
GST_INFO ("Clapper enhancers initialized, found: %u", n_items);
}
}
static inline gboolean
_is_name_listed (const gchar *name, const gchar *list_str)
{
gsize name_len = strlen (name);
guint i = 0;
while (list_str[i] != '\0') {
guint end = i;
while (list_str[end] != ';' && list_str[end] != '\0')
++end;
/* Compare letters count until separator and prefix of whole string */
if (end - i == name_len && g_str_has_prefix (list_str + i, name))
return TRUE;
i = end;
/* Move to the next letter after ';' */
if (list_str[i] != '\0')
++i;
}
return FALSE;
}
/*
* clapper_enhancers_loader_get_info:
* @iface_type: an interface #GType
* @scheme: an URI scheme
* @host: (nullable): an URI host
*
* Returns: (transfer full) (nullable): available #PeasPluginInfo or %NULL.
*/
static PeasPluginInfo *
clapper_enhancers_loader_get_info (GType iface_type, const gchar *scheme, const gchar *host)
{
GListModel *list = (GListModel *) _engine;
PeasPluginInfo *found_info = NULL;
guint i, n_plugins = g_list_model_get_n_items (list);
const gchar *iface_name;
gboolean is_https;
if (n_plugins == 0) {
GST_INFO ("No Clapper enhancers found");
return NULL;
}
iface_name = ENHANCER_IFACE_NAME_FROM_TYPE (iface_type);
/* Strip common subdomains, so plugins do not
* have to list all combinations */
if (host) {
if (g_str_has_prefix (host, "www."))
host += 4;
else if (g_str_has_prefix (host, "m."))
host += 2;
}
GST_INFO ("Enhancer check, iface: %s, scheme: %s, host: %s",
iface_name, scheme, GST_STR_NULL (host));
is_https = (g_str_has_prefix (scheme, "http")
&& (scheme[4] == '\0' || (scheme[4] == 's' && scheme[5] == '\0')));
if (!host && is_https)
return NULL;
for (i = 0; i < n_plugins; ++i) {
PeasPluginInfo *info = (PeasPluginInfo *) g_list_model_get_item (list, i);
const gchar *iface_names, *schemes, *hosts;
if (!(iface_names = peas_plugin_info_get_external_data (info, ENHANCER_INTERFACES))) {
GST_DEBUG ("Skipping enhancer without interfaces: %s", peas_plugin_info_get_name (info));
g_object_unref (info);
continue;
}
if (!_is_name_listed (iface_name, iface_names)) {
g_object_unref (info);
continue;
}
if (!(schemes = peas_plugin_info_get_external_data (info, ENHANCER_SCHEMES))) {
GST_DEBUG ("Skipping enhancer without schemes: %s", peas_plugin_info_get_name (info));
g_object_unref (info);
continue;
}
if (!_is_name_listed (scheme, schemes)) {
g_object_unref (info);
continue;
}
if (is_https) {
if (!(hosts = peas_plugin_info_get_external_data (info, ENHANCER_HOSTS))) {
GST_DEBUG ("Skipping enhancer without hosts: %s", peas_plugin_info_get_name (info));
g_object_unref (info);
continue;
}
if (!_is_name_listed (host, hosts)) {
g_object_unref (info);
continue;
}
}
found_info = info;
break;
}
return found_info;
}
/*
* clapper_enhancers_loader_has_enhancers:
* @iface_type: an interface #GType
*
* Check if any enhancer implementing given interface type is available.
*
* Returns: whether any valid enhancer was found.
*/
gboolean
clapper_enhancers_loader_has_enhancers (GType iface_type)
{
GListModel *list = (GListModel *) _engine;
const gchar *iface_name = ENHANCER_IFACE_NAME_FROM_TYPE (iface_type);
guint i, n_plugins;
GST_DEBUG ("Checking for any enhancers of type: \"%s\"", iface_name);
n_plugins = g_list_model_get_n_items (list);
for (i = 0; i < n_plugins; ++i) {
PeasPluginInfo *info = (PeasPluginInfo *) g_list_model_get_item (list, i);
const gchar *iface_names;
if (!(iface_names = peas_plugin_info_get_external_data (info, ENHANCER_INTERFACES))) {
g_object_unref (info);
continue;
}
if (!_is_name_listed (iface_name, iface_names)) {
g_object_unref (info);
continue;
}
/* Additional validation */
if (!peas_plugin_info_get_external_data (info, ENHANCER_SCHEMES)
|| !peas_plugin_info_get_external_data (info, ENHANCER_HOSTS)) {
g_object_unref (info);
continue;
}
GST_DEBUG ("Found valid enhancers of type: \"%s\"", iface_name);
g_object_unref (info);
return TRUE;
}
GST_DEBUG ("No available enhancers of type: \"%s\"", iface_name);
return FALSE;
}
/*
* clapper_enhancers_loader_get_schemes:
* @iface_type: an interface #GType
*
* Get all supported schemes for a given interface type.
* The returned array consists of unique strings (no duplicates).
*
* Returns: (transfer full): all supported schemes by enhancers of type.
*/
gchar **
clapper_enhancers_loader_get_schemes (GType iface_type)
{
GListModel *list = (GListModel *) _engine;
GSList *found_schemes = NULL, *fs;
const gchar *iface_name = ENHANCER_IFACE_NAME_FROM_TYPE (iface_type);
gchar **schemes_strv;
guint i, n_plugins, n_schemes;
GST_DEBUG ("Checking supported URI schemes for \"%s\"", iface_name);
n_plugins = g_list_model_get_n_items (list);
for (i = 0; i < n_plugins; ++i) {
PeasPluginInfo *info = (PeasPluginInfo *) g_list_model_get_item (list, i);
const gchar *iface_names, *schemes;
gchar **tmp_strv;
gint j;
if (!(iface_names = peas_plugin_info_get_external_data (info, ENHANCER_INTERFACES))) {
g_object_unref (info);
continue;
}
if (!_is_name_listed (iface_name, iface_names)) {
g_object_unref (info);
continue;
}
if (!(schemes = peas_plugin_info_get_external_data (info, ENHANCER_SCHEMES))) {
g_object_unref (info);
continue;
}
tmp_strv = g_strsplit (schemes, ";", 0);
for (j = 0; tmp_strv[j]; ++j) {
const gchar *scheme = tmp_strv[j];
if (!found_schemes || !g_slist_find_custom (found_schemes,
scheme, (GCompareFunc) strcmp)) {
found_schemes = g_slist_append (found_schemes, g_strdup (scheme));
GST_INFO ("Found supported URI scheme: %s", scheme);
}
}
g_strfreev (tmp_strv);
g_object_unref (info);
}
n_schemes = g_slist_length (found_schemes);
schemes_strv = g_new0 (gchar *, n_schemes + 1);
fs = found_schemes;
for (i = 0; i < n_schemes; ++i) {
schemes_strv[i] = fs->data;
fs = fs->next;
}
GST_DEBUG ("Total found URI schemes: %u", n_schemes);
/* Since string pointers were taken,
* free list without content */
g_slist_free (found_schemes);
return schemes_strv;
}
/*
* clapper_enhancers_loader_check:
* @iface_type: a requested #GType
* @scheme: an URI scheme
* @host: (nullable): an URI host
* @name: (out) (optional) (transfer none): return location for found enhancer name
*
* Checks if any enhancer can handle @uri without initializing loader
* or creating enhancer instance, thus this can be used freely from any thread.
*
* Returns: whether enhancer for given scheme and host is available.
*/
gboolean
clapper_enhancers_loader_check (GType iface_type,
const gchar *scheme, const gchar *host, const gchar **name)
{
PeasPluginInfo *info;
if ((info = clapper_enhancers_loader_get_info (iface_type, scheme, host))) {
if (name)
*name = peas_plugin_info_get_name (info);
g_object_unref (info);
return TRUE;
}
return FALSE;
}
/*
* clapper_enhancers_loader_create_enhancer_for_uri:
* @iface_type: a requested #GType
* @uri: a #GUri
*
* Creates a new enhancer object for given URI.
*
* Enhancer should only be created and used within single thread.
*
* Returns: (transfer full) (nullable): a new enhancer instance.
*/
GObject *
clapper_enhancers_loader_create_enhancer_for_uri (GType iface_type, GUri *uri)
{
GObject *enhancer = NULL;
PeasPluginInfo *info;
const gchar *scheme = g_uri_get_scheme (uri);
const gchar *host = g_uri_get_host (uri);
if ((info = clapper_enhancers_loader_get_info (iface_type, scheme, host))) {
g_mutex_lock (&load_lock);
if (!peas_plugin_info_is_loaded (info) && !peas_engine_load_plugin (_engine, info)) {
GST_ERROR ("Could not load enhancer: %s", peas_plugin_info_get_name (info));
} else if (!peas_engine_provides_extension (_engine, info, iface_type)) {
GST_ERROR ("No \"%s\" enhancer in plugin: %s", ENHANCER_IFACE_NAME_FROM_TYPE (iface_type),
peas_plugin_info_get_name (info));
} else {
enhancer = peas_engine_create_extension (_engine, info, iface_type, NULL);
}
g_mutex_unlock (&load_lock);
g_object_unref (info);
}
return enhancer;
}

View File

@@ -1,33 +0,0 @@
/* Clapper Playback Library
* Copyright (C) 2024 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 Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser 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 <gio/gio.h>
#include "clapper-extractable.h"
#include "clapper-harvest.h"
G_BEGIN_DECLS
G_GNUC_INTERNAL
gboolean clapper_extractable_extract (ClapperExtractable *extractable, GUri *uri, ClapperHarvest *harvest, GCancellable *cancellable, GError **error);
G_END_DECLS

View File

@@ -1,61 +0,0 @@
/* Clapper Playback Library
* Copyright (C) 2024 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 Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser 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.
*/
/**
* ClapperExtractable:
*
* An interface for creating enhancers that resolve given URI into something playable.
*
* Since: 0.8
*/
#include <gst/gst.h>
#include "clapper-extractable-private.h"
#include "clapper-harvest-private.h"
G_DEFINE_INTERFACE (ClapperExtractable, clapper_extractable, G_TYPE_OBJECT);
static gboolean
clapper_extractable_default_extract (ClapperExtractable *self, GUri *uri,
ClapperHarvest *harvest, GCancellable *cancellable, GError **error)
{
if (*error == NULL) {
g_set_error (error, GST_CORE_ERROR,
GST_CORE_ERROR_NOT_IMPLEMENTED,
"Extractable object did not implement extract function");
}
return FALSE;
}
static void
clapper_extractable_default_init (ClapperExtractableInterface *iface)
{
iface->extract = clapper_extractable_default_extract;
}
gboolean
clapper_extractable_extract (ClapperExtractable *self, GUri *uri,
ClapperHarvest *harvest, GCancellable *cancellable, GError **error)
{
ClapperExtractableInterface *iface = CLAPPER_EXTRACTABLE_GET_IFACE (self);
return iface->extract (self, uri, harvest, cancellable, error);
}

View File

@@ -1,69 +0,0 @@
/* Clapper Playback Library
* Copyright (C) 2024 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 Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser 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
#if !defined(__CLAPPER_INSIDE__) && !defined(CLAPPER_COMPILATION)
#error "Only <clapper/clapper.h> can be included directly."
#endif
#include <glib.h>
#include <glib-object.h>
#include <gio/gio.h>
#include <clapper/clapper-visibility.h>
#include <clapper/clapper-harvest.h>
G_BEGIN_DECLS
#define CLAPPER_TYPE_EXTRACTABLE (clapper_extractable_get_type())
#define CLAPPER_EXTRACTABLE_CAST(obj) ((ClapperExtractable *)(obj))
CLAPPER_API
G_DECLARE_INTERFACE (ClapperExtractable, clapper_extractable, CLAPPER, EXTRACTABLE, GObject)
/**
* ClapperExtractableInterface:
* @parent_iface: The parent interface structure.
* @extract: Extract data and fill harvest.
*/
struct _ClapperExtractableInterface
{
GTypeInterface parent_iface;
/**
* ClapperExtractableInterface::extract:
* @extractable: a #ClapperExtractable
* @uri: a #GUri
* @cancellable: a #GCancellable object
* @error: a #GError
*
* Extract data and fill harvest.
*
* Returns: whether extraction was successful.
*
* Since: 0.8
*/
gboolean (* extract) (ClapperExtractable *extractable, GUri *uri, ClapperHarvest *harvest, GCancellable *cancellable, GError **error);
/*< private >*/
gpointer padding[8];
};
G_END_DECLS

View File

@@ -27,8 +27,6 @@
#include <glib-object.h>
#include <gio/gio.h>
#include <gst/gst.h>
#include <clapper/clapper-visibility.h>
#include <clapper/clapper-media-item.h>
#include <clapper/clapper-enums.h>
@@ -37,7 +35,6 @@ G_BEGIN_DECLS
#define CLAPPER_TYPE_FEATURE (clapper_feature_get_type())
#define CLAPPER_FEATURE_CAST(obj) ((ClapperFeature *)(obj))
CLAPPER_API
G_DECLARE_DERIVABLE_TYPE (ClapperFeature, clapper_feature, CLAPPER, FEATURE, GstObject)
/**

View File

@@ -1,36 +0,0 @@
/*
* Copyright (C) 2024 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 Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser 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
#if !defined(__CLAPPER_INSIDE__) && !defined(CLAPPER_COMPILATION)
#error "Only <clapper/clapper.h> can be included directly."
#endif
/**
* CLAPPER_WITH_ENHANCERS_LOADER:
*
* Check if Clapper was compiled with Enhancers Loader functionality.
*
* Alternatively, apps before compiling can also check whether `pkgconfig`
* variable named `functionalities` contains `enhancers-loader` string.
*
* Since: 0.8
*/
#define CLAPPER_WITH_ENHANCERS_LOADER (@CLAPPER_WITH_ENHANCERS_LOADER@)

View File

@@ -1,35 +0,0 @@
/* Clapper Playback Library
* Copyright (C) 2024 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 Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser 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 <gst/tag/tag.h>
#include "clapper-harvest.h"
G_BEGIN_DECLS
G_GNUC_INTERNAL
ClapperHarvest * clapper_harvest_new (void);
G_GNUC_INTERNAL
gboolean clapper_harvest_unpack (ClapperHarvest *harvest, GstBuffer **buffer, gsize *buf_size, GstCaps **caps, GstTagList **tags, GstToc **toc, GstStructure **headers);
G_END_DECLS

View File

@@ -1,450 +0,0 @@
/* Clapper Playback Library
* Copyright (C) 2024 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 Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser 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.
*/
/**
* ClapperHarvest:
*
* An object storing data from enhancers that implement [iface@Clapper.Extractable] interface.
*
* Since: 0.8
*/
/*
* NOTE: We cannot simply expose GstMiniObjects for
* implementations to assemble TagList/Toc themselves, see:
* https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/2867
*/
#include "clapper-harvest-private.h"
#define GST_CAT_DEFAULT clapper_harvest_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
struct _ClapperHarvest
{
GstObject parent;
GstCaps *caps;
GstBuffer *buffer;
gsize buf_size;
GstTagList *tags;
GstToc *toc;
GstStructure *headers;
guint16 n_chapters;
guint16 n_tracks;
};
#define parent_class clapper_harvest_parent_class
G_DEFINE_TYPE (ClapperHarvest, clapper_harvest, GST_TYPE_OBJECT);
static inline void
_ensure_tags (ClapperHarvest *self)
{
if (!self->tags) {
self->tags = gst_tag_list_new_empty ();
gst_tag_list_set_scope (self->tags, GST_TAG_SCOPE_GLOBAL);
}
}
static inline void
_ensure_toc (ClapperHarvest *self)
{
if (!self->toc)
self->toc = gst_toc_new (GST_TOC_SCOPE_GLOBAL);
}
static inline void
_ensure_headers (ClapperHarvest *self)
{
if (!self->headers)
self->headers = gst_structure_new_empty ("request-headers");
}
ClapperHarvest *
clapper_harvest_new (void)
{
ClapperHarvest *harvest;
harvest = g_object_new (CLAPPER_TYPE_HARVEST, NULL);
gst_object_ref_sink (harvest);
return harvest;
}
gboolean
clapper_harvest_unpack (ClapperHarvest *self,
GstBuffer **buffer, gsize *buf_size, GstCaps **caps,
GstTagList **tags, GstToc **toc, GstStructure **headers)
{
/* Not filled or already unpacked */
if (!self->buffer)
return FALSE;
*buffer = self->buffer;
self->buffer = NULL;
*buf_size = self->buf_size;
self->buf_size = 0;
*caps = self->caps;
self->caps = NULL;
*tags = self->tags;
self->tags = NULL;
*toc = self->toc;
self->toc = NULL;
*headers = self->headers;
self->headers = NULL;
return TRUE;
}
/**
* clapper_harvest_fill:
* @harvest: a #ClapperHarvest
* @media_type: media mime type
* @data: (array length=size) (element-type guint8) (transfer full): data to fill @harvest
* @size: allocated size of @data
*
* Fill harvest with extracted data. It can be anything that GStreamer
* can parse and play such as single URI or a streaming manifest.
*
* Calling again this function will replace previously filled content.
*
* Commonly used media types are:
*
* * `application/dash+xml`
*
* * `application/x-hls`
*
* * `text/uri-list`
*
* Returns: %TRUE when filled successfully, %FALSE if taken data was empty.
*
* Since: 0.8
*/
gboolean
clapper_harvest_fill (ClapperHarvest *self, const gchar *media_type, gpointer data, gsize size)
{
g_return_val_if_fail (CLAPPER_IS_HARVEST (self), FALSE);
g_return_val_if_fail (media_type != NULL, FALSE);
g_return_val_if_fail (data != NULL, FALSE);
if (!data || size == 0) {
g_free (data);
return FALSE;
}
if (gst_debug_category_get_threshold (GST_CAT_DEFAULT) >= GST_LEVEL_DEBUG) {
gboolean is_printable = (strcmp (media_type, "application/dash+xml") == 0)
|| (strcmp (media_type, "application/x-hls") == 0)
|| (strcmp (media_type, "text/uri-list") == 0);
if (is_printable) {
gchar *data_str;
data_str = g_new0 (gchar, size + 1);
memcpy (data_str, data, size);
GST_DEBUG_OBJECT (self, "Filled with data:\n%s", data_str);
g_free (data_str);
}
}
gst_clear_buffer (&self->buffer);
gst_clear_caps (&self->caps);
self->buffer = gst_buffer_new_wrapped (data, size);
self->buf_size = size;
self->caps = gst_caps_new_simple (media_type,
"source", G_TYPE_STRING, "clapper-harvest", NULL);
return TRUE;
}
/**
* clapper_harvest_fill_with_text:
* @harvest: a #ClapperHarvest
* @media_type: media mime type
* @text: (transfer full): data to fill @harvest as %NULL terminated string
*
* A convenience method to fill @harvest using a %NULL terminated string.
*
* For more info, see [method@Clapper.Harvest.fill] documentation.
*
* Returns: %TRUE when filled successfully, %FALSE if taken data was empty.
*
* Since: 0.8
*/
gboolean
clapper_harvest_fill_with_text (ClapperHarvest *self, const gchar *media_type, gchar *text)
{
g_return_val_if_fail (text != NULL, FALSE);
return clapper_harvest_fill (self, media_type, text, strlen (text));
}
/**
* clapper_harvest_fill_with_bytes:
* @harvest: a #ClapperHarvest
* @media_type: media mime type
* @bytes: (transfer full): a #GBytes to fill @harvest
*
* A convenience method to fill @harvest with data from #GBytes.
*
* For more info, see [method@Clapper.Harvest.fill] documentation.
*
* Returns: %TRUE when filled successfully, %FALSE if taken data was empty.
*
* Since: 0.8
*/
gboolean
clapper_harvest_fill_with_bytes (ClapperHarvest *self, const gchar *media_type, GBytes *bytes)
{
gpointer data;
gsize size = 0;
g_return_val_if_fail (bytes != NULL, FALSE);
data = g_bytes_unref_to_data (bytes, &size);
return clapper_harvest_fill (self, media_type, data, size);
}
/**
* clapper_harvest_tags_add:
* @harvest: a #ClapperHarvest
* @tag: a name of tag to set
* @...: %NULL-terminated list of arguments
*
* Append one or more tags into the tag list.
*
* Variable arguments should be in the form of tag and value pairs.
*
* Since: 0.8
*/
void
clapper_harvest_tags_add (ClapperHarvest *self, const gchar *tag, ...)
{
va_list args;
g_return_if_fail (CLAPPER_IS_HARVEST (self));
g_return_if_fail (tag != NULL);
_ensure_tags (self);
va_start (args, tag);
gst_tag_list_add_valist (self->tags, GST_TAG_MERGE_APPEND, tag, args);
va_end (args);
}
/**
* clapper_harvest_tags_add_value: (rename-to clapper_harvest_tags_add)
* @harvest: a #ClapperHarvest
* @tag: a name of tag to set
* @value: a #GValue of tag
*
* Append another tag into the tag list using #GValue.
*
* Since: 0.8
*/
void
clapper_harvest_tags_add_value (ClapperHarvest *self, const gchar *tag, const GValue *value)
{
g_return_if_fail (CLAPPER_IS_HARVEST (self));
g_return_if_fail (tag != NULL);
g_return_if_fail (G_IS_VALUE (value));
_ensure_tags (self);
gst_tag_list_add_value (self->tags, GST_TAG_MERGE_APPEND, tag, value);
}
/**
* clapper_harvest_toc_add:
* @harvest: a #ClapperHarvest
* @type: a #GstTocEntryType
* @title: an entry title
* @start: entry start time in seconds
* @end: entry end time in seconds or -1 if none
*
* Append a chapter or track name into table of contents.
*
* Since: 0.8
*/
void
clapper_harvest_toc_add (ClapperHarvest *self, GstTocEntryType type,
const gchar *title, gdouble start, gdouble end)
{
GstTocEntry *entry, *subentry;
GstClockTime start_time, end_time;
gchar edition[3]; // 2 + 1
gchar id[14]; // 7 + 1 + 5 + 1
const gchar *id_prefix;
guint16 nth_entry;
g_return_if_fail (CLAPPER_IS_HARVEST (self));
g_return_if_fail (type == GST_TOC_ENTRY_TYPE_CHAPTER || type == GST_TOC_ENTRY_TYPE_TRACK);
g_return_if_fail (title != NULL);
g_return_if_fail (start >= 0 && end >= start);
switch (type) {
case GST_TOC_ENTRY_TYPE_CHAPTER:
id_prefix = "chapter";
nth_entry = ++(self->n_chapters);
break;
case GST_TOC_ENTRY_TYPE_TRACK:
id_prefix = "track";
nth_entry = ++(self->n_tracks);
break;
default:
g_assert_not_reached ();
return;
}
start_time = start * GST_SECOND;
end_time = (end >= 0) ? end * GST_SECOND : GST_CLOCK_TIME_NONE;
g_snprintf (edition, sizeof (edition), "0%i", type);
g_snprintf (id, sizeof (id), "%s.%" G_GUINT16_FORMAT, id_prefix, nth_entry);
GST_DEBUG_OBJECT (self, "Inserting TOC %s: \"%s\""
" (%" G_GUINT64_FORMAT "-%" G_GUINT64_FORMAT ")",
id, title, start_time, end_time);
subentry = gst_toc_entry_new (type, id);
gst_toc_entry_set_tags (subentry, gst_tag_list_new (GST_TAG_TITLE, title, NULL));
gst_toc_entry_set_start_stop_times (subentry, start_time, end_time);
_ensure_toc (self);
find_entry:
if (!(entry = gst_toc_find_entry (self->toc, edition))) {
GstTocEntry *toc_entry;
toc_entry = gst_toc_entry_new (GST_TOC_ENTRY_TYPE_EDITION, edition);
gst_toc_entry_set_start_stop_times (toc_entry, 0, GST_CLOCK_TIME_NONE);
gst_toc_append_entry (self->toc, toc_entry); // transfer full and must be writable
goto find_entry;
}
gst_toc_entry_append_sub_entry (entry, subentry);
}
/**
* clapper_harvest_headers_set:
* @harvest: a #ClapperHarvest
* @key: a header name
* @...: %NULL-terminated list of arguments
*
* Set one or more request headers named with @key to specified `value`.
*
* Arguments should be %NULL terminated list of `key+value` string pairs.
*
* Setting again the same key will update its value to the new one.
*
* Since: 0.8
*/
void
clapper_harvest_headers_set (ClapperHarvest *self, const gchar *key, ...)
{
va_list args;
g_return_if_fail (CLAPPER_IS_HARVEST (self));
g_return_if_fail (key != NULL);
_ensure_headers (self);
va_start (args, key);
while (key != NULL) {
const gchar *val = va_arg (args, const gchar *);
GST_DEBUG_OBJECT (self, "Set header, \"%s\": \"%s\"", key, val);
gst_structure_set (self->headers, key, G_TYPE_STRING, val, NULL);
key = va_arg (args, const gchar *);
}
va_end (args);
}
/**
* clapper_harvest_headers_set_value: (rename-to clapper_harvest_headers_set)
* @harvest: a #ClapperHarvest
* @key: a header name
* @value: a string #GValue of header
*
* Set another header in the request headers list using #GValue.
*
* Setting again the same key will update its value to the new one.
*
* Since: 0.8
*/
void
clapper_harvest_headers_set_value (ClapperHarvest *self, const gchar *key, const GValue *value)
{
g_return_if_fail (CLAPPER_IS_HARVEST (self));
g_return_if_fail (key != NULL);
g_return_if_fail (G_IS_VALUE (value) && G_VALUE_HOLDS_STRING (value));
_ensure_headers (self);
GST_DEBUG_OBJECT (self, "Set header, \"%s\": \"%s\"", key, g_value_get_string (value));
gst_structure_set_value (self->headers, key, value);
}
static void
clapper_harvest_init (ClapperHarvest *self)
{
}
static void
clapper_harvest_finalize (GObject *object)
{
ClapperHarvest *self = CLAPPER_HARVEST_CAST (object);
GST_TRACE_OBJECT (self, "Finalize");
gst_clear_caps (&self->caps);
gst_clear_buffer (&self->buffer);
if (self->tags)
gst_tag_list_unref (self->tags);
if (self->toc)
gst_toc_unref (self->toc);
if (self->headers)
gst_structure_free (self->headers);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static void
clapper_harvest_class_init (ClapperHarvestClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "clapperharvest", 0,
"Clapper Harvest");
gobject_class->finalize = clapper_harvest_finalize;
}

View File

@@ -1,64 +0,0 @@
/* Clapper Playback Library
* Copyright (C) 2024 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 Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser 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
#if !defined(__CLAPPER_INSIDE__) && !defined(CLAPPER_COMPILATION)
#error "Only <clapper/clapper.h> can be included directly."
#endif
#include <glib.h>
#include <glib-object.h>
#include <gst/gst.h>
#include <gst/tag/tag.h>
#include <clapper/clapper-visibility.h>
G_BEGIN_DECLS
#define CLAPPER_TYPE_HARVEST (clapper_harvest_get_type())
#define CLAPPER_HARVEST_CAST(obj) ((ClapperHarvest *)(obj))
G_DECLARE_FINAL_TYPE (ClapperHarvest, clapper_harvest, CLAPPER, HARVEST, GstObject)
CLAPPER_API
gboolean clapper_harvest_fill (ClapperHarvest *harvest, const gchar *media_type, gpointer data, gsize size);
CLAPPER_API
gboolean clapper_harvest_fill_with_text (ClapperHarvest *harvest, const gchar *media_type, gchar *text);
CLAPPER_API
gboolean clapper_harvest_fill_with_bytes (ClapperHarvest *harvest, const gchar *media_type, GBytes *bytes);
CLAPPER_API
void clapper_harvest_tags_add (ClapperHarvest *harvest, const gchar *tag, ...) G_GNUC_NULL_TERMINATED;
CLAPPER_API
void clapper_harvest_tags_add_value (ClapperHarvest *harvest, const gchar *tag, const GValue *value);
CLAPPER_API
void clapper_harvest_toc_add (ClapperHarvest *harvest, GstTocEntryType type, const gchar *title, gdouble start, gdouble end);
CLAPPER_API
void clapper_harvest_headers_set (ClapperHarvest *harvest, const gchar *key, ...) G_GNUC_NULL_TERMINATED;
CLAPPER_API
void clapper_harvest_headers_set_value (ClapperHarvest *harvest, const gchar *key, const GValue *value);
G_END_DECLS

View File

@@ -26,8 +26,6 @@
#include <glib.h>
#include <glib-object.h>
#include <gst/gst.h>
#include <clapper/clapper-visibility.h>
#include <clapper/clapper-enums.h>
G_BEGIN_DECLS
@@ -38,7 +36,6 @@ G_BEGIN_DECLS
/* NOTE: #ClapperMarker are immutable objects that cannot be derived,
* otherwise #ClapperFeaturesManager would not be able to announce media
* item changed caused by changes within them */
CLAPPER_API
G_DECLARE_FINAL_TYPE (ClapperMarker, clapper_marker, CLAPPER, MARKER, GstObject)
/**
@@ -48,19 +45,14 @@ G_DECLARE_FINAL_TYPE (ClapperMarker, clapper_marker, CLAPPER, MARKER, GstObject)
*/
#define CLAPPER_MARKER_NO_END ((gdouble) -1) // Needs a cast from int, otherwise GIR is generated incorrectly
CLAPPER_API
ClapperMarker * clapper_marker_new (ClapperMarkerType marker_type, const gchar *title, gdouble start, gdouble end);
CLAPPER_API
ClapperMarkerType clapper_marker_get_marker_type (ClapperMarker *marker);
CLAPPER_API
const gchar * clapper_marker_get_title (ClapperMarker *marker);
CLAPPER_API
gdouble clapper_marker_get_start (ClapperMarker *marker);
CLAPPER_API
gdouble clapper_marker_get_end (ClapperMarker *marker);
G_END_DECLS

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