From 424314329e1fa976339262c3999a69e3a25cf2c3 Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Thu, 15 Aug 2024 13:51:45 +0200 Subject: [PATCH] Satisfy ruff check --- main.py | 1 + melon/__init__.py | 6 + melon/application.py | 10 +- melon/browse/__init__.py | 10 +- melon/browse/channel.py | 14 +- melon/browse/playlist.py | 12 +- melon/browse/search.py | 12 +- melon/browse/server.py | 13 +- melon/home/__init__.py | 5 - melon/home/history.py | 12 +- melon/home/new.py | 17 +- melon/home/playlists.py | 8 +- melon/home/subs.py | 8 +- melon/import_providers/newpipe.py | 8 +- melon/import_providers/utils.py | 7 +- melon/importer.py | 10 +- melon/models/__init__.py | 10 +- melon/models/callbacks.py | 6 +- melon/player/__init__.py | 23 +- melon/player/playlist.py | 26 +- melon/playlist/__init__.py | 19 +- melon/playlist/create.py | 15 +- melon/playlist/pick.py | 14 +- melon/servers/__init__.py | 11 +- melon/servers/invidious/__init__.py | 13 +- melon/servers/nebula/__init__.py | 12 +- melon/servers/peertube/__init__.py | 9 +- melon/servers/utils.py | 16 +- melon/settings/__init__.py | 5 - melon/utils.py | 5 +- melon/widgets/feeditem.py | 15 +- melon/widgets/filterbutton.py | 3 - melon/widgets/iconbutton.py | 7 +- melon/widgets/player.py | 53 ++-- melon/widgets/preferencerow.py | 16 +- melon/widgets/simpledialog.py | 6 +- melon/window.py | 9 +- po/de.po | 388 ++++++++++++++-------------- po/fa.po | 388 ++++++++++++++-------------- po/melon.pot | 388 ++++++++++++++-------------- po/nl.po | 388 ++++++++++++++-------------- 41 files changed, 911 insertions(+), 1087 deletions(-) diff --git a/main.py b/main.py index 659fc77..d284fb0 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,7 @@ # manual quick-run script import sys from melon.application import Application + Application.application_id = "icu.ccw.melon" app = Application() diff --git a/melon/__init__.py b/melon/__init__.py index e69de29..c1e7d50 100644 --- a/melon/__init__.py +++ b/melon/__init__.py @@ -0,0 +1,6 @@ +import gi + +gi.require_version("Gtk", "4.0") +gi.require_version("Gdk", "4.0") +gi.require_version("Adw", "1") +gi.require_version("Gst", "1.0") diff --git a/melon/application.py b/melon/application.py index 0cc6ed9..9c88e2c 100644 --- a/melon/application.py +++ b/melon/application.py @@ -1,12 +1,8 @@ -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Gtk, Adw, Gio, GLib +from gi.repository import Adw, GLib from melon.window import MainWindow -from melon.models import init_db, notify -from melon.servers.utils import get_server_instance, load_server, get_servers_list +from melon.models import init_db, notify, load_server +from melon.servers.utils import get_server_instance, get_servers_list class Application(Adw.Application): diff --git a/melon/browse/__init__.py b/melon/browse/__init__.py index 453ad98..1910309 100644 --- a/melon/browse/__init__.py +++ b/melon/browse/__init__.py @@ -1,14 +1,10 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Gtk, Adw, Gio, Gdk, GLib +from gi.repository import Gtk, Adw, Gdk, GLib from gettext import gettext as _ from melon.widgets.iconbutton import IconButton from melon.servers.utils import get_allowed_servers_list -from melon.models import get_app_settings, register_callback +from melon.models import get_app_settings +from melon.models.callbacks import register_callback class BrowseScreen(Adw.NavigationPage): diff --git a/melon/browse/channel.py b/melon/browse/channel.py index d98ac52..9d8e850 100644 --- a/melon/browse/channel.py +++ b/melon/browse/channel.py @@ -1,16 +1,10 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Gtk, Adw, Gio, Gdk, GLib +from gi.repository import Gtk, Adw, Gdk, GLib from unidecode import unidecode from gettext import gettext as _ import threading from melon.servers.utils import get_server_instance, get_servers_list from melon.servers.utils import pixbuf_from_url -from melon.servers import SearchMode from melon.widgets.feeditem import AdaptiveFeedItem from melon.widgets.preferencerow import PreferenceRow, PreferenceType, Preference from melon.widgets.iconbutton import IconButton @@ -47,7 +41,7 @@ class BrowseChannelScreen(Adw.NavigationPage): change the feed and prepare layout """ self.current_feed = feed_id - if not self.results is None: + if self.results is not None: self.box.remove(self.results) self.results = Adw.PreferencesGroup() feed_name = "" @@ -92,7 +86,7 @@ class BrowseChannelScreen(Adw.NavigationPage): # display channel info av = Adw.Avatar() av.set_size(64) - if not texture is None: + if texture is not None: av.set_custom_image(texture) else: av.set_text(self.channel.name) @@ -133,7 +127,7 @@ class BrowseChannelScreen(Adw.NavigationPage): if app_conf["show_images_in_browse"]: pixbuf = pixbuf_from_url(self.channel.avatar) texture = None - if not pixbuf is None: + if pixbuf is not None: texture = Gdk.Texture.new_for_pixbuf(pixbuf) GLib.idle_add(self.display_info, texture) diff --git a/melon/browse/playlist.py b/melon/browse/playlist.py index 2fc3603..2fe9113 100644 --- a/melon/browse/playlist.py +++ b/melon/browse/playlist.py @@ -1,16 +1,10 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Gtk, Adw, Gio, Gdk, GLib +from gi.repository import Gtk, Adw, Gdk, GLib from unidecode import unidecode from gettext import gettext as _ import threading from melon.servers.utils import get_server_instance, get_servers_list from melon.servers.utils import pixbuf_from_url -from melon.servers import SearchMode from melon.widgets.feeditem import AdaptiveFeedItem from melon.widgets.iconbutton import IconButton from melon.widgets.preferencerow import PreferenceRow, PreferenceType, Preference @@ -79,7 +73,7 @@ class BrowsePlaylistScreen(Adw.NavigationPage): # display channel info av = Adw.Avatar() av.set_size(64) - if not texture is None: + if texture is not None: av.set_custom_image(texture) else: av.set_text(self.playlist.title) @@ -96,7 +90,7 @@ class BrowsePlaylistScreen(Adw.NavigationPage): if app_conf["show_images_in_browse"]: pixbuf = pixbuf_from_url(self.playlist.thumbnail) texture = None - if not pixbuf is None: + if pixbuf is not None: texture = Gdk.Texture.new_for_pixbuf(pixbuf) GLib.idle_add(self.display_info, texture) diff --git a/melon/browse/search.py b/melon/browse/search.py index 9353fbe..436688a 100644 --- a/melon/browse/search.py +++ b/melon/browse/search.py @@ -1,9 +1,4 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Gtk, Adw, Gio, Gdk, GLib +from gi.repository import Gtk, Adw from gettext import gettext as _ from gettext import ngettext @@ -11,8 +6,9 @@ from melon.widgets.iconbutton import IconButton from melon.widgets.feeditem import AdaptiveFeedItem from melon.widgets.filterbutton import FilterButton from melon.servers.utils import get_allowed_servers_list, get_server_instance -from melon.models import get_app_settings, register_callback -from melon.servers import SearchMode, Preference, PreferenceType +from melon.models import get_app_settings +from melon.models.callbacks import register_callback +from melon.servers import SearchMode class GlobalSearchScreen(Adw.NavigationPage): diff --git a/melon/browse/server.py b/melon/browse/server.py index 7582fb3..0f638a8 100644 --- a/melon/browse/server.py +++ b/melon/browse/server.py @@ -1,9 +1,4 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Gtk, Adw, Gio, Gdk, GLib +from gi.repository import Gtk, Adw, GLib import threading from gettext import gettext as _ @@ -94,7 +89,7 @@ class Search(ViewStackPage): self.reset() return # remove old results - if not self.results is None: + if self.results is not None: self.inner.remove(self.results) # add new result wrapper self.results = Adw.PreferencesGroup() @@ -109,7 +104,7 @@ class Search(ViewStackPage): self.inner.append(self.results) def reset(self): - if not self.results is None: + if self.results is not None: self.inner.remove(self.results) self.results = Adw.StatusPage() self.results.set_title(_("*crickets chirping*")) @@ -221,7 +216,7 @@ class BrowseServerScreen(Adw.NavigationPage): self.toolbar_view.add_bottom_bar(self.bottom_bar) self.set_child(self.toolbar_view) - if not window is None: + if window is not None: window.breakpoint.add_setter(self.header_bar, "title-widget", Gtk.Box()) window.breakpoint.add_setter(self.bottom_bar, "reveal", True) diff --git a/melon/home/__init__.py b/melon/home/__init__.py index 907507a..acd66ba 100644 --- a/melon/home/__init__.py +++ b/melon/home/__init__.py @@ -1,8 +1,3 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") from gi.repository import Gtk, Adw, Gio from gettext import gettext as _ diff --git a/melon/home/history.py b/melon/home/history.py index 0367133..b955efe 100644 --- a/melon/home/history.py +++ b/melon/home/history.py @@ -1,8 +1,3 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") from gi.repository import Gtk, Adw, GLib import threading from gettext import gettext as _ @@ -10,7 +5,8 @@ from gettext import gettext as _ from melon.widgets.viewstackpage import ViewStackPage from melon.widgets.iconbutton import IconButton from melon.widgets.feeditem import AdaptiveFeedItem -from melon.models import get_history, register_callback, get_app_settings +from melon.models import get_history, get_app_settings +from melon.models.callbacks import register_callback from melon.servers.utils import group_by_date, filter_resources @@ -74,7 +70,7 @@ class History(ViewStackPage): if self.focus_node is None: self.focus_node = group # remove old load more button - if not self.next_ctr is None: + if self.next_ctr is not None: self.results.remove(self.next_ctr) # show Load more button if there are more entries if len(self.data) > (page + 1) * self.page_size: @@ -97,7 +93,7 @@ class History(ViewStackPage): # auto scroll to it # NOTE: we have to delay this, because everything has to be layout first # and apparently GTK doesn't have an event for this - if not self.focus_node is None: + if self.focus_node is not None: GLib.timeout_add(500, lambda: self.wrapper.scroll_to(self.focus_node)) def schedule(self): diff --git a/melon/home/new.py b/melon/home/new.py index 5133845..946eaae 100644 --- a/melon/home/new.py +++ b/melon/home/new.py @@ -1,9 +1,4 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Gtk, Adw, GLib, Gio, GObject +from gi.repository import Gtk, Adw, GLib import threading from datetime import datetime from gettext import gettext as _ @@ -11,8 +6,8 @@ from gettext import gettext as _ from melon.widgets.viewstackpage import ViewStackPage from melon.widgets.iconbutton import IconButton from melon.widgets.feeditem import AdaptiveFeedItem -from melon.servers.utils import fetch_home_feed, group_by_date -from melon.models import register_callback +from melon.servers.utils import fetch_home_feed +from melon.models.callbacks import register_callback from melon.models import get_subscribed_channels, get_app_settings from melon.models import ( get_cached_feed, @@ -138,7 +133,7 @@ class NewFeed(ViewStackPage): def load_overlay(self): last = get_last_playback() - if not last is None: + if last is not None: pos = last[1] dur = last[2] if pos is None or dur is None: @@ -152,10 +147,10 @@ class NewFeed(ViewStackPage): # TODO: move into settings menu last = None if last is None: - if not self.ov_toast is None: + if self.ov_toast is not None: self.ov_toast.dismiss() return - if not self.ov_toast is None: + if self.ov_toast is not None: self.ov_toast.dismiss() self.ov_toast = None resource = last[0] diff --git a/melon/home/playlists.py b/melon/home/playlists.py index 62495bc..e52d222 100644 --- a/melon/home/playlists.py +++ b/melon/home/playlists.py @@ -1,8 +1,3 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") from gi.repository import Gtk, Adw, GLib import threading from gettext import gettext as _ @@ -10,7 +5,8 @@ from gettext import gettext as _ from melon.widgets.viewstackpage import ViewStackPage from melon.widgets.iconbutton import IconButton from melon.widgets.feeditem import AdaptivePlaylistFeedItem -from melon.models import register_callback, get_playlists, get_app_settings +from melon.models import get_playlists, get_app_settings +from melon.models.callbacks import register_callback from melon.models import PlaylistWrapperType from melon.servers.utils import server_is_allowed diff --git a/melon/home/subs.py b/melon/home/subs.py index 456e247..e743752 100644 --- a/melon/home/subs.py +++ b/melon/home/subs.py @@ -1,8 +1,3 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") from gi.repository import Gtk, Adw, GLib import threading from gettext import gettext as _ @@ -10,7 +5,8 @@ from gettext import gettext as _ from melon.widgets.viewstackpage import ViewStackPage from melon.widgets.iconbutton import IconButton from melon.widgets.feeditem import AdaptiveFeedItem -from melon.models import get_subscribed_channels, register_callback, get_app_settings +from melon.models import get_subscribed_channels, get_app_settings +from melon.models.callbacks import register_callback from melon.servers.utils import filter_resources diff --git a/melon/import_providers/newpipe.py b/melon/import_providers/newpipe.py index 2a523d1..1a1e91c 100644 --- a/melon/import_providers/newpipe.py +++ b/melon/import_providers/newpipe.py @@ -8,9 +8,7 @@ from melon.servers import Channel, Playlist, Video from melon.models import ( ensure_subscribed_to_channel, ensure_bookmark_external_playlist, - add_to_history, new_local_playlist, - add_to_local_playlist, set_local_playlist_thumbnail, add_history_items, add_videos, @@ -106,7 +104,7 @@ class NewpipeImporter(ImportProvider, ABC): title = dt[2] channel_name = dt[5] channel_id = None - if not dt[4] is None: + if dt[4] is not None: channel_id = dt[4].split("/")[-1] thumb = dt[6].replace("https://i.ytimg.com", self.img_url) # newpipe does not store description @@ -150,7 +148,7 @@ class NewpipeImporter(ImportProvider, ABC): title = vdt[2] channel_name = vdt[3] channel_id = None - if not vdt[4] is None: + if vdt[4] is not None: channel_id = vdt[4].split("/")[-1] thumb = vdt[5].replace("https://i.ytimg.com", self.img_url) # newpipe doesn't store descriptions @@ -175,7 +173,7 @@ class NewpipeImporter(ImportProvider, ABC): """, (dt[2],), ).fetchone() - if not thumb is None: + if thumb is not None: set_local_playlist_thumbnail( pid, thumb[0].replace("https://i.ytimg.com", self.img_url) ) diff --git a/melon/import_providers/utils.py b/melon/import_providers/utils.py index b9bdc6a..a8673dd 100644 --- a/melon/import_providers/utils.py +++ b/melon/import_providers/utils.py @@ -1,9 +1,4 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Gtk, Adw, GLib, Gio +from gi.repository import Gtk, GLib, Gio from melon.import_providers import ImportProvider, PickerMode diff --git a/melon/importer.py b/melon/importer.py index c10fbad..1a440e3 100644 --- a/melon/importer.py +++ b/melon/importer.py @@ -1,16 +1,12 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Gtk, Adw, Gio +from gi.repository import Gtk, Adw from gettext import gettext as _ from melon.import_providers.utils import ImportPicker -from melon.import_providers import ImportProvider, PickerMode +from melon.import_providers import ImportProvider from melon.models.callbacks import freeze, unfreeze from melon.servers.utils import get_allowed_servers_list, get_server_instance from melon.models import get_app_settings +from melon.widgets.iconbutton import IconButton class ImporterScreen(Adw.NavigationPage): diff --git a/melon/models/__init__.py b/melon/models/__init__.py index 8fb8a88..9f9219d 100644 --- a/melon/models/__init__.py +++ b/melon/models/__init__.py @@ -1,7 +1,6 @@ from copy import deepcopy from enum import Enum, auto from datetime import datetime -from functools import cache import sqlite3 import os import json @@ -9,7 +8,7 @@ import sys from melon.servers import Video, Channel, Playlist, Resource from melon.utils import get_data_dir -from melon.models.callbacks import notify, register_callback +from melon.models.callbacks import notify class LocalPlaylist: @@ -447,7 +446,7 @@ def get_server_settings(sid: str): try: # autoparse json value = convert_json(setting[1]) - except Exception as e: + except Exception: # fallback to native type on error value = setting[1] base["custom"][setting[0]] = value @@ -459,7 +458,7 @@ def is_server_enabled(server_id: str): value = conn.execute( "SELECT enabled FROM servers WHERE server = ?", (server_id,) ).fetchone() - if not value is None: + if value is not None: value = value[0] else: value = server_settings_template["enabled"] @@ -975,7 +974,7 @@ def add_to_history(vid, uts=None): Takes :Video type and adds the video to the history automatically adds a uts to the video """ - if uts == None: + if uts is None: uts = datetime.now().timestamp() ensure_video(vid) conn = connect_to_db() @@ -1062,7 +1061,6 @@ def update_cached_feed(ls: list[(Video, int)]): # stored in app settings # code same as set_app_setting # but the notify's in the normal function would cause an infinite loop - app_conf = get_app_settings() execute_sql( conn, """ diff --git a/melon/models/callbacks.py b/melon/models/callbacks.py index 2ea2c7b..7ca4728 100644 --- a/melon/models/callbacks.py +++ b/melon/models/callbacks.py @@ -31,14 +31,14 @@ def unfreeze(): def register_callback(target: str, callback_id: str, function): - if not target in callbacks: + if target not in callbacks: return callbacks[target][callback_id] = function return lambda: unregister_callback(target, callback_id) def unregister_callback(target: str, callback_id: str): - if not target in callbacks: + if target not in callbacks: return if callback_id in callbacks[target]: callbacks[target].pop(callback_id) @@ -47,7 +47,7 @@ def unregister_callback(target: str, callback_id: str): def notify(target: str): if frozen: return - if not target in callbacks: + if target not in callbacks: return for _, func in callbacks[target].items(): func() diff --git a/melon/player/__init__.py b/melon/player/__init__.py index 242b5ce..89f142d 100644 --- a/melon/player/__init__.py +++ b/melon/player/__init__.py @@ -1,28 +1,19 @@ -import gi - -gi.require_version("WebKit", "6.0") -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -gi.require_version("Gst", "1.0") -from gi.repository import Gtk, Adw, WebKit, GLib, Gst +from gi.repository import Gtk, Adw, GLib from unidecode import unidecode from gettext import gettext as _ import threading from melon.servers.utils import get_server_instance, get_servers_list -from melon.servers import SearchMode from melon.widgets.player import VideoPlayer from melon.widgets.feeditem import AdaptiveFeedItem -from melon.widgets.preferencerow import PreferenceRow, PreferenceType, Preference from melon.widgets.iconbutton import IconButton -from melon.models import get_app_settings, add_to_history, register_callback +from melon.models import get_app_settings, add_to_history from melon.models import ( get_video_playback_position, set_video_playback_position, set_video_playback_position_force, get_video_duration, ) -from melon.utils import pass_me class PlayerScreen(Adw.NavigationPage): @@ -66,7 +57,7 @@ class PlayerScreen(Adw.NavigationPage): settings = get_app_settings() self.player = VideoPlayer(self.streams, settings["with_gl"]) pos = get_video_playback_position(self.video.server, self.video.id) - if not pos is None: + if pos is not None: self.position = pos self.player.goto(pos) self.player.connect_update(self.on_player_data) @@ -79,7 +70,7 @@ class PlayerScreen(Adw.NavigationPage): self.disconnect_player() def disconnect_player(self): - if not self.player is None: + if self.player is not None: self.player.connect_ended(None) self.player.connect_update(None) self.player.stop() @@ -104,7 +95,7 @@ class PlayerScreen(Adw.NavigationPage): self.duration = duration def display_channel(self): - if not self.channel is None: + if self.channel is not None: self.about.add(AdaptiveFeedItem(self.channel)) return False @@ -188,7 +179,7 @@ class PlayerScreen(Adw.NavigationPage): # reset playback position if video was nearly completely watched pos = get_video_playback_position(server_id, video_id) dur = get_video_duration(server_id, video_id) - if not pos is None and not dur is None: + if pos is not None and dur is not None: # TODO consider moving this to the settings panel consider_done = 0.99 * dur # video was probably watched till end @@ -203,7 +194,7 @@ class PlayerScreen(Adw.NavigationPage): server = get_servers_list()[server_id] self.instance = get_server_instance(server) - if not self.external_btn is None: + if self.external_btn is not None: self.header_bar.remove(self.external_btn) self.external_btn = IconButton("", "modem-symbolic") self.external_btn.connect("clicked", self.on_open_in_browser) diff --git a/melon/player/playlist.py b/melon/player/playlist.py index dd016cb..1e0e68f 100644 --- a/melon/player/playlist.py +++ b/melon/player/playlist.py @@ -1,28 +1,14 @@ -import gi - -gi.require_version("WebKit", "6.0") -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Gtk, Adw, WebKit, GLib -from unidecode import unidecode +from gi.repository import Gtk, Adw, GLib from gettext import gettext as _ import threading import random from melon.servers.utils import get_server_instance, get_servers_list -from melon.servers import SearchMode from melon.widgets.feeditem import AdaptiveFeedItem from melon.widgets.preferencerow import PreferenceRow, PreferenceType, Preference -from melon.widgets.iconbutton import IconButton -from melon.models import get_app_settings, add_to_history, register_callback -from melon.models import ( - get_video_playback_position, - set_video_playback_position, - set_video_playback_position_force, -) from melon.utils import pass_me -from melon.models import get_local_playlist, PlaylistWrapper, PlaylistWrapperType +from melon.models import get_local_playlist, PlaylistWrapper from melon.player import PlayerScreen @@ -116,12 +102,12 @@ class PlaylistPlayerScreen(PlayerScreen): return ind = self.get_next_index(0) - if not ind is None: + if ind is not None: self.prepare(ind) def get_next_index(self, fallback=None): index = self.playlist_index + 1 - if not fallback is None: + if fallback is not None: index = fallback if self.playlist_repeat_single: @@ -154,7 +140,7 @@ class PlaylistPlayerScreen(PlayerScreen): def on_player_end(self): super().on_player_end() ind = self.get_next_index() - if not ind is None: + if ind is not None: self.prepare(ind) def empty_playlist(self): @@ -196,7 +182,7 @@ class PlaylistPlayerScreen(PlayerScreen): def ctr_skip_video(self): ind = self.get_next_index() - if not ind is None: + if ind is not None: self.prepare(ind) def ctr_toggle_shuffle(self, state): diff --git a/melon/playlist/__init__.py b/melon/playlist/__init__.py index 3d35672..d5bfc9e 100644 --- a/melon/playlist/__init__.py +++ b/melon/playlist/__init__.py @@ -1,14 +1,7 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") from gi.repository import Gtk, Gdk, Adw, GLib, GObject from unidecode import unidecode from gettext import gettext as _ -from melon.servers.utils import get_servers_list, get_server_instance -from melon.servers import Preference, PreferenceType, Resource from melon.widgets.iconbutton import IconButton from melon.widgets.feeditem import AdaptiveFeedItem from melon.widgets.simpledialog import SimpleDialog @@ -21,20 +14,14 @@ from melon.models import ( set_local_playlist_thumbnail, delete_from_local_playlist, set_local_playlist_content, - is_server_enabled, - ensure_server_disabled, - ensure_server_enabled, - register_callback, ) +from melon.models.callbacks import register_callback from melon.utils import pass_me class LocalPlaylistScreen(Adw.NavigationPage): def __init__(self, playlist_id, *args, **kwargs): super().__init__(*args, **kwargs) - - app_conf = get_app_settings() - self.playlist_id = playlist_id # register update listener self.unregister = register_callback( @@ -107,7 +94,9 @@ class LocalPlaylistScreen(Adw.NavigationPage): for raw_index, (entry, index) in enumerate( sorted(playlist.content, key=lambda x: x[1]) ): - item = AdaptiveFeedItem(entry) + item = AdaptiveFeedItem( + entry, show_preview=app_conf["show_images_in_feed"] + ) item.menuitems = [ ( _("Set as playlist thumbnail"), diff --git a/melon/playlist/create.py b/melon/playlist/create.py index 6a72216..3e24e14 100644 --- a/melon/playlist/create.py +++ b/melon/playlist/create.py @@ -1,9 +1,4 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Gtk, Adw, Gio, GLib +from gi.repository import Gtk, Adw, GLib from gettext import gettext as _ import threading @@ -11,14 +6,14 @@ from melon.widgets.iconbutton import IconButton from melon.widgets.simpledialog import SimpleDialog from melon.widgets.feeditem import AdaptiveFeedItem from melon.models import new_local_playlist, Video -from melon.servers.utils import get_app_settings +from melon.servers.utils import get_app_settings, get_server_instance, get_servers_list class PlaylistCreatorDialog(SimpleDialog): def display(self, video=None): page = Adw.PreferencesPage() self.content = [] - if not video is None: + if video is not None: self.content = [video] # use preference group as preview for video element preview_group = Adw.PreferencesGroup() @@ -83,7 +78,7 @@ class PlaylistCreatorDialog(SimpleDialog): if isinstance(target, Video): # target is already a video object video = target - elif not target is None: + elif target is not None: # we have to fetch the video ourselves server_id = target[0] video_id = target[1] @@ -91,7 +86,7 @@ class PlaylistCreatorDialog(SimpleDialog): if server_id in servers: instance = get_server_instance(servers[server_id]) video = instance.get_video_info(video_id) - if (not target is None) and video is None: + if (target is not None) and video is None: # tried loading video data but failed GLib.idle_add(self.err) else: diff --git a/melon/playlist/pick.py b/melon/playlist/pick.py index 8394216..f654302 100644 --- a/melon/playlist/pick.py +++ b/melon/playlist/pick.py @@ -1,10 +1,4 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Gtk, Adw, Gio, GLib, Gdk -from unidecode import unidecode +from gi.repository import Gtk, Adw, GLib from gettext import gettext as _ import threading @@ -14,7 +8,6 @@ from melon.widgets.simpledialog import SimpleDialog from melon.models import get_playlists, PlaylistWrapperType, add_to_local_playlist from melon.servers.utils import ( get_app_settings, - pixbuf_from_url, get_servers_list, get_server_instance, ) @@ -80,6 +73,7 @@ class PlaylistPickerDialog(SimpleDialog): playlist, video, ), + show_preview=app_conf["show_images_in_feed"], ) group.add(row) @@ -103,7 +97,7 @@ class PlaylistPickerDialog(SimpleDialog): def background(self, target=None): video = None - if not target is None: + if target is not None: server_id = target[0] video_id = target[1] servers = get_servers_list() @@ -111,7 +105,7 @@ class PlaylistPickerDialog(SimpleDialog): instance = get_server_instance(servers[server_id]) video = instance.get_video_info(video_id) - if not video is None: + if video is not None: GLib.idle_add(self.display, video) else: GLib.idle_add(self.error) diff --git a/melon/servers/__init__.py b/melon/servers/__init__.py index fbb4e25..a39eb31 100644 --- a/melon/servers/__init__.py +++ b/melon/servers/__init__.py @@ -1,13 +1,6 @@ -from enum import Flag, Enum, auto +from enum import Enum, auto from abc import ABC, abstractmethod -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -gi.require_version("WebKit", "6.0") -from gi.repository import GObject, WebKit -from typing import Callable - +from gi.repository import GObject from melon.servers.loader import server_finder from melon.import_providers import ImportProvider diff --git a/melon/servers/invidious/__init__.py b/melon/servers/invidious/__init__.py index 5495333..75e928a 100644 --- a/melon/servers/invidious/__init__.py +++ b/melon/servers/invidious/__init__.py @@ -3,16 +3,11 @@ import requests from urllib.parse import urlparse, parse_qs from datetime import datetime from gettext import gettext as _ -import gi - -gi.require_version("WebKit", "6.0") -from gi.repository import GLib, WebKit from melon.import_providers.newpipe import NewpipeImporter from melon.servers import Server, Preference, PreferenceType from melon.servers import Feed, Channel, Video, Playlist, Stream, SearchMode from melon.servers import USER_AGENT -from melon.utils import pass_me class NewpipeInvidiousImporter(NewpipeImporter): @@ -298,7 +293,7 @@ class Invidious(Server): current_page = query["page"][0] try: current_page = int(current_page) - except Exception as e: + except Exception: current_page = 1 instance = self.get_external_url() listings = soup.find_all("a", {"class": "pure-button"}) @@ -308,12 +303,12 @@ class Invidious(Server): iquery = parse_qs(iurlres.query) if iurlres.path != urlres.path: continue - if not "page" in iquery: + if "page" not in iquery: continue ipage = 1 try: ipage = int(iquery["page"][0]) - except Exception as e: + except Exception: ipage = 1 if ipage <= current_page: continue @@ -358,7 +353,7 @@ class Invidious(Server): rel = src["src"] stream_url = f"{instance}{rel}" results.append(Stream(stream_url, src["label"])) - except: + except Exception as _: continue return results return [] diff --git a/melon/servers/nebula/__init__.py b/melon/servers/nebula/__init__.py index 1596d05..0da6e69 100644 --- a/melon/servers/nebula/__init__.py +++ b/melon/servers/nebula/__init__.py @@ -1,6 +1,4 @@ -from bs4 import BeautifulSoup import requests -from urllib.parse import urlparse, parse_qs from datetime import datetime import json from gettext import gettext as _ @@ -138,7 +136,7 @@ class Nebula(Server): results = [] for entry in listing["items"]: res = self.parse_entry(entry) - if not res is None: + if res is not None: results.append(res) return results @@ -166,7 +164,7 @@ class Nebula(Server): data = json.loads(r.text) for entry in data["results"]: res = self.parse_entry(entry) - if not res is None: + if res is not None: results.append(res) if mask == SearchMode.ANY or mask == SearchMode.VIDEOS: # fetch videos @@ -175,7 +173,7 @@ class Nebula(Server): data = json.loads(r.text) for entry in data["results"]: res = self.parse_entry(entry) - if not res is None: + if res is not None: results.append(res) return results @@ -199,7 +197,7 @@ class Nebula(Server): video_feed = Feed("videos", _("Videos")) if r.ok: data = json.loads(r.text) - if (not "playlist" in data) or len(data["playlist"]) == 0: + if ("playlist" not in data) or len(data["playlist"]) == 0: return [video_feed] else: return [video_feed, Feed("playlists", _("Playlists"))] @@ -302,7 +300,7 @@ class Nebula(Server): # obtain the user login token (changes every time) # NOTE: the first time the app runs this, # it will send out the Login Detected email - level1_auth = f"https://nebula.tv/auth/login/" + level1_auth = "https://nebula.tv/auth/login/" level1_data = {"email": email, "password": passwd} r1 = requests.post( level1_auth, json=level1_data, headers={"Content-Type": "application/json"} diff --git a/melon/servers/peertube/__init__.py b/melon/servers/peertube/__init__.py index f908922..f98d5cf 100644 --- a/melon/servers/peertube/__init__.py +++ b/melon/servers/peertube/__init__.py @@ -1,12 +1,9 @@ import requests -from urllib.parse import urlparse, parse_qs from datetime import datetime from gettext import gettext as _ from melon.servers import Server, Preference, PreferenceType from melon.servers import Feed, Channel, Video, Playlist, Stream, SearchMode -from melon.servers import USER_AGENT -from melon.import_providers.newpipe import NewpipeImporter class Peertube(Server): @@ -122,7 +119,7 @@ class Peertube(Server): item_host = item["host"] channel_id = f"https://{item_host}::{item_id}" avatar = None - if "avatar" in item and not item["avatar"] is None: + if "avatar" in item and item["avatar"] is not None: path = item["avatar"]["path"] avatar = f"{instance}{path}" c = Channel( @@ -194,7 +191,7 @@ class Peertube(Server): channel_host = data["host"] channel_id = f"https://{channel_host}::{channel_slug}" avatar = None - if "avatar" in data and not data["avatar"] is None: + if "avatar" in data and data["avatar"] is not None: avatar_path = data["avatar"]["path"] avatar = f"{instance}{avatar_path}" return Channel( @@ -307,7 +304,7 @@ class Peertube(Server): channel_slug = item["channel"]["name"] channel_host = item["channel"]["host"] channel_id = f"https://{channel_host}::{channel_slug}" - except Exception as e: + except Exception: # skip invalid entries # peertube keeps deleted videos in the playlist # but doesn't set all attributes diff --git a/melon/servers/utils.py b/melon/servers/utils.py index 0c30313..92bce8e 100644 --- a/melon/servers/utils.py +++ b/melon/servers/utils.py @@ -1,23 +1,21 @@ -from operator import itemgetter from pkgutil import iter_modules import importlib import inspect from functools import cache +import threading import os import sys -from gi.repository import GLib, Gtk, Gdk, GdkPixbuf, Gio +from gi.repository import GLib, GdkPixbuf import requests -import urllib from datetime import datetime from melon.servers.loader import server_finder from melon.models import ( get_server_settings, get_subscribed_channels, get_app_settings, - load_server, ) from melon.servers import Server -from melon.servers import Channel, Playlist, Resource +from melon.servers import Resource def pixbuf_from_url(url: str) -> GdkPixbuf.Pixbuf: @@ -39,7 +37,7 @@ def pixbuf_from_url(url: str) -> GdkPixbuf.Pixbuf: loader.write_bytes(GLib.Bytes.new(content)) loader.close() return loader.get_pixbuf() - except: + except Exception as _: return None @@ -55,9 +53,6 @@ def get_server_instance(server) -> Server: return instance -import threading - - class NewsWorkerPool: threads = [] tasks = [] @@ -74,7 +69,6 @@ class NewsWorkerPool: self.threads.append(thread) def run(self): - name = threading.currentThread().getName() while self.tasks: task = self.tasks.pop(0) instance = task[0] @@ -101,7 +95,7 @@ def fetch_home_feed() -> list[Resource]: # generate list of tasks tasks = [] for server in servers: - if not server["id"] in db: + if server["id"] not in db: continue instance = get_server_instance(server) channels = db[server["id"]] diff --git a/melon/settings/__init__.py b/melon/settings/__init__.py index 27bf8d2..7a9efcb 100644 --- a/melon/settings/__init__.py +++ b/melon/settings/__init__.py @@ -1,8 +1,3 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") from gi.repository import Gtk, Adw from gettext import gettext as _ diff --git a/melon/utils.py b/melon/utils.py index a61b9ca..99ce1ba 100644 --- a/melon/utils.py +++ b/melon/utils.py @@ -1,7 +1,4 @@ -import gi - -gi.require_version("Gdk", "4.0") -from gi.repository import Gio, GLib +from gi.repository import GLib from functools import cache import os diff --git a/melon/widgets/feeditem.py b/melon/widgets/feeditem.py index b2b9c1d..0c9af32 100644 --- a/melon/widgets/feeditem.py +++ b/melon/widgets/feeditem.py @@ -1,14 +1,7 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") from gi.repository import Gtk, Adw, GLib, Gdk from melon.servers import Resource, Video, Playlist, Channel from melon.servers.utils import pixbuf_from_url -from melon.widgets.iconbutton import IconButton from melon.models import PlaylistWrapperType, PlaylistWrapper -import threading from melon.background import queue from unidecode import unidecode from gettext import gettext as _ @@ -101,7 +94,7 @@ class AdaptiveFeedItem(Adw.ActionRow): if self.onClick is None: self.set_action_name("win.browse_channel") - if not self.onClick is None: + if self.onClick is not None: self.connect("activated", self.onClick) self.preview = Adw.Avatar() @@ -118,7 +111,7 @@ class AdaptiveFeedItem(Adw.ActionRow): GLib.idle_add(self.complete_avatar, texture) return pixbuf = pixbuf_from_url(url) - if not pixbuf is None: + if pixbuf is not None: texture = Gdk.Texture.new_for_pixbuf(pixbuf) preview_cache[url] = texture GLib.idle_add(self.complete_avatar, texture) @@ -195,7 +188,7 @@ class AdaptivePlaylistFeedItem(Adw.ActionRow): super().__init__(*args, **kwargs) self.set_title(unidecode(playlist.inner.title).replace("&", "&")) self.set_subtitle(unidecode(playlist.inner.description).replace("&", "&")) - if not onClick is None: + if onClick is not None: # use custom click callback self.connect("activated", onClick) elif playlist.type == PlaylistWrapperType.EXTERNAL: @@ -221,7 +214,7 @@ class AdaptivePlaylistFeedItem(Adw.ActionRow): GLib.idle_add(self.complete_avatar, texture) return pixbuf = pixbuf_from_url(url) - if not pixbuf is None: + if pixbuf is not None: texture = Gdk.Texture.new_for_pixbuf(pixbuf) preview_cache[url] = texture GLib.idle_add(self.complete_avatar, texture) diff --git a/melon/widgets/filterbutton.py b/melon/widgets/filterbutton.py index 2b30b0b..f983048 100644 --- a/melon/widgets/filterbutton.py +++ b/melon/widgets/filterbutton.py @@ -1,6 +1,3 @@ -import gi - -gi.require_version("Gtk", "4.0") from gi.repository import Gtk diff --git a/melon/widgets/iconbutton.py b/melon/widgets/iconbutton.py index 7068aa0..9c34322 100644 --- a/melon/widgets/iconbutton.py +++ b/melon/widgets/iconbutton.py @@ -1,8 +1,3 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") from gi.repository import Gtk, Adw @@ -27,5 +22,5 @@ class IconButton(Gtk.Button): def update(self, name, icon, tooltip=None): self.set_name(name) self.set_icon(icon) - if not tooltip is None: + if tooltip is not None: self.set_tooltip(tooltip) diff --git a/melon/widgets/player.py b/melon/widgets/player.py index cbb3000..c27479f 100644 --- a/melon/widgets/player.py +++ b/melon/widgets/player.py @@ -1,19 +1,8 @@ -import gi - -gi.require_version("WebKit", "6.0") -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -gi.require_version("Gst", "1.0") -from gi.repository import Gtk, Adw, WebKit, GLib, Gst, Gio -from unidecode import unidecode +from gi.repository import Gtk, Adw, GLib, Gst, Gio from gettext import gettext as _ -from datetime import datetime -from enum import Enum, auto from melon.servers import Stream from melon.widgets.iconbutton import IconButton -from melon.widgets.preferencerow import PreferenceRow, PreferenceType, Preference -from melon.utils import pass_me def format_seconds(secs: float) -> str: @@ -325,12 +314,12 @@ class VideoPlayerBase(Gtk.Overlay): self.ended_callback = callback def _toggle_fullscreen(self): - if not self.toggle_fullscreen is None: - state = self.toggle_fullscreen() + if self.toggle_fullscreen is not None: + self.toggle_fullscreen() def _toggle_popout(self): - if not self.toggle_popout is None: - state = self.toggle_popout() + if self.toggle_popout is not None: + self.toggle_popout() def set_toggle_states(self, popout: bool, fullscreen: bool): if popout: @@ -487,7 +476,7 @@ class VideoPlayerBase(Gtk.Overlay): self.stream = stream self.source.set_state(Gst.State.NULL) self.source.set_property("uri", stream.url) - if not self.position is None: + if self.position is not None: self.target_position = self.position self.play() self._build_menu() @@ -517,7 +506,7 @@ class VideoPlayerBase(Gtk.Overlay): pos = self.source.query_position(Gst.Format.TIME) # compare the nanoseconds values before converting them to seconds # so we don't have to deal with float arithmetics - if pos[0] and dur[0] and pos[1] == dur[1] and not self.ended_callback is None: + if pos[0] and dur[0] and pos[1] == dur[1] and self.ended_callback is not None: self.ended_callback() if dur[0]: # convert nanoseconds to senconds @@ -531,25 +520,25 @@ class VideoPlayerBase(Gtk.Overlay): # so the preview shows the correct timestamp # has the amazing side effect of also sending # the requested timestamp on update - if not self.target_position is None: + if self.target_position is not None: pos = self.target_position else: pos = None - if not pos is None and not dur is None: + if pos is not None and dur is not None: # use combined method if we have a value for both # so we don't call the update function twice self.set_position_and_duration(pos, dur) # a video position was requested but not yet seeked to - if not self.target_position is None: + if self.target_position is not None: position = self.target_position self.target_position = None self.source.seek_simple( Gst.Format.TIME, Gst.SeekFlags.FLUSH, position * Gst.SECOND ) - elif not pos is None: + elif pos is not None: self.set_position(pos) - elif not dur is None: + elif dur is not None: self.set_duration(dur) return True @@ -576,19 +565,19 @@ class VideoPlayerBase(Gtk.Overlay): def _update_playhead(self): pos_text = "00:00" dur_text = "--:--" - if not self.position is None: + if self.position is not None: pos_text = format_seconds(self.position) - elif not self.target_position is None: + elif self.target_position is not None: pos_text = format_seconds(self.target_position) - if not self.duration is None: + if self.duration is not None: dur_text = format_seconds(self.duration) self.position_display.set_label(pos_text) self.duration_display.set_label(dur_text) - if not self.duration is None and not self.position is None: + if self.duration is not None and self.position is not None: self.progress_display.set_range(0, self.duration) self.progress_display.set_value(self.position) - if not self.update_callback is None: + if self.update_callback is not None: self.update_callback(self.position, self.duration) else: self.progress_display.set_value(0) @@ -645,7 +634,7 @@ class VideoPlayer(Gtk.Stack): def _show_player(self): has_player = self.get_child_by_name("player") - if not has_player is None: + if has_player is not None: # has player -> remove it self.remove(has_player) else: @@ -655,7 +644,7 @@ class VideoPlayer(Gtk.Stack): def _popout_player(self): has_player = self.get_child_by_name("player") - if not has_player is None: + if has_player is not None: self.remove(has_player) self.set_visible_child_name("placeholder") @@ -783,11 +772,11 @@ class VideoPlayerWindow(Adw.Window): if curr == self._lastfull: return self._lastfull = curr - if not self.onfull is None: + if self.onfull is not None: self.onfull(curr) def close(self): - if not self.onclose is None: + if self.onclose is not None: self.onclose() def connect_close(self, callback=None): diff --git a/melon/widgets/preferencerow.py b/melon/widgets/preferencerow.py index 1298549..a029c26 100644 --- a/melon/widgets/preferencerow.py +++ b/melon/widgets/preferencerow.py @@ -1,15 +1,9 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Gtk, Adw, GLib, Gdk +from gi.repository import Gtk, Adw from gettext import gettext as _ from copy import deepcopy as copy -from melon.servers import Resource, Video, Playlist, Channel, Preference, PreferenceType -from melon.servers.utils import pixbuf_from_url +from melon.servers import Preference, PreferenceType from melon.widgets.iconbutton import IconButton from melon.widgets.simpledialog import SimpleDialog from melon.utils import pass_me, many @@ -85,7 +79,7 @@ class PreferenceRow: # because the "notify" signal might be called more than once return self.current_value = copy(value) - if not self.callback is None: + if self.callback is not None: self.callback(value) def get_widget(self): @@ -95,7 +89,7 @@ class PreferenceRow: self.callback = cb def on_active(self): - if not self.callback is None: + if self.callback is not None: self.callback(self.get_active()) @@ -159,7 +153,7 @@ class MultiRow(Adw.PreferencesRow): counter += 1 def notify(self): - if not self.callback is None: + if self.callback is not None: self.callback(copy(self.values)) self.update() diff --git a/melon/widgets/simpledialog.py b/melon/widgets/simpledialog.py index 65ce89f..cf896a1 100644 --- a/melon/widgets/simpledialog.py +++ b/melon/widgets/simpledialog.py @@ -1,8 +1,4 @@ -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") -from gi.repository import Gtk, Adw, Gio, GLib +from gi.repository import Adw class SimpleDialog(Adw.Dialog): diff --git a/melon/window.py b/melon/window.py index 3f654b8..651d07f 100644 --- a/melon/window.py +++ b/melon/window.py @@ -1,8 +1,3 @@ -import sys -import gi - -gi.require_version("Gtk", "4.0") -gi.require_version("Adw", "1") from gi.repository import Gtk, Adw, Gio, GLib from gettext import gettext as _ @@ -12,7 +7,6 @@ from melon.browse.server import BrowseServerScreen from melon.browse.channel import BrowseChannelScreen from melon.browse.playlist import BrowsePlaylistScreen from melon.browse.search import GlobalSearchScreen -from melon.servers.utils import get_servers_list, get_server_instance from melon.settings import SettingsScreen from melon.importer import ImporterScreen from melon.player import PlayerScreen @@ -54,7 +48,6 @@ class MainWindow(Adw.ApplicationWindow): def open_playlist_picker(self, action, prefs): server_id = prefs[0] video_id = prefs[1] - servers = get_servers_list() video = (server_id, video_id) diag = PlaylistPickerDialog(video) diag.show(self) @@ -156,7 +149,7 @@ class MainWindow(Adw.ApplicationWindow): def reg_action(self, name, func, variant=None, target=None): vtype = None - if not variant is None: + if variant is not None: vtype = GLib.VariantType.new(variant) act = Gio.SimpleAction.new(name, vtype) act.connect("activate", func) diff --git a/po/de.po b/po/de.po index 0075b68..62dc1ab 100644 --- a/po/de.po +++ b/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Melon 0.1.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-15 12:29+0200\n" +"POT-Creation-Date: 2024-08-15 13:53+0200\n" "PO-Revision-Date: 2024-04-20 14:18+0000\n" "Last-Translator: hurzelchen \n" @@ -86,481 +86,481 @@ msgid "" "button" msgstr "" -#: ../melon/browse/__init__.py:20 ../melon/browse/search.py:66 -#: ../melon/browse/server.py:115 ../melon/browse/server.py:143 -#: ../melon/home/history.py:25 ../melon/home/new.py:36 -#: ../melon/home/playlists.py:23 ../melon/home/subs.py:22 -#: ../melon/importer.py:63 ../melon/player/__init__.py:113 -#: ../melon/player/playlist.py:164 ../melon/player/playlist.py:171 -#: ../melon/playlist/__init__.py:82 ../melon/playlist/create.py:104 -#: ../melon/playlist/pick.py:121 +#: ../melon/browse/__init__.py:16 ../melon/browse/search.py:62 +#: ../melon/browse/server.py:110 ../melon/browse/server.py:138 +#: ../melon/home/history.py:21 ../melon/home/new.py:31 +#: ../melon/home/playlists.py:19 ../melon/home/subs.py:18 +#: ../melon/importer.py:59 ../melon/player/__init__.py:104 +#: ../melon/player/playlist.py:150 ../melon/player/playlist.py:157 +#: ../melon/playlist/__init__.py:69 ../melon/playlist/create.py:99 +#: ../melon/playlist/pick.py:115 msgid "*crickets chirping*" msgstr "*Grillen zirpen*" -#: ../melon/browse/__init__.py:21 +#: ../melon/browse/__init__.py:17 msgid "There are no available servers" msgstr "Es sind keine Dienste vorhanden" -#: ../melon/browse/__init__.py:24 ../melon/browse/search.py:72 -#: ../melon/importer.py:67 +#: ../melon/browse/__init__.py:20 ../melon/browse/search.py:68 +#: ../melon/importer.py:63 msgid "Enable servers in the settings menu" msgstr "Aktiviere Dienste im Einstellungsmenü" -#: ../melon/browse/__init__.py:33 +#: ../melon/browse/__init__.py:29 msgid "Available Servers" msgstr "Verfügbare Dienste" -#: ../melon/browse/__init__.py:35 +#: ../melon/browse/__init__.py:31 msgid "You can enable/disable and filter servers in the settings menu" msgstr "" "Du kannst Dienste in den Einstellungen aktivieren, deaktivieren und filtern" -#: ../melon/browse/__init__.py:56 +#: ../melon/browse/__init__.py:52 msgid "Servers" msgstr "Dienste" -#: ../melon/browse/__init__.py:64 ../melon/browse/search.py:126 +#: ../melon/browse/__init__.py:60 ../melon/browse/search.py:122 msgid "Global Search" msgstr "Globale Suche" -#: ../melon/browse/channel.py:104 +#: ../melon/browse/channel.py:98 msgid "Subscribe to channel" msgstr "Kanal abonnieren" -#: ../melon/browse/channel.py:105 +#: ../melon/browse/channel.py:99 msgid "Add latest uploads to home feed" msgstr "Zeige neue Videos im Home-Feed an" -#: ../melon/browse/channel.py:117 +#: ../melon/browse/channel.py:111 msgid "Channel feed" msgstr "" -#: ../melon/browse/channel.py:118 +#: ../melon/browse/channel.py:112 msgid "This channel provides multiple feeds, choose which one to view" msgstr "" -#: ../melon/browse/channel.py:170 +#: ../melon/browse/channel.py:164 msgid "Channel" msgstr "Kanal" -#: ../melon/browse/playlist.py:48 ../melon/playlist/__init__.py:74 +#: ../melon/browse/playlist.py:42 ../melon/playlist/__init__.py:61 msgid "Start playing" msgstr "Wiedergeben" -#: ../melon/browse/playlist.py:69 ../melon/player/__init__.py:53 +#: ../melon/browse/playlist.py:63 ../melon/player/__init__.py:44 msgid "Bookmark" msgstr "Merken" -#: ../melon/browse/playlist.py:70 +#: ../melon/browse/playlist.py:64 msgid "Add Playlist to your local playlist collection" msgstr "Wiedergabeliste zur lokalen Sammlung hinzufügen" -#: ../melon/browse/playlist.py:124 +#: ../melon/browse/playlist.py:118 msgid "Playlist" msgstr "Wiedergabeliste" -#: ../melon/browse/search.py:49 +#: ../melon/browse/search.py:45 msgid "No results" msgstr "Keine Ergebnisse" -#: ../melon/browse/search.py:52 +#: ../melon/browse/search.py:48 #, python-brace-format msgid "{count} result" msgid_plural "{count} results" msgstr[0] "{count} Ergebnis" msgstr[1] "{count} Ergebnisse" -#: ../melon/browse/search.py:68 +#: ../melon/browse/search.py:64 msgid "There are no available servers, a search would yield no results" msgstr "" "Es gibt keine verfügbaren Dienste, eine Suche würde keine Ergebnisse liefern" -#: ../melon/browse/search.py:96 ../melon/browse/server.py:47 +#: ../melon/browse/search.py:92 ../melon/browse/server.py:42 msgid "Any" msgstr "Alle" -#: ../melon/browse/search.py:100 ../melon/browse/server.py:51 +#: ../melon/browse/search.py:96 ../melon/browse/server.py:46 msgid "Channels" msgstr "Kanäle" -#: ../melon/browse/search.py:105 ../melon/browse/server.py:56 -#: ../melon/home/playlists.py:34 ../melon/home/playlists.py:78 -#: ../melon/servers/nebula/__init__.py:206 -#: ../melon/servers/peertube/__init__.py:213 +#: ../melon/browse/search.py:101 ../melon/browse/server.py:51 +#: ../melon/home/playlists.py:30 ../melon/home/playlists.py:74 +#: ../melon/servers/nebula/__init__.py:203 +#: ../melon/servers/peertube/__init__.py:209 msgid "Playlists" msgstr "Wiedergabelisten" -#: ../melon/browse/search.py:110 ../melon/browse/server.py:61 -#: ../melon/servers/nebula/__init__.py:200 -#: ../melon/servers/peertube/__init__.py:213 -#: ../melon/servers/peertube/__init__.py:214 +#: ../melon/browse/search.py:106 ../melon/browse/server.py:56 +#: ../melon/servers/nebula/__init__.py:197 +#: ../melon/servers/peertube/__init__.py:209 +#: ../melon/servers/peertube/__init__.py:210 msgid "Videos" msgstr "Videos" -#: ../melon/browse/server.py:26 +#: ../melon/browse/server.py:21 msgid "Search" msgstr "Suchen" -#: ../melon/browse/server.py:116 +#: ../melon/browse/server.py:111 msgid "Try searching for a term" msgstr "Suche nach einem Suchbegriff" -#: ../melon/browse/server.py:118 +#: ../melon/browse/server.py:113 msgid "Try using a different query" msgstr "Versuche nach einem anderen Begriff zu suchen" -#: ../melon/browse/server.py:144 +#: ../melon/browse/server.py:139 msgid "This feed is empty" msgstr "" -#: ../melon/home/__init__.py:20 +#: ../melon/home/__init__.py:15 msgid "Home" msgstr "Startseite" -#: ../melon/home/__init__.py:41 ../melon/home/history.py:28 -#: ../melon/home/new.py:49 ../melon/home/subs.py:25 +#: ../melon/home/__init__.py:36 ../melon/home/history.py:24 +#: ../melon/home/new.py:44 ../melon/home/subs.py:21 msgid "Browse Servers" msgstr "Dienste durchsuchen" -#: ../melon/home/__init__.py:48 +#: ../melon/home/__init__.py:43 msgid "Preferences" msgstr "Einstellungen" -#: ../melon/home/__init__.py:49 +#: ../melon/home/__init__.py:44 msgid "Import Data" msgstr "Daten Importieren" -#: ../melon/home/__init__.py:50 +#: ../melon/home/__init__.py:45 msgid "About Melon" msgstr "Über Melon" -#: ../melon/home/history.py:26 +#: ../melon/home/history.py:22 msgid "You haven't watched any videos yet" msgstr "Du hast noch keine Videos geschaut" -#: ../melon/home/history.py:38 ../melon/home/history.py:125 +#: ../melon/home/history.py:34 ../melon/home/history.py:121 msgid "History" msgstr "Verlauf" -#: ../melon/home/history.py:39 +#: ../melon/home/history.py:35 msgid "These are the videos you opened in the past" msgstr "Diese Videos hast du in der Vergangenheit geöffnet" -#: ../melon/home/history.py:83 +#: ../melon/home/history.py:79 msgid "Show more" msgstr "Mehr anzeigen" -#: ../melon/home/history.py:84 +#: ../melon/home/history.py:80 msgid "Load older videos" msgstr "" -#: ../melon/home/new.py:30 +#: ../melon/home/new.py:25 msgid "Refresh" msgstr "Aktualisieren" -#: ../melon/home/new.py:40 +#: ../melon/home/new.py:35 msgid "Subscribe to a channel first, to view new uploads" msgstr "Du musst einem Kanal folgen, um neue Videos zu sehen." -#: ../melon/home/new.py:45 +#: ../melon/home/new.py:40 msgid "The channels you are subscribed to haven't uploaded anything yet" msgstr "Die Kanäle, die du abonniert hast, haben noch nichts hochgeladen" -#: ../melon/home/new.py:68 +#: ../melon/home/new.py:63 #, python-brace-format msgid "(Last refresh: {last_refresh})" msgstr "(Zuletzt aktualisiert: {last_refresh})" -#: ../melon/home/new.py:72 ../melon/home/new.py:172 +#: ../melon/home/new.py:67 ../melon/home/new.py:167 msgid "What's new" msgstr "Neues" -#: ../melon/home/new.py:74 +#: ../melon/home/new.py:69 msgid "These are the latest videos of channels you follow" msgstr "Hier sind die neusten Videos von Kanälen, denen du folgst" -#: ../melon/home/new.py:162 +#: ../melon/home/new.py:157 msgid "Pick up where you left off" msgstr "" -#: ../melon/home/new.py:163 +#: ../melon/home/new.py:158 msgid "Watch" msgstr "" -#: ../melon/home/playlists.py:24 +#: ../melon/home/playlists.py:20 msgid "You don't have any playlists yet" msgstr "Du hast noch keine Wiedergabelisten" -#: ../melon/home/playlists.py:26 ../melon/home/playlists.py:39 +#: ../melon/home/playlists.py:22 ../melon/home/playlists.py:35 msgid "Create a new playlist" msgstr "Neue Wiedergabeliste erstellen" -#: ../melon/home/playlists.py:36 +#: ../melon/home/playlists.py:32 msgid "Here are playlists you've bookmarked or created yourself" msgstr "" "Hier ist eine Liste an Wiedergabelisten, die du dir gemerkt oder selber " "erstellt hast" -#: ../melon/home/playlists.py:39 +#: ../melon/home/playlists.py:35 msgid "New" msgstr "Neu" -#: ../melon/home/subs.py:23 +#: ../melon/home/subs.py:19 msgid "You aren't yet subscribed to channels" msgstr "Du folgst noch keinen Kanälen" -#: ../melon/home/subs.py:33 ../melon/home/subs.py:68 +#: ../melon/home/subs.py:29 ../melon/home/subs.py:64 msgid "Subscriptions" msgstr "Kanäle" -#: ../melon/home/subs.py:34 +#: ../melon/home/subs.py:30 msgid "You are subscribed to the following channels" msgstr "Du folgst den folgenden Kanälen" -#: ../melon/import_providers/newpipe.py:42 +#: ../melon/import_providers/newpipe.py:40 msgid "Newpipe Database importer" msgstr "NewPipe Datenbank Import" -#: ../melon/import_providers/newpipe.py:44 +#: ../melon/import_providers/newpipe.py:42 msgid "" "Import the .db file from inside the newpipe .zip export (as invidious " "content)" msgstr "" "Importiere die .db Datei aus dem NewPipe .zip Export (als Invidious Inhalte)" -#: ../melon/import_providers/newpipe.py:46 +#: ../melon/import_providers/newpipe.py:44 msgid "Select .db file" msgstr "Wähle eine .db Datei" -#: ../melon/import_providers/newpipe.py:60 +#: ../melon/import_providers/newpipe.py:58 msgid "Newpipe Database" msgstr "NewPipe Datenbank" -#: ../melon/importer.py:19 ../melon/importer.py:37 +#: ../melon/importer.py:15 ../melon/importer.py:33 msgid "Import" msgstr "Importieren" -#: ../melon/importer.py:38 +#: ../melon/importer.py:34 #, fuzzy msgid "The following import methods have been found" msgstr "Die folgenden Import-Methoden wurden gefunden" -#: ../melon/importer.py:64 +#: ../melon/importer.py:60 #, fuzzy msgid "There are no available importer methods" msgstr "Es gibt keine verfügbaren Import-Methoden" -#: ../melon/player/__init__.py:41 +#: ../melon/player/__init__.py:32 msgid "Description" msgstr "Beschreibung" -#: ../melon/player/__init__.py:54 +#: ../melon/player/__init__.py:45 msgid "Add this video to a playlist" msgstr "Füge dieses Video einer Wiedergabeliste hinzu" -#: ../melon/player/__init__.py:114 ../melon/playlist/create.py:105 -#: ../melon/playlist/pick.py:122 +#: ../melon/player/__init__.py:105 ../melon/playlist/create.py:100 +#: ../melon/playlist/pick.py:116 msgid "Video could not be loaded" msgstr "Das Video konnte nicht geladen werden" -#: ../melon/player/__init__.py:152 ../melon/player/__init__.py:186 -#: ../melon/player/playlist.py:57 +#: ../melon/player/__init__.py:143 ../melon/player/__init__.py:177 +#: ../melon/player/playlist.py:43 msgid "Loading..." msgstr "" -#: ../melon/player/playlist.py:165 +#: ../melon/player/playlist.py:151 msgid "This playlist is empty" msgstr "Diese Wiedergabeliste ist leer" -#: ../melon/player/playlist.py:172 +#: ../melon/player/playlist.py:158 msgid "There was an error loading the playlist" msgstr "Beim Laden der Wiedergabeliste ist ein Fehler aufgetreten" -#: ../melon/player/playlist.py:225 +#: ../melon/player/playlist.py:211 msgid "Previous" msgstr "Vorheriges" -#: ../melon/player/playlist.py:227 +#: ../melon/player/playlist.py:213 msgid "Play video that comes before this one in the playlist" msgstr "Spielt das Video, was in der Wiedergabeliste vor diesem kommt" -#: ../melon/player/playlist.py:244 +#: ../melon/player/playlist.py:230 msgid "Next" msgstr "Nächstes" -#: ../melon/player/playlist.py:246 +#: ../melon/player/playlist.py:232 msgid "Play video that comes after this one in the playlist" msgstr "Spielt das Video, was in der Wiedergabeliste nach diesem kommt" -#: ../melon/player/playlist.py:258 +#: ../melon/player/playlist.py:244 msgid "Skip" msgstr "Überspringen" -#: ../melon/player/playlist.py:259 +#: ../melon/player/playlist.py:245 msgid "Skip this video and pick a new one at random" msgstr "Überspringt dieses Video und wählt zufällig ein Neues aus" -#: ../melon/player/playlist.py:270 +#: ../melon/player/playlist.py:256 msgid "Shuffle" msgstr "" -#: ../melon/player/playlist.py:271 +#: ../melon/player/playlist.py:257 msgid "Chooses the next video at random" msgstr "Wählt das nächste Video zufällig aus" -#: ../melon/player/playlist.py:282 +#: ../melon/player/playlist.py:268 msgid "Repeat current video" msgstr "" -#: ../melon/player/playlist.py:283 +#: ../melon/player/playlist.py:269 msgid "Puts this video on loop" msgstr "" -#: ../melon/player/playlist.py:298 +#: ../melon/player/playlist.py:284 msgid "Repeat playlist" msgstr "" -#: ../melon/player/playlist.py:300 +#: ../melon/player/playlist.py:286 msgid "Start playling the playlist from the beginning after reaching the end" msgstr "" "Spielt die Wiedergabeliste erneut von Beginn, wenn das Ende erreicht wurde" -#: ../melon/player/playlist.py:312 +#: ../melon/player/playlist.py:298 msgid "Playlist Content" msgstr "" -#: ../melon/player/playlist.py:314 +#: ../melon/player/playlist.py:300 msgid "Click on videos to continue playing the playlist from there" msgstr "Klicke auf ein Video, um die Wiedergabeliste von dort fortzusetzen" -#: ../melon/playlist/__init__.py:70 +#: ../melon/playlist/__init__.py:57 msgid "Edit" msgstr "Bearbeiten" -#: ../melon/playlist/__init__.py:84 +#: ../melon/playlist/__init__.py:71 msgid "You haven't added any videos to this playlist yet" msgstr "Du hast noch keine Videos zu dieser Wiedergabeliste hinzugefügt" -#: ../melon/playlist/__init__.py:87 +#: ../melon/playlist/__init__.py:74 msgid "Start watching" msgstr "Videos anschauen" -#: ../melon/playlist/__init__.py:113 +#: ../melon/playlist/__init__.py:102 msgid "Set as playlist thumbnail" msgstr "" -#: ../melon/playlist/__init__.py:121 +#: ../melon/playlist/__init__.py:110 msgid "Remove from playlist" msgstr "" -#: ../melon/playlist/__init__.py:214 +#: ../melon/playlist/__init__.py:203 msgid "Edit Playlist" msgstr "Wiedergabeliste bearbeiten" -#: ../melon/playlist/__init__.py:220 +#: ../melon/playlist/__init__.py:209 msgid "Playlist details" msgstr "Wiedergabelistendetails" -#: ../melon/playlist/__init__.py:221 +#: ../melon/playlist/__init__.py:210 msgid "Change playlist information" msgstr "Wiedergabelistendetails ändern" -#: ../melon/playlist/__init__.py:223 ../melon/playlist/create.py:43 +#: ../melon/playlist/__init__.py:212 ../melon/playlist/create.py:38 msgid "Playlist name" msgstr "Name der Wiedergabeliste" -#: ../melon/playlist/__init__.py:226 ../melon/playlist/create.py:46 +#: ../melon/playlist/__init__.py:215 ../melon/playlist/create.py:41 msgid "Playlist description" msgstr "Beschreibung der Wiedergabeliste" -#: ../melon/playlist/__init__.py:231 +#: ../melon/playlist/__init__.py:220 msgid "Save details" msgstr "Details speichern" -#: ../melon/playlist/__init__.py:233 +#: ../melon/playlist/__init__.py:222 msgid "Change playlist title and description. (Closes the dialog)" msgstr "" "Titel und Beschreibung der Wiedergabeliste ändern. (Schließt den Dialog)" -#: ../melon/playlist/__init__.py:244 +#: ../melon/playlist/__init__.py:233 msgid "Delete Playlist" msgstr "Wiedergabeliste löschen" -#: ../melon/playlist/__init__.py:246 +#: ../melon/playlist/__init__.py:235 msgid "Delete this playlist and it's content. This can NOT be undone." msgstr "" "Diese Wiedergabeliste und ihren Inhalt löschen. Diese Aktion kann nicht " "rückgängig gemacht werden." -#: ../melon/playlist/__init__.py:259 +#: ../melon/playlist/__init__.py:248 msgid "Close" msgstr "Schließen" -#: ../melon/playlist/__init__.py:261 +#: ../melon/playlist/__init__.py:250 msgid "Close without changing anything" msgstr "" -#: ../melon/playlist/__init__.py:290 +#: ../melon/playlist/__init__.py:279 msgid "Delete Playlist?" msgstr "" -#: ../melon/playlist/__init__.py:291 +#: ../melon/playlist/__init__.py:280 msgid "Do you really want to delete this playlist? This can not be undone." msgstr "" -#: ../melon/playlist/__init__.py:293 ../melon/playlist/create.py:54 -#: ../melon/playlist/create.py:109 ../melon/playlist/pick.py:88 -#: ../melon/playlist/pick.py:126 ../melon/widgets/preferencerow.py:181 -#: ../melon/widgets/preferencerow.py:220 +#: ../melon/playlist/__init__.py:282 ../melon/playlist/create.py:49 +#: ../melon/playlist/create.py:104 ../melon/playlist/pick.py:82 +#: ../melon/playlist/pick.py:120 ../melon/widgets/preferencerow.py:175 +#: ../melon/widgets/preferencerow.py:214 msgid "Cancel" msgstr "Abbruch" -#: ../melon/playlist/__init__.py:295 ../melon/widgets/preferencerow.py:222 +#: ../melon/playlist/__init__.py:284 ../melon/widgets/preferencerow.py:216 msgid "Delete" msgstr "Löschen" -#: ../melon/playlist/create.py:25 ../melon/playlist/pick.py:35 +#: ../melon/playlist/create.py:20 ../melon/playlist/pick.py:28 msgid "Video" msgstr "Video" -#: ../melon/playlist/create.py:27 +#: ../melon/playlist/create.py:22 msgid "The following video will be added to the new playlist" msgstr "Das folgende Video wird zu der neuen Wiedergabeliste hinzugefügt" -#: ../melon/playlist/create.py:39 ../melon/playlist/create.py:125 +#: ../melon/playlist/create.py:34 ../melon/playlist/create.py:120 msgid "New Playlist" msgstr "Neue Wiedergabeliste" -#: ../melon/playlist/create.py:40 +#: ../melon/playlist/create.py:35 msgid "Enter more playlist information" msgstr "Gibt weitere Wiedergabelistendetails an" -#: ../melon/playlist/create.py:44 +#: ../melon/playlist/create.py:39 msgid "Unnamed Playlist" msgstr "Unbenannte Wiedergabeliste" -#: ../melon/playlist/create.py:54 ../melon/playlist/create.py:109 -#: ../melon/playlist/pick.py:88 ../melon/playlist/pick.py:126 +#: ../melon/playlist/create.py:49 ../melon/playlist/create.py:104 +#: ../melon/playlist/pick.py:82 ../melon/playlist/pick.py:120 msgid "Do not create playlist" msgstr "Wiedergabeliste nicht erstellen" -#: ../melon/playlist/create.py:57 ../melon/widgets/preferencerow.py:184 +#: ../melon/playlist/create.py:52 ../melon/widgets/preferencerow.py:178 msgid "Create" msgstr "Erstellen" -#: ../melon/playlist/create.py:57 +#: ../melon/playlist/create.py:52 msgid "Create playlist" msgstr "Wiedergabeliste erstellen" -#: ../melon/playlist/pick.py:37 +#: ../melon/playlist/pick.py:30 msgid "The following video will be added to the playlist" msgstr "Das folgende Video wird zur Wiedergabeliste hinzugefügt" -#: ../melon/playlist/pick.py:50 ../melon/widgets/feeditem.py:154 +#: ../melon/playlist/pick.py:43 ../melon/widgets/feeditem.py:147 msgid "Add to playlist" msgstr "Zur Wiedergabeliste hinzufügen" -#: ../melon/playlist/pick.py:53 +#: ../melon/playlist/pick.py:46 msgid "" "Choose a playlist to add the video to. Note that you can only add videos to " "local playlists, not external bookmarked ones" @@ -568,42 +568,42 @@ msgstr "" "Wähle die Wiedergabeliste, zu der das Video hinzugefügt werden soll. (Du " "kannst Videos nur zu lokalen Wiedergabelisten hinzufügen, nicht in gemerkte)" -#: ../melon/playlist/pick.py:57 +#: ../melon/playlist/pick.py:50 msgid "Create new playlist" msgstr "Neue Wiedergabeliste erstellen" -#: ../melon/playlist/pick.py:58 +#: ../melon/playlist/pick.py:51 msgid "Create a new playlist and add the video to it" msgstr "Neue Wiedergabeliste erstellen und Video hinzufügen" -#: ../melon/playlist/pick.py:142 +#: ../melon/playlist/pick.py:136 msgid "Add to Playlist" msgstr "Zur Wiedergabeliste hinzufügen" -#: ../melon/servers/invidious/__init__.py:35 +#: ../melon/servers/invidious/__init__.py:29 msgid "Open source alternative front-end to YouTube" msgstr "Quelloffenes alternatives Frontend für YouTube" -#: ../melon/servers/invidious/__init__.py:40 +#: ../melon/servers/invidious/__init__.py:34 msgid "Instance" msgstr "Instanz" -#: ../melon/servers/invidious/__init__.py:42 +#: ../melon/servers/invidious/__init__.py:36 msgid "" "See https://docs.invidious.io/instances/ for a list of available instances" msgstr "" "Auf https://docs.invidious.io/instances/ kannst du eine liste verfügbarer " "Instanzen finden" -#: ../melon/servers/invidious/__init__.py:55 +#: ../melon/servers/invidious/__init__.py:49 msgid "Trending" msgstr "Trends" -#: ../melon/servers/invidious/__init__.py:56 +#: ../melon/servers/invidious/__init__.py:50 msgid "Popular" msgstr "Beliebt" -#: ../melon/servers/nebula/__init__.py:21 +#: ../melon/servers/nebula/__init__.py:18 msgid "" "Home of smart, thoughtful videos, podcasts, and classes from your favorite " "creators" @@ -611,32 +611,32 @@ msgstr "" "Zu Hause von intelligenten, durchdachten Videos, Podcasts und Kursen von " "deinen Lieblingskanälen" -#: ../melon/servers/nebula/__init__.py:27 +#: ../melon/servers/nebula/__init__.py:24 msgid "Email Address" msgstr "E-Mail-Adresse" -#: ../melon/servers/nebula/__init__.py:28 +#: ../melon/servers/nebula/__init__.py:25 msgid "Email Address to login to your account" msgstr "E-Mail-Adresse zur Anmeldung mit deinem Konto" -#: ../melon/servers/nebula/__init__.py:35 +#: ../melon/servers/nebula/__init__.py:32 msgid "Password" msgstr "Passwort" -#: ../melon/servers/nebula/__init__.py:36 +#: ../melon/servers/nebula/__init__.py:33 msgid "Password associated with your account" msgstr "Passwort zur Anmeldung mit deinem Konto" -#: ../melon/servers/peertube/__init__.py:16 +#: ../melon/servers/peertube/__init__.py:12 msgid "Decentralized video hosting network, based on free/libre software" msgstr "" "Dezentralisiertes Video-Hosting-Netzwerk, basierend auf freier/libre Software" -#: ../melon/servers/peertube/__init__.py:21 +#: ../melon/servers/peertube/__init__.py:17 msgid "Instances" msgstr "Instanzen" -#: ../melon/servers/peertube/__init__.py:23 +#: ../melon/servers/peertube/__init__.py:19 msgid "" "List of peertube instances, from which to fetch content. See https://" "joinpeertube.org/instances" @@ -644,32 +644,32 @@ msgstr "" "Liste von PeerTube Instanzen, von denen Inhalte geladen werden sollen. Siehe " "https://joinpeertube.org/instances" -#: ../melon/servers/peertube/__init__.py:31 +#: ../melon/servers/peertube/__init__.py:27 msgid "Show NSFW content" msgstr "NSFW Inhalte anzeigen" -#: ../melon/servers/peertube/__init__.py:32 +#: ../melon/servers/peertube/__init__.py:28 #, fuzzy msgid "Passes the nsfw filter to the peertube search API" msgstr "Gibt den NSFW Filter an die PeerTube Such-API weiter" -#: ../melon/servers/peertube/__init__.py:39 +#: ../melon/servers/peertube/__init__.py:35 msgid "Enable Federation" msgstr "" -#: ../melon/servers/peertube/__init__.py:40 +#: ../melon/servers/peertube/__init__.py:36 msgid "Returns content from federated instances instead of only local content" msgstr "" -#: ../melon/servers/peertube/__init__.py:65 +#: ../melon/servers/peertube/__init__.py:61 msgid "Latest" msgstr "Neuste" -#: ../melon/settings/__init__.py:23 +#: ../melon/settings/__init__.py:18 msgid "Show Previews when browsing public feeds (incl. search)" msgstr "Vorschaubilder für externe Inhalte anzeigen" -#: ../melon/settings/__init__.py:25 +#: ../melon/settings/__init__.py:20 msgid "" "Set to true to show previews when viewing channel contents, public feeds and " "searching" @@ -677,11 +677,11 @@ msgstr "" "Aktiviert Vorschaubilder beim Durchsuchen von Diensten, Ansehen von Kanälen " "und Wiedergabelisten" -#: ../melon/settings/__init__.py:34 +#: ../melon/settings/__init__.py:29 msgid "Show Previews in local feeds" msgstr "Vorschaubilder für lokale Inhalte anzeigen" -#: ../melon/settings/__init__.py:36 +#: ../melon/settings/__init__.py:31 msgid "" "Set to true to show previews in the new feed, for subscribed channels, and " "saved playlists" @@ -689,12 +689,12 @@ msgstr "" "Aktiviert Vorschaubilder im Neues Tab, im Kanäle Tab und für selbst " "erstellte Wiedergabelisten" -#: ../melon/settings/__init__.py:44 +#: ../melon/settings/__init__.py:39 #, fuzzy msgid "Show servers that may contain nsfw content" msgstr "Dienste anzeigen, die teilweise NSFW Inhalte enthalten" -#: ../melon/settings/__init__.py:46 +#: ../melon/settings/__init__.py:41 #, fuzzy msgid "" "Lists/Delists servers in the browse servers list, if they contain some nsfw " @@ -702,12 +702,12 @@ msgid "" msgstr "" "Zeige Dienste, die vereinzelt NSFW Inhalte beinhalten, beim Durchsuchen an" -#: ../melon/settings/__init__.py:54 +#: ../melon/settings/__init__.py:49 #, fuzzy msgid "Show servers that only contain nsfw content" msgstr "Dienste anzeigen, die ausschließlich NSFW Inhalte enthalten" -#: ../melon/settings/__init__.py:56 +#: ../melon/settings/__init__.py:51 #, fuzzy msgid "" "Lists/Delists servers in the browse servers list, if they contain only/" @@ -715,139 +715,139 @@ msgid "" msgstr "" "Zeige Dienste, die (fast) nur NSFW Inhalte beinhalten, beim Durchsuchen an" -#: ../melon/settings/__init__.py:64 +#: ../melon/settings/__init__.py:59 msgid "Show servers that require login" msgstr "Dienste anzeigen, die ein Konto benötigen" -#: ../melon/settings/__init__.py:66 +#: ../melon/settings/__init__.py:61 msgid "" "Lists/Delists servers in the browse servers list, if they require login to " "function" msgstr "Zeige Dienste, für die du einen Account brauchst, beim Durchsuchen an" -#: ../melon/settings/__init__.py:74 +#: ../melon/settings/__init__.py:69 msgid "Use GPU acceleration for video player if available" msgstr "" -#: ../melon/settings/__init__.py:75 +#: ../melon/settings/__init__.py:70 msgid "Disable this if the video player doesn't work" msgstr "" -#: ../melon/settings/__init__.py:86 +#: ../melon/settings/__init__.py:81 msgid "Settings" msgstr "Einstellungen" -#: ../melon/settings/__init__.py:99 +#: ../melon/settings/__init__.py:94 msgid "General" msgstr "Allgemein" -#: ../melon/settings/__init__.py:100 +#: ../melon/settings/__init__.py:95 msgid "Global app settings" msgstr "Globale App Einstellungen" -#: ../melon/settings/__init__.py:124 +#: ../melon/settings/__init__.py:119 msgid "Enable Server" msgstr "Dienst aktivieren" -#: ../melon/settings/__init__.py:126 +#: ../melon/settings/__init__.py:121 msgid "" "Disabled servers won't show up in the browser or on the local/home screen" msgstr "" "Deaktivierte Dienste werden beim Durchsuchen und auf dem Startbildschirm " "nicht angezeigt" -#: ../melon/widgets/feeditem.py:148 +#: ../melon/widgets/feeditem.py:141 msgid "Watch now" msgstr "" -#: ../melon/widgets/feeditem.py:161 +#: ../melon/widgets/feeditem.py:154 msgid "Open in browser" msgstr "" -#: ../melon/widgets/feeditem.py:165 +#: ../melon/widgets/feeditem.py:158 msgid "View channel" msgstr "" -#: ../melon/widgets/player.py:136 +#: ../melon/widgets/player.py:125 msgid "No streams available" msgstr "" -#: ../melon/widgets/player.py:198 +#: ../melon/widgets/player.py:187 msgid "Toggle floating window" msgstr "" -#: ../melon/widgets/player.py:204 +#: ../melon/widgets/player.py:193 msgid "Toggle fullscreen" msgstr "" -#: ../melon/widgets/player.py:226 ../melon/widgets/player.py:613 -#: ../melon/widgets/player.py:622 +#: ../melon/widgets/player.py:215 ../melon/widgets/player.py:602 +#: ../melon/widgets/player.py:611 msgid "Play" msgstr "" -#: ../melon/widgets/player.py:253 +#: ../melon/widgets/player.py:242 msgid "Stream options" msgstr "" -#: ../melon/widgets/player.py:483 +#: ../melon/widgets/player.py:472 msgid "Resolution" msgstr "Auflösung" -#: ../melon/widgets/player.py:604 +#: ../melon/widgets/player.py:593 msgid "Pause" msgstr "Pause" -#: ../melon/widgets/player.py:642 +#: ../melon/widgets/player.py:631 msgid "The video is playing in separate window" msgstr "Dieses Video spielt in einem separaten Fenster" -#: ../melon/widgets/player.py:779 +#: ../melon/widgets/player.py:768 msgid "Player" msgstr "" -#: ../melon/widgets/preferencerow.py:125 +#: ../melon/widgets/preferencerow.py:119 msgid "Add" msgstr "Hinzufügen" -#: ../melon/widgets/preferencerow.py:139 +#: ../melon/widgets/preferencerow.py:133 msgid "Move up" msgstr "Nach oben verschieben" -#: ../melon/widgets/preferencerow.py:147 +#: ../melon/widgets/preferencerow.py:141 msgid "Move down" msgstr "Nach unten verschieben" -#: ../melon/widgets/preferencerow.py:153 +#: ../melon/widgets/preferencerow.py:147 msgid "Remove from list" msgstr "Von der Liste entfernen" -#: ../melon/widgets/preferencerow.py:168 +#: ../melon/widgets/preferencerow.py:162 msgid "Add Item" msgstr "Eintrag hinzufügen" -#: ../melon/widgets/preferencerow.py:171 +#: ../melon/widgets/preferencerow.py:165 msgid "Create a new list entry" msgstr "Neuen Listeneintrag erstellen" -#: ../melon/widgets/preferencerow.py:172 +#: ../melon/widgets/preferencerow.py:166 msgid "Enter the new value here" msgstr "Gibt den neuen Wert hier ein" -#: ../melon/widgets/preferencerow.py:175 +#: ../melon/widgets/preferencerow.py:169 msgid "Value" msgstr "Wert" -#: ../melon/widgets/preferencerow.py:215 +#: ../melon/widgets/preferencerow.py:209 msgid "Delete Item?" msgstr "" -#: ../melon/widgets/preferencerow.py:217 +#: ../melon/widgets/preferencerow.py:211 msgid "" "Do you really want to delete this item? You won't be able to restore it " "afterwards" msgstr "" -#: ../melon/window.py:93 +#: ../melon/window.py:86 msgid "Stream videos on the go" msgstr "Videos unterwegs streamen" diff --git a/po/fa.po b/po/fa.po index b94b78d..59f1d92 100644 --- a/po/fa.po +++ b/po/fa.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Melon 0.1.2\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-15 12:29+0200\n" +"POT-Creation-Date: 2024-08-15 13:53+0200\n" "PO-Revision-Date: 2024-05-30 09:18+0000\n" "Last-Translator: sohrabbehdani \n" @@ -92,472 +92,472 @@ msgid "" msgstr "" "صفحه ویدیو، با یک پخش‌کننده ویدیو در بالا، اطلاعات ویدیو و دکمه نشانک‌گذاری" -#: ../melon/browse/__init__.py:20 ../melon/browse/search.py:66 -#: ../melon/browse/server.py:115 ../melon/browse/server.py:143 -#: ../melon/home/history.py:25 ../melon/home/new.py:36 -#: ../melon/home/playlists.py:23 ../melon/home/subs.py:22 -#: ../melon/importer.py:63 ../melon/player/__init__.py:113 -#: ../melon/player/playlist.py:164 ../melon/player/playlist.py:171 -#: ../melon/playlist/__init__.py:82 ../melon/playlist/create.py:104 -#: ../melon/playlist/pick.py:121 +#: ../melon/browse/__init__.py:16 ../melon/browse/search.py:62 +#: ../melon/browse/server.py:110 ../melon/browse/server.py:138 +#: ../melon/home/history.py:21 ../melon/home/new.py:31 +#: ../melon/home/playlists.py:19 ../melon/home/subs.py:18 +#: ../melon/importer.py:59 ../melon/player/__init__.py:104 +#: ../melon/player/playlist.py:150 ../melon/player/playlist.py:157 +#: ../melon/playlist/__init__.py:69 ../melon/playlist/create.py:99 +#: ../melon/playlist/pick.py:115 #, fuzzy msgid "*crickets chirping*" msgstr "*جیرجیرک جیرجیرک*" -#: ../melon/browse/__init__.py:21 +#: ../melon/browse/__init__.py:17 msgid "There are no available servers" msgstr "" -#: ../melon/browse/__init__.py:24 ../melon/browse/search.py:72 -#: ../melon/importer.py:67 +#: ../melon/browse/__init__.py:20 ../melon/browse/search.py:68 +#: ../melon/importer.py:63 msgid "Enable servers in the settings menu" msgstr "فعال کردن کارساز در منوی تنظیمات" -#: ../melon/browse/__init__.py:33 +#: ../melon/browse/__init__.py:29 msgid "Available Servers" msgstr "کارساز های موجود" -#: ../melon/browse/__init__.py:35 +#: ../melon/browse/__init__.py:31 msgid "You can enable/disable and filter servers in the settings menu" msgstr "شما می‌توانید کارسازها را در تنظیمات فعال/غیرفعال و پالایش کنید." -#: ../melon/browse/__init__.py:56 +#: ../melon/browse/__init__.py:52 msgid "Servers" msgstr "کارسازها" -#: ../melon/browse/__init__.py:64 ../melon/browse/search.py:126 +#: ../melon/browse/__init__.py:60 ../melon/browse/search.py:122 msgid "Global Search" msgstr "جستجو سراسری" -#: ../melon/browse/channel.py:104 +#: ../melon/browse/channel.py:98 msgid "Subscribe to channel" msgstr "مشترک کانال شوید" -#: ../melon/browse/channel.py:105 +#: ../melon/browse/channel.py:99 msgid "Add latest uploads to home feed" msgstr "افزودن آخرین بارگذاری‌ها به صفحه‌خانه" -#: ../melon/browse/channel.py:117 +#: ../melon/browse/channel.py:111 msgid "Channel feed" msgstr "خوراک کانال" -#: ../melon/browse/channel.py:118 +#: ../melon/browse/channel.py:112 msgid "This channel provides multiple feeds, choose which one to view" msgstr "" -#: ../melon/browse/channel.py:170 +#: ../melon/browse/channel.py:164 msgid "Channel" msgstr "کانال" -#: ../melon/browse/playlist.py:48 ../melon/playlist/__init__.py:74 +#: ../melon/browse/playlist.py:42 ../melon/playlist/__init__.py:61 msgid "Start playing" msgstr "شروع به پخش کردن" -#: ../melon/browse/playlist.py:69 ../melon/player/__init__.py:53 +#: ../melon/browse/playlist.py:63 ../melon/player/__init__.py:44 msgid "Bookmark" msgstr "نشانک گذاری" -#: ../melon/browse/playlist.py:70 +#: ../melon/browse/playlist.py:64 msgid "Add Playlist to your local playlist collection" msgstr "افزودن این لیست‌پخش به مجموعه لیست‌پخش های محلی" -#: ../melon/browse/playlist.py:124 +#: ../melon/browse/playlist.py:118 msgid "Playlist" msgstr "سیاهه‌ٔ پخش" -#: ../melon/browse/search.py:49 +#: ../melon/browse/search.py:45 msgid "No results" msgstr "بدون نتیجه" -#: ../melon/browse/search.py:52 +#: ../melon/browse/search.py:48 #, python-brace-format msgid "{count} result" msgid_plural "{count} results" msgstr[0] "" msgstr[1] "" -#: ../melon/browse/search.py:68 +#: ../melon/browse/search.py:64 msgid "There are no available servers, a search would yield no results" msgstr "" -#: ../melon/browse/search.py:96 ../melon/browse/server.py:47 +#: ../melon/browse/search.py:92 ../melon/browse/server.py:42 msgid "Any" msgstr "همه" -#: ../melon/browse/search.py:100 ../melon/browse/server.py:51 +#: ../melon/browse/search.py:96 ../melon/browse/server.py:46 msgid "Channels" msgstr "کانال‌ها" -#: ../melon/browse/search.py:105 ../melon/browse/server.py:56 -#: ../melon/home/playlists.py:34 ../melon/home/playlists.py:78 -#: ../melon/servers/nebula/__init__.py:206 -#: ../melon/servers/peertube/__init__.py:213 +#: ../melon/browse/search.py:101 ../melon/browse/server.py:51 +#: ../melon/home/playlists.py:30 ../melon/home/playlists.py:74 +#: ../melon/servers/nebula/__init__.py:203 +#: ../melon/servers/peertube/__init__.py:209 msgid "Playlists" msgstr "سیاههٔ پخش" -#: ../melon/browse/search.py:110 ../melon/browse/server.py:61 -#: ../melon/servers/nebula/__init__.py:200 -#: ../melon/servers/peertube/__init__.py:213 -#: ../melon/servers/peertube/__init__.py:214 +#: ../melon/browse/search.py:106 ../melon/browse/server.py:56 +#: ../melon/servers/nebula/__init__.py:197 +#: ../melon/servers/peertube/__init__.py:209 +#: ../melon/servers/peertube/__init__.py:210 msgid "Videos" msgstr "ویدیوها" -#: ../melon/browse/server.py:26 +#: ../melon/browse/server.py:21 msgid "Search" msgstr "جست‌وجو" -#: ../melon/browse/server.py:116 +#: ../melon/browse/server.py:111 msgid "Try searching for a term" msgstr "" -#: ../melon/browse/server.py:118 +#: ../melon/browse/server.py:113 msgid "Try using a different query" msgstr "" -#: ../melon/browse/server.py:144 +#: ../melon/browse/server.py:139 msgid "This feed is empty" msgstr "" -#: ../melon/home/__init__.py:20 +#: ../melon/home/__init__.py:15 msgid "Home" msgstr "خانه" -#: ../melon/home/__init__.py:41 ../melon/home/history.py:28 -#: ../melon/home/new.py:49 ../melon/home/subs.py:25 +#: ../melon/home/__init__.py:36 ../melon/home/history.py:24 +#: ../melon/home/new.py:44 ../melon/home/subs.py:21 msgid "Browse Servers" msgstr "جستجو در کارساز ها" -#: ../melon/home/__init__.py:48 +#: ../melon/home/__init__.py:43 msgid "Preferences" msgstr "تنظیمات" -#: ../melon/home/__init__.py:49 +#: ../melon/home/__init__.py:44 msgid "Import Data" msgstr "وارد کردن دیتا" -#: ../melon/home/__init__.py:50 +#: ../melon/home/__init__.py:45 msgid "About Melon" msgstr "درباره Melon" -#: ../melon/home/history.py:26 +#: ../melon/home/history.py:22 msgid "You haven't watched any videos yet" msgstr "" -#: ../melon/home/history.py:38 ../melon/home/history.py:125 +#: ../melon/home/history.py:34 ../melon/home/history.py:121 msgid "History" msgstr "تاریخچه" -#: ../melon/home/history.py:39 +#: ../melon/home/history.py:35 msgid "These are the videos you opened in the past" msgstr "" -#: ../melon/home/history.py:83 +#: ../melon/home/history.py:79 msgid "Show more" msgstr "نمایش بیشتر" -#: ../melon/home/history.py:84 +#: ../melon/home/history.py:80 msgid "Load older videos" msgstr "دریافت ویدئوهای قدیمی‌تر" -#: ../melon/home/new.py:30 +#: ../melon/home/new.py:25 msgid "Refresh" msgstr "بازخوانی" -#: ../melon/home/new.py:40 +#: ../melon/home/new.py:35 msgid "Subscribe to a channel first, to view new uploads" msgstr "برای تماشای محتوای بارگذاری جدید، در کانال‌ها مشترک شوید." -#: ../melon/home/new.py:45 +#: ../melon/home/new.py:40 msgid "The channels you are subscribed to haven't uploaded anything yet" msgstr "کانالی که مشترک آن شدید هیچ محتوای بارگذاری شده ای ندارد" -#: ../melon/home/new.py:68 +#: ../melon/home/new.py:63 #, python-brace-format msgid "(Last refresh: {last_refresh})" msgstr "(آخرین بازخوانی: {last_refresh})" -#: ../melon/home/new.py:72 ../melon/home/new.py:172 +#: ../melon/home/new.py:67 ../melon/home/new.py:167 msgid "What's new" msgstr "چه چیزی جدید است؟" -#: ../melon/home/new.py:74 +#: ../melon/home/new.py:69 msgid "These are the latest videos of channels you follow" msgstr "" -#: ../melon/home/new.py:162 +#: ../melon/home/new.py:157 msgid "Pick up where you left off" msgstr "" -#: ../melon/home/new.py:163 +#: ../melon/home/new.py:158 msgid "Watch" msgstr "تماشا" -#: ../melon/home/playlists.py:24 +#: ../melon/home/playlists.py:20 msgid "You don't have any playlists yet" msgstr "شما هنوز هیچ سیاههٔ پخشی ندارید." -#: ../melon/home/playlists.py:26 ../melon/home/playlists.py:39 +#: ../melon/home/playlists.py:22 ../melon/home/playlists.py:35 msgid "Create a new playlist" msgstr "ایجاد یک لیست‌پخش جدید" -#: ../melon/home/playlists.py:36 +#: ../melon/home/playlists.py:32 msgid "Here are playlists you've bookmarked or created yourself" msgstr "اینها لیست پخش هایی هستند که توسط شما نشانه‌گذاری و یا ایجاد شده‌اند." -#: ../melon/home/playlists.py:39 +#: ../melon/home/playlists.py:35 msgid "New" msgstr "جدید" -#: ../melon/home/subs.py:23 +#: ../melon/home/subs.py:19 msgid "You aren't yet subscribed to channels" msgstr "شما مشترک هیچ کانالی نیستید" -#: ../melon/home/subs.py:33 ../melon/home/subs.py:68 +#: ../melon/home/subs.py:29 ../melon/home/subs.py:64 msgid "Subscriptions" msgstr "اشتراک‌ها" -#: ../melon/home/subs.py:34 +#: ../melon/home/subs.py:30 msgid "You are subscribed to the following channels" msgstr "شما در کانال‌های زیر مشترک هستید" -#: ../melon/import_providers/newpipe.py:42 +#: ../melon/import_providers/newpipe.py:40 msgid "Newpipe Database importer" msgstr "درون‌ریز پایگاه‌دادهٔ نیوپایپ" -#: ../melon/import_providers/newpipe.py:44 +#: ../melon/import_providers/newpipe.py:42 msgid "" "Import the .db file from inside the newpipe .zip export (as invidious " "content)" msgstr "" "درون‌ریزی پروندهٔ ‪.db‬ از داخل خروجی ‬‪.zip‬ نیوپایپ (به عنوان محتوای اینویدیوس)" -#: ../melon/import_providers/newpipe.py:46 +#: ../melon/import_providers/newpipe.py:44 msgid "Select .db file" msgstr "انتخاب فایل .db" -#: ../melon/import_providers/newpipe.py:60 +#: ../melon/import_providers/newpipe.py:58 msgid "Newpipe Database" msgstr "پایگاه‌دادهٔ نیوپایپ" -#: ../melon/importer.py:19 ../melon/importer.py:37 +#: ../melon/importer.py:15 ../melon/importer.py:33 msgid "Import" msgstr "واردکردن" -#: ../melon/importer.py:38 +#: ../melon/importer.py:34 msgid "The following import methods have been found" msgstr "روش های واردکردن پیدا شدند" -#: ../melon/importer.py:64 +#: ../melon/importer.py:60 msgid "There are no available importer methods" msgstr "" -#: ../melon/player/__init__.py:41 +#: ../melon/player/__init__.py:32 msgid "Description" msgstr "توضیحات" -#: ../melon/player/__init__.py:54 +#: ../melon/player/__init__.py:45 msgid "Add this video to a playlist" msgstr "افزودن این ویدئو به لیست‌پخش" -#: ../melon/player/__init__.py:114 ../melon/playlist/create.py:105 -#: ../melon/playlist/pick.py:122 +#: ../melon/player/__init__.py:105 ../melon/playlist/create.py:100 +#: ../melon/playlist/pick.py:116 msgid "Video could not be loaded" msgstr "" -#: ../melon/player/__init__.py:152 ../melon/player/__init__.py:186 -#: ../melon/player/playlist.py:57 +#: ../melon/player/__init__.py:143 ../melon/player/__init__.py:177 +#: ../melon/player/playlist.py:43 msgid "Loading..." msgstr "در حال بارکردن..." -#: ../melon/player/playlist.py:165 +#: ../melon/player/playlist.py:151 msgid "This playlist is empty" msgstr "" -#: ../melon/player/playlist.py:172 +#: ../melon/player/playlist.py:158 msgid "There was an error loading the playlist" msgstr "" -#: ../melon/player/playlist.py:225 +#: ../melon/player/playlist.py:211 msgid "Previous" msgstr "قبلی" -#: ../melon/player/playlist.py:227 +#: ../melon/player/playlist.py:213 msgid "Play video that comes before this one in the playlist" msgstr "" -#: ../melon/player/playlist.py:244 +#: ../melon/player/playlist.py:230 msgid "Next" msgstr "بعدی" -#: ../melon/player/playlist.py:246 +#: ../melon/player/playlist.py:232 msgid "Play video that comes after this one in the playlist" msgstr "ویدیو بعد از این را که در سیاههٔ‌پخش وجود دارد پخش کن." -#: ../melon/player/playlist.py:258 +#: ../melon/player/playlist.py:244 msgid "Skip" msgstr "ردکردن" -#: ../melon/player/playlist.py:259 +#: ../melon/player/playlist.py:245 msgid "Skip this video and pick a new one at random" msgstr "رد کردن این ویدئو و انتخاب یک عدد به صورت تصادفی" -#: ../melon/player/playlist.py:270 +#: ../melon/player/playlist.py:256 msgid "Shuffle" msgstr "مخلوط" -#: ../melon/player/playlist.py:271 +#: ../melon/player/playlist.py:257 msgid "Chooses the next video at random" msgstr "انتخاب ویدئو بعدی به صورت تصادفی" -#: ../melon/player/playlist.py:282 +#: ../melon/player/playlist.py:268 msgid "Repeat current video" msgstr "بازپخش این ویدئو" -#: ../melon/player/playlist.py:283 +#: ../melon/player/playlist.py:269 msgid "Puts this video on loop" msgstr "ویدئو را در حلقه قرار دهید." -#: ../melon/player/playlist.py:298 +#: ../melon/player/playlist.py:284 msgid "Repeat playlist" msgstr "بازپخش لیست‌پخش" -#: ../melon/player/playlist.py:300 +#: ../melon/player/playlist.py:286 msgid "Start playling the playlist from the beginning after reaching the end" msgstr "" -#: ../melon/player/playlist.py:312 +#: ../melon/player/playlist.py:298 msgid "Playlist Content" msgstr "محتوای سیاههٔ‌پخش" -#: ../melon/player/playlist.py:314 +#: ../melon/player/playlist.py:300 msgid "Click on videos to continue playing the playlist from there" msgstr "بر روی ویدئو ضربه بزنید تا پخش از لیست پخش از آن ویدئو ادامه پیدا کند." -#: ../melon/playlist/__init__.py:70 +#: ../melon/playlist/__init__.py:57 msgid "Edit" msgstr "ویرایش" -#: ../melon/playlist/__init__.py:84 +#: ../melon/playlist/__init__.py:71 msgid "You haven't added any videos to this playlist yet" msgstr "" -#: ../melon/playlist/__init__.py:87 +#: ../melon/playlist/__init__.py:74 msgid "Start watching" msgstr "شروع به تماشا کنید" -#: ../melon/playlist/__init__.py:113 +#: ../melon/playlist/__init__.py:102 msgid "Set as playlist thumbnail" msgstr "" -#: ../melon/playlist/__init__.py:121 +#: ../melon/playlist/__init__.py:110 msgid "Remove from playlist" msgstr "" -#: ../melon/playlist/__init__.py:214 +#: ../melon/playlist/__init__.py:203 msgid "Edit Playlist" msgstr "حذف لیست‌پخش" -#: ../melon/playlist/__init__.py:220 +#: ../melon/playlist/__init__.py:209 msgid "Playlist details" msgstr "جزئیات لیست‌پخش" -#: ../melon/playlist/__init__.py:221 +#: ../melon/playlist/__init__.py:210 msgid "Change playlist information" msgstr "تغییر اطلاعات لیست پخش" -#: ../melon/playlist/__init__.py:223 ../melon/playlist/create.py:43 +#: ../melon/playlist/__init__.py:212 ../melon/playlist/create.py:38 msgid "Playlist name" msgstr "نام لیست‌پخش" -#: ../melon/playlist/__init__.py:226 ../melon/playlist/create.py:46 +#: ../melon/playlist/__init__.py:215 ../melon/playlist/create.py:41 msgid "Playlist description" msgstr "اطلاعات سیاههٔ پخش" -#: ../melon/playlist/__init__.py:231 +#: ../melon/playlist/__init__.py:220 msgid "Save details" msgstr "ذخیره جزئیات" -#: ../melon/playlist/__init__.py:233 +#: ../melon/playlist/__init__.py:222 msgid "Change playlist title and description. (Closes the dialog)" msgstr "تغییر عنوان و توضیحات لیست پخش (این پنجره بسته می شود)" -#: ../melon/playlist/__init__.py:244 +#: ../melon/playlist/__init__.py:233 msgid "Delete Playlist" msgstr "حذف لیست پخش" -#: ../melon/playlist/__init__.py:246 +#: ../melon/playlist/__init__.py:235 msgid "Delete this playlist and it's content. This can NOT be undone." msgstr "این عملیات این لیست‌پخش و محتویات آن را حذف می‌کند و قابل بازگشت نیست." -#: ../melon/playlist/__init__.py:259 +#: ../melon/playlist/__init__.py:248 msgid "Close" msgstr "بستن" -#: ../melon/playlist/__init__.py:261 +#: ../melon/playlist/__init__.py:250 msgid "Close without changing anything" msgstr "بستن بدون تغییر دادن چیزی" -#: ../melon/playlist/__init__.py:290 +#: ../melon/playlist/__init__.py:279 msgid "Delete Playlist?" msgstr "" -#: ../melon/playlist/__init__.py:291 +#: ../melon/playlist/__init__.py:280 msgid "Do you really want to delete this playlist? This can not be undone." msgstr "" -#: ../melon/playlist/__init__.py:293 ../melon/playlist/create.py:54 -#: ../melon/playlist/create.py:109 ../melon/playlist/pick.py:88 -#: ../melon/playlist/pick.py:126 ../melon/widgets/preferencerow.py:181 -#: ../melon/widgets/preferencerow.py:220 +#: ../melon/playlist/__init__.py:282 ../melon/playlist/create.py:49 +#: ../melon/playlist/create.py:104 ../melon/playlist/pick.py:82 +#: ../melon/playlist/pick.py:120 ../melon/widgets/preferencerow.py:175 +#: ../melon/widgets/preferencerow.py:214 msgid "Cancel" msgstr "لغو" -#: ../melon/playlist/__init__.py:295 ../melon/widgets/preferencerow.py:222 +#: ../melon/playlist/__init__.py:284 ../melon/widgets/preferencerow.py:216 msgid "Delete" msgstr "حذف" -#: ../melon/playlist/create.py:25 ../melon/playlist/pick.py:35 +#: ../melon/playlist/create.py:20 ../melon/playlist/pick.py:28 msgid "Video" msgstr "ویدیو" -#: ../melon/playlist/create.py:27 +#: ../melon/playlist/create.py:22 msgid "The following video will be added to the new playlist" msgstr "" -#: ../melon/playlist/create.py:39 ../melon/playlist/create.py:125 +#: ../melon/playlist/create.py:34 ../melon/playlist/create.py:120 msgid "New Playlist" msgstr "سیاههٔ پخش جدید" -#: ../melon/playlist/create.py:40 +#: ../melon/playlist/create.py:35 msgid "Enter more playlist information" msgstr "وارد کردن توضیحات بیشتر برای لیست‌پخش" -#: ../melon/playlist/create.py:44 +#: ../melon/playlist/create.py:39 msgid "Unnamed Playlist" msgstr "سیاههٔ پخش بدون نام" -#: ../melon/playlist/create.py:54 ../melon/playlist/create.py:109 -#: ../melon/playlist/pick.py:88 ../melon/playlist/pick.py:126 +#: ../melon/playlist/create.py:49 ../melon/playlist/create.py:104 +#: ../melon/playlist/pick.py:82 ../melon/playlist/pick.py:120 msgid "Do not create playlist" msgstr "لیست پخش را ایجاد نکن." -#: ../melon/playlist/create.py:57 ../melon/widgets/preferencerow.py:184 +#: ../melon/playlist/create.py:52 ../melon/widgets/preferencerow.py:178 msgid "Create" msgstr "ایجاد" -#: ../melon/playlist/create.py:57 +#: ../melon/playlist/create.py:52 msgid "Create playlist" msgstr "ایجاد لیست‌پخش" -#: ../melon/playlist/pick.py:37 +#: ../melon/playlist/pick.py:30 msgid "The following video will be added to the playlist" msgstr "" -#: ../melon/playlist/pick.py:50 ../melon/widgets/feeditem.py:154 +#: ../melon/playlist/pick.py:43 ../melon/widgets/feeditem.py:147 msgid "Add to playlist" msgstr "افزودن به لیست‌پخش" -#: ../melon/playlist/pick.py:53 +#: ../melon/playlist/pick.py:46 msgid "" "Choose a playlist to add the video to. Note that you can only add videos to " "local playlists, not external bookmarked ones" @@ -566,73 +566,73 @@ msgstr "" "نکته: شما تنها می‌توانید ویدئو را به لیست پخش های محلی اضافه کنید، نه به " "نشانک گذاری شده های خارجی." -#: ../melon/playlist/pick.py:57 +#: ../melon/playlist/pick.py:50 msgid "Create new playlist" msgstr "ایجاد یک لیست‌پخش جدید" -#: ../melon/playlist/pick.py:58 +#: ../melon/playlist/pick.py:51 msgid "Create a new playlist and add the video to it" msgstr "ایجاد یک لیست‌پخش جدید و افزودن ویدئو به آن" -#: ../melon/playlist/pick.py:142 +#: ../melon/playlist/pick.py:136 msgid "Add to Playlist" msgstr "افزودن به لیست‌پخش" -#: ../melon/servers/invidious/__init__.py:35 +#: ../melon/servers/invidious/__init__.py:29 msgid "Open source alternative front-end to YouTube" msgstr "" -#: ../melon/servers/invidious/__init__.py:40 +#: ../melon/servers/invidious/__init__.py:34 msgid "Instance" msgstr "نمونه" -#: ../melon/servers/invidious/__init__.py:42 +#: ../melon/servers/invidious/__init__.py:36 msgid "" "See https://docs.invidious.io/instances/ for a list of available instances" msgstr "" "برای مشاهده لیستی از کارساز های موجود به https://docs.invidious.io/" "instances/ مراجعه کنید" -#: ../melon/servers/invidious/__init__.py:55 +#: ../melon/servers/invidious/__init__.py:49 msgid "Trending" msgstr "" -#: ../melon/servers/invidious/__init__.py:56 +#: ../melon/servers/invidious/__init__.py:50 msgid "Popular" msgstr "معروف" -#: ../melon/servers/nebula/__init__.py:21 +#: ../melon/servers/nebula/__init__.py:18 msgid "" "Home of smart, thoughtful videos, podcasts, and classes from your favorite " "creators" msgstr "" "خانه ویدیوها، پادکست‌ها و کلاس‌های هوشمند و متفکر از سازندگان مورد علاقه‌تان" -#: ../melon/servers/nebula/__init__.py:27 +#: ../melon/servers/nebula/__init__.py:24 msgid "Email Address" msgstr "آدرس رایانامه" -#: ../melon/servers/nebula/__init__.py:28 +#: ../melon/servers/nebula/__init__.py:25 msgid "Email Address to login to your account" msgstr "آدرس رایانامه برای ورود به حساب کاربری" -#: ../melon/servers/nebula/__init__.py:35 +#: ../melon/servers/nebula/__init__.py:32 msgid "Password" msgstr "" -#: ../melon/servers/nebula/__init__.py:36 +#: ../melon/servers/nebula/__init__.py:33 msgid "Password associated with your account" msgstr "" -#: ../melon/servers/peertube/__init__.py:16 +#: ../melon/servers/peertube/__init__.py:12 msgid "Decentralized video hosting network, based on free/libre software" msgstr "شبکه میزبانی ویدیو غیرمتمرکز، بر اساس نرم افزار رایگان/آزاد" -#: ../melon/servers/peertube/__init__.py:21 +#: ../melon/servers/peertube/__init__.py:17 msgid "Instances" msgstr "نمونه‌ها" -#: ../melon/servers/peertube/__init__.py:23 +#: ../melon/servers/peertube/__init__.py:19 msgid "" "List of peertube instances, from which to fetch content. See https://" "joinpeertube.org/instances" @@ -640,31 +640,31 @@ msgstr "" "فهرست نمونه‌های پیرتیوب که محتوا از آن‌ها واکشی می‌شود. این نشانی را ببینید: " "https://joinpeertube.org/instances" -#: ../melon/servers/peertube/__init__.py:31 +#: ../melon/servers/peertube/__init__.py:27 msgid "Show NSFW content" msgstr "نمایش محتوای nsfw" -#: ../melon/servers/peertube/__init__.py:32 +#: ../melon/servers/peertube/__init__.py:28 msgid "Passes the nsfw filter to the peertube search API" msgstr "" -#: ../melon/servers/peertube/__init__.py:39 +#: ../melon/servers/peertube/__init__.py:35 msgid "Enable Federation" msgstr "فعال کردن فدریشن" -#: ../melon/servers/peertube/__init__.py:40 +#: ../melon/servers/peertube/__init__.py:36 msgid "Returns content from federated instances instead of only local content" msgstr "محتوا را از کارساز های فدریتد بجای محلی نشان می‌دهد." -#: ../melon/servers/peertube/__init__.py:65 +#: ../melon/servers/peertube/__init__.py:61 msgid "Latest" msgstr "آخرین" -#: ../melon/settings/__init__.py:23 +#: ../melon/settings/__init__.py:18 msgid "Show Previews when browsing public feeds (incl. search)" msgstr "نمایش پیش نمایش ها هنگام مرور خوراک‌های عمومی (از جمله جستجو)" -#: ../melon/settings/__init__.py:25 +#: ../melon/settings/__init__.py:20 msgid "" "Set to true to show previews when viewing channel contents, public feeds and " "searching" @@ -672,11 +672,11 @@ msgstr "" "برای نمایش پیش نمایش ها هنگام مشاهده محتوای کانال، فیدهای عمومی و جستجو، روی " "بله تنظیم کنید" -#: ../melon/settings/__init__.py:34 +#: ../melon/settings/__init__.py:29 msgid "Show Previews in local feeds" msgstr "نمایش پیشنمایش ها در خوراک های محلی" -#: ../melon/settings/__init__.py:36 +#: ../melon/settings/__init__.py:31 msgid "" "Set to true to show previews in the new feed, for subscribed channels, and " "saved playlists" @@ -684,158 +684,158 @@ msgstr "" "برای نمایش پیش‌نمایش‌ها در فید جدید، برای کانال‌های مشترک و لیست‌های پخش " "ذخیره‌شده، روی بله تنظیم کنید" -#: ../melon/settings/__init__.py:44 +#: ../melon/settings/__init__.py:39 msgid "Show servers that may contain nsfw content" msgstr "نمایش کارساز هایی که ممکن است دارای محتوای NSFW باشد" -#: ../melon/settings/__init__.py:46 +#: ../melon/settings/__init__.py:41 msgid "" "Lists/Delists servers in the browse servers list, if they contain some nsfw " "content" msgstr "" -#: ../melon/settings/__init__.py:54 +#: ../melon/settings/__init__.py:49 msgid "Show servers that only contain nsfw content" msgstr "نمایش کارساز هایی که تنها دارای محتوای NSFW هستند" -#: ../melon/settings/__init__.py:56 +#: ../melon/settings/__init__.py:51 msgid "" "Lists/Delists servers in the browse servers list, if they contain only/" "mostly nsfw content" msgstr "" -#: ../melon/settings/__init__.py:64 +#: ../melon/settings/__init__.py:59 msgid "Show servers that require login" msgstr "نمایش کارساز هایی که به ورود احتیاج دارند" -#: ../melon/settings/__init__.py:66 +#: ../melon/settings/__init__.py:61 msgid "" "Lists/Delists servers in the browse servers list, if they require login to " "function" msgstr "" -#: ../melon/settings/__init__.py:74 +#: ../melon/settings/__init__.py:69 msgid "Use GPU acceleration for video player if available" msgstr "" -#: ../melon/settings/__init__.py:75 +#: ../melon/settings/__init__.py:70 msgid "Disable this if the video player doesn't work" msgstr "" -#: ../melon/settings/__init__.py:86 +#: ../melon/settings/__init__.py:81 msgid "Settings" msgstr "تنظیمات" -#: ../melon/settings/__init__.py:99 +#: ../melon/settings/__init__.py:94 msgid "General" msgstr "کلی" -#: ../melon/settings/__init__.py:100 +#: ../melon/settings/__init__.py:95 msgid "Global app settings" msgstr "تنظیمات کلی کاره" -#: ../melon/settings/__init__.py:124 +#: ../melon/settings/__init__.py:119 msgid "Enable Server" msgstr "فعال کردن کارساز" -#: ../melon/settings/__init__.py:126 +#: ../melon/settings/__init__.py:121 msgid "" "Disabled servers won't show up in the browser or on the local/home screen" msgstr "" "کارساز های غیرفعال شده دیگر به شما در بخش محلی و صفحه‌خانه نشان داده نمی‌شوند." -#: ../melon/widgets/feeditem.py:148 +#: ../melon/widgets/feeditem.py:141 msgid "Watch now" msgstr "" -#: ../melon/widgets/feeditem.py:161 +#: ../melon/widgets/feeditem.py:154 msgid "Open in browser" msgstr "" -#: ../melon/widgets/feeditem.py:165 +#: ../melon/widgets/feeditem.py:158 msgid "View channel" msgstr "" -#: ../melon/widgets/player.py:136 +#: ../melon/widgets/player.py:125 msgid "No streams available" msgstr "جریان پخشی موجود نیست" -#: ../melon/widgets/player.py:198 +#: ../melon/widgets/player.py:187 msgid "Toggle floating window" msgstr "" -#: ../melon/widgets/player.py:204 +#: ../melon/widgets/player.py:193 msgid "Toggle fullscreen" msgstr "" -#: ../melon/widgets/player.py:226 ../melon/widgets/player.py:613 -#: ../melon/widgets/player.py:622 +#: ../melon/widgets/player.py:215 ../melon/widgets/player.py:602 +#: ../melon/widgets/player.py:611 msgid "Play" msgstr "" -#: ../melon/widgets/player.py:253 +#: ../melon/widgets/player.py:242 msgid "Stream options" msgstr "تنظیمات استریم" -#: ../melon/widgets/player.py:483 +#: ../melon/widgets/player.py:472 msgid "Resolution" msgstr "وضوح" -#: ../melon/widgets/player.py:604 +#: ../melon/widgets/player.py:593 msgid "Pause" msgstr "" -#: ../melon/widgets/player.py:642 +#: ../melon/widgets/player.py:631 msgid "The video is playing in separate window" msgstr "" -#: ../melon/widgets/player.py:779 +#: ../melon/widgets/player.py:768 msgid "Player" msgstr "پخش‌کننده" -#: ../melon/widgets/preferencerow.py:125 +#: ../melon/widgets/preferencerow.py:119 msgid "Add" msgstr "افزودن" -#: ../melon/widgets/preferencerow.py:139 +#: ../melon/widgets/preferencerow.py:133 msgid "Move up" msgstr "انتقال به بالا" -#: ../melon/widgets/preferencerow.py:147 +#: ../melon/widgets/preferencerow.py:141 msgid "Move down" msgstr "انتقال به پایین" -#: ../melon/widgets/preferencerow.py:153 +#: ../melon/widgets/preferencerow.py:147 msgid "Remove from list" msgstr "حذف از لیست" -#: ../melon/widgets/preferencerow.py:168 +#: ../melon/widgets/preferencerow.py:162 msgid "Add Item" msgstr "افزودن مورد" -#: ../melon/widgets/preferencerow.py:171 +#: ../melon/widgets/preferencerow.py:165 msgid "Create a new list entry" msgstr "ایجاد یک ورودی لیست جدید" -#: ../melon/widgets/preferencerow.py:172 +#: ../melon/widgets/preferencerow.py:166 msgid "Enter the new value here" msgstr "مقادیر را اینجا وارد کنید." -#: ../melon/widgets/preferencerow.py:175 +#: ../melon/widgets/preferencerow.py:169 msgid "Value" msgstr "مقدار" -#: ../melon/widgets/preferencerow.py:215 +#: ../melon/widgets/preferencerow.py:209 msgid "Delete Item?" msgstr "" -#: ../melon/widgets/preferencerow.py:217 +#: ../melon/widgets/preferencerow.py:211 msgid "" "Do you really want to delete this item? You won't be able to restore it " "afterwards" msgstr "" -#: ../melon/window.py:93 +#: ../melon/window.py:86 msgid "Stream videos on the go" msgstr "ویدیو‌هارا استریم کن" diff --git a/po/melon.pot b/po/melon.pot index 0bc6cd1..eaa35f2 100644 --- a/po/melon.pot +++ b/po/melon.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Melon 0.2.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-15 12:29+0200\n" +"POT-Creation-Date: 2024-08-15 13:53+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -79,734 +79,734 @@ msgid "" "button" msgstr "" -#: ../melon/browse/__init__.py:20 ../melon/browse/search.py:66 -#: ../melon/browse/server.py:115 ../melon/browse/server.py:143 -#: ../melon/home/history.py:25 ../melon/home/new.py:36 -#: ../melon/home/playlists.py:23 ../melon/home/subs.py:22 -#: ../melon/importer.py:63 ../melon/player/__init__.py:113 -#: ../melon/player/playlist.py:164 ../melon/player/playlist.py:171 -#: ../melon/playlist/__init__.py:82 ../melon/playlist/create.py:104 -#: ../melon/playlist/pick.py:121 +#: ../melon/browse/__init__.py:16 ../melon/browse/search.py:62 +#: ../melon/browse/server.py:110 ../melon/browse/server.py:138 +#: ../melon/home/history.py:21 ../melon/home/new.py:31 +#: ../melon/home/playlists.py:19 ../melon/home/subs.py:18 +#: ../melon/importer.py:59 ../melon/player/__init__.py:104 +#: ../melon/player/playlist.py:150 ../melon/player/playlist.py:157 +#: ../melon/playlist/__init__.py:69 ../melon/playlist/create.py:99 +#: ../melon/playlist/pick.py:115 msgid "*crickets chirping*" msgstr "" -#: ../melon/browse/__init__.py:21 +#: ../melon/browse/__init__.py:17 msgid "There are no available servers" msgstr "" -#: ../melon/browse/__init__.py:24 ../melon/browse/search.py:72 -#: ../melon/importer.py:67 +#: ../melon/browse/__init__.py:20 ../melon/browse/search.py:68 +#: ../melon/importer.py:63 msgid "Enable servers in the settings menu" msgstr "" -#: ../melon/browse/__init__.py:33 +#: ../melon/browse/__init__.py:29 msgid "Available Servers" msgstr "" -#: ../melon/browse/__init__.py:35 +#: ../melon/browse/__init__.py:31 msgid "You can enable/disable and filter servers in the settings menu" msgstr "" -#: ../melon/browse/__init__.py:56 +#: ../melon/browse/__init__.py:52 msgid "Servers" msgstr "" -#: ../melon/browse/__init__.py:64 ../melon/browse/search.py:126 +#: ../melon/browse/__init__.py:60 ../melon/browse/search.py:122 msgid "Global Search" msgstr "" -#: ../melon/browse/channel.py:104 +#: ../melon/browse/channel.py:98 msgid "Subscribe to channel" msgstr "" -#: ../melon/browse/channel.py:105 +#: ../melon/browse/channel.py:99 msgid "Add latest uploads to home feed" msgstr "" -#: ../melon/browse/channel.py:117 +#: ../melon/browse/channel.py:111 msgid "Channel feed" msgstr "" -#: ../melon/browse/channel.py:118 +#: ../melon/browse/channel.py:112 msgid "This channel provides multiple feeds, choose which one to view" msgstr "" -#: ../melon/browse/channel.py:170 +#: ../melon/browse/channel.py:164 msgid "Channel" msgstr "" -#: ../melon/browse/playlist.py:48 ../melon/playlist/__init__.py:74 +#: ../melon/browse/playlist.py:42 ../melon/playlist/__init__.py:61 msgid "Start playing" msgstr "" -#: ../melon/browse/playlist.py:69 ../melon/player/__init__.py:53 +#: ../melon/browse/playlist.py:63 ../melon/player/__init__.py:44 msgid "Bookmark" msgstr "" -#: ../melon/browse/playlist.py:70 +#: ../melon/browse/playlist.py:64 msgid "Add Playlist to your local playlist collection" msgstr "" -#: ../melon/browse/playlist.py:124 +#: ../melon/browse/playlist.py:118 msgid "Playlist" msgstr "" -#: ../melon/browse/search.py:49 +#: ../melon/browse/search.py:45 msgid "No results" msgstr "" -#: ../melon/browse/search.py:52 +#: ../melon/browse/search.py:48 #, python-brace-format msgid "{count} result" msgid_plural "{count} results" msgstr[0] "" msgstr[1] "" -#: ../melon/browse/search.py:68 +#: ../melon/browse/search.py:64 msgid "There are no available servers, a search would yield no results" msgstr "" -#: ../melon/browse/search.py:96 ../melon/browse/server.py:47 +#: ../melon/browse/search.py:92 ../melon/browse/server.py:42 msgid "Any" msgstr "" -#: ../melon/browse/search.py:100 ../melon/browse/server.py:51 +#: ../melon/browse/search.py:96 ../melon/browse/server.py:46 msgid "Channels" msgstr "" -#: ../melon/browse/search.py:105 ../melon/browse/server.py:56 -#: ../melon/home/playlists.py:34 ../melon/home/playlists.py:78 -#: ../melon/servers/nebula/__init__.py:206 -#: ../melon/servers/peertube/__init__.py:213 +#: ../melon/browse/search.py:101 ../melon/browse/server.py:51 +#: ../melon/home/playlists.py:30 ../melon/home/playlists.py:74 +#: ../melon/servers/nebula/__init__.py:203 +#: ../melon/servers/peertube/__init__.py:209 msgid "Playlists" msgstr "" -#: ../melon/browse/search.py:110 ../melon/browse/server.py:61 -#: ../melon/servers/nebula/__init__.py:200 -#: ../melon/servers/peertube/__init__.py:213 -#: ../melon/servers/peertube/__init__.py:214 +#: ../melon/browse/search.py:106 ../melon/browse/server.py:56 +#: ../melon/servers/nebula/__init__.py:197 +#: ../melon/servers/peertube/__init__.py:209 +#: ../melon/servers/peertube/__init__.py:210 msgid "Videos" msgstr "" -#: ../melon/browse/server.py:26 +#: ../melon/browse/server.py:21 msgid "Search" msgstr "" -#: ../melon/browse/server.py:116 +#: ../melon/browse/server.py:111 msgid "Try searching for a term" msgstr "" -#: ../melon/browse/server.py:118 +#: ../melon/browse/server.py:113 msgid "Try using a different query" msgstr "" -#: ../melon/browse/server.py:144 +#: ../melon/browse/server.py:139 msgid "This feed is empty" msgstr "" -#: ../melon/home/__init__.py:20 +#: ../melon/home/__init__.py:15 msgid "Home" msgstr "" -#: ../melon/home/__init__.py:41 ../melon/home/history.py:28 -#: ../melon/home/new.py:49 ../melon/home/subs.py:25 +#: ../melon/home/__init__.py:36 ../melon/home/history.py:24 +#: ../melon/home/new.py:44 ../melon/home/subs.py:21 msgid "Browse Servers" msgstr "" -#: ../melon/home/__init__.py:48 +#: ../melon/home/__init__.py:43 msgid "Preferences" msgstr "" -#: ../melon/home/__init__.py:49 +#: ../melon/home/__init__.py:44 msgid "Import Data" msgstr "" -#: ../melon/home/__init__.py:50 +#: ../melon/home/__init__.py:45 msgid "About Melon" msgstr "" -#: ../melon/home/history.py:26 +#: ../melon/home/history.py:22 msgid "You haven't watched any videos yet" msgstr "" -#: ../melon/home/history.py:38 ../melon/home/history.py:125 +#: ../melon/home/history.py:34 ../melon/home/history.py:121 msgid "History" msgstr "" -#: ../melon/home/history.py:39 +#: ../melon/home/history.py:35 msgid "These are the videos you opened in the past" msgstr "" -#: ../melon/home/history.py:83 +#: ../melon/home/history.py:79 msgid "Show more" msgstr "" -#: ../melon/home/history.py:84 +#: ../melon/home/history.py:80 msgid "Load older videos" msgstr "" -#: ../melon/home/new.py:30 +#: ../melon/home/new.py:25 msgid "Refresh" msgstr "" -#: ../melon/home/new.py:40 +#: ../melon/home/new.py:35 msgid "Subscribe to a channel first, to view new uploads" msgstr "" -#: ../melon/home/new.py:45 +#: ../melon/home/new.py:40 msgid "The channels you are subscribed to haven't uploaded anything yet" msgstr "" -#: ../melon/home/new.py:68 +#: ../melon/home/new.py:63 #, python-brace-format msgid "(Last refresh: {last_refresh})" msgstr "" -#: ../melon/home/new.py:72 ../melon/home/new.py:172 +#: ../melon/home/new.py:67 ../melon/home/new.py:167 msgid "What's new" msgstr "" -#: ../melon/home/new.py:74 +#: ../melon/home/new.py:69 msgid "These are the latest videos of channels you follow" msgstr "" -#: ../melon/home/new.py:162 +#: ../melon/home/new.py:157 msgid "Pick up where you left off" msgstr "" -#: ../melon/home/new.py:163 +#: ../melon/home/new.py:158 msgid "Watch" msgstr "" -#: ../melon/home/playlists.py:24 +#: ../melon/home/playlists.py:20 msgid "You don't have any playlists yet" msgstr "" -#: ../melon/home/playlists.py:26 ../melon/home/playlists.py:39 +#: ../melon/home/playlists.py:22 ../melon/home/playlists.py:35 msgid "Create a new playlist" msgstr "" -#: ../melon/home/playlists.py:36 +#: ../melon/home/playlists.py:32 msgid "Here are playlists you've bookmarked or created yourself" msgstr "" -#: ../melon/home/playlists.py:39 +#: ../melon/home/playlists.py:35 msgid "New" msgstr "" -#: ../melon/home/subs.py:23 +#: ../melon/home/subs.py:19 msgid "You aren't yet subscribed to channels" msgstr "" -#: ../melon/home/subs.py:33 ../melon/home/subs.py:68 +#: ../melon/home/subs.py:29 ../melon/home/subs.py:64 msgid "Subscriptions" msgstr "" -#: ../melon/home/subs.py:34 +#: ../melon/home/subs.py:30 msgid "You are subscribed to the following channels" msgstr "" -#: ../melon/import_providers/newpipe.py:42 +#: ../melon/import_providers/newpipe.py:40 msgid "Newpipe Database importer" msgstr "" -#: ../melon/import_providers/newpipe.py:44 +#: ../melon/import_providers/newpipe.py:42 msgid "" "Import the .db file from inside the newpipe .zip export (as invidious " "content)" msgstr "" -#: ../melon/import_providers/newpipe.py:46 +#: ../melon/import_providers/newpipe.py:44 msgid "Select .db file" msgstr "" -#: ../melon/import_providers/newpipe.py:60 +#: ../melon/import_providers/newpipe.py:58 msgid "Newpipe Database" msgstr "" -#: ../melon/importer.py:19 ../melon/importer.py:37 +#: ../melon/importer.py:15 ../melon/importer.py:33 msgid "Import" msgstr "" -#: ../melon/importer.py:38 +#: ../melon/importer.py:34 msgid "The following import methods have been found" msgstr "" -#: ../melon/importer.py:64 +#: ../melon/importer.py:60 msgid "There are no available importer methods" msgstr "" -#: ../melon/player/__init__.py:41 +#: ../melon/player/__init__.py:32 msgid "Description" msgstr "" -#: ../melon/player/__init__.py:54 +#: ../melon/player/__init__.py:45 msgid "Add this video to a playlist" msgstr "" -#: ../melon/player/__init__.py:114 ../melon/playlist/create.py:105 -#: ../melon/playlist/pick.py:122 +#: ../melon/player/__init__.py:105 ../melon/playlist/create.py:100 +#: ../melon/playlist/pick.py:116 msgid "Video could not be loaded" msgstr "" -#: ../melon/player/__init__.py:152 ../melon/player/__init__.py:186 -#: ../melon/player/playlist.py:57 +#: ../melon/player/__init__.py:143 ../melon/player/__init__.py:177 +#: ../melon/player/playlist.py:43 msgid "Loading..." msgstr "" -#: ../melon/player/playlist.py:165 +#: ../melon/player/playlist.py:151 msgid "This playlist is empty" msgstr "" -#: ../melon/player/playlist.py:172 +#: ../melon/player/playlist.py:158 msgid "There was an error loading the playlist" msgstr "" -#: ../melon/player/playlist.py:225 +#: ../melon/player/playlist.py:211 msgid "Previous" msgstr "" -#: ../melon/player/playlist.py:227 +#: ../melon/player/playlist.py:213 msgid "Play video that comes before this one in the playlist" msgstr "" -#: ../melon/player/playlist.py:244 +#: ../melon/player/playlist.py:230 msgid "Next" msgstr "" -#: ../melon/player/playlist.py:246 +#: ../melon/player/playlist.py:232 msgid "Play video that comes after this one in the playlist" msgstr "" -#: ../melon/player/playlist.py:258 +#: ../melon/player/playlist.py:244 msgid "Skip" msgstr "" -#: ../melon/player/playlist.py:259 +#: ../melon/player/playlist.py:245 msgid "Skip this video and pick a new one at random" msgstr "" -#: ../melon/player/playlist.py:270 +#: ../melon/player/playlist.py:256 msgid "Shuffle" msgstr "" -#: ../melon/player/playlist.py:271 +#: ../melon/player/playlist.py:257 msgid "Chooses the next video at random" msgstr "" -#: ../melon/player/playlist.py:282 +#: ../melon/player/playlist.py:268 msgid "Repeat current video" msgstr "" -#: ../melon/player/playlist.py:283 +#: ../melon/player/playlist.py:269 msgid "Puts this video on loop" msgstr "" -#: ../melon/player/playlist.py:298 +#: ../melon/player/playlist.py:284 msgid "Repeat playlist" msgstr "" -#: ../melon/player/playlist.py:300 +#: ../melon/player/playlist.py:286 msgid "Start playling the playlist from the beginning after reaching the end" msgstr "" -#: ../melon/player/playlist.py:312 +#: ../melon/player/playlist.py:298 msgid "Playlist Content" msgstr "" -#: ../melon/player/playlist.py:314 +#: ../melon/player/playlist.py:300 msgid "Click on videos to continue playing the playlist from there" msgstr "" -#: ../melon/playlist/__init__.py:70 +#: ../melon/playlist/__init__.py:57 msgid "Edit" msgstr "" -#: ../melon/playlist/__init__.py:84 +#: ../melon/playlist/__init__.py:71 msgid "You haven't added any videos to this playlist yet" msgstr "" -#: ../melon/playlist/__init__.py:87 +#: ../melon/playlist/__init__.py:74 msgid "Start watching" msgstr "" -#: ../melon/playlist/__init__.py:113 +#: ../melon/playlist/__init__.py:102 msgid "Set as playlist thumbnail" msgstr "" -#: ../melon/playlist/__init__.py:121 +#: ../melon/playlist/__init__.py:110 msgid "Remove from playlist" msgstr "" -#: ../melon/playlist/__init__.py:214 +#: ../melon/playlist/__init__.py:203 msgid "Edit Playlist" msgstr "" -#: ../melon/playlist/__init__.py:220 +#: ../melon/playlist/__init__.py:209 msgid "Playlist details" msgstr "" -#: ../melon/playlist/__init__.py:221 +#: ../melon/playlist/__init__.py:210 msgid "Change playlist information" msgstr "" -#: ../melon/playlist/__init__.py:223 ../melon/playlist/create.py:43 +#: ../melon/playlist/__init__.py:212 ../melon/playlist/create.py:38 msgid "Playlist name" msgstr "" -#: ../melon/playlist/__init__.py:226 ../melon/playlist/create.py:46 +#: ../melon/playlist/__init__.py:215 ../melon/playlist/create.py:41 msgid "Playlist description" msgstr "" -#: ../melon/playlist/__init__.py:231 +#: ../melon/playlist/__init__.py:220 msgid "Save details" msgstr "" -#: ../melon/playlist/__init__.py:233 +#: ../melon/playlist/__init__.py:222 msgid "Change playlist title and description. (Closes the dialog)" msgstr "" -#: ../melon/playlist/__init__.py:244 +#: ../melon/playlist/__init__.py:233 msgid "Delete Playlist" msgstr "" -#: ../melon/playlist/__init__.py:246 +#: ../melon/playlist/__init__.py:235 msgid "Delete this playlist and it's content. This can NOT be undone." msgstr "" -#: ../melon/playlist/__init__.py:259 +#: ../melon/playlist/__init__.py:248 msgid "Close" msgstr "" -#: ../melon/playlist/__init__.py:261 +#: ../melon/playlist/__init__.py:250 msgid "Close without changing anything" msgstr "" -#: ../melon/playlist/__init__.py:290 +#: ../melon/playlist/__init__.py:279 msgid "Delete Playlist?" msgstr "" -#: ../melon/playlist/__init__.py:291 +#: ../melon/playlist/__init__.py:280 msgid "Do you really want to delete this playlist? This can not be undone." msgstr "" -#: ../melon/playlist/__init__.py:293 ../melon/playlist/create.py:54 -#: ../melon/playlist/create.py:109 ../melon/playlist/pick.py:88 -#: ../melon/playlist/pick.py:126 ../melon/widgets/preferencerow.py:181 -#: ../melon/widgets/preferencerow.py:220 +#: ../melon/playlist/__init__.py:282 ../melon/playlist/create.py:49 +#: ../melon/playlist/create.py:104 ../melon/playlist/pick.py:82 +#: ../melon/playlist/pick.py:120 ../melon/widgets/preferencerow.py:175 +#: ../melon/widgets/preferencerow.py:214 msgid "Cancel" msgstr "" -#: ../melon/playlist/__init__.py:295 ../melon/widgets/preferencerow.py:222 +#: ../melon/playlist/__init__.py:284 ../melon/widgets/preferencerow.py:216 msgid "Delete" msgstr "" -#: ../melon/playlist/create.py:25 ../melon/playlist/pick.py:35 +#: ../melon/playlist/create.py:20 ../melon/playlist/pick.py:28 msgid "Video" msgstr "" -#: ../melon/playlist/create.py:27 +#: ../melon/playlist/create.py:22 msgid "The following video will be added to the new playlist" msgstr "" -#: ../melon/playlist/create.py:39 ../melon/playlist/create.py:125 +#: ../melon/playlist/create.py:34 ../melon/playlist/create.py:120 msgid "New Playlist" msgstr "" -#: ../melon/playlist/create.py:40 +#: ../melon/playlist/create.py:35 msgid "Enter more playlist information" msgstr "" -#: ../melon/playlist/create.py:44 +#: ../melon/playlist/create.py:39 msgid "Unnamed Playlist" msgstr "" -#: ../melon/playlist/create.py:54 ../melon/playlist/create.py:109 -#: ../melon/playlist/pick.py:88 ../melon/playlist/pick.py:126 +#: ../melon/playlist/create.py:49 ../melon/playlist/create.py:104 +#: ../melon/playlist/pick.py:82 ../melon/playlist/pick.py:120 msgid "Do not create playlist" msgstr "" -#: ../melon/playlist/create.py:57 ../melon/widgets/preferencerow.py:184 +#: ../melon/playlist/create.py:52 ../melon/widgets/preferencerow.py:178 msgid "Create" msgstr "" -#: ../melon/playlist/create.py:57 +#: ../melon/playlist/create.py:52 msgid "Create playlist" msgstr "" -#: ../melon/playlist/pick.py:37 +#: ../melon/playlist/pick.py:30 msgid "The following video will be added to the playlist" msgstr "" -#: ../melon/playlist/pick.py:50 ../melon/widgets/feeditem.py:154 +#: ../melon/playlist/pick.py:43 ../melon/widgets/feeditem.py:147 msgid "Add to playlist" msgstr "" -#: ../melon/playlist/pick.py:53 +#: ../melon/playlist/pick.py:46 msgid "" "Choose a playlist to add the video to. Note that you can only add videos to " "local playlists, not external bookmarked ones" msgstr "" -#: ../melon/playlist/pick.py:57 +#: ../melon/playlist/pick.py:50 msgid "Create new playlist" msgstr "" -#: ../melon/playlist/pick.py:58 +#: ../melon/playlist/pick.py:51 msgid "Create a new playlist and add the video to it" msgstr "" -#: ../melon/playlist/pick.py:142 +#: ../melon/playlist/pick.py:136 msgid "Add to Playlist" msgstr "" -#: ../melon/servers/invidious/__init__.py:35 +#: ../melon/servers/invidious/__init__.py:29 msgid "Open source alternative front-end to YouTube" msgstr "" -#: ../melon/servers/invidious/__init__.py:40 +#: ../melon/servers/invidious/__init__.py:34 msgid "Instance" msgstr "" -#: ../melon/servers/invidious/__init__.py:42 +#: ../melon/servers/invidious/__init__.py:36 msgid "" "See https://docs.invidious.io/instances/ for a list of available instances" msgstr "" -#: ../melon/servers/invidious/__init__.py:55 +#: ../melon/servers/invidious/__init__.py:49 msgid "Trending" msgstr "" -#: ../melon/servers/invidious/__init__.py:56 +#: ../melon/servers/invidious/__init__.py:50 msgid "Popular" msgstr "" -#: ../melon/servers/nebula/__init__.py:21 +#: ../melon/servers/nebula/__init__.py:18 msgid "" "Home of smart, thoughtful videos, podcasts, and classes from your favorite " "creators" msgstr "" -#: ../melon/servers/nebula/__init__.py:27 +#: ../melon/servers/nebula/__init__.py:24 msgid "Email Address" msgstr "" -#: ../melon/servers/nebula/__init__.py:28 +#: ../melon/servers/nebula/__init__.py:25 msgid "Email Address to login to your account" msgstr "" -#: ../melon/servers/nebula/__init__.py:35 +#: ../melon/servers/nebula/__init__.py:32 msgid "Password" msgstr "" -#: ../melon/servers/nebula/__init__.py:36 +#: ../melon/servers/nebula/__init__.py:33 msgid "Password associated with your account" msgstr "" -#: ../melon/servers/peertube/__init__.py:16 +#: ../melon/servers/peertube/__init__.py:12 msgid "Decentralized video hosting network, based on free/libre software" msgstr "" -#: ../melon/servers/peertube/__init__.py:21 +#: ../melon/servers/peertube/__init__.py:17 msgid "Instances" msgstr "" -#: ../melon/servers/peertube/__init__.py:23 +#: ../melon/servers/peertube/__init__.py:19 msgid "" "List of peertube instances, from which to fetch content. See https://" "joinpeertube.org/instances" msgstr "" -#: ../melon/servers/peertube/__init__.py:31 +#: ../melon/servers/peertube/__init__.py:27 msgid "Show NSFW content" msgstr "" -#: ../melon/servers/peertube/__init__.py:32 +#: ../melon/servers/peertube/__init__.py:28 msgid "Passes the nsfw filter to the peertube search API" msgstr "" -#: ../melon/servers/peertube/__init__.py:39 +#: ../melon/servers/peertube/__init__.py:35 msgid "Enable Federation" msgstr "" -#: ../melon/servers/peertube/__init__.py:40 +#: ../melon/servers/peertube/__init__.py:36 msgid "Returns content from federated instances instead of only local content" msgstr "" -#: ../melon/servers/peertube/__init__.py:65 +#: ../melon/servers/peertube/__init__.py:61 msgid "Latest" msgstr "" -#: ../melon/settings/__init__.py:23 +#: ../melon/settings/__init__.py:18 msgid "Show Previews when browsing public feeds (incl. search)" msgstr "" -#: ../melon/settings/__init__.py:25 +#: ../melon/settings/__init__.py:20 msgid "" "Set to true to show previews when viewing channel contents, public feeds and " "searching" msgstr "" -#: ../melon/settings/__init__.py:34 +#: ../melon/settings/__init__.py:29 msgid "Show Previews in local feeds" msgstr "" -#: ../melon/settings/__init__.py:36 +#: ../melon/settings/__init__.py:31 msgid "" "Set to true to show previews in the new feed, for subscribed channels, and " "saved playlists" msgstr "" -#: ../melon/settings/__init__.py:44 +#: ../melon/settings/__init__.py:39 msgid "Show servers that may contain nsfw content" msgstr "" -#: ../melon/settings/__init__.py:46 +#: ../melon/settings/__init__.py:41 msgid "" "Lists/Delists servers in the browse servers list, if they contain some nsfw " "content" msgstr "" -#: ../melon/settings/__init__.py:54 +#: ../melon/settings/__init__.py:49 msgid "Show servers that only contain nsfw content" msgstr "" -#: ../melon/settings/__init__.py:56 +#: ../melon/settings/__init__.py:51 msgid "" "Lists/Delists servers in the browse servers list, if they contain only/" "mostly nsfw content" msgstr "" -#: ../melon/settings/__init__.py:64 +#: ../melon/settings/__init__.py:59 msgid "Show servers that require login" msgstr "" -#: ../melon/settings/__init__.py:66 +#: ../melon/settings/__init__.py:61 msgid "" "Lists/Delists servers in the browse servers list, if they require login to " "function" msgstr "" -#: ../melon/settings/__init__.py:74 +#: ../melon/settings/__init__.py:69 msgid "Use GPU acceleration for video player if available" msgstr "" -#: ../melon/settings/__init__.py:75 +#: ../melon/settings/__init__.py:70 msgid "Disable this if the video player doesn't work" msgstr "" -#: ../melon/settings/__init__.py:86 +#: ../melon/settings/__init__.py:81 msgid "Settings" msgstr "" -#: ../melon/settings/__init__.py:99 +#: ../melon/settings/__init__.py:94 msgid "General" msgstr "" -#: ../melon/settings/__init__.py:100 +#: ../melon/settings/__init__.py:95 msgid "Global app settings" msgstr "" -#: ../melon/settings/__init__.py:124 +#: ../melon/settings/__init__.py:119 msgid "Enable Server" msgstr "" -#: ../melon/settings/__init__.py:126 +#: ../melon/settings/__init__.py:121 msgid "" "Disabled servers won't show up in the browser or on the local/home screen" msgstr "" -#: ../melon/widgets/feeditem.py:148 +#: ../melon/widgets/feeditem.py:141 msgid "Watch now" msgstr "" -#: ../melon/widgets/feeditem.py:161 +#: ../melon/widgets/feeditem.py:154 msgid "Open in browser" msgstr "" -#: ../melon/widgets/feeditem.py:165 +#: ../melon/widgets/feeditem.py:158 msgid "View channel" msgstr "" -#: ../melon/widgets/player.py:136 +#: ../melon/widgets/player.py:125 msgid "No streams available" msgstr "" -#: ../melon/widgets/player.py:198 +#: ../melon/widgets/player.py:187 msgid "Toggle floating window" msgstr "" -#: ../melon/widgets/player.py:204 +#: ../melon/widgets/player.py:193 msgid "Toggle fullscreen" msgstr "" -#: ../melon/widgets/player.py:226 ../melon/widgets/player.py:613 -#: ../melon/widgets/player.py:622 +#: ../melon/widgets/player.py:215 ../melon/widgets/player.py:602 +#: ../melon/widgets/player.py:611 msgid "Play" msgstr "" -#: ../melon/widgets/player.py:253 +#: ../melon/widgets/player.py:242 msgid "Stream options" msgstr "" -#: ../melon/widgets/player.py:483 +#: ../melon/widgets/player.py:472 msgid "Resolution" msgstr "" -#: ../melon/widgets/player.py:604 +#: ../melon/widgets/player.py:593 msgid "Pause" msgstr "" -#: ../melon/widgets/player.py:642 +#: ../melon/widgets/player.py:631 msgid "The video is playing in separate window" msgstr "" -#: ../melon/widgets/player.py:779 +#: ../melon/widgets/player.py:768 msgid "Player" msgstr "" -#: ../melon/widgets/preferencerow.py:125 +#: ../melon/widgets/preferencerow.py:119 msgid "Add" msgstr "" -#: ../melon/widgets/preferencerow.py:139 +#: ../melon/widgets/preferencerow.py:133 msgid "Move up" msgstr "" -#: ../melon/widgets/preferencerow.py:147 +#: ../melon/widgets/preferencerow.py:141 msgid "Move down" msgstr "" -#: ../melon/widgets/preferencerow.py:153 +#: ../melon/widgets/preferencerow.py:147 msgid "Remove from list" msgstr "" -#: ../melon/widgets/preferencerow.py:168 +#: ../melon/widgets/preferencerow.py:162 msgid "Add Item" msgstr "" -#: ../melon/widgets/preferencerow.py:171 +#: ../melon/widgets/preferencerow.py:165 msgid "Create a new list entry" msgstr "" -#: ../melon/widgets/preferencerow.py:172 +#: ../melon/widgets/preferencerow.py:166 msgid "Enter the new value here" msgstr "" -#: ../melon/widgets/preferencerow.py:175 +#: ../melon/widgets/preferencerow.py:169 msgid "Value" msgstr "" -#: ../melon/widgets/preferencerow.py:215 +#: ../melon/widgets/preferencerow.py:209 msgid "Delete Item?" msgstr "" -#: ../melon/widgets/preferencerow.py:217 +#: ../melon/widgets/preferencerow.py:211 msgid "" "Do you really want to delete this item? You won't be able to restore it " "afterwards" msgstr "" -#: ../melon/window.py:93 +#: ../melon/window.py:86 msgid "Stream videos on the go" msgstr "" diff --git a/po/nl.po b/po/nl.po index dbc6c08..581db03 100644 --- a/po/nl.po +++ b/po/nl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Melon 0.2.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-15 12:29+0200\n" +"POT-Creation-Date: 2024-08-15 13:53+0200\n" "PO-Revision-Date: 2024-07-17 09:18+0000\n" "Last-Translator: Vistaus \n" "Language-Team: Dutch