diff -Nru grilo-plugins-0.3.11/AUTHORS grilo-plugins-0.3.12/AUTHORS --- grilo-plugins-0.3.11/AUTHORS 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/AUTHORS 2020-09-03 05:36:44.355468000 +0000 @@ -12,6 +12,7 @@ Andrzej Bieniek Anish A Antía Puentes +Asier Sarasua Garmendia Ask Hjorth Larsen Aurimas Černius Balázs Meskó @@ -20,6 +21,7 @@ Bastien Nocera Benjamin Steinwender Ben Walsh +Boyuan Yang <073plan@gmail.com> Bruno Lopes da Silva Carles Ferrando Carlos Garnacho @@ -28,6 +30,7 @@ Chao-Hsiung Liao Charles Monzat Cheng-Chia Tseng +Chinmay Gurjar Chris Lord Christian Kirbach Christophe Fergeau @@ -43,6 +46,7 @@ Dimitris Spingos Dominique Leuenberger Dušan Kazik +Dz Chen Efstathios Iosifidis Elad Alfassa Emanuele Aina @@ -60,11 +64,13 @@ fosero Fran Diéguez Gábor Kelemen +Gaurav Narula George Sedov Gianvito Cavasoli Gil Forcada Giovanni Campagna gogo +Goran Vidović Guilhem Bonnefille Guillaume Emont Iago Toral @@ -136,10 +142,12 @@ Saiful B. Khan Samir Ribic Sam Thursfield +scootergrisen Sebastian Keller Seong-ho Cho Simon McVittie Simon Pena +Stephan Woidowski Sumaid Syed Thiago Mendes Tiago Santos @@ -165,7 +173,9 @@ Yi-Jyun Pan Yosef Or Boczko YunQiang Su +Yuri Chornoivan Yuri Myasoedov +Zander Brown Zeeshan Ali (Khattak) Милош Поповић Мирослав Николић diff -Nru grilo-plugins-0.3.11/debian/changelog grilo-plugins-0.3.12/debian/changelog --- grilo-plugins-0.3.11/debian/changelog 2020-09-07 17:26:08.000000000 +0000 +++ grilo-plugins-0.3.12/debian/changelog 2022-11-03 19:48:48.000000000 +0000 @@ -1,9 +1,28 @@ -grilo-plugins (0.3.11-1ubuntu1~18.04.sav0) bionic; urgency=low +grilo-plugins (0.3.12-1ubuntu1~18.04.sav0) bionic; urgency=low * Backport to Bionic * debian/control: Set debhelper-compat (= 11) BD - -- Rob Savoury Mon, 07 Sep 2020 10:26:08 -0700 + -- Rob Savoury Thu, 03 Nov 2022 12:48:48 -0700 + +grilo-plugins (0.3.12-1ubuntu1) hirsute; urgency=low + + * Merge from Debian unstable. Remaining changes: + - Split package into -base and -extra (Closes: #805609) + + -- Steve Langasek Sun, 25 Oct 2020 00:52:23 -0700 + +grilo-plugins (0.3.12-1) unstable; urgency=medium + + * New upstream release. + * debian/control: + - Update build dependency on libgom-1.0-dev to 0.4. + - Remove the Spotify Cover plugin from the list, it's no longer + available. + * debian/rules: + - Disable deprecation warnings. + + -- Alberto Garcia Sun, 06 Sep 2020 14:49:43 +0200 grilo-plugins (0.3.11-1ubuntu1) focal; urgency=low diff -Nru grilo-plugins-0.3.11/debian/control grilo-plugins-0.3.12/debian/control --- grilo-plugins-0.3.11/debian/control 2020-09-07 17:26:08.000000000 +0000 +++ grilo-plugins-0.3.12/debian/control 2022-11-03 19:48:48.000000000 +0000 @@ -9,7 +9,7 @@ gperf, libarchive-dev, libglib2.0-dev (>= 2.44), - libgom-1.0-dev (>= 0.3.2), + libgom-1.0-dev (>= 0.4), libgrilo-0.3-dev (>= 0.3.8), libgstreamer1.0-dev, libxml2-dev, @@ -76,7 +76,6 @@ - Last.fm Cover - Musicbrainz Cover Art - Radio France - - Spotify Cover - Steam Store - TheAudioDB cover - TheGamesDB.net diff -Nru grilo-plugins-0.3.11/debian/rules grilo-plugins-0.3.12/debian/rules --- grilo-plugins-0.3.11/debian/rules 2020-02-16 21:47:44.000000000 +0000 +++ grilo-plugins-0.3.12/debian/rules 2020-09-06 15:43:32.000000000 +0000 @@ -2,6 +2,10 @@ export DEB_BUILD_MAINT_OPTIONS = hardening=+all +export CPPFLAGS = $(shell dpkg-buildflags --get CPPFLAGS) \ + -DGLIB_DISABLE_DEPRECATION_WARNINGS \ + -Wno-deprecated-declarations + %: dh $@ diff -Nru grilo-plugins-0.3.11/help/C/grilo-plugins.xml grilo-plugins-0.3.12/help/C/grilo-plugins.xml --- grilo-plugins-0.3.11/help/C/grilo-plugins.xml 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/help/C/grilo-plugins.xml 2020-09-03 05:36:44.355468000 +0000 @@ -87,7 +87,7 @@ Gravatar -This is a Grilo plugin for Gravatar Its plugin ID is "grl-gravatar". +This is a Grilo plugin for Gravatar. Its plugin ID is "grl-gravatar" diff -Nru grilo-plugins-0.3.11/help/cs/cs.po grilo-plugins-0.3.12/help/cs/cs.po --- grilo-plugins-0.3.11/help/cs/cs.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/help/cs/cs.po 2020-09-03 05:36:44.356468000 +0000 @@ -1,13 +1,13 @@ # Czech translation for grilo-plugins. # Copyright (C) 2018 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. -# Marek Černocký , 2018, 2019. +# Marek Černocký , 2018, 2019, 2020. # msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" -"POT-Creation-Date: 2019-02-12 01:59+0000\n" -"PO-Revision-Date: 2019-03-05 10:18+0100\n" +"POT-Creation-Date: 2020-05-30 10:28+0000\n" +"PO-Revision-Date: 2020-08-25 10:50+0200\n" "Last-Translator: Marek Černocký \n" "Language-Team: čeština \n" "Language: cs\n" @@ -152,8 +152,8 @@ #. (itstool) path: sect1/para #: C/grilo-plugins.xml:90 msgid "" -"This is a Grilo plugin for Gravatar Its plugin ID is \"grl-gravatar" -"\"." +"This is a Grilo plugin for Gravatar. Its plugin ID is \"grl-gravatar" +"\"" msgstr "" "Jedná se o zásuvný modul Grilo pro avatary Gravatar. Jeho ID je " "\"grl-gravatar\"." diff -Nru grilo-plugins-0.3.11/help/da/da.po grilo-plugins-0.3.12/help/da/da.po --- grilo-plugins-0.3.11/help/da/da.po 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/help/da/da.po 2020-09-03 05:36:44.356468000 +0000 @@ -0,0 +1,823 @@ +# Danish translation for grilo-plugins. +# Copyright (C) 2020 grilo-plugins's COPYRIGHT HOLDER +# This file is distributed under the same license as the grilo-plugins package. +# scootergrisen, 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: grilo-plugins master\n" +"POT-Creation-Date: 2020-03-16 16:04+0000\n" +"PO-Revision-Date: 2020-04-14 00:00+0000\n" +"Last-Translator: scootergrisen\n" +"Language-Team: Danish \n" +"Language: da\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. Put one translator per line, in the form NAME , YEAR1, YEAR2 +msgctxt "_" +msgid "translator-credits" +msgstr "scootergrisen <>, 2020" + +#. (itstool) path: bookinfo/title +#. (itstool) path: chapter/title +#: C/grilo-plugins.xml:19 C/grilo-plugins.xml:60 +msgid "Grilo Plugins" +msgstr "Grilo-udvidelsesmoduler" + +#. (itstool) path: authorgroup/author +#: C/grilo-plugins.xml:22 +msgid "Murray Cumming" +msgstr "Murray Cumming" + +#. (itstool) path: abstract/para +#. (itstool) path: chapter/para +#: C/grilo-plugins.xml:31 C/grilo-plugins.xml:55 +msgid "" +"Grilo is a framework for browsing and searching media content from various " +"sources using a single API. The Grilo Plugins plugins for the Grilo " +"framework to provide access to various sources of media and metadata." +msgstr "" +"Grilo er et framework til at gennemse og søge efter medieindhold fra diverse " +"kilder med ét API. Udvidelsesmodulerne i Grilo-udvidelsesmoduler til Grilo-" +"frameworket giver adgang til diverse kilder med medier og metadata." + +#. (itstool) path: bookinfo/copyright +#: C/grilo-plugins.xml:35 +msgid "2012 Openismus GmbH" +msgstr "2012 Openismus GmbH" + +#. (itstool) path: legalnotice/para +#: C/grilo-plugins.xml:41 +msgid "" +"Permission is granted to copy, distribute and/or modify this document under " +"the terms of the GNU Free Documentation License, Version 1.2 or any later " +"version published by the Free Software Foundation; with no Invariant " +"Sections, no Front-Cover Texts, and no Back-Cover Texts. You may obtain a " +"copy of the GNU Free Documentation License from the Free Software Foundation " +"by visiting their Web site or by writing to: Free Software Foundation, Inc., " +"51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA." +msgstr "" +"Der gives tilladelse til at kopiere, distribuere og/eller ændre dette " +"dokument under betingelserne i GNU Free Documentation License, version 1.2 " +"eller enhver senere version udgivet af Free Software Foundation; uden " +"invariante afsnit, forsidetekster, samt bagsidetekster. Du kan få fat i en " +"kopier af GNU Free Documentation License fra Free Software Foundation ved at " +"besøge deres websted eller ved at skrive til: Free Software Foundation, " +"Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA." + +#. (itstool) path: chapter/title +#: C/grilo-plugins.xml:53 +msgid "Introduction" +msgstr "Introduktion" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:64 +msgid "Apple Trailers" +msgstr "Apple-trailere" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:65 +msgid "" +"This is a Grilo plugin for Apple trailers. Its plugin ID is \"grl-" +"apple-trailers\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til Apple-trailere. Dets udvidelsesmodul-" +"id er \"grl-apple-trailers\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:69 +msgid "Bookmarks" +msgstr "Bogmærker" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:70 +msgid "" +"This is a Grilo plugin for bookmarks. Its plugin ID is \"grl-" +"bookmarks\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til bogmærker. Dets udvidelsesmodul-id er " +"\"grl-bookmarks\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:74 +msgid "DMap" +msgstr "DMap" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:75 +msgid "" +"This is a Grilo plugin for DMap. Its plugin ID is \"grl-dmap\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til DMap. Dets udvidelsesmodul-id er " +"\"grl-dmap\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:79 +msgid "Filesystem" +msgstr "Filsystem" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:80 +msgid "" +"This is a Grilo plugin for the filesystem. Its plugin ID is \"grl-" +"filesystem\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til filsystemet. Dets udvidelsesmodul-id " +"er \"grl-filesystem\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:84 +msgid "Flickr" +msgstr "Flickr" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:85 +msgid "" +"This is a Grilo plugin for Flickr. Its plugin ID is \"grl-flickr\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til Flickr. Dets udvidelsesmodul-id er " +"\"grl-flickr\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:89 +msgid "Gravatar" +msgstr "Gravatar" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:90 +msgid "" +"This is a Grilo plugin for Gravatar Its plugin ID is \"grl-gravatar" +"\"." +msgstr "" +"Dette er et Grilo-udvidelsesmodul til Gravatar. Dets udvidelsesmodul-id er " +"\"grl-gravatar\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:94 +msgid "Jamendo" +msgstr "Jamendo" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:95 +msgid "" +"This is a Grilo plugin for Jamendo. Its plugin ID is \"grl-jamendo" +"\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til Jamendo. Dets udvidelsesmodul-id er " +"\"grl-jamendo\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:99 +msgid "Local Metadata" +msgstr "Lokale metadata" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:100 +msgid "" +"This is a Grilo plugin for Local metadata. Its plugin ID is \"grl-" +"local-metadata\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til lokale metadata. Dets udvidelsesmodul-" +"id er \"grl-local-metadata\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:104 +msgid "Metadata Store" +msgstr "Metadata-lager" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:105 +msgid "" +"This is a Grilo plugin for metadata store. Its plugin ID is \"grl-" +"metadata-store\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til metadata-lager. Dets udvidelsesmodul-" +"id er \"grl-metadata-store\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:109 +msgid "Optical Media" +msgstr "Optiske medier" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:110 +msgid "" +"This is a Grilo plugin for optical media. Its plugin ID is \"grl-" +"optical-media\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til optiske medier. Dets udvidelsesmodul-" +"id er \"grl-optical-media\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:114 +msgid "Podcasts" +msgstr "Podcasts" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:115 +msgid "" +"This is a Grilo plugin for podcasts. Its plugin ID is \"grl-podcasts" +"\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til podcasts. Dets udvidelsesmodul-id er " +"\"grl-podcasts\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:119 +msgid "Shoutcast" +msgstr "Shoutcast" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:120 +msgid "" +"This is a Grilo plugin for Shoutcast. Its plugin ID is \"grl-" +"shoutcast\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til Shoutcast. Dets udvidelsesmodul-id er " +"\"grl-shoutcast\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:124 +msgid "TMDb Plugin" +msgstr "TMDb-udvidelsesmodul" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:125 +msgid "" +"The TMDb plugin retrieves information about movies from the TMDb online service, which is a community-" +"maintained movie database. Its plugin ID is \"grl-tmdb\"" +msgstr "" +"TMDb-udvidelsesmodulet indhenter information om film fra onlinetjenesten TMDb, som er en " +"filmdatabase, der vedligeholdes af fællesskabet. Dets udvidelsesmodul-id er " +"\"grl-tmdb\"" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:126 +msgid "" +"Before using this plugin, you should set the TMDB API Key with grl_config_set_api_key()." +msgstr "" +"Inden du bruger udvidelsesmodulet skal du indstille TMDB API-nøglen med " +"grl_config_set_api_key()." + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:127 +msgid "" +"You may then use grl_source_resolve() to discover details about an existing GrlMediaItem." +msgstr "" +"Herefter kan du bruge grl_source_resolve() til at finde " +"detaljer om en eksisterende GrlMediaItem." + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:128 +msgid "" +"This plugin does not support search via grl_source_search() or queries via grl_source_query()." +msgstr "" +"Udvidelsesmodulet understøtter ikke søgning via grl_source_search() eller forespørgsel " +"via grl_source_query()." + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:130 +msgid "Here is a simple example of the use of the Grilo TMDb plugin:" +msgstr "" +"Her er et simpelt eksempel på anvendelsen af Grilo TMDb-" +"udvidelsesmodulet:" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:132 +msgid "" +"File: example-tmdb.c" +msgstr "" +"Fil: example-" +"tmdb.c" + +#. (itstool) path: sect1/programlisting +#: C/grilo-plugins.xml:133 +#, no-wrap +msgid "" +"\n" +"/*\n" +" * Copyright (C) 2012 Canonical Ltd.\n" +" *\n" +" * Author: Jens Georg <jensg@openismus.com>\n" +" *\n" +" * This library is free software; you can redistribute it and/or\n" +" * modify it under the terms of the GNU Lesser General Public License\n" +" * as published by the Free Software Foundation; version 2.1 of\n" +" * the License, or (at your option) any later version.\n" +" *\n" +" * This library is distributed in the hope that it will be useful, but\n" +" * WITHOUT ANY WARRANTY; without even the implied warranty of\n" +" * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" +" * Lesser General Public License for more details.\n" +" *\n" +" * You should have received a copy of the GNU Lesser General Public\n" +" * License along with this library; if not, write to the Free Software\n" +" * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n" +" * 02110-1301 USA\n" +" *\n" +" */\n" +"\n" +"#include <grilo.h>\n" +"#include <stdio.h>\n" +"\n" +"/**\n" +" * This TMDB key is just for testing.\n" +" * For real-world use, please request your own key from\n" +" * http://api.themoviedb.org\n" +" */\n" +"#define TMDB_KEY \"719b9b296835b04cd919c4bf5220828a\"\n" +"\n" +"#define TMDB_PLUGIN_ID \"grl-tmdb\"\n" +"\n" +"GMainLoop *loop = NULL;\n" +"GrlKeyID director_key = 0;\n" +"\n" +"static void\n" +"resolve_cb (GrlSource *src, guint operation_id, GrlMedia *media, gpointer user_data, const GError *error)\n" +"{\n" +" const char *title, *studio;\n" +"\n" +" g_assert_no_error (error);\n" +" g_assert (media);\n" +"\n" +" title = grl_media_get_title (media);\n" +" studio = grl_media_get_studio (media);\n" +" printf (\"Media: Title='%s', Studio='%s'\\n\",\n" +" title, studio);\n" +"\n" +" if (director_key != 0) {\n" +" const gchar *director =\n" +" grl_data_get_string (GRL_DATA (media), director_key);\n" +" printf (\" Director=%s\\n\", director);\n" +" }\n" +"\n" +" g_main_loop_quit (loop);\n" +"}\n" +"\n" +"int main (int argc, char *argv[])\n" +"{\n" +" GrlRegistry *reg;\n" +" GrlConfig *config;\n" +" GError *error = NULL;\n" +" GrlSource *src;\n" +" gboolean plugin_activated;\n" +" GrlCaps *caps;\n" +" GrlOperationOptions *options;\n" +" GrlMedia *media;\n" +" const GList *keys;\n" +" const GList* l;\n" +"\n" +" grl_init (&argc, &argv);\n" +"\n" +" /*\n" +" * Set the TMDB API key:\n" +" * You must use your own TMDB API key in your own application.\n" +" */\n" +" reg = grl_registry_get_default ();\n" +" config = grl_config_new (TMDB_PLUGIN_ID, NULL);\n" +" grl_config_set_api_key (config, TMDB_KEY);\n" +" grl_registry_add_config (reg, config, NULL);\n" +" grl_registry_load_all_plugins (reg, FALSE, NULL);\n" +"\n" +" /*\n" +" * Get the plugin:\n" +" */\n" +" error = NULL;\n" +" plugin_activated =\n" +" grl_registry_activate_plugin_by_id (reg, TMDB_PLUGIN_ID, &error);\n" +" g_assert (plugin_activated);\n" +" g_assert_no_error (error);\n" +"\n" +" /*\n" +" * Get the Grilo source:\n" +" */\n" +" src = grl_registry_lookup_source (reg, TMDB_PLUGIN_ID);\n" +"\n" +" /*\n" +" * Check that it has the expected capability:\n" +" */\n" +" g_assert (grl_source_supported_operations (src) & GRL_OP_RESOLVE);\n" +" caps = grl_source_get_caps (src, GRL_OP_RESOLVE);\n" +" g_assert (caps);\n" +"\n" +" options = grl_operation_options_new (caps);\n" +"\n" +" /*\n" +" * A media item that we will give to the TMDB plugin,\n" +" * to discover its details.\n" +" */\n" +" media = grl_media_video_new ();\n" +" grl_media_set_title (media, \"Sherlock Holmes\");\n" +"\n" +" /*\n" +" * Discover what keys are provided by the source:\n" +" */\n" +" keys = grl_source_supported_keys (src);\n" +" for (l = keys; l != NULL; l = l->next) {\n" +" const gchar *name;\n" +" GrlKeyID id = GPOINTER_TO_INT (l->data);\n" +"\n" +" g_assert (id);\n" +"\n" +" name = grl_metadata_key_get_name (id);\n" +" printf (\"Supported key: %s\\n\", name);\n" +"\n" +" /*\n" +" * Remember this for later use:\n" +" * You may instead use grl_registry_lookup_metadata_key_name().\n" +" */\n" +" if (g_strcmp0 (name, \"tmdb-director\") == 0) {\n" +" director_key = id;\n" +" }\n" +" }\n" +"\n" +" /*\n" +" * Ask the TMDB plugin for the media item's details,\n" +" * from the TMDB online service:\n" +" */\n" +" grl_source_resolve (src, media,\n" +" keys, options,\n" +" resolve_cb, NULL);\n" +"\n" +" /*\n" +" * Start the main loop so our callback can be called:\n" +" */\n" +" loop = g_main_loop_new (NULL, FALSE);\n" +" g_main_loop_run (loop);\n" +"\n" +" /*\n" +" * Release objects:\n" +" */\n" +" g_object_unref (media);\n" +" g_object_unref (config);\n" +" g_object_unref (options);\n" +"\n" +" /*\n" +" * Deinitialize Grilo:\n" +" */\n" +" grl_deinit ();\n" +"}\n" +"\n" +"\n" +"\n" +msgstr "" +"\n" +"/*\n" +" * Copyright (C) 2012 Canonical Ltd.\n" +" *\n" +" * Author: Jens Georg <jensg@openismus.com>\n" +" *\n" +" * This library is free software; you can redistribute it and/or\n" +" * modify it under the terms of the GNU Lesser General Public License\n" +" * as published by the Free Software Foundation; version 2.1 of\n" +" * the License, or (at your option) any later version.\n" +" *\n" +" * This library is distributed in the hope that it will be useful, but\n" +" * WITHOUT ANY WARRANTY; without even the implied warranty of\n" +" * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" +" * Lesser General Public License for more details.\n" +" *\n" +" * You should have received a copy of the GNU Lesser General Public\n" +" * License along with this library; if not, write to the Free Software\n" +" * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n" +" * 02110-1301 USA\n" +" *\n" +" */\n" +"\n" +"#include <grilo.h>\n" +"#include <stdio.h>\n" +"\n" +"/**\n" +" * This TMDB key is just for testing.\n" +" * For real-world use, please request your own key from\n" +" * http://api.themoviedb.org\n" +" */\n" +"#define TMDB_KEY \"719b9b296835b04cd919c4bf5220828a\"\n" +"\n" +"#define TMDB_PLUGIN_ID \"grl-tmdb\"\n" +"\n" +"GMainLoop *loop = NULL;\n" +"GrlKeyID director_key = 0;\n" +"\n" +"static void\n" +"resolve_cb (GrlSource *src, guint operation_id, GrlMedia *media, gpointer " +"user_data, const GError *error)\n" +"{\n" +" const char *title, *studio;\n" +"\n" +" g_assert_no_error (error);\n" +" g_assert (media);\n" +"\n" +" title = grl_media_get_title (media);\n" +" studio = grl_media_get_studio (media);\n" +" printf (\"Media: Title='%s', Studio='%s'\\n\",\n" +" title, studio);\n" +"\n" +" if (director_key != 0) {\n" +" const gchar *director =\n" +" grl_data_get_string (GRL_DATA (media), director_key);\n" +" printf (\" Director=%s\\n\", director);\n" +" }\n" +"\n" +" g_main_loop_quit (loop);\n" +"}\n" +"\n" +"int main (int argc, char *argv[])\n" +"{\n" +" GrlRegistry *reg;\n" +" GrlConfig *config;\n" +" GError *error = NULL;\n" +" GrlSource *src;\n" +" gboolean plugin_activated;\n" +" GrlCaps *caps;\n" +" GrlOperationOptions *options;\n" +" GrlMedia *media;\n" +" const GList *keys;\n" +" const GList* l;\n" +"\n" +" grl_init (&argc, &argv);\n" +"\n" +" /*\n" +" * Set the TMDB API key:\n" +" * You must use your own TMDB API key in your own application.\n" +" */\n" +" reg = grl_registry_get_default ();\n" +" config = grl_config_new (TMDB_PLUGIN_ID, NULL);\n" +" grl_config_set_api_key (config, TMDB_KEY);\n" +" grl_registry_add_config (reg, config, NULL);\n" +" grl_registry_load_all_plugins (reg, FALSE, NULL);\n" +"\n" +" /*\n" +" * Get the plugin:\n" +" */\n" +" error = NULL;\n" +" plugin_activated =\n" +" grl_registry_activate_plugin_by_id (reg, TMDB_PLUGIN_ID, &error);\n" +" g_assert (plugin_activated);\n" +" g_assert_no_error (error);\n" +"\n" +" /*\n" +" * Get the Grilo source:\n" +" */\n" +" src = grl_registry_lookup_source (reg, TMDB_PLUGIN_ID);\n" +"\n" +" /*\n" +" * Check that it has the expected capability:\n" +" */\n" +" g_assert (grl_source_supported_operations (src) & GRL_OP_RESOLVE);\n" +" caps = grl_source_get_caps (src, GRL_OP_RESOLVE);\n" +" g_assert (caps);\n" +"\n" +" options = grl_operation_options_new (caps);\n" +"\n" +" /*\n" +" * A media item that we will give to the TMDB plugin,\n" +" * to discover its details.\n" +" */\n" +" media = grl_media_video_new ();\n" +" grl_media_set_title (media, \"Sherlock Holmes\");\n" +"\n" +" /*\n" +" * Discover what keys are provided by the source:\n" +" */\n" +" keys = grl_source_supported_keys (src);\n" +" for (l = keys; l != NULL; l = l->next) {\n" +" const gchar *name;\n" +" GrlKeyID id = GPOINTER_TO_INT (l->data);\n" +"\n" +" g_assert (id);\n" +"\n" +" name = grl_metadata_key_get_name (id);\n" +" printf (\"Supported key: %s\\n\", name);\n" +"\n" +" /*\n" +" * Remember this for later use:\n" +" * You may instead use grl_registry_lookup_metadata_key_name().\n" +" */\n" +" if (g_strcmp0 (name, \"tmdb-director\") == 0) {\n" +" director_key = id;\n" +" }\n" +" }\n" +"\n" +" /*\n" +" * Ask the TMDB plugin for the media item's details,\n" +" * from the TMDB online service:\n" +" */\n" +" grl_source_resolve (src, media,\n" +" keys, options,\n" +" resolve_cb, NULL);\n" +"\n" +" /*\n" +" * Start the main loop so our callback can be called:\n" +" */\n" +" loop = g_main_loop_new (NULL, FALSE);\n" +" g_main_loop_run (loop);\n" +"\n" +" /*\n" +" * Release objects:\n" +" */\n" +" g_object_unref (media);\n" +" g_object_unref (config);\n" +" g_object_unref (options);\n" +"\n" +" /*\n" +" * Deinitialize Grilo:\n" +" */\n" +" grl_deinit ();\n" +"}\n" +"\n" +"\n" +"\n" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:140 +msgid "Tracker" +msgstr "Tracker" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:141 +msgid "" +"This is a Grilo plugin for Tracker. Its plugin ID is \"grl-tracker" +"\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til Tracker. Dets udvidelsesmodul-id er " +"\"grl-tracker\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:145 +msgid "Vimeo" +msgstr "Vimeo" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:146 +msgid "" +"This is a Grilo plugin for Vimeo. Its plugin ID is \"grl-vimeo\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til Vimeo. Dets udvidelsesmodul-id er " +"\"grl-vimeo\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:150 +msgid "YouTube" +msgstr "YouTube" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:151 +msgid "" +"This is a Grilo plugin for YouTube. Its plugin ID is \"grl-youtube" +"\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til YouTube. Dets udvidelsesmodul-id er " +"\"grl-youtube\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:155 +msgid "DLeyna" +msgstr "DLeyna" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:156 +msgid "" +"This is a Grilo plugin for UPnP/DLNA. Its plugin ID is \"grl-dleyna" +"\"" +msgstr "" +"Dette er et Grilo-udvidelsesmodul til UPnP/DLNA. Dets udvidelsesmodul-id er " +"\"grl-dleyna\"" + +#. (itstool) path: para/ulink +#: C/legal.xml:9 +msgid "link" +msgstr "link" + +#. (itstool) path: legalnotice/para +#: C/legal.xml:2 +msgid "" +"Permission is granted to copy, distribute and/or modify this document under " +"the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any " +"later version published by the Free Software Foundation with no Invariant " +"Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy " +"of the GFDL at this <_:ulink-1/> or in the file COPYING-DOCS distributed " +"with this manual." +msgstr "" +"Der gives tilladelse til at kopiere, distribuere og/eller ændre dette " +"dokument under betingelserne i GNU Free Documentation License (GFDL), " +"version 1.1 eller enhver senere version udgivet af Free Software Foundation; " +"uden invariante afsnit, forsidetekster, samt bagsidetekster. Du kan se en " +"kopi af GFDL her <_:ulink-1/>, eller i filen COPYING-DOCS som distribueres " +"sammen med denne manual." + +#. (itstool) path: legalnotice/para +#: C/legal.xml:12 +msgid "" +"This manual is part of a collection of GNOME manuals distributed under the " +"GFDL. If you want to distribute this manual separately from the collection, " +"you can do so by adding a copy of the license to the manual, as described in " +"section 6 of the license." +msgstr "" +"Denne manual er en del af den samling af GNOME-manualer, som udgives under " +"GFDL. Hvis du ønsker at distribuere denne manuel adskilt fra samlingen, kan " +"du gøre dette ved at tilføje en kopi af licensen til manualen, som beskrevet " +"i afsnit 6 af licensen." + +#. (itstool) path: legalnotice/para +#: C/legal.xml:19 +msgid "" +"Many of the names used by companies to distinguish their products and " +"services are claimed as trademarks. Where those names appear in any GNOME " +"documentation, and the members of the GNOME Documentation Project are made " +"aware of those trademarks, then the names are in capital letters or initial " +"capital letters." +msgstr "" +"En stor del af de navne, som anvendes af firmaer til at identificere deres " +"produkter og tjenester, hævdes som værende varemærker. Hvor disse navne " +"fremgår i en hvilken som helst GNOME-dokumentation, og medlemmerne af GNOME-" +"dokumentationsprojektet er gjort opmærksom på disse varemærker, så er disse " +"navne vist med store bogstaver eller stort begyndelsesbogstav." + +#. (itstool) path: listitem/para +#: C/legal.xml:35 +msgid "" +"DOCUMENT IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTY OF ANY KIND, " +"EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT " +"THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS " +"MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE " +"RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR " +"MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR " +"MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL " +"WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY " +"SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN " +"ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION " +"OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND" +msgstr "" +"DETTE DOKUMENT GØRES TILGÆNGELIGT SÅDAN SOM DET ER, UDEN NOGEN FORM FOR " +"GARANTI, HVERKEN UDTALT ELLER ANTYDET, DERIBLANDT, UDEN BEGRÆNSNINGER, " +"GARANTIER OM AT DOKUMENTET ELLER ÆNDREDE VERSIONER AF DOKUMENTET ER FRIT FOR " +"DEFEKTER, PASSENDE TIL ET BESTEMT FORMÅL ELLER IKKE-KRÆNKENDE. DU HÆFTER " +"SELV FOR HELE RISIKOEN VEDRØRENDE KVALITET, KORREKTHED OG YDELSE FOR " +"DOKUMENTET ELLER ÆNDREDE VERSIONER AF DOKUMENTET. SKULLE ET DOKUMENT, ELLER " +"EN ÆNDRET VERSION AF ET DOKUMENT VISE SIG AT VÆRE DEFEKT PÅ EN HVILKEN SOM " +"HELST MÅDE, HÆFTER DU FOR BETALING FOR EVENTUEL NØDVENDIG SERVICE, " +"REPARATION ELLER KORREKTION (OG IKKE HVERKEN DEN OPRINDELIGE FORFATTER, " +"SKRIBENT ELLER NOGEN ANDEN BIDRAGYDER). DENNE ERKLÆRING OM GARANTIFORBEHOLD " +"ER EN ESSENTIEL DEL AF DENNE LICENS. INGEN BRUG AF NOGET DOKUMENT ELLER " +"ÆNDRET VERSION AF DOKUMENTET ER AUTORISERET HERUNDER BORTSET FRA DENNE " +"ANSVARSFRASKRIVELSE OG" + +#. (itstool) path: listitem/para +#: C/legal.xml:55 +msgid "" +"UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING " +"NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY " +"CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE " +"DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON " +"FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF " +"ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, " +"WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES " +"OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED " +"VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE " +"POSSIBILITY OF SUCH DAMAGES." +msgstr "" +"UNDER INGEN OMSTÆNDIGHEDER OG UNDER INGEN JURIDISK TEORI, UANSET OM DET ER " +"EN BEVIDST SKADENDE HANDLING (INKLUSIVE UFORSVARLIGHED) ELLER PÅ HVILKEN SOM " +"HELST ANDEN MÅDE, KAN FORFATTEREN, SKRIBENT, BIDRAGYDERE, DISTRIBUTØRER " +"ELLER FORSYNER AF DETTE DOKUMENT ELLER MODIFICEREDE VERSIONER GØRES " +"ANSVARLIG OVERFOR NOGEN PERSON FOR NOGEN DIREKTE, INDIREKTE, SPECIEL, " +"TILFÆLDIG ELLER FØLGENDE SKADE PÅFØRT NOGEN INKLUSIVE, UDEN BEGRÆNSNING, " +"SKADE SOM FØLGE AF TAB AF RYGTE, ARBEJDSSTOP, COMPUTERFEJL ELLER -SVIGT, " +"ELLER ENHVER ANDEN FORM FOR SKADE ELLER TAB SOM ER OPSTÅET I FORBINDELSE MED " +"BRUG AF DETTE DOKUMENT ELLER MODIFICEREDE VERSIONER HERAF, SELV HVIS EN " +"SÅDAN PART HAR VÆRET INFORMERET OM MULIGHEDEN FOR SÅDANNE SKADER." + +#. (itstool) path: legalnotice/para +#: C/legal.xml:28 +msgid "" +"DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS " +"OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: " +"<_:orderedlist-1/>" +msgstr "" +"DOKUMENTET OG ÆNDREDE VERSIONER AF DOKUMENTET STILLES TIL RÅDIGHED UNDER GNU " +"FREE DOCUMENTATION LICENSE MED FØLGENDE BETINGELSER: <_:orderedlist-1/>" diff -Nru grilo-plugins-0.3.11/help/es/es.po grilo-plugins-0.3.12/help/es/es.po --- grilo-plugins-0.3.11/help/es/es.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/help/es/es.po 2020-09-03 05:36:44.356468000 +0000 @@ -1,11 +1,11 @@ # -# Daniel Mustieles , 2018-2019. +# Daniel Mustieles , 2018-2020. # msgid "" msgstr "" "Project-Id-Version: 1\n" -"POT-Creation-Date: 2019-09-30 11:33+0000\n" -"PO-Revision-Date: 2019-10-04 12:19+0200\n" +"POT-Creation-Date: 2020-05-30 10:28+0000\n" +"PO-Revision-Date: 2020-08-25 13:39+0200\n" "Last-Translator: Daniel Mustieles \n" "Language-Team: Spanish - Spain \n" "Language: es_ES\n" @@ -13,12 +13,12 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Gtranslator 3.34.0\n" +"X-Generator: Gtranslator 3.36.0\n" #. Put one translator per line, in the form NAME , YEAR1, YEAR2 msgctxt "_" msgid "translator-credits" -msgstr "Daniel Mustieles , 2018, 2019" +msgstr "Daniel Mustieles , 2018, 2020" #. (itstool) path: bookinfo/title #. (itstool) path: chapter/title @@ -150,12 +150,15 @@ #. (itstool) path: sect1/para #: C/grilo-plugins.xml:90 +#| msgid "" +#| "This is a Grilo plugin for Gravatar Its plugin ID is \"grl-" +#| "gravatar\"." msgid "" -"This is a Grilo plugin for Gravatar Its plugin ID is \"grl-gravatar" -"\"." +"This is a Grilo plugin for Gravatar. Its plugin ID is \"grl-gravatar" +"\"" msgstr "" -"Esto es un complemento para Gravatar. El ID de este complemento es " -"\"grl-gravatar\"" +"Esto es un complemento de Grilo para Gravatar. El ID de este complemento es " +"\"grl-gravatar\"" #. (itstool) path: sect1/title #: C/grilo-plugins.xml:94 diff -Nru grilo-plugins-0.3.11/help/LINGUAS grilo-plugins-0.3.12/help/LINGUAS --- grilo-plugins-0.3.11/help/LINGUAS 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/help/LINGUAS 2020-09-03 05:36:44.356468000 +0000 @@ -1,6 +1,8 @@ +da cs de es pl pt_BR sv +uk diff -Nru grilo-plugins-0.3.11/help/pl/pl.po grilo-plugins-0.3.12/help/pl/pl.po --- grilo-plugins-0.3.11/help/pl/pl.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/help/pl/pl.po 2020-09-03 05:36:44.357468000 +0000 @@ -1,14 +1,14 @@ # Polish translation for grilo-plugins help. -# Copyright © 2018-2019 the grilo-plugins authors. +# Copyright © 2018-2020 the grilo-plugins authors. # This file is distributed under the same license as the grilo-plugins help. -# Piotr Drąg , 2018-2019. -# Aviary.pl , 2018-2019. +# Piotr Drąg , 2018-2020. +# Aviary.pl , 2018-2020. # msgid "" msgstr "" "Project-Id-Version: grilo-plugins-help\n" -"POT-Creation-Date: 2019-02-12 01:59+0000\n" -"PO-Revision-Date: 2019-02-12 12:47+0100\n" +"POT-Creation-Date: 2020-04-03 20:39+0000\n" +"PO-Revision-Date: 2020-04-05 10:58+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" @@ -22,8 +22,8 @@ msgctxt "_" msgid "translator-credits" msgstr "" -"Piotr Drąg , 2018-2019\n" -"Aviary.pl , 2018-2019" +"Piotr Drąg , 2018-2020\n" +"Aviary.pl , 2018-2020" #. (itstool) path: bookinfo/title #. (itstool) path: chapter/title @@ -155,11 +155,11 @@ #. (itstool) path: sect1/para #: C/grilo-plugins.xml:90 msgid "" -"This is a Grilo plugin for Gravatar Its plugin ID is \"grl-gravatar" -"\"." +"This is a Grilo plugin for Gravatar. Its plugin ID is \"grl-gravatar" +"\"" msgstr "" "To wtyczka Grilo dla serwisu Gravatar. Jej identyfikator to \"grl-" -"gravatar\"." +"gravatar\"" #. (itstool) path: sect1/title #: C/grilo-plugins.xml:94 diff -Nru grilo-plugins-0.3.11/help/sv/sv.po grilo-plugins-0.3.12/help/sv/sv.po --- grilo-plugins-0.3.11/help/sv/sv.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/help/sv/sv.po 2020-09-03 05:36:44.357468000 +0000 @@ -1,13 +1,13 @@ # Swedish translation for grilo-plugins. -# Copyright © 2018, 2019 grilo-plugins's COPYRIGHT HOLDER +# Copyright © 2018-2020 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. -# Anders Jonsson , 2018, 2019. +# Anders Jonsson , 2018, 2019, 2020. # msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" -"POT-Creation-Date: 2019-02-12 01:59+0000\n" -"PO-Revision-Date: 2019-02-12 16:20+0100\n" +"POT-Creation-Date: 2020-04-03 20:39+0000\n" +"PO-Revision-Date: 2020-05-01 22:07+0200\n" "Last-Translator: Anders Jonsson \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -15,7 +15,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.2.1\n" +"X-Generator: Poedit 2.3\n" #. Put one translator per line, in the form NAME , YEAR1, YEAR2 msgctxt "_" @@ -153,12 +153,11 @@ msgid "Gravatar" msgstr "Gravatar" -# TODO: Missing period in original between sentences #. (itstool) path: sect1/para #: C/grilo-plugins.xml:90 msgid "" -"This is a Grilo plugin for Gravatar Its plugin ID is \"grl-gravatar" -"\"." +"This is a Grilo plugin for Gravatar. Its plugin ID is \"grl-gravatar" +"\"" msgstr "" "Detta är en Grilo-insticksmodul för Gravatar. Dess insticksmodul-ID är " "\"grl-gravatar\"." @@ -318,160 +317,6 @@ #. (itstool) path: sect1/programlisting #: C/grilo-plugins.xml:133 #, no-wrap -#| msgid "" -#| "\n" -#| "/*\n" -#| " * Copyright (C) 2012 Canonical Ltd.\n" -#| " *\n" -#| " * Author: Jens Georg <jensg@openismus.com>\n" -#| " *\n" -#| " * This library is free software; you can redistribute it and/or\n" -#| " * modify it under the terms of the GNU Lesser General Public License\n" -#| " * as published by the Free Software Foundation; version 2.1 of\n" -#| " * the License, or (at your option) any later version.\n" -#| " *\n" -#| " * This library is distributed in the hope that it will be useful, but\n" -#| " * WITHOUT ANY WARRANTY; without even the implied warranty of\n" -#| " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" -#| " * Lesser General Public License for more details.\n" -#| " *\n" -#| " * You should have received a copy of the GNU Lesser General Public\n" -#| " * License along with this library; if not, write to the Free Software\n" -#| " * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n" -#| " * 02110-1301 USA\n" -#| " *\n" -#| " */\n" -#| "\n" -#| "#include <grilo.h>\n" -#| "#include <stdio.h>\n" -#| "\n" -#| "/**\n" -#| " * This TMDB key is just for testing.\n" -#| " * For real-world use, please request your own key from\n" -#| " * http://api.themoviedb.org\n" -#| " */\n" -#| "#define TMDB_KEY \"719b9b296835b04cd919c4bf5220828a\"\n" -#| "\n" -#| "#define TMDB_PLUGIN_ID \"grl-tmdb\"\n" -#| "\n" -#| "GMainLoop *loop = NULL;\n" -#| "GrlKeyID director_key = 0;\n" -#| "\n" -#| "static void\n" -#| "resolve_cb (GrlSource *src, guint operation_id, GrlMedia *media, gpointer user_data, const GError *error)\n" -#| "{\n" -#| " g_assert_no_error (error);\n" -#| " g_assert (media);\n" -#| "\n" -#| " const gchar *title = grl_media_get_title (media);\n" -#| " const gchar *studio = grl_media_get_studio (media);\n" -#| " printf (\"Media: Title='%s', Studio='%s'\\n\",\n" -#| " title, studio);\n" -#| "\n" -#| " if (director_key != 0) {\n" -#| " const gchar *director =\n" -#| " grl_data_get_string (GRL_DATA (media), director_key);\n" -#| " printf (\" Director=%s\\n\", director);\n" -#| " }\n" -#| "\n" -#| " g_main_loop_quit (loop);\n" -#| "}\n" -#| "\n" -#| "int main (int argc, char *argv[])\n" -#| "{\n" -#| " grl_init (&argc, &argv);\n" -#| "\n" -#| " /*\n" -#| " * Set the TMDB API key:\n" -#| " * You must use your own TMDB API key in your own application.\n" -#| " */\n" -#| " GrlRegistry *reg = grl_registry_get_default ();\n" -#| " GrlConfig *config = grl_config_new (TMDB_PLUGIN_ID, NULL);\n" -#| " grl_config_set_api_key (config, TMDB_KEY);\n" -#| " grl_registry_add_config (reg, config, NULL);\n" -#| " grl_registry_load_all_plugins (reg, FALSE, NULL);\n" -#| "\n" -#| " /*\n" -#| " * Get the plugin:\n" -#| " */\n" -#| " GError *error = NULL;\n" -#| " gboolean plugin_activated =\n" -#| " grl_registry_activate_plugin_by_id (reg, TMDB_PLUGIN_ID, &error);\n" -#| " g_assert (plugin_activated);\n" -#| " g_assert_no_error (error);\n" -#| "\n" -#| " /*\n" -#| " * Get the Grilo source:\n" -#| " */\n" -#| " GrlSource *src =\n" -#| " grl_registry_lookup_source (reg, TMDB_PLUGIN_ID);\n" -#| "\n" -#| " /*\n" -#| " * Check that it has the expected capability:\n" -#| " */\n" -#| " g_assert (grl_source_supported_operations (src) & GRL_OP_RESOLVE);\n" -#| " GrlCaps *caps = grl_source_get_caps (src, GRL_OP_RESOLVE);\n" -#| " g_assert (caps);\n" -#| "\n" -#| " GrlOperationOptions *options = grl_operation_options_new (caps);\n" -#| "\n" -#| " /*\n" -#| " * A media item that we will give to the TMDB plugin,\n" -#| " * to discover its details.\n" -#| " */\n" -#| " GrlMedia *media = grl_media_video_new ();\n" -#| " grl_media_set_title (media, \"Sherlock Holmes\");\n" -#| "\n" -#| " /*\n" -#| " * Discover what keys are provided by the source:\n" -#| " */\n" -#| " const GList *keys = grl_source_supported_keys (src);\n" -#| " const GList* l = NULL;\n" -#| " for (l = keys; l != NULL; l = l->next) {\n" -#| " GrlKeyID id = GPOINTER_TO_INT (l->data);\n" -#| " g_assert (id);\n" -#| "\n" -#| " const gchar *name = grl_metadata_key_get_name (id);\n" -#| " printf (\"Supported key: %s\\n\", name);\n" -#| "\n" -#| " /*\n" -#| " * Remember this for later use:\n" -#| " * You may instead use grl_registry_lookup_metadata_key_name().\n" -#| " */\n" -#| " if (g_strcmp0 (name, \"tmdb-director\") == 0) {\n" -#| " director_key = id;\n" -#| " }\n" -#| " }\n" -#| "\n" -#| " /*\n" -#| " * Ask the TMDB plugin for the media item's details,\n" -#| " * from the TMDB online service:\n" -#| " */\n" -#| " grl_source_resolve (src, media,\n" -#| " keys, options,\n" -#| " resolve_cb, NULL);\n" -#| "\n" -#| " /*\n" -#| " * Start the main loop so our callback can be called:\n" -#| " */\n" -#| " loop = g_main_loop_new (NULL, FALSE);\n" -#| " g_main_loop_run (loop);\n" -#| "\n" -#| " /*\n" -#| " * Release objects:\n" -#| " */\n" -#| " g_object_unref (media);\n" -#| " g_object_unref (config);\n" -#| " g_object_unref (options);\n" -#| "\n" -#| " /*\n" -#| " * Deinitialize Grilo:\n" -#| " */\n" -#| " grl_deinit ();\n" -#| "}\n" -#| "\n" -#| "\n" -#| "\n" msgid "" "\n" "/*\n" diff -Nru grilo-plugins-0.3.11/help/uk/uk.po grilo-plugins-0.3.12/help/uk/uk.po --- grilo-plugins-0.3.11/help/uk/uk.po 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/help/uk/uk.po 2020-09-03 05:36:44.357468000 +0000 @@ -0,0 +1,838 @@ +# Ukrainian translation for grilo-plugins. +# Copyright (C) 2020 grilo-plugins's COPYRIGHT HOLDER +# This file is distributed under the same license as the grilo-plugins package. +# +# Yuri Chornoivan , 2020. +msgid "" +msgstr "" +"Project-Id-Version: grilo-plugins master\n" +"POT-Creation-Date: 2020-06-30 14:14+0000\n" +"PO-Revision-Date: 2020-06-30 17:48+0300\n" +"Last-Translator: Yuri Chornoivan \n" +"Language-Team: Ukrainian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: uk\n" +"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Lokalize 20.07.70\n" + +#. Put one translator per line, in the form NAME , YEAR1, YEAR2 +msgctxt "_" +msgid "translator-credits" +msgstr "Юрій Чорноіван , 2020" + +#. (itstool) path: bookinfo/title +#. (itstool) path: chapter/title +#: C/grilo-plugins.xml:19 C/grilo-plugins.xml:60 +msgid "Grilo Plugins" +msgstr "Додатки Grilo" + +#. (itstool) path: authorgroup/author +#: C/grilo-plugins.xml:22 +msgid "Murray Cumming" +msgstr "Murray Cumming" + +#. (itstool) path: abstract/para +#. (itstool) path: chapter/para +#: C/grilo-plugins.xml:31 C/grilo-plugins.xml:55 +msgid "" +"Grilo is a framework for browsing and searching media content from various " +"sources using a single API. The Grilo Plugins plugins for the Grilo " +"framework to provide access to various sources of media and metadata." +msgstr "" +"Grilo — бібліотека для навігації і пошуку даних щодо відео та звукових" +" записів з різноманітних джерел за допомогою єдиного програмного інтерфейсу." +" Додатки Grilo до бібліотеки Grilo надають доступ до різноманітних джерел" +" метаданих." + +#. (itstool) path: bookinfo/copyright +#: C/grilo-plugins.xml:35 +msgid "2012 Openismus GmbH" +msgstr "2012 Openismus GmbH" + +#. (itstool) path: legalnotice/para +#: C/grilo-plugins.xml:41 +msgid "" +"Permission is granted to copy, distribute and/or modify this document under " +"the terms of the GNU Free Documentation License, Version 1.2 or any later " +"version published by the Free Software Foundation; with no Invariant " +"Sections, no Front-Cover Texts, and no Back-Cover Texts. You may obtain a " +"copy of the GNU Free Documentation License from the Free Software Foundation " +"by visiting their Web site or by writing to: Free Software Foundation, Inc., " +"51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA." +msgstr "" +"Кожен має право копіювати, розповсюджувати та вносити зміни до даного" +" Документа на умовах GNU Free Documentation License, Версії 1.2 або будь-якої" +" наступної версії, опублікованої Free Software Foundation; даний Документ не" +" містить Незмінних розділів; даний Документ не має Текстів титульної та" +" зворотної обкладинок. Ви можете отримати копію GNU Free Documentation" +" License у Free Software Foundation, відвідавши її сайт або написавши за" +" такою адресоою: Free Software Foundation, Inc., " +"51 Franklin Street, Fifth Floor, Boston, MA 02111-1301, USA." + +#. (itstool) path: chapter/title +#: C/grilo-plugins.xml:53 +msgid "Introduction" +msgstr "Вступ" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:64 +msgid "Apple Trailers" +msgstr "Трейлери Apple" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:65 +msgid "" +"This is a Grilo plugin for Apple trailers. Its plugin ID is \"grl-" +"apple-trailers\"" +msgstr "" +"Це додаток Grilo для трейлерів Apple. Його ідентифікатором додатка є \"grl-" +"apple-trailers\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:69 +msgid "Bookmarks" +msgstr "Закладки" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:70 +msgid "" +"This is a Grilo plugin for bookmarks. Its plugin ID is \"grl-" +"bookmarks\"" +msgstr "" +"Це додаток Grilo для закладок. Його ідентифікатором додатка є \"grl-" +"bookmarks\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:74 +msgid "DMap" +msgstr "DMap" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:75 +msgid "" +"This is a Grilo plugin for DMap. Its plugin ID is \"grl-dmap\"" +msgstr "" +"Це додаток Grilo для DMap. Його ідентифікатором додатка є \"grl-dmap\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:79 +msgid "Filesystem" +msgstr "Файлова система" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:80 +msgid "" +"This is a Grilo plugin for the filesystem. Its plugin ID is \"grl-" +"filesystem\"" +msgstr "" +"Це додаток Grilo для файлової системи. Його ідентифікатором додатка є <" +"literal>\"grl-" +"filesystem\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:84 +msgid "Flickr" +msgstr "Flickr" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:85 +msgid "" +"This is a Grilo plugin for Flickr. Its plugin ID is \"grl-flickr\"" +msgstr "" +"Це додаток Grilo для Flickr. Його ідентифікатором додатка є \"grl-flickr\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:89 +msgid "Gravatar" +msgstr "Gravatar" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:90 +msgid "" +"This is a Grilo plugin for Gravatar. Its plugin ID is \"grl-gravatar" +"\"" +msgstr "" +"Це додаток Grilo для Gravatar. Його ідентифікатором додатка є \"grl-gravatar" +"\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:94 +msgid "Jamendo" +msgstr "Jamendo" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:95 +msgid "" +"This is a Grilo plugin for Jamendo. Its plugin ID is \"grl-jamendo" +"\"" +msgstr "" +"Це додаток Grilo для Jamendo. Його ідентифікатором додатка є \"grl-jamendo" +"\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:99 +msgid "Local Metadata" +msgstr "Локальні метадані" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:100 +msgid "" +"This is a Grilo plugin for Local metadata. Its plugin ID is \"grl-" +"local-metadata\"" +msgstr "" +"Це додаток Grilo для локальних метаданих. Його ідентифікатором додатка є <" +"literal>\"grl-local-metadata\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:104 +msgid "Metadata Store" +msgstr "Сховище метаданих" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:105 +msgid "" +"This is a Grilo plugin for metadata store. Its plugin ID is \"grl-" +"metadata-store\"" +msgstr "" +"Це додаток Grilo для сховища метаданих. Його ідентифікатором додатка є <" +"literal>\"grl-" +"metadata-store\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:109 +msgid "Optical Media" +msgstr "Оптичний носій" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:110 +msgid "" +"This is a Grilo plugin for optical media. Its plugin ID is \"grl-" +"optical-media\"" +msgstr "" +"Це додаток Grilo для оптичних носіїв даних. Його ідентифікатором додатка є <" +"literal>\"grl-" +"optical-media\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:114 +msgid "Podcasts" +msgstr "Подкасти" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:115 +msgid "" +"This is a Grilo plugin for podcasts. Its plugin ID is \"grl-podcasts" +"\"" +msgstr "" +"Це додаток Grilo для подкастів. Його ідентифікатором додатка є \"grl-podcasts" +"\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:119 +msgid "Shoutcast" +msgstr "Shoutcast" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:120 +msgid "" +"This is a Grilo plugin for Shoutcast. Its plugin ID is \"grl-" +"shoutcast\"" +msgstr "" +"Це додаток Grilo для Shoutcast. Його ідентифікатором додатка є \"grl-" +"shoutcast\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:124 +msgid "TMDb Plugin" +msgstr "Додаток TMDb" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:125 +msgid "" +"The TMDb plugin retrieves information about movies from the TMDb online service, which is a community-" +"maintained movie database. Its plugin ID is \"grl-tmdb\"" +msgstr "" +"Додаток TMDb отримує дані щодо фільмів з інтернет-служби TMDb, яка є базою даних фільмів, супровід якої" +" здійснює спільнота користувачів. Його ідентифікатором додатка є \"grl-tmdb\"" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:126 +msgid "" +"Before using this plugin, you should set the TMDB API Key with grl_config_set_api_key()." +msgstr "" +"Перш ніж користуватися цим додатком, вам слід встановити ключ до програмного" +" інтерфейсу TMDB за допомогою grl_config_set_api_key()." + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:127 +msgid "" +"You may then use grl_source_resolve() to discover details about an existing GrlMediaItem." +msgstr "" +"Далі, ви можете скористатися grl_source_resolve() для визначення подробиць щодо наявного GrlMediaItem." + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:128 +msgid "" +"This plugin does not support search via grl_source_search() or queries via grl_source_query()." +msgstr "" +"У цьому додатку не передбачено підтримки пошуку за допомогою grl_source_search() або запитів за допомогою" +" grl_source_query()." + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:130 +msgid "Here is a simple example of the use of the Grilo TMDb plugin:" +msgstr "Це простий приклад використання додатка TMDb Grilo:" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:132 +msgid "" +"File: example-tmdb.c" +msgstr "" +"Файл: example-tmdb.c" + +#. (itstool) path: sect1/programlisting +#: C/grilo-plugins.xml:133 +#, no-wrap +msgid "" +"\n" +"/*\n" +" * Copyright (C) 2012 Canonical Ltd.\n" +" *\n" +" * Author: Jens Georg <jensg@openismus.com>\n" +" *\n" +" * This library is free software; you can redistribute it and/or\n" +" * modify it under the terms of the GNU Lesser General Public License\n" +" * as published by the Free Software Foundation; version 2.1 of\n" +" * the License, or (at your option) any later version.\n" +" *\n" +" * This library is distributed in the hope that it will be useful, but\n" +" * WITHOUT ANY WARRANTY; without even the implied warranty of\n" +" * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" +" * Lesser General Public License for more details.\n" +" *\n" +" * You should have received a copy of the GNU Lesser General Public\n" +" * License along with this library; if not, write to the Free Software\n" +" * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n" +" * 02110-1301 USA\n" +" *\n" +" */\n" +"\n" +"#include <grilo.h>\n" +"#include <stdio.h>\n" +"\n" +"/**\n" +" * This TMDB key is just for testing.\n" +" * For real-world use, please request your own key from\n" +" * http://api.themoviedb.org\n" +" */\n" +"#define TMDB_KEY \"719b9b296835b04cd919c4bf5220828a\"\n" +"\n" +"#define TMDB_PLUGIN_ID \"grl-tmdb\"\n" +"\n" +"GMainLoop *loop = NULL;\n" +"GrlKeyID director_key = 0;\n" +"\n" +"static void\n" +"resolve_cb (GrlSource *src, guint operation_id, GrlMedia *media, gpointer" +" user_data, const GError *error)\n" +"{\n" +" const char *title, *studio;\n" +"\n" +" g_assert_no_error (error);\n" +" g_assert (media);\n" +"\n" +" title = grl_media_get_title (media);\n" +" studio = grl_media_get_studio (media);\n" +" printf (\"Media: Title='%s', Studio='%s'\\n\",\n" +" title, studio);\n" +"\n" +" if (director_key != 0) {\n" +" const gchar *director =\n" +" grl_data_get_string (GRL_DATA (media), director_key);\n" +" printf (\" Director=%s\\n\", director);\n" +" }\n" +"\n" +" g_main_loop_quit (loop);\n" +"}\n" +"\n" +"int main (int argc, char *argv[])\n" +"{\n" +" GrlRegistry *reg;\n" +" GrlConfig *config;\n" +" GError *error = NULL;\n" +" GrlSource *src;\n" +" gboolean plugin_activated;\n" +" GrlCaps *caps;\n" +" GrlOperationOptions *options;\n" +" GrlMedia *media;\n" +" const GList *keys;\n" +" const GList* l;\n" +"\n" +" grl_init (&argc, &argv);\n" +"\n" +" /*\n" +" * Set the TMDB API key:\n" +" * You must use your own TMDB API key in your own application.\n" +" */\n" +" reg = grl_registry_get_default ();\n" +" config = grl_config_new (TMDB_PLUGIN_ID, NULL);\n" +" grl_config_set_api_key (config, TMDB_KEY);\n" +" grl_registry_add_config (reg, config, NULL);\n" +" grl_registry_load_all_plugins (reg, FALSE, NULL);\n" +"\n" +" /*\n" +" * Get the plugin:\n" +" */\n" +" error = NULL;\n" +" plugin_activated =\n" +" grl_registry_activate_plugin_by_id (reg, TMDB_PLUGIN_ID, &error);\n" +" g_assert (plugin_activated);\n" +" g_assert_no_error (error);\n" +"\n" +" /*\n" +" * Get the Grilo source:\n" +" */\n" +" src = grl_registry_lookup_source (reg, TMDB_PLUGIN_ID);\n" +"\n" +" /*\n" +" * Check that it has the expected capability:\n" +" */\n" +" g_assert (grl_source_supported_operations (src) & GRL_OP_RESOLVE);\n" +" caps = grl_source_get_caps (src, GRL_OP_RESOLVE);\n" +" g_assert (caps);\n" +"\n" +" options = grl_operation_options_new (caps);\n" +"\n" +" /*\n" +" * A media item that we will give to the TMDB plugin,\n" +" * to discover its details.\n" +" */\n" +" media = grl_media_video_new ();\n" +" grl_media_set_title (media, \"Sherlock Holmes\");\n" +"\n" +" /*\n" +" * Discover what keys are provided by the source:\n" +" */\n" +" keys = grl_source_supported_keys (src);\n" +" for (l = keys; l != NULL; l = l->next) {\n" +" const gchar *name;\n" +" GrlKeyID id = GPOINTER_TO_INT (l->data);\n" +"\n" +" g_assert (id);\n" +"\n" +" name = grl_metadata_key_get_name (id);\n" +" printf (\"Supported key: %s\\n\", name);\n" +"\n" +" /*\n" +" * Remember this for later use:\n" +" * You may instead use grl_registry_lookup_metadata_key_name().\n" +" */\n" +" if (g_strcmp0 (name, \"tmdb-director\") == 0) {\n" +" director_key = id;\n" +" }\n" +" }\n" +"\n" +" /*\n" +" * Ask the TMDB plugin for the media item's details,\n" +" * from the TMDB online service:\n" +" */\n" +" grl_source_resolve (src, media,\n" +" keys, options,\n" +" resolve_cb, NULL);\n" +"\n" +" /*\n" +" * Start the main loop so our callback can be called:\n" +" */\n" +" loop = g_main_loop_new (NULL, FALSE);\n" +" g_main_loop_run (loop);\n" +"\n" +" /*\n" +" * Release objects:\n" +" */\n" +" g_object_unref (media);\n" +" g_object_unref (config);\n" +" g_object_unref (options);\n" +"\n" +" /*\n" +" * Deinitialize Grilo:\n" +" */\n" +" grl_deinit ();\n" +"}\n" +"\n" +"\n" +"\n" +msgstr "" +"\n" +"/*\n" +" * Copyright (C) 2012 Canonical Ltd.\n" +" *\n" +" * Author: Jens Georg <jensg@openismus.com>\n" +" *\n" +" * This library is free software; you can redistribute it and/or\n" +" * modify it under the terms of the GNU Lesser General Public License\n" +" * as published by the Free Software Foundation; version 2.1 of\n" +" * the License, or (at your option) any later version.\n" +" *\n" +" * This library is distributed in the hope that it will be useful, but\n" +" * WITHOUT ANY WARRANTY; without even the implied warranty of\n" +" * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" +" * Lesser General Public License for more details.\n" +" *\n" +" * You should have received a copy of the GNU Lesser General Public\n" +" * License along with this library; if not, write to the Free Software\n" +" * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA\n" +" * 02110-1301 USA\n" +" *\n" +" */\n" +"\n" +"#include <grilo.h>\n" +"#include <stdio.h>\n" +"\n" +"/**\n" +" * This TMDB key is just for testing.\n" +" * For real-world use, please request your own key from\n" +" * http://api.themoviedb.org\n" +" */\n" +"#define TMDB_KEY \"719b9b296835b04cd919c4bf5220828a\"\n" +"\n" +"#define TMDB_PLUGIN_ID \"grl-tmdb\"\n" +"\n" +"GMainLoop *loop = NULL;\n" +"GrlKeyID director_key = 0;\n" +"\n" +"static void\n" +"resolve_cb (GrlSource *src, guint operation_id, GrlMedia *media, gpointer" +" user_data, const GError *error)\n" +"{\n" +" const char *title, *studio;\n" +"\n" +" g_assert_no_error (error);\n" +" g_assert (media);\n" +"\n" +" title = grl_media_get_title (media);\n" +" studio = grl_media_get_studio (media);\n" +" printf (\"Media: Title='%s', Studio='%s'\\n\",\n" +" title, studio);\n" +"\n" +" if (director_key != 0) {\n" +" const gchar *director =\n" +" grl_data_get_string (GRL_DATA (media), director_key);\n" +" printf (\" Director=%s\\n\", director);\n" +" }\n" +"\n" +" g_main_loop_quit (loop);\n" +"}\n" +"\n" +"int main (int argc, char *argv[])\n" +"{\n" +" GrlRegistry *reg;\n" +" GrlConfig *config;\n" +" GError *error = NULL;\n" +" GrlSource *src;\n" +" gboolean plugin_activated;\n" +" GrlCaps *caps;\n" +" GrlOperationOptions *options;\n" +" GrlMedia *media;\n" +" const GList *keys;\n" +" const GList* l;\n" +"\n" +" grl_init (&argc, &argv);\n" +"\n" +" /*\n" +" * Set the TMDB API key:\n" +" * You must use your own TMDB API key in your own application.\n" +" */\n" +" reg = grl_registry_get_default ();\n" +" config = grl_config_new (TMDB_PLUGIN_ID, NULL);\n" +" grl_config_set_api_key (config, TMDB_KEY);\n" +" grl_registry_add_config (reg, config, NULL);\n" +" grl_registry_load_all_plugins (reg, FALSE, NULL);\n" +"\n" +" /*\n" +" * Get the plugin:\n" +" */\n" +" error = NULL;\n" +" plugin_activated =\n" +" grl_registry_activate_plugin_by_id (reg, TMDB_PLUGIN_ID, &error);\n" +" g_assert (plugin_activated);\n" +" g_assert_no_error (error);\n" +"\n" +" /*\n" +" * Get the Grilo source:\n" +" */\n" +" src = grl_registry_lookup_source (reg, TMDB_PLUGIN_ID);\n" +"\n" +" /*\n" +" * Check that it has the expected capability:\n" +" */\n" +" g_assert (grl_source_supported_operations (src) & GRL_OP_RESOLVE);\n" +" caps = grl_source_get_caps (src, GRL_OP_RESOLVE);\n" +" g_assert (caps);\n" +"\n" +" options = grl_operation_options_new (caps);\n" +"\n" +" /*\n" +" * A media item that we will give to the TMDB plugin,\n" +" * to discover its details.\n" +" */\n" +" media = grl_media_video_new ();\n" +" grl_media_set_title (media, \"Sherlock Holmes\");\n" +"\n" +" /*\n" +" * Discover what keys are provided by the source:\n" +" */\n" +" keys = grl_source_supported_keys (src);\n" +" for (l = keys; l != NULL; l = l->next) {\n" +" const gchar *name;\n" +" GrlKeyID id = GPOINTER_TO_INT (l->data);\n" +"\n" +" g_assert (id);\n" +"\n" +" name = grl_metadata_key_get_name (id);\n" +" printf (\"Supported key: %s\\n\", name);\n" +"\n" +" /*\n" +" * Remember this for later use:\n" +" * You may instead use grl_registry_lookup_metadata_key_name().\n" +" */\n" +" if (g_strcmp0 (name, \"tmdb-director\") == 0) {\n" +" director_key = id;\n" +" }\n" +" }\n" +"\n" +" /*\n" +" * Ask the TMDB plugin for the media item's details,\n" +" * from the TMDB online service:\n" +" */\n" +" grl_source_resolve (src, media,\n" +" keys, options,\n" +" resolve_cb, NULL);\n" +"\n" +" /*\n" +" * Start the main loop so our callback can be called:\n" +" */\n" +" loop = g_main_loop_new (NULL, FALSE);\n" +" g_main_loop_run (loop);\n" +"\n" +" /*\n" +" * Release objects:\n" +" */\n" +" g_object_unref (media);\n" +" g_object_unref (config);\n" +" g_object_unref (options);\n" +"\n" +" /*\n" +" * Deinitialize Grilo:\n" +" */\n" +" grl_deinit ();\n" +"}\n" +"\n" +"\n" +"\n" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:140 +msgid "Tracker" +msgstr "Tracker" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:141 +msgid "" +"This is a Grilo plugin for Tracker. Its plugin ID is \"grl-tracker" +"\"" +msgstr "" +"Це додаток Grilo для Tracker. Його ідентифікатором додатка є \"grl-tracker" +"\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:145 +msgid "Vimeo" +msgstr "Vimeo" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:146 +msgid "" +"This is a Grilo plugin for Vimeo. Its plugin ID is \"grl-vimeo\"" +msgstr "" +"Це додаток Grilo для Vimeo. Його ідентифікатором додатка є \"grl-vimeo\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:150 +msgid "YouTube" +msgstr "YouTube" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:151 +msgid "" +"This is a Grilo plugin for YouTube. Its plugin ID is \"grl-youtube" +"\"" +msgstr "" +"Це додаток Grilo для YouTube. Його ідентифікатором додатка є \"grl-youtube\"" + +#. (itstool) path: sect1/title +#: C/grilo-plugins.xml:155 +msgid "DLeyna" +msgstr "DLeyna" + +#. (itstool) path: sect1/para +#: C/grilo-plugins.xml:156 +msgid "" +"This is a Grilo plugin for UPnP/DLNA. Its plugin ID is \"grl-dleyna" +"\"" +msgstr "" +"Це додаток Grilo для UPnP/DLNA. Його ідентифікатором додатка є \"grl-dleyna" +"\"" + +#. (itstool) path: para/ulink +#: C/legal.xml:9 +msgid "link" +msgstr "посиланням" + +#. (itstool) path: legalnotice/para +#: C/legal.xml:2 +msgid "" +"Permission is granted to copy, distribute and/or modify this document under " +"the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any " +"later version published by the Free Software Foundation with no Invariant " +"Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy " +"of the GFDL at this <_:ulink-1/> or in the file COPYING-DOCS distributed " +"with this manual." +msgstr "" +"Дозволяється копіювати, розповсюджувати та/або змінювати цей документ за " +"умовами ліцензії GNU Free Documentation License (GFDL), версії 1.1 або будь-" +"якої старішої версії, опублікованої Фондом вільного програмного забезпечення " +"(Free Software Foundation), без змінених частин та без текстів на " +"обкладинках. Ви можете знайти копію ліцензії GFDL за цим <_:ulink-1/> або в " +"файлі COPYING-DOCS, який поширюється разом з цим посібником." + +#. (itstool) path: legalnotice/para +#: C/legal.xml:12 +msgid "" +"This manual is part of a collection of GNOME manuals distributed under the " +"GFDL. If you want to distribute this manual separately from the collection, " +"you can do so by adding a copy of the license to the manual, as described in " +"section 6 of the license." +msgstr "" +"Цей посібник є частиною документації GNOME яка поширюється під ліцензією " +"GFDL. Якщо Ви бажаєте розповсюджувати цей посібник окремо від іншої " +"документації, можете це зробити додавши до нього копію ліцензії, як описано " +"в пункті 6 ліцензії." + +#. (itstool) path: legalnotice/para +#: C/legal.xml:19 +msgid "" +"Many of the names used by companies to distinguish their products and " +"services are claimed as trademarks. Where those names appear in any GNOME " +"documentation, and the members of the GNOME Documentation Project are made " +"aware of those trademarks, then the names are in capital letters or initial " +"capital letters." +msgstr "" +"Багато назв, які використовуються компаніями для позначення своїх продуктів " +"та послуг, заявлені в якості товарних знаків. Якщо такі назви зустрічаються " +"в будь-якій документації GNOME, і члени проєкту документування GNOME знають " +"про них, то назви пишуться великими літерами, або з великої літери." + +#. (itstool) path: listitem/para +#: C/legal.xml:35 +msgid "" +"DOCUMENT IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTY OF ANY KIND, " +"EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT " +"THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS " +"MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE " +"RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR " +"MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR " +"MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL " +"WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY " +"SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN " +"ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION " +"OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND" +msgstr "" +"ДОКУМЕНТ НАДАЄТЬСЯ \"ЯК Є\", БЕЗ БУДЬ-ЯКИХ ГАРАНТІЇ, ЯВНИХ ЧИ НЕЯВНИХ, " +"ВКЛЮЧАЮЧИ, АЛЕ НЕ ОБМЕЖУЮЧИСЬ, ГАРАНТІЙ ЩО ЦЕЙ ДОКУМЕНТ ЧИ ЗМІНЕНА ВЕРСІЯ " +"ДОКУМЕНТА ВІЛЬНІ ВІД ДЕФЕКТІВ, ПРИДАТНІ ДО ПРОДАЖУ, ВІДПОВІДАЮТЬ ПЕВНІЙ МЕТІ " +"АБО НЕ ПОРУШУЮТЬ ЧИЇСЬ ПРАВА. ВЕСЬ РИЗИК ЗА ЯКІСТЬ, ТОЧНІСТЬ, ТА ЧИННІСТЬ " +"ЦЬОГО ДОКУМЕНТУ АБО ЙОГО ЗМІНЕНИХ ВЕРСІЙ ЛЕЖИТЬ НА ВАС. ЯКЩО БУДЬ-ЯКИЙ " +"ДОКУМЕНТ ЧИ ЗМІНЕНА ВЕРСІЯ БУДУТЬ ВИЗНАНІ ДЕФЕКТНИМИ У БУДЬ-ЯКОМУ " +"ВІДНОШЕННІ, ВИ (НЕ ПОЧАТКОВИЙ УКЛАДАЧ, АВТОР АБО БУДЬ-ЯКИЙ СПІВАВТОР) БЕРЕТЕ " +"НА СЕБЕ ВИТРАТИ ЗА БУДЬ-ЯКЕ НЕОБХІДНЕ ОБСЛУГОВУВАННЯ, РЕМОНТ ЧИ ВИПРАВЛЕННЯ. " +"ЦЯ ВІДМОВА ВІД ГАРАНТІЙ СКЛАДАЄ ВАЖЛИВУ ЧАСТИНУ ЦІЄЇ ЛІЦЕНЗІЇ. НЕ " +"ДОПУСКАЄТЬСЯ ВИКОРИСТАННЯ ЦЬОГО ДОКУМЕНТУ АБО ЙОГО ЗМІНЕНОЇ ВЕРСІЇ БЕЗ " +"ПРИЙНЯТТЯ ЦІЄЇ ВІДМОВИ; ТА" + +#. (itstool) path: listitem/para +#: C/legal.xml:55 +msgid "" +"UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING " +"NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY " +"CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE " +"DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON " +"FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF " +"ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, " +"WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES " +"OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED " +"VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE " +"POSSIBILITY OF SUCH DAMAGES." +msgstr "" +"НІ ЗА ЯКИХ ОБСТАВИН ТА ЗА БУДЬ-ЯКОГО ЗАКОНОДАВСТВА, ЧИ ТО ГРОМАДЯНСЬКОЇ " +"ВІДПОВІДАЛЬНОСТІ (ВКЛЮЧАЮЧИ ХАЛАТНІСТЬ), ДОГОВОРУ, ЧИ ЧОГОСЬ ІНШОГО, АВТОР, " +"ПОЧАТКОВИЙ УКЛАДАЧ, БУДЬ-ЯКИЙ СПІВАВТОР, АБО ДИСТРИБ'ЮТОР ДОКУМЕНТУ ЧИ " +"ЗМІНЕНОЇ ВЕРСІЇ ДОКУМЕНТУ, АБО БУДЬ-ЯКИЙ ПОСТАЧАЛЬНИК БУДЬ-ЯКОЇ З ЦИХ " +"СТОРІН, НЕ НЕСЕ ВІДПОВІДАЛЬНІСТЬ ПЕРЕД БУДЬ-ЯКОЮ ОСОБОЮ ЗА БУДЬ-ЯКІ ПРЯМІ, " +"НЕПРЯМІ, ОСОБЛИВІ, ВИПАДКОВІ, АБО ІСТОТНІ ЗБИТКИ БУДЬ-ЯКОГО ХАРАКТЕРУ " +"ВКЛЮЧАЮЧИ, АЛЕ НЕ ОБМЕЖУЮЧИСЬ, ЗБИТКАМИ ВІД ВТРАТИ ПРЕСТИЖУ, ЗУПИНКИ РОБОТИ, " +"ЗБОЇВ АБО НЕСПРАВНОСТЕЙ КОМП'ЮТЕРА, АБО БУДЬ-ЯКІ ІНШІ ЗБИТКИ АБО ВТРАТИ ЩО " +"ВИНИКЛИ БЕЗВІДНОСНО АБО ВНАСЛІДОК ВИКОРИСТАННЯ ЦЬОГО ДОКУМЕНТУ ТА ЗМІНЕНИХ " +"ВЕРСІЙ ЦЬОГО ДОКУМЕНТУ, НАВІТЬ ЯКЩО ЦІ СТОРОНИ, МОЖЛИВО, БУЛИ ПРОІНФОРМОВАНІ " +"ПРО МОЖЛИВІСТЬ ТАКИХ ЗБИТКІВ." + +#. (itstool) path: legalnotice/para +#: C/legal.xml:28 +msgid "" +"DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS " +"OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: " +"<_:orderedlist-1/>" +msgstr "" +"ДОКУМЕНТ ТА ЗМІНЕНІ ВЕРСІЇ ДОКУМЕНТУ НАДАЮТЬСЯ КОРИСТУВАЧУ ЗА УМОВАМИ " +"ЛІЦЕНЗІЇ GNU FREE DOCUMENTATION LICENSE З ПОДАЛЬШИМ РОЗУМІННЯМ ПРО ТЕ, ЩО: " +"<_:orderedlist-1/>" diff -Nru grilo-plugins-0.3.11/meson.build grilo-plugins-0.3.12/meson.build --- grilo-plugins-0.3.11/meson.build 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/meson.build 2020-09-03 05:36:44.357468000 +0000 @@ -6,7 +6,7 @@ # Copyright (C) 2016 Igalia S.L. All rights reserved. project('grilo-plugins', 'c', - version: '0.3.11', + version: '0.3.12', default_options: [ 'buildtype=debugoptimized', 'c_std=gnu99', @@ -53,7 +53,7 @@ gio_dep = dependency('gio-2.0', required: false) gio_unix_dep = dependency('gio-unix-2.0', required: false) goa_dep = dependency('goa-1.0', version: '>= 3.17.91', required: false) -gom_dep = dependency('gom-1.0', version: '>= 0.3.2', required: false) +gom_dep = dependency('gom-1.0', version: '>= 0.4', required: false) grilo_net_dep = dependency('grilo-net-0.3', version: '>= 0.3.0', required: false, fallback: ['grilo', 'libgrlnet_dep']) grilo_pls_dep = dependency('grilo-pls-0.3', version: '>= 0.3.0', required: false, @@ -62,7 +62,12 @@ gthread_dep = dependency('gthread-2.0', required: false) json_glib_dep = dependency('json-glib-1.0', required: false) libarchive_dep = dependency('libarchive', required: false) -libdmapsharing_dep = dependency('libdmapsharing-3.0', version: '>= 2.9.12', required: false) +libdmapsharing4_dep = dependency('libdmapsharing-4.0', version: '>= 3.9.9', required: false) +if libdmapsharing4_dep.found() + libdmapsharing_dep = libdmapsharing4_dep +else + libdmapsharing_dep = dependency('libdmapsharing-3.0', version: '>= 2.9.12', required: false) +endif libgdata_dep = dependency('libgdata', version: '>= 0.9.1', required: false) libmediaart_dep = dependency('libmediaart-2.0', required: false) libsoup_dep = dependency('libsoup-2.4', required: false) @@ -72,6 +77,8 @@ totem_plparser_dep = dependency('totem-plparser', version: '>= 3.4.1', required: false) totem_plparser_mini_dep = dependency('totem-plparser-mini', version: '>= 3.4.1', required: false) tracker_sparql_dep = dependency('tracker-sparql-2.0', version: '>= 2.3.0', required: false) +tracker3_dep = dependency('tracker-sparql-3.0', required: false) +tracker3_testutils_dep = dependency('tracker-testutils-3.0', required: false) lua_dep = dependency('lua', version: '>= 5.3.0', required: false) if not lua_dep.found() @@ -123,6 +130,7 @@ ['thetvdb', [grilo_net_dep, libxml_dep, libarchive_dep, gom_dep], []], ['tmdb', [json_glib_dep, libsoup_dep, grilo_net_dep], []], ['tracker', [tracker_sparql_dep], []], + ['tracker3', [tracker3_dep], []], ['vimeo', [grilo_net_dep, libxml_dep, totem_plparser_dep], []], ['youtube', [grilo_net_dep, libxml_dep, libgdata_dep, totem_plparser_dep], []], ] @@ -153,6 +161,9 @@ cdata.set_quoted('DPAP_PLUGIN_ID', 'grl-dpap') cdata.set_quoted('DAAP_PLUGIN_ID', 'grl-daap') endif + if p[NAME] == 'dleyna' + cdata.set_quoted('DLEYNA_DBUS_NAME', get_option('dleyna-service-name')) + endif idx = idx + 1 endforeach @@ -165,6 +176,11 @@ endif endif +# Special case: tracker and tracker3 modules are mutually exclusive +if tracker3_enabled and tracker_enabled + error('tracker3 and tracker modules cannot be enabled at the same time') +endif + message('Plugins:') foreach p: plugins name = p[NAME].underscorify() + '_enabled' diff -Nru grilo-plugins-0.3.11/meson_options.txt grilo-plugins-0.3.12/meson_options.txt --- grilo-plugins-0.3.11/meson_options.txt 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/meson_options.txt 2020-09-03 05:36:44.357468000 +0000 @@ -1,6 +1,7 @@ option('enable-bookmarks', type: 'combo', choices: [ 'auto', 'yes', 'no' ], value: 'auto', description: 'Enable Bookmarks plugin') option('enable-chromaprint', type: 'combo', choices: [ 'auto', 'yes', 'no' ], value: 'auto', description: 'Enable Chromaprint plugin') option('enable-dleyna', type: 'combo', choices: [ 'auto', 'yes', 'no' ], value: 'auto', description: 'Enable dLeyna plugin') +option('dleyna-service-name', type: 'string', value : 'com.intel.dleyna-server', description: 'D-Bus name for dLeyna server') option('enable-dmap', type: 'combo', choices: [ 'auto', 'yes', 'no' ], value: 'auto', description: 'Enable DMAP plugin') option('enable-filesystem', type: 'combo', choices: [ 'auto', 'yes', 'no' ], value: 'auto', description: 'Enable Filesystem plugin') option('enable-flickr', type: 'combo', choices: [ 'auto', 'yes', 'no' ], value: 'auto', description: 'Enable Flickr plugin') @@ -19,5 +20,6 @@ option('enable-thetvdb', type: 'combo', choices: [ 'auto', 'yes', 'no' ], value: 'auto', description: 'Enable Thetvdb plugin') option('enable-tmdb', type: 'combo', choices: [ 'auto', 'yes', 'no' ], value: 'auto', description: 'Enable TMDb plugin') option('enable-tracker', type: 'combo', choices: [ 'auto', 'yes', 'no' ], value: 'auto', description: 'Enable Tracker plugin') +option('enable-tracker3', type: 'combo', choices: [ 'auto', 'yes', 'no' ], value: 'auto', description: 'Enable Tracker3 plugin') option('enable-vimeo', type: 'combo', choices: [ 'auto', 'yes', 'no' ], value: 'auto', description: 'Enable Vimeo plugin') option('enable-youtube', type: 'combo', choices: [ 'auto', 'yes', 'no' ], value: 'auto', description: 'Enable YouTube plugin') diff -Nru grilo-plugins-0.3.11/NEWS grilo-plugins-0.3.12/NEWS --- grilo-plugins-0.3.11/NEWS 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/NEWS 2020-09-03 05:36:44.355468000 +0000 @@ -1,3 +1,77 @@ +NEW in 0.3.12 +============= + * Increase gom requirement to 0.4 or greater + * !85 Add Tracker3 plugin + * !93 tracker3: Add support to run under Flatpak + * !74 tracker3: Prefer last-modified from file's metadata + * !25 Remove Spotify coverart plugin + * !70 dmap: Add support to libdmapsharing-4.0 + * !77 Stream Store: Fix date format to iso8601 + * !83 tracker: Add Genre fetched from tracker + * !73 dleyna: Allow bus name to be changed + * !87 !88 dleyna: Set metadata relative to containers' type + * !76 Acoustid: Fix the counting of Release Groups + * !84 Acoustid: Fix returning same Record multiple times + * !37 Lua-Factory: Add support to GrlRelatedKeys + + * Added translations + * Ukrainian + + * Updated translations + * Basque + * Brazilian Portuguese + * Chinese (China) + * Croatian + * Czech + * Danish + * Dutch + * English (GB) + * Finnish + * Galician + * German + * Indonesian + * Lithuanian + * Polish + * Romanian + * Slovenian + * Spanish + * Swedish + * Turkish + * Ukrainian + + * Contributors to this release: + Anders Jonsson + Asier Sarasua Garmendia + Ask Hjorth Larsen + Aurimas Černius + Bastien Nocera + Boyuan Yang <073plan@gmail.com> + Carlos Garnacho + Chinmay Gurjar + Daniel Korostil + Daniel Mustieles + Daniel Șerbănescu + Dz Chen + Emin Tufan Çetin + Fran Dieguez + Gaurav Narula + Goran Vidović + Jean Felder + Jiri Grönroos + Kukuh Syafaat + Marek Černocký + Marinus Schraal + Matej Urbančič + Nathan Follens + Piotr Drąg + Rafael Fontenelle + scootergrisen + Stephan Woidowski + Victor Toso + W. Michael Petullo + Yuri Chornoivan + Zander Brown + NEW in 0.3.11 ============= * !67 tracker: Fix crash if chromaprint plugin isn't installed diff -Nru grilo-plugins-0.3.11/po/cs.po grilo-plugins-0.3.12/po/cs.po --- grilo-plugins-0.3.11/po/cs.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/cs.po 2020-09-03 05:36:44.359468000 +0000 @@ -1,14 +1,14 @@ # Czech translation for grilo-plugins. # Copyright (C) 2013 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. -# Marek Černocký , 2013, 2014, 2015, 2016, 2018. +# Marek Černocký , 2013, 2014, 2015, 2016, 2018, 2020. # msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-08-01 17:25+0000\n" -"PO-Revision-Date: 2018-08-20 7:29+0100\n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-25 10:49+0200\n" "Last-Translator: Marek Černocký \n" "Language-Team: Czech \n" "Language: cs\n" @@ -41,17 +41,17 @@ msgid "Failed to remove: %s" msgstr "Selhalo odstranění: %s" -#: src/bookmarks/grl-bookmarks.c:766 src/podcasts/grl-podcasts.c:928 -#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1806 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Selhalo uložení: %s" -#: src/bookmarks/grl-bookmarks.c:840 src/bookmarks/grl-bookmarks.c:875 -#: src/bookmarks/grl-bookmarks.c:906 src/bookmarks/grl-bookmarks.c:964 -#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1662 -#: src/podcasts/grl-podcasts.c:1706 src/podcasts/grl-podcasts.c:1740 -#: src/podcasts/grl-podcasts.c:1775 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Žádné připojení k databázi" @@ -64,54 +64,54 @@ msgid "A source for browsing the DLNA server “%s”" msgstr "Zdroj pro procházení serveru DLNA „%s“" -#: src/dleyna/grl-dleyna-source.c:273 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "Nahrání selhalo, cílový zdroj odstraněn" -#: src/dleyna/grl-dleyna-source.c:375 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "Nahrání selhalo, „%s“, přeneseno %lu z %lu bajtů" -#: src/dleyna/grl-dleyna-source.c:880 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "Selhalo získání vlastností položky (chyba BrowseObjects %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1519 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "" "Nahrání selhalo, u multimediálního objektu, který má být přenesen, schází " "adresa URL" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format msgid "A source for browsing the DAAP server “%s”" msgstr "Zdroj pro procházení serveru DAAP „%s“" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:788 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 #: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Alba" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:777 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 #: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Umělci" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1115 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 #: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Neplatný identifikátor kontejneru %s" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format msgid "A source for browsing the DPAP server “%s”" msgstr "Zdroj pro procházení serveru DPAP „%s“" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Fotografie" @@ -123,12 +123,12 @@ msgid "A source for browsing the filesystem" msgstr "Zdroj pro procházení souborového systému" -#: src/filesystem/grl-filesystem.c:1170 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "Soubor %s neexistuje" -#: src/filesystem/grl-filesystem.c:1248 src/youtube/grl-youtube.c:1505 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Nelze získat médium z %s" @@ -207,7 +207,7 @@ msgstr "Selhalo zpracování odpovědi" #: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 -#: src/podcasts/grl-podcasts.c:1363 src/shoutcast/grl-shoutcast.c:417 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Prázdná odpověď" @@ -252,6 +252,7 @@ #: src/local-metadata/grl-local-metadata.c:381 #: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" @@ -304,6 +305,7 @@ #: src/metadata-store/grl-metadata-store.c:598 #: src/metadata-store/grl-metadata-store.c:617 #: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" @@ -363,32 +365,32 @@ msgid "Failed to parse content" msgstr "Selhalo zpracování obsahu" -#: src/podcasts/grl-podcasts.c:1297 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Selhalo zpracování obsahu podcastu" -#: src/podcasts/grl-podcasts.c:1452 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Selhalo získání informací o podcastu" -#: src/podcasts/grl-podcasts.c:1492 src/podcasts/grl-podcasts.c:1512 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Selhalo získání seznamu podcastů: %s" -#: src/podcasts/grl-podcasts.c:1565 src/podcasts/grl-podcasts.c:1580 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Selhalo získání metadat o vysílání podcastu" -#: src/podcasts/grl-podcasts.c:1618 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Selhalo získání metadat podcastu" -#: src/podcasts/grl-podcasts.c:1802 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "Nelze vytvořit kontejner. Přijímány jsou pouze kanály" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "Vyžadována adresa URL" @@ -519,42 +521,46 @@ msgstr "Vzdálená data neobsahují platný identifikátor" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Selhal dotaz: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Selhalo získání média z adresy URI: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Prázdný dotaz" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format msgid "ID “%s” is not known in this source" msgstr "ID „%s“ není v tomto zdroji známo" +#: src/tracker3/grl-tracker-source-priv.h:47 +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "" +"Zásuvný modul pro vyhledávání multimediálního obsahu pomocí aplikace Tracker3" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "" "Zásuvný modul pro vyhledávání multimediálního obsahu pomocí aplikace Tracker" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -msgid "Removable — %s" -msgstr "Výměnné – %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Místní soubory" - #: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "Zdroj pro procházení a vyhledávání videí Vimeo" diff -Nru grilo-plugins-0.3.11/po/da.po grilo-plugins-0.3.12/po/da.po --- grilo-plugins-0.3.11/po/da.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/da.po 2020-09-03 05:36:44.359468000 +0000 @@ -1,24 +1,22 @@ # Danish translation for grilo-plugins. # Copyright (C) 2013-16, 2018 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. -# # Ask Hjorth Larsen , 2013-16, 2018. -# scootergrisen, 2015. +# scootergrisen, 2015, 2020. +# msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-08-01 17:25+0000\n" -"PO-Revision-Date: 2018-09-01 17:37+0200\n" -"Last-Translator: Ask Hjorth Larsen \n" +"POT-Creation-Date: 2020-04-03 19:54+0000\n" +"PO-Revision-Date: 2020-04-14 00:00+0000\n" +"Last-Translator: scootergrisen\n" "Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Virtaal 0.7.1\n" -"X-Project-Style: gnome\n" #: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" @@ -43,17 +41,17 @@ msgid "Failed to remove: %s" msgstr "Kunne ikke fjerne: %s" -#: src/bookmarks/grl-bookmarks.c:766 src/podcasts/grl-podcasts.c:928 -#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1806 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Kunne ikke gemme: %s" -#: src/bookmarks/grl-bookmarks.c:840 src/bookmarks/grl-bookmarks.c:875 -#: src/bookmarks/grl-bookmarks.c:906 src/bookmarks/grl-bookmarks.c:964 -#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1662 -#: src/podcasts/grl-podcasts.c:1706 src/podcasts/grl-podcasts.c:1740 -#: src/podcasts/grl-podcasts.c:1775 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Ingen databaseforbindelse" @@ -67,53 +65,53 @@ msgid "A source for browsing the DLNA server “%s”" msgstr "En kilde til at gennemse DLNA-serveren “%s”" -#: src/dleyna/grl-dleyna-source.c:273 +#: src/dleyna/grl-dleyna-source.c:271 msgid "Upload failed, target source destroyed" msgstr "Forsendelse mislykkedes; målkilden ødelagt" -#: src/dleyna/grl-dleyna-source.c:375 +#: src/dleyna/grl-dleyna-source.c:373 #, c-format msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "Forsendelse mislykkedes; “%s”; overførte %lu af %lu byte" -#: src/dleyna/grl-dleyna-source.c:880 +#: src/dleyna/grl-dleyna-source.c:878 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "Kunne ikke hente egenskaber for element (BrowseObjects-fejl %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1519 +#: src/dleyna/grl-dleyna-source.c:1517 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "" "Forsendelse mislykkedes; URL mangler på medieobjektet, der skal overføres" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format msgid "A source for browsing the DAAP server “%s”" msgstr "En kilde til at gennemse DAAP-serveren “%s”" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:788 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 #: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Album" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:777 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 #: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Kunstnere" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1115 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 #: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Ugyldig beholder-id %s" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format msgid "A source for browsing the DPAP server “%s”" msgstr "En kilde til at gennemse DPAP-serveren “%s”" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Billeder" @@ -125,12 +123,12 @@ msgid "A source for browsing the filesystem" msgstr "En kilde til at gennemse filsystemet" -#: src/filesystem/grl-filesystem.c:1170 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "Filen %s findes ikke" -#: src/filesystem/grl-filesystem.c:1248 src/youtube/grl-youtube.c:1505 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Kan ikke hente medie fra %s" @@ -211,7 +209,7 @@ msgstr "Kunne ikke fortolke svar" #: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 -#: src/podcasts/grl-podcasts.c:1363 src/shoutcast/grl-shoutcast.c:417 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Tomt svar" @@ -249,7 +247,7 @@ #: src/local-metadata/grl-local-metadata.c:42 msgid "Local Metadata Provider" -msgstr "Lokal metadatatjeneste" +msgstr "Lokale metadata-tjeneste" #: src/local-metadata/grl-local-metadata.c:43 msgid "A source providing locally available metadata" @@ -344,11 +342,11 @@ #: src/opensubtitles/grl-opensubtitles.c:41 msgid "A source providing a list of subtitles for a video" -msgstr "En kilde som udbyder en liste af undertekster til en video" +msgstr "En kilde som udbyder en liste over undertekster til en video" #: src/optical-media/grl-optical-media.c:44 msgid "Optical Media" -msgstr "Optisk medie" +msgstr "Optiske medier" #: src/optical-media/grl-optical-media.c:45 msgid "A source for browsing optical media" @@ -368,33 +366,33 @@ msgid "Failed to parse content" msgstr "Kunne ikke fortolke indhold" -#: src/podcasts/grl-podcasts.c:1297 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Kunne ikke fortolke podcast-indhold" -#: src/podcasts/grl-podcasts.c:1452 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Kunne ikke hente podcast-information" -#: src/podcasts/grl-podcasts.c:1492 src/podcasts/grl-podcasts.c:1512 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Kunne ikke hente podcast-liste: %s" -#: src/podcasts/grl-podcasts.c:1565 src/podcasts/grl-podcasts.c:1580 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Kunne ikke hente metadata for podcast-strøm" -#: src/podcasts/grl-podcasts.c:1618 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Kunne ikke hente metadata for podcast" # ?? -#: src/podcasts/grl-podcasts.c:1802 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "Kan ikke oprette beholdere. Kun kanaler accepteres" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "URL påkrævet" @@ -538,11 +536,11 @@ msgid "Failed to get media from uri: %s" msgstr "Kunne ikke hente medie fra uri: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Tom forespørgsel" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format msgid "ID “%s” is not known in this source" msgstr "Id “%s” kendes ikke i denne kilde" @@ -551,15 +549,6 @@ msgid "A plugin for searching multimedia content using Tracker" msgstr "Et udvidelsesmodul til at søge i multimedieindhold med Tracker" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -msgid "Removable — %s" -msgstr "Kan fjernes — %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Lokale filer" - #: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "En kilde til at gennemse og søge i Vimeo-videoer" @@ -621,9 +610,3 @@ #, c-format msgid "Invalid feed identifier %s" msgstr "Ugyldig kanal-id %s" - -#~ msgid "Album art Provider from Last.FM" -#~ msgstr "Albumbilledtjeneste fra Last.FM" - -#~ msgid "A plugin for getting album arts using Last.FM as backend" -#~ msgstr "Et udvidelsesmodul til at hente albumbilleder med Last.FM som motor" diff -Nru grilo-plugins-0.3.11/po/de.po grilo-plugins-0.3.12/po/de.po --- grilo-plugins-0.3.11/po/de.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/de.po 2020-09-03 05:36:44.359468000 +0000 @@ -1,123 +1,124 @@ # German translation for grilo-plugins. # Copyright (C) 2013 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. +# # Christian Kirbach , 2013. # Wolfgang Stöggl , 2014. # Paul Seyfert , 2015. -# Mario Blättermann , 2015. +# Mario Blättermann , 2015, 2020. # Tim Sabsch , 2018. -# +# Stephan Woidowski , 2020. msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-07-06 09:16+0000\n" -"PO-Revision-Date: 2018-07-07 10:55+0200\n" -"Last-Translator: Tim Sabsch \n" +"POT-Creation-Date: 2020-08-29 09:10+0000\n" +"PO-Revision-Date: 2020-08-30 09:48+0200\n" +"Last-Translator: Mario Blättermann \n" "Language-Team: Deutsch \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.0.8\n" +"X-Generator: Lokalize 20.08.0\n" -#: src/bookmarks/grl-bookmarks.c:65 +#: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" msgstr "Lesezeichen" -#: src/bookmarks/grl-bookmarks.c:66 +#: src/bookmarks/grl-bookmarks.c:61 msgid "A source for organizing media bookmarks" msgstr "Eine Quelle zum Organisieren von Medien-Lesezeichen" -#: src/bookmarks/grl-bookmarks.c:434 +#: src/bookmarks/grl-bookmarks.c:427 msgid "Failed to get bookmark metadata" msgstr "Ermitteln der Metadaten der Lesezeichen gescheitert: %s" -#: src/bookmarks/grl-bookmarks.c:464 src/bookmarks/grl-bookmarks.c:481 +#: src/bookmarks/grl-bookmarks.c:457 src/bookmarks/grl-bookmarks.c:474 #, c-format msgid "Failed to find bookmarks: %s" msgstr "Ermitteln der Lesezeichen ist gescheitert: %s" -#: src/bookmarks/grl-bookmarks.c:633 src/podcasts/grl-podcasts.c:826 -#: src/podcasts/grl-podcasts.c:858 src/podcasts/grl-podcasts.c:890 +#: src/bookmarks/grl-bookmarks.c:626 src/podcasts/grl-podcasts.c:823 +#: src/podcasts/grl-podcasts.c:855 src/podcasts/grl-podcasts.c:887 #, c-format msgid "Failed to remove: %s" msgstr "Entfernen ist fehlgeschlagen: %s" -#: src/bookmarks/grl-bookmarks.c:773 src/podcasts/grl-podcasts.c:931 -#: src/podcasts/grl-podcasts.c:964 src/podcasts/grl-podcasts.c:1811 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Speichern gescheitert: %s" -#: src/bookmarks/grl-bookmarks.c:847 src/bookmarks/grl-bookmarks.c:882 -#: src/bookmarks/grl-bookmarks.c:913 src/bookmarks/grl-bookmarks.c:971 -#: src/metadata-store/grl-metadata-store.c:881 src/podcasts/grl-podcasts.c:1667 -#: src/podcasts/grl-podcasts.c:1711 src/podcasts/grl-podcasts.c:1745 -#: src/podcasts/grl-podcasts.c:1780 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Keine Datenbank-Verbindung" -#: src/chromaprint/grl-chromaprint.c:46 +#: src/chromaprint/grl-chromaprint.c:41 msgid "A plugin to get metadata using gstreamer framework" msgstr "" -"Ein Plugin zur Ermittlung von Metadaten mit Hilfe des gstreamer Framework" +"Ein Plugin zur Ermittlung von Metadaten mit Hilfe des Gstreamer-Frameworks" #: src/dleyna/grl-dleyna-source.c:34 #, c-format msgid "A source for browsing the DLNA server “%s”" msgstr "Eine Quelle zum Durchsuchen des DLNA-Servers »%s«" -#: src/dleyna/grl-dleyna-source.c:278 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "Hochladen schlug fehl, die Zielquelle wurde zerstört" -#: src/dleyna/grl-dleyna-source.c:380 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "Hochladen schlug fehl, »%s«, %lu von %lu Bytes wurden übertragen" -#: src/dleyna/grl-dleyna-source.c:885 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "" "Ermitteln der Objekt-Eigenschaften schlug fehl (BrowseObjects-Fehler %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1524 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "" -"Hochladen schlug fehl. Adresse fehlt auf dem Medienobjekt, welches " -"übertragen werden soll" +"Hochladen schlug fehl. Adresse fehlt auf dem Medienobjekt, welches übertragen " +"werden soll" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format msgid "A source for browsing the DAAP server “%s”" msgstr "Eine Quelle zum Durchsuchen des DAAP-Servers »%s«" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:795 -#: src/magnatune/grl-magnatune.c:127 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 +#: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Alben" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:784 -#: src/magnatune/grl-magnatune.c:126 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 +#: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Künstler" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1122 -#: src/jamendo/grl-jamendo.c:1233 src/magnatune/grl-magnatune.c:873 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 +#: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Ungültiger Container-Bezeichner %s" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format msgid "A source for browsing the DPAP server “%s”" msgstr "Eine Quelle zum Durchsuchen des DAAP-Servers »%s«" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Fotos" @@ -129,31 +130,31 @@ msgid "A source for browsing the filesystem" msgstr "Eine Quelle zum Durchsuchen des Dateisystems" -#: src/filesystem/grl-filesystem.c:1179 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "Die Datei %s existiert nicht" -#: src/filesystem/grl-filesystem.c:1257 src/youtube/grl-youtube.c:1512 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Holen von Medien auf %s fehlgeschlagen" -#: src/flickr/grl-flickr.c:63 +#: src/flickr/grl-flickr.c:58 msgid "A source for browsing and searching Flickr photos" msgstr "Eine Quelle zum Durchsuchen von Flickr-Fotos" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:67 +#: src/flickr/grl-flickr.c:62 #, c-format msgid "%s’s Flickr" msgstr "Flickr von %s" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:69 +#: src/flickr/grl-flickr.c:64 #, c-format msgid "A source for browsing and searching %s’s flickr photos" -msgstr "Eine Quelle zum Durchsuchen der flickr-Fotos von %s" +msgstr "Eine Quelle zum Durchsuchen der Flickr-Fotos von %s" #: src/freebox/grl-freebox.c:48 msgid "Freebox TV" @@ -177,8 +178,7 @@ #: src/gravatar/grl-gravatar.c:47 msgid "A plugin to get avatars for artist and author fields" -msgstr "" -"Ein Plugin zum Holen von Benutzerbildern für Künstler und Künstler-Felder" +msgstr "Ein Plugin zum Holen von Benutzerbildern für Künstler und Autor-Felder" #: src/jamendo/grl-jamendo.c:91 msgid "A source for browsing and searching Jamendo music" @@ -208,43 +208,43 @@ msgid "Top tracks" msgstr "Beste Titel" -#: src/jamendo/grl-jamendo.c:348 src/jamendo/grl-jamendo.c:708 -#: src/shoutcast/grl-shoutcast.c:416 src/shoutcast/grl-shoutcast.c:470 +#: src/jamendo/grl-jamendo.c:341 src/jamendo/grl-jamendo.c:701 +#: src/shoutcast/grl-shoutcast.c:409 src/shoutcast/grl-shoutcast.c:463 msgid "Failed to parse response" msgstr "Verarbeitung der Antwort ist gescheitert" -#: src/jamendo/grl-jamendo.c:356 src/jamendo/grl-jamendo.c:363 -#: src/podcasts/grl-podcasts.c:1368 src/shoutcast/grl-shoutcast.c:424 +#: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Leere Antwort" -#: src/jamendo/grl-jamendo.c:677 src/shoutcast/grl-shoutcast.c:558 +#: src/jamendo/grl-jamendo.c:670 src/shoutcast/grl-shoutcast.c:551 #, c-format msgid "Failed to connect: %s" msgstr "Verbindung fehlgeschlagen: %s" -#: src/jamendo/grl-jamendo.c:806 +#: src/jamendo/grl-jamendo.c:799 msgid "Feeds" msgstr "Quellen" -#: src/jamendo/grl-jamendo.c:990 src/jamendo/grl-jamendo.c:1035 -#: src/jamendo/grl-jamendo.c:1062 +#: src/jamendo/grl-jamendo.c:983 src/jamendo/grl-jamendo.c:1028 +#: src/jamendo/grl-jamendo.c:1055 #, c-format msgid "Invalid identifier %s" msgstr "Ungültiger Bezeichner %s" -#: src/jamendo/grl-jamendo.c:1049 src/youtube/grl-youtube.c:1104 -#: src/youtube/grl-youtube.c:1237 src/youtube/grl-youtube.c:1449 +#: src/jamendo/grl-jamendo.c:1042 src/youtube/grl-youtube.c:1097 +#: src/youtube/grl-youtube.c:1230 src/youtube/grl-youtube.c:1442 #, c-format msgid "Invalid category identifier %s" msgstr "Ungültiger Kategorie-Bezeichner %s" -#: src/jamendo/grl-jamendo.c:1228 +#: src/jamendo/grl-jamendo.c:1221 #, c-format msgid "Failed to browse: %s is a track" msgstr "Durchsuchen fehlgeschlagen: %s ist ein Musiktitel" -#: src/jamendo/grl-jamendo.c:1287 +#: src/jamendo/grl-jamendo.c:1280 #, c-format msgid "Malformed query “%s”" msgstr "Fehlerhafte Anfrage »%s«" @@ -257,85 +257,87 @@ msgid "A source providing locally available metadata" msgstr "Eine Quelle, die lokal verfügbare Metadaten liefert" -#: src/local-metadata/grl-local-metadata.c:388 -#: src/metadata-store/grl-metadata-store.c:791 src/raitv/grl-raitv.c:878 +#: src/local-metadata/grl-local-metadata.c:381 +#: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" msgstr "Es konnte nicht aufgelöst werden: %s" -#: src/local-metadata/grl-local-metadata.c:682 +#: src/local-metadata/grl-local-metadata.c:673 msgid "Cannot resolve any of the given keys" msgstr "Auflösen von allen Schlüsselwörtern fehlgeschlagen" -#: src/local-metadata/grl-local-metadata.c:686 +#: src/local-metadata/grl-local-metadata.c:677 msgid "A GIO supported URL for images is required" msgstr "Eine von GIO unterstützte Adresse für Bilder wird benötigt" -#: src/magnatune/grl-magnatune.c:128 +#: src/magnatune/grl-magnatune.c:123 msgid "Genres" msgstr "Genres" -#: src/magnatune/grl-magnatune.c:136 +#: src/magnatune/grl-magnatune.c:131 msgid "A source for browsing music" msgstr "Eine Quelle zum Durchsuchen von Musik" -#: src/magnatune/grl-magnatune.c:428 +#: src/magnatune/grl-magnatune.c:421 #, c-format msgid "Failed to get database from magnatune: %s" msgstr "Ermitteln der Datenbank von Magnatune ist fehlgeschlagen: %s" -#: src/magnatune/grl-magnatune.c:458 +#: src/magnatune/grl-magnatune.c:451 #, c-format msgid "Failed to save database from magnatune: “%s”" msgstr "Speichern der Magnatune-Datenbank ist fehlgeschlagen: »%s«" -#: src/magnatune/grl-magnatune.c:729 +#: src/magnatune/grl-magnatune.c:722 #, c-format msgid "Failed to get table from magnatune db: %s" -msgstr "Holen der Datenbank von Magnatune ist fehlgeschlagen: %s" +msgstr "Holen der Datenbanktabelle von Magnatune ist fehlgeschlagen: %s" -#: src/magnatune/grl-magnatune.c:745 +#: src/magnatune/grl-magnatune.c:738 #, c-format msgid "Fail before returning media to user: %s" msgstr "Fehlschlag beim Zurücksenden der Medien zum Benutzer: %s" -#: src/metadata-store/grl-metadata-store.c:45 +#: src/metadata-store/grl-metadata-store.c:40 msgid "Metadata Store" msgstr "Metadatenspeicher" -#: src/metadata-store/grl-metadata-store.c:46 +#: src/metadata-store/grl-metadata-store.c:41 msgid "A plugin for storing extra metadata information" msgstr "Ein Plugin zur Speicherung von zusätzlichen Metadaten" -#: src/metadata-store/grl-metadata-store.c:605 -#: src/metadata-store/grl-metadata-store.c:624 -#: src/metadata-store/grl-metadata-store.c:836 +#: src/metadata-store/grl-metadata-store.c:598 +#: src/metadata-store/grl-metadata-store.c:617 +#: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" msgstr "Aktualisieren der Metadaten ist fehlgeschlagen: %s" -#: src/metadata-store/grl-metadata-store.c:606 +#: src/metadata-store/grl-metadata-store.c:599 msgid "specified keys are not writable" -msgstr "Angegebene Schlüssel sind nicht schreibbar" +msgstr "Angegebene Schlüssel sind schreibgeschützt" -#: src/metadata-store/grl-metadata-store.c:646 +#: src/metadata-store/grl-metadata-store.c:639 msgid "Failed to update metadata" msgstr "Aktualisieren der Metadaten ist fehlgeschlagen" -#: src/metadata-store/grl-metadata-store.c:792 -#: src/metadata-store/grl-metadata-store.c:837 +#: src/metadata-store/grl-metadata-store.c:785 +#: src/metadata-store/grl-metadata-store.c:830 msgid "“source-id” not available" msgstr "»Quellen-ID« nicht verfügbar" -#: src/metadata-store/grl-metadata-store.c:812 +#: src/metadata-store/grl-metadata-store.c:805 msgid "Failed to resolve" msgstr "Auflösen schlug fehl" -#: src/metadata-store/grl-metadata-store.c:949 -#: src/metadata-store/grl-metadata-store.c:986 src/raitv/grl-raitv.c:432 -#: src/shoutcast/grl-shoutcast.c:756 src/vimeo/grl-vimeo.c:547 +#: src/metadata-store/grl-metadata-store.c:942 +#: src/metadata-store/grl-metadata-store.c:979 src/raitv/grl-raitv.c:423 +#: src/shoutcast/grl-shoutcast.c:749 src/vimeo/grl-vimeo.c:540 #, c-format msgid "Failed to search: %s" msgstr "Suche ist fehlgeschlagen: %s" @@ -346,60 +348,60 @@ #: src/opensubtitles/grl-opensubtitles.c:41 msgid "A source providing a list of subtitles for a video" -msgstr "Eine Quelle, die eine Liste mit Untertitel für ein Video liefert" +msgstr "Eine Quelle, die eine Liste mit Untertiteln für ein Video liefert" #: src/optical-media/grl-optical-media.c:44 msgid "Optical Media" -msgstr "Optische Median" +msgstr "Optische Medien" #: src/optical-media/grl-optical-media.c:45 msgid "A source for browsing optical media" msgstr "Eine Quelle zum Durchsuchen optischer Medien" -#: src/podcasts/grl-podcasts.c:153 +#: src/podcasts/grl-podcasts.c:148 msgid "A source for browsing podcasts" msgstr "Eine Quelle zum Durchsuchen von Podcasts" -#: src/podcasts/grl-podcasts.c:762 src/podcasts/grl-podcasts.c:782 +#: src/podcasts/grl-podcasts.c:759 src/podcasts/grl-podcasts.c:779 #, c-format msgid "Failed to get podcast streams: %s" -msgstr "Empfang des Podcast-Stroms ist fehlgeschlagen: %s" +msgstr "Empfang des Podcast-Datenstroms ist fehlgeschlagen: %s" -#: src/podcasts/grl-podcasts.c:1248 src/podcasts/grl-podcasts.c:1257 -#: src/podcasts/grl-podcasts.c:1267 +#: src/podcasts/grl-podcasts.c:1245 src/podcasts/grl-podcasts.c:1254 +#: src/podcasts/grl-podcasts.c:1264 msgid "Failed to parse content" msgstr "Verarbeitung des Inhalts ist fehlgeschlagen" -#: src/podcasts/grl-podcasts.c:1302 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Verarbeitung des Podcast-Inhalts ist fehlgeschlagen" -#: src/podcasts/grl-podcasts.c:1457 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Holen der Podcast-Informationen ist fehlgeschlagen" -#: src/podcasts/grl-podcasts.c:1497 src/podcasts/grl-podcasts.c:1517 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Holen der Podcast-Liste ist fehlgeschlagen: %s" -#: src/podcasts/grl-podcasts.c:1570 src/podcasts/grl-podcasts.c:1585 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" -msgstr "Ermitteln der Podcast-Strom-Metadaten ist fehlgeschlagen" +msgstr "Ermitteln der Podcast-Datenstrom-Metadaten ist fehlgeschlagen" -#: src/podcasts/grl-podcasts.c:1623 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Ermitteln der Podcast-Metadaten ist fehlgeschlagen" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "Container kann nicht erstellt werden. Es werden nur Quellen akzeptiert" -#: src/podcasts/grl-podcasts.c:1812 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "Adresse erforderlich" -#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:78 +#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:73 msgid "Most Popular" msgstr "Am beliebtesten" @@ -411,218 +413,227 @@ msgid "A source for browsing and searching Rai.tv videos" msgstr "Eine Quelle zum Durchsuchen von Rai.tv-Videos" -#: src/raitv/grl-raitv.c:171 +#: src/raitv/grl-raitv.c:164 msgid "All" msgstr "Alle" -#: src/raitv/grl-raitv.c:172 +#: src/raitv/grl-raitv.c:165 msgid "Black and White" msgstr "Schwarz/Weiß" -#: src/raitv/grl-raitv.c:173 +#: src/raitv/grl-raitv.c:166 msgid "Cinema" msgstr "Kino" -#: src/raitv/grl-raitv.c:174 +#: src/raitv/grl-raitv.c:167 msgid "Comedians" msgstr "Komödien" -#: src/raitv/grl-raitv.c:175 +#: src/raitv/grl-raitv.c:168 msgid "Chronicle" msgstr "Geschichte" -#: src/raitv/grl-raitv.c:176 +#: src/raitv/grl-raitv.c:169 msgid "Culture" msgstr "Kultur" -#: src/raitv/grl-raitv.c:177 +#: src/raitv/grl-raitv.c:170 msgid "Economy" msgstr "Wirtschaft" -#: src/raitv/grl-raitv.c:178 +#: src/raitv/grl-raitv.c:171 msgid "Fiction" msgstr "Fiktion" # Fernsehsparte -#: src/raitv/grl-raitv.c:179 +#: src/raitv/grl-raitv.c:172 msgid "Junior" msgstr "Kinder" -#: src/raitv/grl-raitv.c:180 +#: src/raitv/grl-raitv.c:173 msgid "Investigations" msgstr "Untersuchungen" -#: src/raitv/grl-raitv.c:181 +#: src/raitv/grl-raitv.c:174 msgid "Interviews" msgstr "Interviews" -#: src/raitv/grl-raitv.c:182 +#: src/raitv/grl-raitv.c:175 msgid "Music" msgstr "Musik" -#: src/raitv/grl-raitv.c:183 +#: src/raitv/grl-raitv.c:176 msgid "News" msgstr "Neuigkeiten" -#: src/raitv/grl-raitv.c:184 +#: src/raitv/grl-raitv.c:177 msgid "Health" msgstr "Gesundheit" -#: src/raitv/grl-raitv.c:185 +#: src/raitv/grl-raitv.c:178 msgid "Satire" msgstr "Satire" -#: src/raitv/grl-raitv.c:187 +#: src/raitv/grl-raitv.c:180 msgid "Society" msgstr "Gesellschaft" -#: src/raitv/grl-raitv.c:188 +#: src/raitv/grl-raitv.c:181 msgid "Show" -msgstr "Schau" +msgstr "Show" -#: src/raitv/grl-raitv.c:189 +#: src/raitv/grl-raitv.c:182 msgid "Sport" msgstr "Sport" -#: src/raitv/grl-raitv.c:190 +#: src/raitv/grl-raitv.c:183 msgid "History" msgstr "Geschichte" -#: src/raitv/grl-raitv.c:191 +#: src/raitv/grl-raitv.c:184 msgid "Politics" msgstr "Politik" -#: src/raitv/grl-raitv.c:192 +#: src/raitv/grl-raitv.c:185 msgid "Leisure" msgstr "Vergnügen" -#: src/raitv/grl-raitv.c:193 +#: src/raitv/grl-raitv.c:186 msgid "Travel" msgstr "Reise" -#: src/raitv/grl-raitv.c:625 +#: src/raitv/grl-raitv.c:616 #, c-format msgid "Failed to browse: %s" msgstr "Durchsuchen ist fehlgeschlagen: %s" -#: src/shoutcast/grl-shoutcast.c:65 +#: src/shoutcast/grl-shoutcast.c:60 msgid "A source for browsing SHOUTcast radios" msgstr "Eine Quelle zum Durchsuchen von SHOUTcast-Radiosendern" -#: src/shoutcast/grl-shoutcast.c:462 +#: src/shoutcast/grl-shoutcast.c:455 #, c-format msgid "Cannot find media %s" msgstr "Medium %s kann nicht gefunden werden" -#: src/shoutcast/grl-shoutcast.c:757 src/vimeo/grl-vimeo.c:548 +#: src/shoutcast/grl-shoutcast.c:750 src/vimeo/grl-vimeo.c:541 msgid "non-NULL search text is required" -msgstr "Suchtext wird benötigt" +msgstr "nicht-NULL-Suchtext wird benötigt" -#: src/thetvdb/grl-thetvdb.c:98 +#: src/thetvdb/grl-thetvdb.c:93 msgid "A source for fetching metadata of television shows" -msgstr "Eine Quelle zum Holen von Metadaten von Fernseh-Serien" +msgstr "Eine Quelle zum Holen von Metadaten von Fernsehserien" -#: src/tmdb/grl-tmdb.c:1004 +#: src/tmdb/grl-tmdb.c:998 msgid "Remote data does not contain valid identifier" msgstr "Ferndaten enthalten keine gültigen Bezeichner" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Anfrage ist fehlgeschlagen: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Holen der Medien von folgender Adresse ist fehlgeschlagen: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Leere Anfrage" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format msgid "ID “%s” is not known in this source" msgstr "Kennung »%s« ist in dieser Quelle nicht bekannt" +#: src/tracker3/grl-tracker-source-priv.h:47 +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "Ein Plugin zum Durchsuchen von Multimedia-Inhalten mittels Tracker3" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "Ein Plugin zum Durchsuchen von Multimedia-Inhalten mittels Tracker" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -msgid "Removable — %s" -msgstr "Entfernbar — %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Lokale Dateien" - -#: src/vimeo/grl-vimeo.c:56 +#: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "Eine Quelle zum Durchsuchen von Vimeo-Videos" -#: src/youtube/grl-youtube.c:60 +#: src/youtube/grl-youtube.c:55 msgid "Standard feeds" msgstr "Standard-Quellen" -#: src/youtube/grl-youtube.c:63 +#: src/youtube/grl-youtube.c:58 msgid "Categories" msgstr "Kategorien" -#: src/youtube/grl-youtube.c:69 +#: src/youtube/grl-youtube.c:64 msgid "Top Rated" msgstr "Bestbewertet" -#: src/youtube/grl-youtube.c:72 +#: src/youtube/grl-youtube.c:67 msgid "Top Favorites" msgstr "Top-Favoriten" -#: src/youtube/grl-youtube.c:75 +#: src/youtube/grl-youtube.c:70 msgid "Most Viewed" msgstr "Am meisten angesehen" -#: src/youtube/grl-youtube.c:81 +#: src/youtube/grl-youtube.c:76 msgid "Most Recent" msgstr "Zuletzt hochgeladen" -#: src/youtube/grl-youtube.c:84 +#: src/youtube/grl-youtube.c:79 msgid "Most Discussed" msgstr "Am meisten diskutiert" -#: src/youtube/grl-youtube.c:87 +#: src/youtube/grl-youtube.c:82 msgid "Most Linked" msgstr "Am meisten verknüpft" -#: src/youtube/grl-youtube.c:90 +#: src/youtube/grl-youtube.c:85 msgid "Most Responded" -msgstr "Am meisten beantwortet" +msgstr "Am meisten kommentiert" -#: src/youtube/grl-youtube.c:93 +#: src/youtube/grl-youtube.c:88 msgid "Recently Featured" msgstr "Zuletzt vorgestellt" -#: src/youtube/grl-youtube.c:96 +#: src/youtube/grl-youtube.c:91 msgid "Watch On Mobile" msgstr "Mobil ansehen" -#: src/youtube/grl-youtube.c:115 +#: src/youtube/grl-youtube.c:110 msgid "A source for browsing and searching YouTube videos" msgstr "Eine Quelle zum Durchsuchen von YouTube-Videos" -#: src/youtube/grl-youtube.c:863 +#: src/youtube/grl-youtube.c:856 msgid "Failed to get feed" msgstr "Holen der Quelle fehlgeschlagen" -#: src/youtube/grl-youtube.c:1040 src/youtube/grl-youtube.c:1428 +#: src/youtube/grl-youtube.c:1033 src/youtube/grl-youtube.c:1421 #, c-format msgid "Invalid feed identifier %s" msgstr "Ungültiger Quellen-Bezeichner %s" +#~ msgid "Removable — %s" +#~ msgstr "Entfernbar — %s" + +#~ msgid "Local files" +#~ msgstr "Lokale Dateien" + #~ msgid "Apple Movie Trailers" #~ msgstr "Apple Filmvorschau" diff -Nru grilo-plugins-0.3.11/po/en_GB.po grilo-plugins-0.3.12/po/en_GB.po --- grilo-plugins-0.3.11/po/en_GB.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/en_GB.po 2020-09-03 05:36:44.360468000 +0000 @@ -2,612 +2,625 @@ # Copyright (C) 2016 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. # Abigail Brady , Bastien Nocera , 2016. +# Zander Brown , 2019. # msgid "" msgstr "" "Project-Id-Version: grilo-plugins 0.3.4\n" -"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" -"product=grilo&keywords=I18N+L10N&component=plugins\n" -"POT-Creation-Date: 2016-09-16 11:16+0000\n" -"PO-Revision-Date: 2016-09-18 11:10+0200\n" -"Last-Translator: David King \n" -"Language-Team: \n" -"Language: \n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" +"POT-Creation-Date: 2018-08-01 17:25+0000\n" +"PO-Revision-Date: 2019-08-25 15:01+0100\n" +"Last-Translator: Zander Brown \n" +"Language-Team: English - United Kingdom \n" +"Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Gtranslator 3.32.1\n" -#: ../src/bookmarks/grl-bookmarks.c:65 +#: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" msgstr "Bookmarks" -#: ../src/bookmarks/grl-bookmarks.c:66 +#: src/bookmarks/grl-bookmarks.c:61 msgid "A source for organizing media bookmarks" msgstr "A source for organising media bookmarks" -#: ../src/bookmarks/grl-bookmarks.c:434 +#: src/bookmarks/grl-bookmarks.c:427 msgid "Failed to get bookmark metadata" msgstr "Failed to get bookmark metadata" -#: ../src/bookmarks/grl-bookmarks.c:464 ../src/bookmarks/grl-bookmarks.c:481 +#: src/bookmarks/grl-bookmarks.c:457 src/bookmarks/grl-bookmarks.c:474 #, c-format msgid "Failed to find bookmarks: %s" msgstr "Failed to find bookmarks: %s" -#: ../src/bookmarks/grl-bookmarks.c:633 ../src/podcasts/grl-podcasts.c:828 -#: ../src/podcasts/grl-podcasts.c:860 ../src/podcasts/grl-podcasts.c:892 +#: src/bookmarks/grl-bookmarks.c:626 src/podcasts/grl-podcasts.c:823 +#: src/podcasts/grl-podcasts.c:855 src/podcasts/grl-podcasts.c:887 #, c-format msgid "Failed to remove: %s" msgstr "Failed to remove: %s" -#: ../src/bookmarks/grl-bookmarks.c:773 ../src/podcasts/grl-podcasts.c:933 -#: ../src/podcasts/grl-podcasts.c:966 ../src/podcasts/grl-podcasts.c:1811 +#: src/bookmarks/grl-bookmarks.c:766 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1806 #, c-format msgid "Failed to store: %s" msgstr "Failed to store: %s" -#: ../src/bookmarks/grl-bookmarks.c:847 ../src/bookmarks/grl-bookmarks.c:882 -#: ../src/bookmarks/grl-bookmarks.c:913 ../src/bookmarks/grl-bookmarks.c:971 -#: ../src/metadata-store/grl-metadata-store.c:869 -#: ../src/podcasts/grl-podcasts.c:1667 ../src/podcasts/grl-podcasts.c:1711 -#: ../src/podcasts/grl-podcasts.c:1745 ../src/podcasts/grl-podcasts.c:1780 +#: src/bookmarks/grl-bookmarks.c:840 src/bookmarks/grl-bookmarks.c:875 +#: src/bookmarks/grl-bookmarks.c:906 src/bookmarks/grl-bookmarks.c:964 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1662 +#: src/podcasts/grl-podcasts.c:1706 src/podcasts/grl-podcasts.c:1740 +#: src/podcasts/grl-podcasts.c:1775 msgid "No database connection" msgstr "No database connection" -#: ../src/chromaprint/grl-chromaprint.c:46 +#: src/chromaprint/grl-chromaprint.c:41 msgid "A plugin to get metadata using gstreamer framework" msgstr "A plugin to get metadata using gstreamer framework" -#: ../src/dleyna/grl-dleyna-source.c:34 +#: src/dleyna/grl-dleyna-source.c:34 #, c-format -msgid "A source for browsing the DLNA server '%s'" -msgstr "A source for browsing the DLNA server '%s'" +#| msgid "A source for browsing the DLNA server '%s'" +msgid "A source for browsing the DLNA server “%s”" +msgstr "A source for browsing the DLNA server “%s”" -#: ../src/dleyna/grl-dleyna-source.c:278 +#: src/dleyna/grl-dleyna-source.c:273 msgid "Upload failed, target source destroyed" msgstr "Upload failed, target source destroyed" -#: ../src/dleyna/grl-dleyna-source.c:380 +#: src/dleyna/grl-dleyna-source.c:375 #, c-format -msgid "Upload failed, '%s', transferred %lu of %lu bytes" -msgstr "Upload failed, '%s', transferred %lu of %lu bytes" +#| msgid "Upload failed, '%s', transferred %lu of %lu bytes" +msgid "Upload failed, “%s”, transferred %lu of %lu bytes" +msgstr "Upload failed, “%s”, transferred %lu of %lu bytes" -#: ../src/dleyna/grl-dleyna-source.c:881 +#: src/dleyna/grl-dleyna-source.c:880 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "Failed to retrieve item properties (BrowseObjects error %d: %s)" -#: ../src/dleyna/grl-dleyna-source.c:1520 +#: src/dleyna/grl-dleyna-source.c:1519 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "Upload failed, URL missing on the media object to be transferred" -#: ../src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:50 #, c-format -msgid "A source for browsing the DAAP server '%s'" -msgstr "A source for browsing the DAAP server '%s'" +#| msgid "A source for browsing the DAAP server '%s'" +msgid "A source for browsing the DAAP server “%s”" +msgstr "A source for browsing the DAAP server “%s”" -#: ../src/dmap/grl-daap-db.c:62 ../src/jamendo/grl-jamendo.c:795 -#: ../src/magnatune/grl-magnatune.c:121 +#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:788 +#: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Albums" -#: ../src/dmap/grl-daap-db.c:64 ../src/jamendo/grl-jamendo.c:784 -#: ../src/magnatune/grl-magnatune.c:120 +#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:777 +#: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Artists" -#: ../src/dmap/grl-daap-db.c:292 ../src/jamendo/grl-jamendo.c:1122 -#: ../src/jamendo/grl-jamendo.c:1233 ../src/magnatune/grl-magnatune.c:841 +#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1115 +#: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Invalid container identifier %s" -#: ../src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:50 #, c-format -msgid "A source for browsing the DPAP server '%s'" -msgstr "A source for browsing the DPAP server '%s'" +#| msgid "A source for browsing the DPAP server '%s'" +msgid "A source for browsing the DPAP server “%s”" +msgstr "A source for browsing the DPAP server “%s”" -#: ../src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:36 msgid "Photos" msgstr "Photos" -#: ../src/filesystem/grl-filesystem.c:58 +#: src/filesystem/grl-filesystem.c:58 msgid "Filesystem" msgstr "Filesystem" -#: ../src/filesystem/grl-filesystem.c:59 +#: src/filesystem/grl-filesystem.c:59 msgid "A source for browsing the filesystem" msgstr "A source for browsing the filesystem" -#: ../src/filesystem/grl-filesystem.c:1179 +#: src/filesystem/grl-filesystem.c:1170 #, c-format msgid "File %s does not exist" msgstr "File %s does not exist" -#: ../src/filesystem/grl-filesystem.c:1257 ../src/youtube/grl-youtube.c:1512 +#: src/filesystem/grl-filesystem.c:1248 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Cannot get media from %s" -#: ../src/flickr/grl-flickr.c:61 +#: src/flickr/grl-flickr.c:58 msgid "A source for browsing and searching Flickr photos" msgstr "A source for browsing and searching Flickr photos" #. "%s" is a full user name, like "John Doe" -#: ../src/flickr/grl-flickr.c:65 +#: src/flickr/grl-flickr.c:62 #, c-format -msgid "%s's Flickr" -msgstr "%s's Flickr" +#| msgid "%s's Flickr" +msgid "%s’s Flickr" +msgstr "%s’s Flickr" #. "%s" is a full user name, like "John Doe" -#: ../src/flickr/grl-flickr.c:67 +#: src/flickr/grl-flickr.c:64 #, c-format -msgid "A source for browsing and searching %s's flickr photos" -msgstr "A source for browsing and searching %s's flickr photos" +#| msgid "A source for browsing and searching %s's flickr photos" +msgid "A source for browsing and searching %s’s flickr photos" +msgstr "A source for browsing and searching %s’s flickr photos" -#: ../src/freebox/grl-freebox.c:48 +#: src/freebox/grl-freebox.c:48 msgid "Freebox TV" msgstr "Freebox TV" -#: ../src/freebox/grl-freebox.c:49 +#: src/freebox/grl-freebox.c:49 msgid "A source for browsing Freebox TV channels" msgstr "A source for browsing Freebox TV channels" -#: ../src/freebox/grl-freebox.c:52 +#: src/freebox/grl-freebox.c:52 msgid "Freebox Radio" msgstr "Freebox Radio" -#: ../src/freebox/grl-freebox.c:53 +#: src/freebox/grl-freebox.c:53 msgid "A source for browsing Freebox radio channels" msgstr "A source for browsing Freebox radio channels" -#: ../src/gravatar/grl-gravatar.c:46 +#: src/gravatar/grl-gravatar.c:46 msgid "Avatar provider from Gravatar" msgstr "Avatar provider from Gravatar" -#: ../src/gravatar/grl-gravatar.c:47 +#: src/gravatar/grl-gravatar.c:47 msgid "A plugin to get avatars for artist and author fields" msgstr "A plugin to get avatars for artist and author fields" -#: ../src/jamendo/grl-jamendo.c:91 +#: src/jamendo/grl-jamendo.c:91 msgid "A source for browsing and searching Jamendo music" msgstr "A source for browsing and searching Jamendo music" -#: ../src/jamendo/grl-jamendo.c:149 +#: src/jamendo/grl-jamendo.c:149 msgid "Albums of the week" msgstr "Albums of the week" -#: ../src/jamendo/grl-jamendo.c:151 +#: src/jamendo/grl-jamendo.c:151 msgid "Tracks of the week" msgstr "Tracks of the week" -#: ../src/jamendo/grl-jamendo.c:153 +#: src/jamendo/grl-jamendo.c:153 msgid "New releases" msgstr "New releases" -#: ../src/jamendo/grl-jamendo.c:155 +#: src/jamendo/grl-jamendo.c:155 msgid "Top artists" msgstr "Top artists" -#: ../src/jamendo/grl-jamendo.c:157 +#: src/jamendo/grl-jamendo.c:157 msgid "Top albums" msgstr "Top albums" -#: ../src/jamendo/grl-jamendo.c:159 +#: src/jamendo/grl-jamendo.c:159 msgid "Top tracks" msgstr "Top tracks" -#: ../src/jamendo/grl-jamendo.c:348 ../src/jamendo/grl-jamendo.c:708 -#: ../src/shoutcast/grl-shoutcast.c:416 ../src/shoutcast/grl-shoutcast.c:470 +#: src/jamendo/grl-jamendo.c:341 src/jamendo/grl-jamendo.c:701 +#: src/shoutcast/grl-shoutcast.c:409 src/shoutcast/grl-shoutcast.c:463 msgid "Failed to parse response" msgstr "Failed to parse response" -#: ../src/jamendo/grl-jamendo.c:356 ../src/jamendo/grl-jamendo.c:363 -#: ../src/podcasts/grl-podcasts.c:1368 ../src/shoutcast/grl-shoutcast.c:424 +#: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 +#: src/podcasts/grl-podcasts.c:1363 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Empty response" -#: ../src/jamendo/grl-jamendo.c:677 ../src/shoutcast/grl-shoutcast.c:558 +#: src/jamendo/grl-jamendo.c:670 src/shoutcast/grl-shoutcast.c:551 #, c-format msgid "Failed to connect: %s" msgstr "Failed to connect: %s" -#: ../src/jamendo/grl-jamendo.c:806 +#: src/jamendo/grl-jamendo.c:799 msgid "Feeds" msgstr "Feeds" -#: ../src/jamendo/grl-jamendo.c:990 ../src/jamendo/grl-jamendo.c:1035 -#: ../src/jamendo/grl-jamendo.c:1062 +#: src/jamendo/grl-jamendo.c:983 src/jamendo/grl-jamendo.c:1028 +#: src/jamendo/grl-jamendo.c:1055 #, c-format msgid "Invalid identifier %s" msgstr "Invalid identifier %s" -#: ../src/jamendo/grl-jamendo.c:1049 ../src/youtube/grl-youtube.c:1104 -#: ../src/youtube/grl-youtube.c:1237 ../src/youtube/grl-youtube.c:1449 +#: src/jamendo/grl-jamendo.c:1042 src/youtube/grl-youtube.c:1097 +#: src/youtube/grl-youtube.c:1230 src/youtube/grl-youtube.c:1442 #, c-format msgid "Invalid category identifier %s" msgstr "Invalid category identifier %s" -#: ../src/jamendo/grl-jamendo.c:1228 +#: src/jamendo/grl-jamendo.c:1221 #, c-format msgid "Failed to browse: %s is a track" msgstr "Failed to browse: %s is a track" -#: ../src/jamendo/grl-jamendo.c:1287 +#: src/jamendo/grl-jamendo.c:1280 #, c-format -msgid "Malformed query \"%s\"" -msgstr "Malformed query \"%s\"" +#| msgid "Malformed query \"%s\"" +msgid "Malformed query “%s”" +msgstr "Malformed query “%s”" -#: ../src/local-metadata/grl-local-metadata.c:42 +#: src/local-metadata/grl-local-metadata.c:42 msgid "Local Metadata Provider" msgstr "Local Metadata Provider" -#: ../src/local-metadata/grl-local-metadata.c:43 +#: src/local-metadata/grl-local-metadata.c:43 msgid "A source providing locally available metadata" msgstr "A source providing locally-available metadata" -#: ../src/local-metadata/grl-local-metadata.c:388 -#: ../src/metadata-store/grl-metadata-store.c:779 ../src/raitv/grl-raitv.c:874 -#: ../src/tracker/grl-tracker-source-api.c:527 +#: src/local-metadata/grl-local-metadata.c:381 +#: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" msgstr "Failed to resolve: %s" -#: ../src/local-metadata/grl-local-metadata.c:682 +#: src/local-metadata/grl-local-metadata.c:673 msgid "Cannot resolve any of the given keys" msgstr "Cannot resolve any of the given keys" -#: ../src/local-metadata/grl-local-metadata.c:686 +#: src/local-metadata/grl-local-metadata.c:677 msgid "A GIO supported URL for images is required" msgstr "A GIO supported URL for images is required" -#: ../src/magnatune/grl-magnatune.c:122 +#: src/magnatune/grl-magnatune.c:123 msgid "Genres" msgstr "Genres" -#: ../src/magnatune/grl-magnatune.c:130 +#: src/magnatune/grl-magnatune.c:131 msgid "A source for browsing music" msgstr "A source for browsing music" -#: ../src/magnatune/grl-magnatune.c:422 +#: src/magnatune/grl-magnatune.c:421 #, c-format msgid "Failed to get database from magnatune: %s" msgstr "Failed to get database from magnatune: %s" -#: ../src/magnatune/grl-magnatune.c:452 +#: src/magnatune/grl-magnatune.c:451 #, c-format -msgid "Failed to save database from magnatune - '%s'" -msgstr "Failed to save database from magnatune - '%s'" +#| msgid "Failed to save database from magnatune - '%s'" +msgid "Failed to save database from magnatune: “%s”" +msgstr "Failed to save database from magnatune - “%s”" -#: ../src/magnatune/grl-magnatune.c:697 +#: src/magnatune/grl-magnatune.c:722 #, c-format msgid "Failed to get table from magnatune db: %s" msgstr "Failed to get table from magnatune db: %s" -#: ../src/magnatune/grl-magnatune.c:713 +#: src/magnatune/grl-magnatune.c:738 #, c-format msgid "Fail before returning media to user: %s" msgstr "Fail before returning media to user: %s" -#: ../src/metadata-store/grl-metadata-store.c:45 +#: src/metadata-store/grl-metadata-store.c:40 msgid "Metadata Store" msgstr "Metadata Store" -#: ../src/metadata-store/grl-metadata-store.c:46 +#: src/metadata-store/grl-metadata-store.c:41 msgid "A plugin for storing extra metadata information" msgstr "A plugin for storing extra metadata information" -#: ../src/metadata-store/grl-metadata-store.c:593 -#: ../src/metadata-store/grl-metadata-store.c:612 -#: ../src/metadata-store/grl-metadata-store.c:824 -#: ../src/tracker/grl-tracker-source-api.c:637 +#: src/metadata-store/grl-metadata-store.c:598 +#: src/metadata-store/grl-metadata-store.c:617 +#: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" msgstr "Failed to update metadata: %s" -#: ../src/metadata-store/grl-metadata-store.c:594 +#: src/metadata-store/grl-metadata-store.c:599 msgid "specified keys are not writable" msgstr "specified keys are not writable" -#: ../src/metadata-store/grl-metadata-store.c:634 +#: src/metadata-store/grl-metadata-store.c:639 msgid "Failed to update metadata" msgstr "Failed to update metadata" -#: ../src/metadata-store/grl-metadata-store.c:780 -#: ../src/metadata-store/grl-metadata-store.c:825 -msgid "\"source-id\" not available" -msgstr "\"source-id\" not available" +#: src/metadata-store/grl-metadata-store.c:785 +#: src/metadata-store/grl-metadata-store.c:830 +#| msgid "\"source-id\" not available" +msgid "“source-id” not available" +msgstr "“source-id” not available" -#: ../src/metadata-store/grl-metadata-store.c:800 +#: src/metadata-store/grl-metadata-store.c:805 msgid "Failed to resolve" msgstr "Failed to resolve" -#: ../src/metadata-store/grl-metadata-store.c:937 -#: ../src/metadata-store/grl-metadata-store.c:974 ../src/raitv/grl-raitv.c:432 -#: ../src/shoutcast/grl-shoutcast.c:756 ../src/vimeo/grl-vimeo.c:547 +#: src/metadata-store/grl-metadata-store.c:942 +#: src/metadata-store/grl-metadata-store.c:979 src/raitv/grl-raitv.c:423 +#: src/shoutcast/grl-shoutcast.c:749 src/vimeo/grl-vimeo.c:540 #, c-format msgid "Failed to search: %s" msgstr "Failed to search: %s" -#: ../src/opensubtitles/grl-opensubtitles.c:40 +#: src/opensubtitles/grl-opensubtitles.c:40 msgid "OpenSubtitles Provider" msgstr "OpenSubtitles Provider" -#: ../src/opensubtitles/grl-opensubtitles.c:41 +#: src/opensubtitles/grl-opensubtitles.c:41 msgid "A source providing a list of subtitles for a video" msgstr "A source providing a list of subtitles for a video" -#: ../src/optical-media/grl-optical-media.c:44 +#: src/optical-media/grl-optical-media.c:44 msgid "Optical Media" msgstr "Optical Media" -#: ../src/optical-media/grl-optical-media.c:45 +#: src/optical-media/grl-optical-media.c:45 msgid "A source for browsing optical media" msgstr "A source for browsing optical media" -#: ../src/podcasts/grl-podcasts.c:153 +#: src/podcasts/grl-podcasts.c:148 msgid "A source for browsing podcasts" msgstr "A source for browsing podcasts" -#: ../src/podcasts/grl-podcasts.c:764 ../src/podcasts/grl-podcasts.c:784 +#: src/podcasts/grl-podcasts.c:759 src/podcasts/grl-podcasts.c:779 #, c-format msgid "Failed to get podcast streams: %s" msgstr "Failed to get podcast streams: %s" -#: ../src/podcasts/grl-podcasts.c:1250 ../src/podcasts/grl-podcasts.c:1259 -#: ../src/podcasts/grl-podcasts.c:1269 +#: src/podcasts/grl-podcasts.c:1245 src/podcasts/grl-podcasts.c:1254 +#: src/podcasts/grl-podcasts.c:1264 msgid "Failed to parse content" msgstr "Failed to parse content" -#: ../src/podcasts/grl-podcasts.c:1302 +#: src/podcasts/grl-podcasts.c:1297 msgid "Failed to parse podcast contents" msgstr "Failed to parse podcast contents" -#: ../src/podcasts/grl-podcasts.c:1457 +#: src/podcasts/grl-podcasts.c:1452 msgid "Failed to get podcast information" msgstr "Failed to get podcast information" -#: ../src/podcasts/grl-podcasts.c:1497 ../src/podcasts/grl-podcasts.c:1517 +#: src/podcasts/grl-podcasts.c:1492 src/podcasts/grl-podcasts.c:1512 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Failed to get podcasts list: %s" -#: ../src/podcasts/grl-podcasts.c:1570 ../src/podcasts/grl-podcasts.c:1585 +#: src/podcasts/grl-podcasts.c:1565 src/podcasts/grl-podcasts.c:1580 msgid "Failed to get podcast stream metadata" msgstr "Failed to get podcast stream metadata" -#: ../src/podcasts/grl-podcasts.c:1623 +#: src/podcasts/grl-podcasts.c:1618 msgid "Failed to get podcast metadata" msgstr "Failed to get podcast metadata" -#: ../src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1802 msgid "Cannot create containers. Only feeds are accepted" msgstr "Cannot create containers. Only feeds are accepted" -#: ../src/podcasts/grl-podcasts.c:1812 +#: src/podcasts/grl-podcasts.c:1807 msgid "URL required" msgstr "URL required" -#: ../src/raitv/grl-raitv.c:49 ../src/youtube/grl-youtube.c:78 +#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:73 msgid "Most Popular" msgstr "Most Popular" -#: ../src/raitv/grl-raitv.c:52 +#: src/raitv/grl-raitv.c:52 msgid "Recent" msgstr "Recent" -#: ../src/raitv/grl-raitv.c:93 +#: src/raitv/grl-raitv.c:93 msgid "A source for browsing and searching Rai.tv videos" msgstr "A source for browsing and searching Rai.tv videos" -#: ../src/raitv/grl-raitv.c:171 +#: src/raitv/grl-raitv.c:164 msgid "All" msgstr "All" -#: ../src/raitv/grl-raitv.c:172 +#: src/raitv/grl-raitv.c:165 msgid "Black and White" msgstr "Black and White" -#: ../src/raitv/grl-raitv.c:173 +#: src/raitv/grl-raitv.c:166 msgid "Cinema" msgstr "Cinema" -#: ../src/raitv/grl-raitv.c:174 +#: src/raitv/grl-raitv.c:167 msgid "Comedians" msgstr "Comedians" -#: ../src/raitv/grl-raitv.c:175 +#: src/raitv/grl-raitv.c:168 msgid "Chronicle" msgstr "Chronicle" -#: ../src/raitv/grl-raitv.c:176 +#: src/raitv/grl-raitv.c:169 msgid "Culture" msgstr "Culture" -#: ../src/raitv/grl-raitv.c:177 +#: src/raitv/grl-raitv.c:170 msgid "Economy" msgstr "Economy" -#: ../src/raitv/grl-raitv.c:178 +#: src/raitv/grl-raitv.c:171 msgid "Fiction" msgstr "Fiction" -#: ../src/raitv/grl-raitv.c:179 +#: src/raitv/grl-raitv.c:172 msgid "Junior" msgstr "Junior" -#: ../src/raitv/grl-raitv.c:180 +#: src/raitv/grl-raitv.c:173 msgid "Investigations" msgstr "Investigations" -#: ../src/raitv/grl-raitv.c:181 +#: src/raitv/grl-raitv.c:174 msgid "Interviews" msgstr "Interviews" -#: ../src/raitv/grl-raitv.c:182 +#: src/raitv/grl-raitv.c:175 msgid "Music" msgstr "Music" -#: ../src/raitv/grl-raitv.c:183 +#: src/raitv/grl-raitv.c:176 msgid "News" msgstr "News" -#: ../src/raitv/grl-raitv.c:184 +#: src/raitv/grl-raitv.c:177 msgid "Health" msgstr "Health" -#: ../src/raitv/grl-raitv.c:185 +#: src/raitv/grl-raitv.c:178 msgid "Satire" msgstr "Satire" -#: ../src/raitv/grl-raitv.c:187 +#: src/raitv/grl-raitv.c:180 msgid "Society" msgstr "Society" -#: ../src/raitv/grl-raitv.c:188 +#: src/raitv/grl-raitv.c:181 msgid "Show" msgstr "Show" -#: ../src/raitv/grl-raitv.c:189 +#: src/raitv/grl-raitv.c:182 msgid "Sport" msgstr "Sport" -#: ../src/raitv/grl-raitv.c:190 +#: src/raitv/grl-raitv.c:183 msgid "History" msgstr "History" -#: ../src/raitv/grl-raitv.c:191 +#: src/raitv/grl-raitv.c:184 msgid "Politics" msgstr "Politics" -#: ../src/raitv/grl-raitv.c:192 +#: src/raitv/grl-raitv.c:185 msgid "Leisure" msgstr "Leisure" -#: ../src/raitv/grl-raitv.c:193 +#: src/raitv/grl-raitv.c:186 msgid "Travel" msgstr "Travel" -#: ../src/raitv/grl-raitv.c:625 +#: src/raitv/grl-raitv.c:616 #, c-format msgid "Failed to browse: %s" msgstr "Failed to browse: %s" -#: ../src/shoutcast/grl-shoutcast.c:65 +#: src/shoutcast/grl-shoutcast.c:60 msgid "A source for browsing SHOUTcast radios" msgstr "A source for browsing SHOUTcast radios" -#: ../src/shoutcast/grl-shoutcast.c:462 +#: src/shoutcast/grl-shoutcast.c:455 #, c-format msgid "Cannot find media %s" msgstr "Cannot find media %s" -#: ../src/shoutcast/grl-shoutcast.c:757 ../src/vimeo/grl-vimeo.c:548 +#: src/shoutcast/grl-shoutcast.c:750 src/vimeo/grl-vimeo.c:541 msgid "non-NULL search text is required" msgstr "non-NULL search text is required" -#: ../src/thetvdb/grl-thetvdb.c:98 +#: src/thetvdb/grl-thetvdb.c:93 msgid "A source for fetching metadata of television shows" msgstr "A source for fetching metadata of television programmes" -#: ../src/tmdb/grl-tmdb.c:1004 +#: src/tmdb/grl-tmdb.c:998 msgid "Remote data does not contain valid identifier" msgstr "Remote data does not contain valid identifier" #. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse -#: ../src/tracker/grl-tracker-source-api.c:398 -#: ../src/tracker/grl-tracker-source-api.c:481 +#: src/tracker/grl-tracker-source-api.c:401 +#: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Failed to query: %s" -#: ../src/tracker/grl-tracker-source-api.c:582 +#: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Failed to get media from uri: %s" -#: ../src/tracker/grl-tracker-source-api.c:802 +#: src/tracker/grl-tracker-source-api.c:806 msgid "Empty query" msgstr "Empty query" -#: ../src/tracker/grl-tracker-source-api.c:1077 +#: src/tracker/grl-tracker-source-api.c:1088 #, c-format -msgid "ID '%s' is not known in this source" -msgstr "ID '%s' is not known in this source" +#| msgid "ID '%s' is not known in this source" +msgid "ID “%s” is not known in this source" +msgstr "ID “%s” is not known in this source" -#: ../src/tracker/grl-tracker-source-priv.h:44 +#: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "A plugin for searching multimedia content using Tracker" -#: ../src/tracker/grl-tracker-utils.c:691 +#: src/tracker/grl-tracker-utils.c:738 #, c-format -msgid "Removable - %s" -msgstr "Removable - %s" +#| msgid "Removable - %s" +msgid "Removable — %s" +msgstr "Removable — %s" -#: ../src/tracker/grl-tracker-utils.c:703 +#: src/tracker/grl-tracker-utils.c:750 msgid "Local files" msgstr "Local files" -#: ../src/vimeo/grl-vimeo.c:56 +#: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "A source for browsing and searching Vimeo videos" -#: ../src/youtube/grl-youtube.c:60 +#: src/youtube/grl-youtube.c:55 msgid "Standard feeds" msgstr "Standard feeds" -#: ../src/youtube/grl-youtube.c:63 +#: src/youtube/grl-youtube.c:58 msgid "Categories" msgstr "Categories" -#: ../src/youtube/grl-youtube.c:69 +#: src/youtube/grl-youtube.c:64 msgid "Top Rated" msgstr "Top Rated" -#: ../src/youtube/grl-youtube.c:72 +#: src/youtube/grl-youtube.c:67 msgid "Top Favorites" msgstr "Top Favourites" -#: ../src/youtube/grl-youtube.c:75 +#: src/youtube/grl-youtube.c:70 msgid "Most Viewed" msgstr "Most Viewed" -#: ../src/youtube/grl-youtube.c:81 +#: src/youtube/grl-youtube.c:76 msgid "Most Recent" msgstr "Most Recent" -#: ../src/youtube/grl-youtube.c:84 +#: src/youtube/grl-youtube.c:79 msgid "Most Discussed" msgstr "Most Discussed" -#: ../src/youtube/grl-youtube.c:87 +#: src/youtube/grl-youtube.c:82 msgid "Most Linked" msgstr "Most Linked" -#: ../src/youtube/grl-youtube.c:90 +#: src/youtube/grl-youtube.c:85 msgid "Most Responded" msgstr "Most Responded" -#: ../src/youtube/grl-youtube.c:93 +#: src/youtube/grl-youtube.c:88 msgid "Recently Featured" msgstr "Recently Featured" -#: ../src/youtube/grl-youtube.c:96 +#: src/youtube/grl-youtube.c:91 msgid "Watch On Mobile" msgstr "Watch On Mobile" -#: ../src/youtube/grl-youtube.c:115 +#: src/youtube/grl-youtube.c:110 msgid "A source for browsing and searching YouTube videos" msgstr "A source for browsing and searching YouTube videos" -#: ../src/youtube/grl-youtube.c:863 +#: src/youtube/grl-youtube.c:856 msgid "Failed to get feed" msgstr "Failed to get feed" -#: ../src/youtube/grl-youtube.c:1040 ../src/youtube/grl-youtube.c:1428 +#: src/youtube/grl-youtube.c:1033 src/youtube/grl-youtube.c:1421 #, c-format msgid "Invalid feed identifier %s" msgstr "Invalid feed identifier %s" diff -Nru grilo-plugins-0.3.11/po/es.po grilo-plugins-0.3.12/po/es.po --- grilo-plugins-0.3.11/po/es.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/es.po 2020-09-03 05:36:44.360468000 +0000 @@ -6,14 +6,14 @@ # MIguel Rodriguez Núñez , 2013. # Miguel Rodriguez Nuñez , 2014. # Miguel Rodríguez Núñez , 2013, 2014, 2015. -# Daniel Mustieles , 2013, 2014, 2015, 2016, 2018. +# Daniel Mustieles , 2013-2020. # msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-07-06 09:16+0000\n" -"PO-Revision-Date: 2018-07-09 08:48+0200\n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-25 13:15+0200\n" "Last-Translator: Daniel Mustieles \n" "Language-Team: es \n" "Language: es\n" @@ -21,46 +21,46 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Gtranslator 2.91.6\n" +"X-Generator: Gtranslator 3.36.0\n" -#: src/bookmarks/grl-bookmarks.c:65 +#: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" msgstr "Marcadores" -#: src/bookmarks/grl-bookmarks.c:66 +#: src/bookmarks/grl-bookmarks.c:61 msgid "A source for organizing media bookmarks" msgstr "Una fuente para organizar marcadores multimedia" -#: src/bookmarks/grl-bookmarks.c:434 +#: src/bookmarks/grl-bookmarks.c:427 msgid "Failed to get bookmark metadata" msgstr "Falló al obtener los metadatos de los marcadores" -#: src/bookmarks/grl-bookmarks.c:464 src/bookmarks/grl-bookmarks.c:481 +#: src/bookmarks/grl-bookmarks.c:457 src/bookmarks/grl-bookmarks.c:474 #, c-format msgid "Failed to find bookmarks: %s" msgstr "Falló al buscar marcadores: %s" -#: src/bookmarks/grl-bookmarks.c:633 src/podcasts/grl-podcasts.c:826 -#: src/podcasts/grl-podcasts.c:858 src/podcasts/grl-podcasts.c:890 +#: src/bookmarks/grl-bookmarks.c:626 src/podcasts/grl-podcasts.c:823 +#: src/podcasts/grl-podcasts.c:855 src/podcasts/grl-podcasts.c:887 #, c-format msgid "Failed to remove: %s" msgstr "Falló al eliminar: %s" -#: src/bookmarks/grl-bookmarks.c:773 src/podcasts/grl-podcasts.c:931 -#: src/podcasts/grl-podcasts.c:964 src/podcasts/grl-podcasts.c:1811 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Falló al guardar: %s" -#: src/bookmarks/grl-bookmarks.c:847 src/bookmarks/grl-bookmarks.c:882 -#: src/bookmarks/grl-bookmarks.c:913 src/bookmarks/grl-bookmarks.c:971 -#: src/metadata-store/grl-metadata-store.c:881 -#: src/podcasts/grl-podcasts.c:1667 src/podcasts/grl-podcasts.c:1711 -#: src/podcasts/grl-podcasts.c:1745 src/podcasts/grl-podcasts.c:1780 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Sin conexión a la base de datos" -#: src/chromaprint/grl-chromaprint.c:46 +#: src/chromaprint/grl-chromaprint.c:41 msgid "A plugin to get metadata using gstreamer framework" msgstr "" "Un complemento para obtener metadatos usando el entorno de trabajo de " @@ -68,60 +68,56 @@ #: src/dleyna/grl-dleyna-source.c:34 #, c-format -#| msgid "A source for browsing the DLNA server '%s'" msgid "A source for browsing the DLNA server “%s”" msgstr "Una fuente para explorar el servidor DLNA «%s»" -#: src/dleyna/grl-dleyna-source.c:278 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "Falló la subida, fuente objetivo destruida" -#: src/dleyna/grl-dleyna-source.c:380 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format -#| msgid "Upload failed, '%s', transferred %lu of %lu bytes" msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "Falló la subida, «%s», transferidos %lu de %lu bytes" -#: src/dleyna/grl-dleyna-source.c:885 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "" "Falló al obtener las propiedades del elemento (error de BrowseObjects %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1524 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "Falló la subida, falta el URL del objeto multimedia que transferir" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format -#| msgid "A source for browsing the DAAP server '%s'" msgid "A source for browsing the DAAP server “%s”" msgstr "Una fuente para explorar el servidor DAAP «%s»" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:795 -#: src/magnatune/grl-magnatune.c:127 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 +#: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Álbumes" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:784 -#: src/magnatune/grl-magnatune.c:126 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 +#: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Artistas" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1122 -#: src/jamendo/grl-jamendo.c:1233 src/magnatune/grl-magnatune.c:873 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 +#: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Identificador de extensión %s no válido" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format -#| msgid "A source for browsing the DPAP server '%s'" msgid "A source for browsing the DPAP server “%s”" msgstr "Una fuente para explorar el servidor DPAP «%s»" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Fotos" @@ -133,31 +129,29 @@ msgid "A source for browsing the filesystem" msgstr "Una fuente para explorar el sistema de archivos" -#: src/filesystem/grl-filesystem.c:1179 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "El archivo %s no existe" -#: src/filesystem/grl-filesystem.c:1257 src/youtube/grl-youtube.c:1512 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "No se pueden obtener los archivos multimedia desde %s" -#: src/flickr/grl-flickr.c:63 +#: src/flickr/grl-flickr.c:58 msgid "A source for browsing and searching Flickr photos" msgstr "Una fuente para explorar y buscar fotos en Flickr" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:67 +#: src/flickr/grl-flickr.c:62 #, c-format -#| msgid "%s's Flickr" msgid "%s’s Flickr" msgstr "%s de Flickr" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:69 +#: src/flickr/grl-flickr.c:64 #, c-format -#| msgid "A source for browsing and searching %s's flickr photos" msgid "A source for browsing and searching %s’s flickr photos" msgstr "Una fuente para explorar y buscar fotos de %s en flickr" @@ -214,45 +208,44 @@ msgid "Top tracks" msgstr "Mejores pistas" -#: src/jamendo/grl-jamendo.c:348 src/jamendo/grl-jamendo.c:708 -#: src/shoutcast/grl-shoutcast.c:416 src/shoutcast/grl-shoutcast.c:470 +#: src/jamendo/grl-jamendo.c:341 src/jamendo/grl-jamendo.c:701 +#: src/shoutcast/grl-shoutcast.c:409 src/shoutcast/grl-shoutcast.c:463 msgid "Failed to parse response" msgstr "Falló al analizar la respuesta" -#: src/jamendo/grl-jamendo.c:356 src/jamendo/grl-jamendo.c:363 -#: src/podcasts/grl-podcasts.c:1368 src/shoutcast/grl-shoutcast.c:424 +#: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Respuesta vacía" -#: src/jamendo/grl-jamendo.c:677 src/shoutcast/grl-shoutcast.c:558 +#: src/jamendo/grl-jamendo.c:670 src/shoutcast/grl-shoutcast.c:551 #, c-format msgid "Failed to connect: %s" msgstr "Falló al conectar: %s" -#: src/jamendo/grl-jamendo.c:806 +#: src/jamendo/grl-jamendo.c:799 msgid "Feeds" msgstr "Proveedores" -#: src/jamendo/grl-jamendo.c:990 src/jamendo/grl-jamendo.c:1035 -#: src/jamendo/grl-jamendo.c:1062 +#: src/jamendo/grl-jamendo.c:983 src/jamendo/grl-jamendo.c:1028 +#: src/jamendo/grl-jamendo.c:1055 #, c-format msgid "Invalid identifier %s" msgstr "Identificador %s no válido" -#: src/jamendo/grl-jamendo.c:1049 src/youtube/grl-youtube.c:1104 -#: src/youtube/grl-youtube.c:1237 src/youtube/grl-youtube.c:1449 +#: src/jamendo/grl-jamendo.c:1042 src/youtube/grl-youtube.c:1097 +#: src/youtube/grl-youtube.c:1230 src/youtube/grl-youtube.c:1442 #, c-format msgid "Invalid category identifier %s" msgstr "Identificador de categoría %s no válido" -#: src/jamendo/grl-jamendo.c:1228 +#: src/jamendo/grl-jamendo.c:1221 #, c-format msgid "Failed to browse: %s is a track" msgstr "Falló al examinar: %s es una pista" -#: src/jamendo/grl-jamendo.c:1287 +#: src/jamendo/grl-jamendo.c:1280 #, c-format -#| msgid "Malformed query \"%s\"" msgid "Malformed query “%s”" msgstr "Consulta «%s» mal formada" @@ -264,87 +257,87 @@ msgid "A source providing locally available metadata" msgstr "Una fuente que proporciona metadatos locales" -#: src/local-metadata/grl-local-metadata.c:388 -#: src/metadata-store/grl-metadata-store.c:791 src/raitv/grl-raitv.c:878 +#: src/local-metadata/grl-local-metadata.c:381 +#: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" msgstr "Falló al resolver: %s" -#: src/local-metadata/grl-local-metadata.c:682 +#: src/local-metadata/grl-local-metadata.c:673 msgid "Cannot resolve any of the given keys" msgstr "No se pudo resolver ninguna clave suministrada" -#: src/local-metadata/grl-local-metadata.c:686 +#: src/local-metadata/grl-local-metadata.c:677 msgid "A GIO supported URL for images is required" msgstr "Se necesita un URL soportado por GIO para imágenes" -#: src/magnatune/grl-magnatune.c:128 +#: src/magnatune/grl-magnatune.c:123 msgid "Genres" msgstr "Géneros" -#: src/magnatune/grl-magnatune.c:136 +#: src/magnatune/grl-magnatune.c:131 msgid "A source for browsing music" msgstr "Una fuente para explorar música" -#: src/magnatune/grl-magnatune.c:428 +#: src/magnatune/grl-magnatune.c:421 #, c-format msgid "Failed to get database from magnatune: %s" msgstr "Falló al obtener la base de datos de magnatune: %s" -#: src/magnatune/grl-magnatune.c:458 +#: src/magnatune/grl-magnatune.c:451 #, c-format -#| msgid "Failed to save database from magnatune - '%s'" msgid "Failed to save database from magnatune: “%s”" msgstr "Falló al guardar la base de datos «%s» de magnatune." -#: src/magnatune/grl-magnatune.c:729 +#: src/magnatune/grl-magnatune.c:722 #, c-format msgid "Failed to get table from magnatune db: %s" msgstr "Falló al obtener la tabla desde la base de datos de magnatune: %s" -#: src/magnatune/grl-magnatune.c:745 +#: src/magnatune/grl-magnatune.c:738 #, c-format msgid "Fail before returning media to user: %s" msgstr "Falló al devolver los contenidos multimedia al usuario: %s" -#: src/metadata-store/grl-metadata-store.c:45 +#: src/metadata-store/grl-metadata-store.c:40 msgid "Metadata Store" msgstr "Almacén de metadatos" -#: src/metadata-store/grl-metadata-store.c:46 +#: src/metadata-store/grl-metadata-store.c:41 msgid "A plugin for storing extra metadata information" msgstr "Un complemento para almacenar información adicional de metadatos" -#: src/metadata-store/grl-metadata-store.c:605 -#: src/metadata-store/grl-metadata-store.c:624 -#: src/metadata-store/grl-metadata-store.c:836 +#: src/metadata-store/grl-metadata-store.c:598 +#: src/metadata-store/grl-metadata-store.c:617 +#: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" msgstr "Falló al actualizar los metadatos: %s" -#: src/metadata-store/grl-metadata-store.c:606 +#: src/metadata-store/grl-metadata-store.c:599 msgid "specified keys are not writable" msgstr "claves especificadas no modificables" -#: src/metadata-store/grl-metadata-store.c:646 +#: src/metadata-store/grl-metadata-store.c:639 msgid "Failed to update metadata" msgstr "Falló al actualizar los metadatos" -#: src/metadata-store/grl-metadata-store.c:792 -#: src/metadata-store/grl-metadata-store.c:837 -#| msgid "\"source-id\" not available" +#: src/metadata-store/grl-metadata-store.c:785 +#: src/metadata-store/grl-metadata-store.c:830 msgid "“source-id” not available" msgstr "«source-id» no disponible" -#: src/metadata-store/grl-metadata-store.c:812 +#: src/metadata-store/grl-metadata-store.c:805 msgid "Failed to resolve" msgstr "No se pudo resolver" -#: src/metadata-store/grl-metadata-store.c:949 -#: src/metadata-store/grl-metadata-store.c:986 src/raitv/grl-raitv.c:432 -#: src/shoutcast/grl-shoutcast.c:756 src/vimeo/grl-vimeo.c:547 +#: src/metadata-store/grl-metadata-store.c:942 +#: src/metadata-store/grl-metadata-store.c:979 src/raitv/grl-raitv.c:423 +#: src/shoutcast/grl-shoutcast.c:749 src/vimeo/grl-vimeo.c:540 #, c-format msgid "Failed to search: %s" msgstr "Falló al buscar: %s" @@ -365,50 +358,50 @@ msgid "A source for browsing optical media" msgstr "Una fuente para explorar soportes ópticos" -#: src/podcasts/grl-podcasts.c:153 +#: src/podcasts/grl-podcasts.c:148 msgid "A source for browsing podcasts" msgstr "Una fuente para explorar podcasts" -#: src/podcasts/grl-podcasts.c:762 src/podcasts/grl-podcasts.c:782 +#: src/podcasts/grl-podcasts.c:759 src/podcasts/grl-podcasts.c:779 #, c-format msgid "Failed to get podcast streams: %s" msgstr "Falló al obtener los flujos del podcast: %s" -#: src/podcasts/grl-podcasts.c:1248 src/podcasts/grl-podcasts.c:1257 -#: src/podcasts/grl-podcasts.c:1267 +#: src/podcasts/grl-podcasts.c:1245 src/podcasts/grl-podcasts.c:1254 +#: src/podcasts/grl-podcasts.c:1264 msgid "Failed to parse content" msgstr "Falló al analizar el contenido" -#: src/podcasts/grl-podcasts.c:1302 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Falló al analizar los contenidos del podcast" -#: src/podcasts/grl-podcasts.c:1457 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Falló al obtener la información del podcast" -#: src/podcasts/grl-podcasts.c:1497 src/podcasts/grl-podcasts.c:1517 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Falló al obtener la lista de podcasts: %s" -#: src/podcasts/grl-podcasts.c:1570 src/podcasts/grl-podcasts.c:1585 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Falló al obtener los metadatos del flujo del podcast" -#: src/podcasts/grl-podcasts.c:1623 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Falló al obtener los metadatos del podcast" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "No se pueden crear contenedores. Sólo se aceptan proveedores" -#: src/podcasts/grl-podcasts.c:1812 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "Se necesita el URL" -#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:78 +#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:73 msgid "Most Popular" msgstr "Más populares" @@ -420,219 +413,228 @@ msgid "A source for browsing and searching Rai.tv videos" msgstr "Una fuente para explorar y buscar vídeos en Rai.tv" -#: src/raitv/grl-raitv.c:171 +#: src/raitv/grl-raitv.c:164 msgid "All" msgstr "Todo" -#: src/raitv/grl-raitv.c:172 +#: src/raitv/grl-raitv.c:165 msgid "Black and White" msgstr "Negro y blanco" -#: src/raitv/grl-raitv.c:173 +#: src/raitv/grl-raitv.c:166 msgid "Cinema" msgstr "Cine" -#: src/raitv/grl-raitv.c:174 +#: src/raitv/grl-raitv.c:167 msgid "Comedians" msgstr "Humoristas" -#: src/raitv/grl-raitv.c:175 +#: src/raitv/grl-raitv.c:168 msgid "Chronicle" msgstr "Crónicas" -#: src/raitv/grl-raitv.c:176 +#: src/raitv/grl-raitv.c:169 msgid "Culture" msgstr "Cultura" -#: src/raitv/grl-raitv.c:177 +#: src/raitv/grl-raitv.c:170 msgid "Economy" msgstr "Economía" -#: src/raitv/grl-raitv.c:178 +#: src/raitv/grl-raitv.c:171 msgid "Fiction" msgstr "Ficción" -#: src/raitv/grl-raitv.c:179 +#: src/raitv/grl-raitv.c:172 msgid "Junior" msgstr "Joven" -#: src/raitv/grl-raitv.c:180 +#: src/raitv/grl-raitv.c:173 msgid "Investigations" msgstr "Investigaciones" -#: src/raitv/grl-raitv.c:181 +#: src/raitv/grl-raitv.c:174 msgid "Interviews" msgstr "Entrevistas" -#: src/raitv/grl-raitv.c:182 +#: src/raitv/grl-raitv.c:175 msgid "Music" msgstr "Música" -#: src/raitv/grl-raitv.c:183 +#: src/raitv/grl-raitv.c:176 msgid "News" msgstr "Noticias" -#: src/raitv/grl-raitv.c:184 +#: src/raitv/grl-raitv.c:177 msgid "Health" msgstr "Salud" -#: src/raitv/grl-raitv.c:185 +#: src/raitv/grl-raitv.c:178 msgid "Satire" msgstr "Sátira" -#: src/raitv/grl-raitv.c:187 +#: src/raitv/grl-raitv.c:180 msgid "Society" msgstr "Sociedad" -#: src/raitv/grl-raitv.c:188 +#: src/raitv/grl-raitv.c:181 msgid "Show" msgstr "Espectáculos" -#: src/raitv/grl-raitv.c:189 +#: src/raitv/grl-raitv.c:182 msgid "Sport" msgstr "Deporte" -#: src/raitv/grl-raitv.c:190 +#: src/raitv/grl-raitv.c:183 msgid "History" msgstr "Historia" -#: src/raitv/grl-raitv.c:191 +#: src/raitv/grl-raitv.c:184 msgid "Politics" msgstr "Política" -#: src/raitv/grl-raitv.c:192 +#: src/raitv/grl-raitv.c:185 msgid "Leisure" msgstr "Ocio" -#: src/raitv/grl-raitv.c:193 +#: src/raitv/grl-raitv.c:186 msgid "Travel" msgstr "Viajes" -#: src/raitv/grl-raitv.c:625 +#: src/raitv/grl-raitv.c:616 #, c-format msgid "Failed to browse: %s" msgstr "Falló al examinar: %s" -#: src/shoutcast/grl-shoutcast.c:65 +#: src/shoutcast/grl-shoutcast.c:60 msgid "A source for browsing SHOUTcast radios" msgstr "Una fuente para explorar emisoras de radio en Shoutcast" -#: src/shoutcast/grl-shoutcast.c:462 +#: src/shoutcast/grl-shoutcast.c:455 #, c-format msgid "Cannot find media %s" msgstr "No se pueden encontrar los archivos multimedia %s" -#: src/shoutcast/grl-shoutcast.c:757 src/vimeo/grl-vimeo.c:548 +#: src/shoutcast/grl-shoutcast.c:750 src/vimeo/grl-vimeo.c:541 msgid "non-NULL search text is required" msgstr "Se requiere un texto de búsqueda no nulo" -#: src/thetvdb/grl-thetvdb.c:98 +#: src/thetvdb/grl-thetvdb.c:93 msgid "A source for fetching metadata of television shows" msgstr "Una fuente para obtener metadatos de espectáculos de televisión" -#: src/tmdb/grl-tmdb.c:1004 +#: src/tmdb/grl-tmdb.c:998 msgid "Remote data does not contain valid identifier" msgstr "Los datos remotos no contienen identificadores válidos" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Falló al consultar: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Falló al obtener los medios del URI: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Consulta vacía" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format -#| msgid "ID '%s' is not known in this source" msgid "ID “%s” is not known in this source" msgstr "no se conoce el ID «%s» en esta fuente" +#: src/tracker3/grl-tracker-source-priv.h:47 +#| msgid "A plugin for searching multimedia content using Tracker" +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "Un complemento para buscar contenido multimedia usando Tracker3" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "Un complemento para buscar contenido multimedia usando Tracker" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -#| msgid "Removable - %s" -msgid "Removable — %s" -msgstr "Extraíble — %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Archivos locales" - -#: src/vimeo/grl-vimeo.c:56 +#: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "Una fuente para explorar y buscar vídeos en Vimeo" -#: src/youtube/grl-youtube.c:60 +#: src/youtube/grl-youtube.c:55 msgid "Standard feeds" msgstr "Proveedores estándar" -#: src/youtube/grl-youtube.c:63 +#: src/youtube/grl-youtube.c:58 msgid "Categories" msgstr "Categorías" -#: src/youtube/grl-youtube.c:69 +#: src/youtube/grl-youtube.c:64 msgid "Top Rated" msgstr "Los más valorados" -#: src/youtube/grl-youtube.c:72 +#: src/youtube/grl-youtube.c:67 msgid "Top Favorites" msgstr "Los más favoritos" -#: src/youtube/grl-youtube.c:75 +#: src/youtube/grl-youtube.c:70 msgid "Most Viewed" msgstr "Más visitados" -#: src/youtube/grl-youtube.c:81 +#: src/youtube/grl-youtube.c:76 msgid "Most Recent" msgstr "Más recientes" -#: src/youtube/grl-youtube.c:84 +#: src/youtube/grl-youtube.c:79 msgid "Most Discussed" msgstr "Más discutidos" -#: src/youtube/grl-youtube.c:87 +#: src/youtube/grl-youtube.c:82 msgid "Most Linked" msgstr "Más enlazados" -#: src/youtube/grl-youtube.c:90 +#: src/youtube/grl-youtube.c:85 msgid "Most Responded" msgstr "Más respondidos" -#: src/youtube/grl-youtube.c:93 +#: src/youtube/grl-youtube.c:88 msgid "Recently Featured" msgstr "Destacados recientemente" -#: src/youtube/grl-youtube.c:96 +#: src/youtube/grl-youtube.c:91 msgid "Watch On Mobile" msgstr "Ver en un dispositivo móvil" -#: src/youtube/grl-youtube.c:115 +#: src/youtube/grl-youtube.c:110 msgid "A source for browsing and searching YouTube videos" msgstr "Una fuente para buscar y explorar vídeos en Youtube" -#: src/youtube/grl-youtube.c:863 +#: src/youtube/grl-youtube.c:856 msgid "Failed to get feed" msgstr "Falló al obtener un proveedor" -#: src/youtube/grl-youtube.c:1040 src/youtube/grl-youtube.c:1428 +#: src/youtube/grl-youtube.c:1033 src/youtube/grl-youtube.c:1421 #, c-format msgid "Invalid feed identifier %s" msgstr "Identificador de proveedor %s no válido" +#~| msgid "Removable - %s" +#~ msgid "Removable — %s" +#~ msgstr "Extraíble — %s" + +#~ msgid "Local files" +#~ msgstr "Archivos locales" + #~ msgid "Apple Movie Trailers" #~ msgstr "Tráiler de películas de Apple" diff -Nru grilo-plugins-0.3.11/po/eu.po grilo-plugins-0.3.12/po/eu.po --- grilo-plugins-0.3.11/po/eu.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/eu.po 2020-09-03 05:36:44.360468000 +0000 @@ -2,22 +2,21 @@ # Copyright (C) 2013 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # -# # Iñaki Larrañaga Murgoitio , 2014, 2015, 2016, 2018. +# Asier Sarasua Garmendia , 2020. +# msgid "" -msgstr "" -"Project-Id-Version: grilo-plugins master\n" +msgstr "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-08-01 17:25+0000\n" -"PO-Revision-Date: 2018-11-25 12:30+0100\n" -"Last-Translator: Iñaki Larrañaga Murgoitio \n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-30 18:58+0100\n" +"Last-Translator: Asier Sarasua Garmendia \n" "Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Lokalize 2.0\n" #: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" @@ -42,17 +41,17 @@ msgid "Failed to remove: %s" msgstr "Huts egin du kentzean: %s" -#: src/bookmarks/grl-bookmarks.c:766 src/podcasts/grl-podcasts.c:928 -#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1806 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Huts egin du gordetzean: %s" -#: src/bookmarks/grl-bookmarks.c:840 src/bookmarks/grl-bookmarks.c:875 -#: src/bookmarks/grl-bookmarks.c:906 src/bookmarks/grl-bookmarks.c:964 -#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1662 -#: src/podcasts/grl-podcasts.c:1706 src/podcasts/grl-podcasts.c:1740 -#: src/podcasts/grl-podcasts.c:1775 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Ez dago datu-basearen konexiorik" @@ -62,62 +61,55 @@ #: src/dleyna/grl-dleyna-source.c:34 #, c-format -#| msgid "A source for browsing the DLNA server '%s'" msgid "A source for browsing the DLNA server “%s”" msgstr "“%s“ DLNA zerbitzaria arakatzeko iturburua" -#: src/dleyna/grl-dleyna-source.c:273 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "Huts egin du igotzean, helburuko iturburua apurtuta" -#: src/dleyna/grl-dleyna-source.c:375 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format -#| msgid "Upload failed, '%s', transferred %lu of %lu bytes" msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "Huts egin du “%s“ igotzean, %lu/%lu byte transferituta" -#: src/dleyna/grl-dleyna-source.c:880 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" -msgstr "" -"Huts egin du elementuaren propietateak eskuratzean (BrowseObjects errorea " -"%d: %s)" +msgstr "Huts egin du elementuaren propietateak eskuratzean (BrowseObjects errorea %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1519 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" -msgstr "" -"Huts egin du igotzean. URLa falta da multimediaren objektuan transferitzeko" +msgstr "Huts egin du igotzean. URLa falta da multimediaren objektuan transferitzeko" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format -#| msgid "A source for browsing the DAAP server '%s'" msgid "A source for browsing the DAAP server “%s”" msgstr "“%s“ DAAP zerbitzaria arakatzeko iturburua" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:788 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 #: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Albumak" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:777 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 #: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Artistak" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1115 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 #: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Baliogabeko '%s' edukiontziaren identifikatzailea" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format -#| msgid "A source for browsing the DPAP server '%s'" msgid "A source for browsing the DPAP server “%s”" msgstr "“%s“ DPAP zerbitzaria arakatzeko iturburua" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Argazkiak" @@ -129,12 +121,12 @@ msgid "A source for browsing the filesystem" msgstr "Fitxategi-sistema arakatzeko iturburua" -#: src/filesystem/grl-filesystem.c:1170 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "Ez da '%s' fitxategia existitzen" -#: src/filesystem/grl-filesystem.c:1248 src/youtube/grl-youtube.c:1505 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Ezin da multimedia eskuratu '%s'(e)tik" @@ -146,14 +138,12 @@ #. "%s" is a full user name, like "John Doe" #: src/flickr/grl-flickr.c:62 #, c-format -#| msgid "%s's Flickr" msgid "%s’s Flickr" msgstr "“%s“ Flickr-en" #. "%s" is a full user name, like "John Doe" #: src/flickr/grl-flickr.c:64 #, c-format -#| msgid "A source for browsing and searching %s's flickr photos" msgid "A source for browsing and searching %s’s flickr photos" msgstr "“%s“(r)en Flickr-eko argazkiak arakatzeko eta bilatzeko iturburua" @@ -175,11 +165,11 @@ #: src/gravatar/grl-gravatar.c:46 msgid "Avatar provider from Gravatar" -msgstr "Gravatar-ek eskainitako avatar-a" +msgstr "Gravatar-ek eskainitako avatarra" #: src/gravatar/grl-gravatar.c:47 msgid "A plugin to get avatars for artist and author fields" -msgstr "Artista eta Egilea eremuetatik avatar-ak eskuratzeko plugina" +msgstr "Artista eta Egilea eremuetatik avatarrak eskuratzeko plugina" #: src/jamendo/grl-jamendo.c:91 msgid "A source for browsing and searching Jamendo music" @@ -215,7 +205,7 @@ msgstr "Huts egin du erantzuna analizatzean" #: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 -#: src/podcasts/grl-podcasts.c:1363 src/shoutcast/grl-shoutcast.c:417 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Erantzuna hutsik" @@ -247,7 +237,6 @@ #: src/jamendo/grl-jamendo.c:1280 #, c-format -#| msgid "Malformed query \"%s\"" msgid "Malformed query “%s”" msgstr "Gaizki osatutako “%s“ kontsulta" @@ -261,6 +250,7 @@ #: src/local-metadata/grl-local-metadata.c:381 #: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" @@ -289,7 +279,6 @@ #: src/magnatune/grl-magnatune.c:451 #, c-format -#| msgid "Failed to save database from magnatune - '%s'" msgid "Failed to save database from magnatune: “%s”" msgstr "Huts egin du Magnatune-tik datu-basea gordetzean: “%s“" @@ -314,6 +303,7 @@ #: src/metadata-store/grl-metadata-store.c:598 #: src/metadata-store/grl-metadata-store.c:617 #: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" @@ -329,7 +319,6 @@ #: src/metadata-store/grl-metadata-store.c:785 #: src/metadata-store/grl-metadata-store.c:830 -#| msgid "\"source-id\" not available" msgid "“source-id” not available" msgstr "“'source-id“ ez dago erabilgarri" @@ -374,32 +363,32 @@ msgid "Failed to parse content" msgstr "Huts egin du edukia analizatzean" -#: src/podcasts/grl-podcasts.c:1297 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Huts egin du podcast-aren edukia analizatzean" -#: src/podcasts/grl-podcasts.c:1452 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Huts egin du podcast-aren informazioa eskuratzean" -#: src/podcasts/grl-podcasts.c:1492 src/podcasts/grl-podcasts.c:1512 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Huts egin du podcast-en zerrenda lortzean: %s" -#: src/podcasts/grl-podcasts.c:1565 src/podcasts/grl-podcasts.c:1580 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Huts egin du podcast korrontearen meta-datuak lortzean" -#: src/podcasts/grl-podcasts.c:1618 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Huts egin du podcast-aren meta-datuak lortzean" -#: src/podcasts/grl-podcasts.c:1802 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "Ezin dira edukiontziak sortu. Iturriak soilik onartzen dira" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "URLa beharrezkoa da" @@ -530,43 +519,44 @@ msgstr "Urruneko datuek ez dute baliozko identifikatzailerik" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Huts egin du kontsultatzean: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Huts egin du URItik multimedia eskuratzean: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Kontsulta hutsik" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format -#| msgid "ID '%s' is not known in this source" msgid "ID “%s” is not known in this source" msgstr "“%s“ IDa ez da iturburu honetan ezaguna" +#: src/tracker3/grl-tracker-source-priv.h:47 +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "Tracker3 erabiliz multimediaren edukia bilatzeko plugina" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "Tracker erabiliz multimediaren edukia bilatzeko plugina" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -#| msgid "Removable - %s" -msgid "Removable — %s" -msgstr "Aldagarria — %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Lokaleko fitxategiak" - #: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "Vimeo-ko bideoak arakatzeko eta bilatzeko iturburua" @@ -628,6 +618,13 @@ msgid "Invalid feed identifier %s" msgstr "Baliogabeko '%s' iturriaren identifikatzailea" +#~| msgid "Removable - %s" +#~ msgid "Removable — %s" +#~ msgstr "Aldagarria — %s" + +#~ msgid "Local files" +#~ msgstr "Lokaleko fitxategiak" + #~ msgid "Album art Provider from Last.FM" #~ msgstr "Albumaren argazkien hornitzailea Last.FM gunetik" diff -Nru grilo-plugins-0.3.11/po/fi.po grilo-plugins-0.3.12/po/fi.po --- grilo-plugins-0.3.11/po/fi.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/fi.po 2020-09-03 05:36:44.360468000 +0000 @@ -7,16 +7,16 @@ msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-09-01 16:49+0000\n" -"PO-Revision-Date: 2018-09-02 12:06+0300\n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-28 18:34+0300\n" +"Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Last-Translator: Jiri Grönroos \n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 2.4.1\n" #: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" @@ -41,17 +41,17 @@ msgid "Failed to remove: %s" msgstr "Poistaminen epäonnistui: %s" -#: src/bookmarks/grl-bookmarks.c:766 src/podcasts/grl-podcasts.c:928 -#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1806 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "" -#: src/bookmarks/grl-bookmarks.c:840 src/bookmarks/grl-bookmarks.c:875 -#: src/bookmarks/grl-bookmarks.c:906 src/bookmarks/grl-bookmarks.c:964 -#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1662 -#: src/podcasts/grl-podcasts.c:1706 src/podcasts/grl-podcasts.c:1740 -#: src/podcasts/grl-podcasts.c:1775 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Ei tietokantayhteyttä" @@ -62,54 +62,54 @@ #: src/dleyna/grl-dleyna-source.c:34 #, c-format msgid "A source for browsing the DLNA server “%s”" -msgstr "" +msgstr "Lähde DLNA-palvelimen “%s” selaamista varten" -#: src/dleyna/grl-dleyna-source.c:273 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "" -#: src/dleyna/grl-dleyna-source.c:375 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "" -#: src/dleyna/grl-dleyna-source.c:880 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "" -#: src/dleyna/grl-dleyna-source.c:1519 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format msgid "A source for browsing the DAAP server “%s”" msgstr "" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:788 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 #: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Albumit" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:777 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 #: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Esittäjät" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1115 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 #: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format msgid "A source for browsing the DPAP server “%s”" msgstr "" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Kuvat" @@ -121,12 +121,12 @@ msgid "A source for browsing the filesystem" msgstr "" -#: src/filesystem/grl-filesystem.c:1170 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "Tiedostoa %s ei ole olemassa" -#: src/filesystem/grl-filesystem.c:1248 src/youtube/grl-youtube.c:1505 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "" @@ -205,7 +205,7 @@ msgstr "Vastauksen jäsentäminen epäonnistui" #: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 -#: src/podcasts/grl-podcasts.c:1363 src/shoutcast/grl-shoutcast.c:417 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Tyhjä vastaus" @@ -250,6 +250,7 @@ #: src/local-metadata/grl-local-metadata.c:381 #: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" @@ -302,6 +303,7 @@ #: src/metadata-store/grl-metadata-store.c:598 #: src/metadata-store/grl-metadata-store.c:617 #: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" @@ -329,7 +331,7 @@ #: src/shoutcast/grl-shoutcast.c:749 src/vimeo/grl-vimeo.c:540 #, c-format msgid "Failed to search: %s" -msgstr "" +msgstr "Haku epäonnistui: %s" #: src/opensubtitles/grl-opensubtitles.c:40 msgid "OpenSubtitles Provider" @@ -337,7 +339,7 @@ #: src/opensubtitles/grl-opensubtitles.c:41 msgid "A source providing a list of subtitles for a video" -msgstr "" +msgstr "Lähde videotekstitysten listaamista varten" #: src/optical-media/grl-optical-media.c:44 msgid "Optical Media" @@ -349,7 +351,7 @@ #: src/podcasts/grl-podcasts.c:148 msgid "A source for browsing podcasts" -msgstr "" +msgstr "Lähde podcastien selaamista varten" #: src/podcasts/grl-podcasts.c:759 src/podcasts/grl-podcasts.c:779 #, c-format @@ -361,46 +363,46 @@ msgid "Failed to parse content" msgstr "Sisällön jäsentäminen epäonnistui" -#: src/podcasts/grl-podcasts.c:1297 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Podcastin sisällön jäsentäminen epäonnistui" -#: src/podcasts/grl-podcasts.c:1452 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "" -#: src/podcasts/grl-podcasts.c:1492 src/podcasts/grl-podcasts.c:1512 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "" -#: src/podcasts/grl-podcasts.c:1565 src/podcasts/grl-podcasts.c:1580 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "" -#: src/podcasts/grl-podcasts.c:1618 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "" -#: src/podcasts/grl-podcasts.c:1802 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "URL vaaditaan" #: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:73 msgid "Most Popular" -msgstr "" +msgstr "Suosituimmat" #: src/raitv/grl-raitv.c:52 msgid "Recent" -msgstr "" +msgstr "Viimeisimmät" #: src/raitv/grl-raitv.c:93 msgid "A source for browsing and searching Rai.tv videos" -msgstr "" +msgstr "Lähde Rai.tv-videoiden selaamista ja hakemista varten" #: src/raitv/grl-raitv.c:164 msgid "All" @@ -412,7 +414,7 @@ #: src/raitv/grl-raitv.c:166 msgid "Cinema" -msgstr "" +msgstr "Elokuva" #: src/raitv/grl-raitv.c:167 msgid "Comedians" @@ -484,7 +486,7 @@ #: src/raitv/grl-raitv.c:185 msgid "Leisure" -msgstr "" +msgstr "Hupi" #: src/raitv/grl-raitv.c:186 msgid "Travel" @@ -517,48 +519,51 @@ msgstr "" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Kysely epäonnistui: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Tyhjä kysely" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format msgid "ID “%s” is not known in this source" msgstr "" -#: src/tracker/grl-tracker-source-priv.h:44 -msgid "A plugin for searching multimedia content using Tracker" +#: src/tracker3/grl-tracker-source-priv.h:47 +msgid "A plugin for searching multimedia content using Tracker3" msgstr "" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -msgid "Removable — %s" +#: src/tracker/grl-tracker-source-priv.h:44 +msgid "A plugin for searching multimedia content using Tracker" msgstr "" -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Paikalliset tiedostot" - #: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" -msgstr "" +msgstr "Lähde Vimeo-videoiden selaamista ja hakemista varten" #: src/youtube/grl-youtube.c:55 msgid "Standard feeds" -msgstr "" +msgstr "Perussyötteet" #: src/youtube/grl-youtube.c:58 msgid "Categories" @@ -566,49 +571,52 @@ #: src/youtube/grl-youtube.c:64 msgid "Top Rated" -msgstr "" +msgstr "Parhaat arvostelut" #: src/youtube/grl-youtube.c:67 msgid "Top Favorites" -msgstr "" +msgstr "Suosikit" #: src/youtube/grl-youtube.c:70 msgid "Most Viewed" -msgstr "" +msgstr "Eniten katsottu" #: src/youtube/grl-youtube.c:76 msgid "Most Recent" -msgstr "" +msgstr "Uusimmat" #: src/youtube/grl-youtube.c:79 msgid "Most Discussed" -msgstr "" +msgstr "Eniten keskusteltu" #: src/youtube/grl-youtube.c:82 msgid "Most Linked" -msgstr "" +msgstr "Eniten linkitetty" #: src/youtube/grl-youtube.c:85 msgid "Most Responded" -msgstr "" +msgstr "Eniten vastattu" #: src/youtube/grl-youtube.c:88 msgid "Recently Featured" -msgstr "" +msgstr "Viimeisimmät nostot" #: src/youtube/grl-youtube.c:91 msgid "Watch On Mobile" -msgstr "" +msgstr "Katso mobiilissa" #: src/youtube/grl-youtube.c:110 msgid "A source for browsing and searching YouTube videos" -msgstr "" +msgstr "Lähde YouTube-videoiden selaamista ja hakemista varten" #: src/youtube/grl-youtube.c:856 msgid "Failed to get feed" -msgstr "" +msgstr "Syötettä ei saatu" #: src/youtube/grl-youtube.c:1033 src/youtube/grl-youtube.c:1421 #, c-format msgid "Invalid feed identifier %s" msgstr "" + +#~ msgid "Local files" +#~ msgstr "Paikalliset tiedostot" diff -Nru grilo-plugins-0.3.11/po/gl.po grilo-plugins-0.3.12/po/gl.po --- grilo-plugins-0.3.11/po/gl.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/gl.po 2020-09-03 05:36:44.361467800 +0000 @@ -1,21 +1,22 @@ # Galician translation for grilo-plugins. # Copyright (C) 2013 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. -# Fran Dieguez , 2013, 2014, 2015, 2016, 2018. +# Fran Dieguez , 2013-2020. +# msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-08-01 17:25+0000\n" -"PO-Revision-Date: 2018-08-30 00:27+0200\n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-26 17:43+0200\n" "Last-Translator: Fran Dieguez \n" -"Language-Team: Proxecto Trasno \n" +"Language-Team: Galician \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Virtaal 0.7.1\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"X-Generator: Gtranslator 3.36.0\n" "X-Project-Style: gnome\n" #: src/bookmarks/grl-bookmarks.c:60 @@ -41,17 +42,17 @@ msgid "Failed to remove: %s" msgstr "Produciuse un fallo ao eliminar: %s" -#: src/bookmarks/grl-bookmarks.c:766 src/podcasts/grl-podcasts.c:928 -#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1806 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Produciuse un fallo ao almacenar: %s" -#: src/bookmarks/grl-bookmarks.c:840 src/bookmarks/grl-bookmarks.c:875 -#: src/bookmarks/grl-bookmarks.c:906 src/bookmarks/grl-bookmarks.c:964 -#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1662 -#: src/podcasts/grl-podcasts.c:1706 src/podcasts/grl-podcasts.c:1740 -#: src/podcasts/grl-podcasts.c:1775 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Non hai conexión coa base de datos" @@ -61,61 +62,57 @@ #: src/dleyna/grl-dleyna-source.c:34 #, c-format -#| msgid "A source for browsing the DLNA server '%s'" msgid "A source for browsing the DLNA server “%s”" msgstr "Unha orixe para explorar o servidor DLNA «%s»" -#: src/dleyna/grl-dleyna-source.c:273 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "A subida fallou, o orixe do obxectivo foi destruído" -#: src/dleyna/grl-dleyna-source.c:375 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format -#| msgid "Upload failed, '%s', transferred %lu of %lu bytes" msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "A subida fallou, «%s», transferíronse %lu de %lu bytes" -#: src/dleyna/grl-dleyna-source.c:880 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "" "Produciuse un fallo ao obter as propiedades do elemento (Erro en " "BrowseObjects %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1519 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "A subida fallou, falta o URL do obxecto multimedia a transferir" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format -#| msgid "A source for browsing the DAAP server '%s'" msgid "A source for browsing the DAAP server “%s”" msgstr "Unha orixe para explorar o servidor DAAP «%s»" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:788 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 #: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Álbums" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:777 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 #: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Artistas" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1115 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 #: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Identificador de contedor %s non válido" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format -#| msgid "A source for browsing the DPAP server '%s'" msgid "A source for browsing the DPAP server “%s”" msgstr "Unha orixe para explorar o servidor DAAP «%s»" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Fotos" @@ -127,12 +124,12 @@ msgid "A source for browsing the filesystem" msgstr "Unha orixe para explorar o sistema de ficheiros" -#: src/filesystem/grl-filesystem.c:1170 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "O ficheiro %s non existe" -#: src/filesystem/grl-filesystem.c:1248 src/youtube/grl-youtube.c:1505 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Non é posíbel obter o media desde %s" @@ -144,14 +141,12 @@ #. "%s" is a full user name, like "John Doe" #: src/flickr/grl-flickr.c:62 #, c-format -#| msgid "%s's Flickr" msgid "%s’s Flickr" msgstr "Flickr de %s" #. "%s" is a full user name, like "John Doe" #: src/flickr/grl-flickr.c:64 #, c-format -#| msgid "A source for browsing and searching %s's flickr photos" msgid "A source for browsing and searching %s’s flickr photos" msgstr "Unha orixe para explorar e buscar fotos no Flickr de %s" @@ -213,7 +208,7 @@ msgstr "Produciuse un fallo ao analizar a resposta" #: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 -#: src/podcasts/grl-podcasts.c:1363 src/shoutcast/grl-shoutcast.c:417 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Resposta baleira" @@ -245,7 +240,6 @@ #: src/jamendo/grl-jamendo.c:1280 #, c-format -#| msgid "Malformed query \"%s\"" msgid "Malformed query “%s”" msgstr "Consulta «%s» malformada" @@ -259,6 +253,7 @@ #: src/local-metadata/grl-local-metadata.c:381 #: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" @@ -287,7 +282,6 @@ #: src/magnatune/grl-magnatune.c:451 #, c-format -#| msgid "Failed to save database from magnatune - '%s'" msgid "Failed to save database from magnatune: “%s”" msgstr "Produciuse un fallo ao gardar a base de datos desde magnatune - «%s»" @@ -313,6 +307,7 @@ #: src/metadata-store/grl-metadata-store.c:598 #: src/metadata-store/grl-metadata-store.c:617 #: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" @@ -328,7 +323,6 @@ #: src/metadata-store/grl-metadata-store.c:785 #: src/metadata-store/grl-metadata-store.c:830 -#| msgid "\"source-id\" not available" msgid "“source-id” not available" msgstr "«source-id» non dispoñíbel" @@ -373,32 +367,32 @@ msgid "Failed to parse content" msgstr "Produciuse un fallo ao analizar o contido" -#: src/podcasts/grl-podcasts.c:1297 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Produciuse un fallo ao analizar os contidos do podcast" -#: src/podcasts/grl-podcasts.c:1452 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Produciuse un fallo ao obter a información do podcast" -#: src/podcasts/grl-podcasts.c:1492 src/podcasts/grl-podcasts.c:1512 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Produciuse un fallo ao obter a lista de podcasts: %s" -#: src/podcasts/grl-podcasts.c:1565 src/podcasts/grl-podcasts.c:1580 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Produciuse un fallo ao obter os metadatos do fluxo de podcast" -#: src/podcasts/grl-podcasts.c:1618 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Produciuse un fallo ao obter os metadatos do podcast" -#: src/podcasts/grl-podcasts.c:1802 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "Non é posíbel crear os contedores. Só se aceptan fontes" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "Requírese un URL" @@ -529,43 +523,45 @@ msgstr "Os datos remotos non conteñen un identificador válido" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Produciuse un fallo ao consultar: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Produciuse un fallo ao obter o multimedia desde o uri: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Consulta baleira" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format -#| msgid "ID '%s' is not known in this source" msgid "ID “%s” is not known in this source" msgstr "O id «%s» non é coñecido nesta orixe" +#: src/tracker3/grl-tracker-source-priv.h:47 +#| msgid "A plugin for searching multimedia content using Tracker" +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "Un engadido para buscar contido multimedia usando Tracker3" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "Un engadido para buscar contido multimedia usando Tracker" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -#| msgid "Removable - %s" -msgid "Removable — %s" -msgstr "Eliminábel — %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Ficheiros locais" - #: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "Unha orixe para explorar e buscar os vídeos de Vimeo" @@ -627,6 +623,13 @@ msgid "Invalid feed identifier %s" msgstr "Identificador %s de fonte non válido" +#~| msgid "Removable - %s" +#~ msgid "Removable — %s" +#~ msgstr "Eliminábel — %s" + +#~ msgid "Local files" +#~ msgstr "Ficheiros locais" + #~ msgid "Apple Movie Trailers" #~ msgstr "Trailers de filmes de Apple" diff -Nru grilo-plugins-0.3.11/po/hr.po grilo-plugins-0.3.12/po/hr.po --- grilo-plugins-0.3.11/po/hr.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/hr.po 2020-09-03 05:36:44.361467800 +0000 @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-08-01 17:25+0000\n" -"PO-Revision-Date: 2018-09-02 18:54+0200\n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-24 23:34+0200\n" "Last-Translator: \n" "Language-Team: Croatian \n" "Language: hr\n" @@ -17,7 +17,7 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 2.1.1\n" +"X-Generator: Poedit 2.4.1\n" #: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" @@ -42,17 +42,17 @@ msgid "Failed to remove: %s" msgstr "Neuspjelo uklanjanje: %s" -#: src/bookmarks/grl-bookmarks.c:766 src/podcasts/grl-podcasts.c:928 -#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1806 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Neuspjela pohrana: %s" -#: src/bookmarks/grl-bookmarks.c:840 src/bookmarks/grl-bookmarks.c:875 -#: src/bookmarks/grl-bookmarks.c:906 src/bookmarks/grl-bookmarks.c:964 -#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1662 -#: src/podcasts/grl-podcasts.c:1706 src/podcasts/grl-podcasts.c:1740 -#: src/podcasts/grl-podcasts.c:1775 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Nema povezivanja s bazom podataka" @@ -65,53 +65,53 @@ msgid "A source for browsing the DLNA server “%s”" msgstr "Izvor za pregledavanje DLNA poslužitelja “%s”" -#: src/dleyna/grl-dleyna-source.c:273 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "Neuspjelo slanje, odredišni izvor je uništen" -#: src/dleyna/grl-dleyna-source.c:375 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "Neuspjelo slanje, “%s”, preneseno %lu od %lu bajta" -#: src/dleyna/grl-dleyna-source.c:880 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "Neuspjelo preuzimanje svojstava stavke (BrowseObjects greška %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1519 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "" "Neuspjelo slanje, URL nedostaje na medijskom objektu koji se treba prenijeti" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format msgid "A source for browsing the DAAP server “%s”" msgstr "Izvor za pregledavanje DAAP poslužitelja “%s”" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:788 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 #: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Albumi" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:777 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 #: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Izvođači" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1115 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 #: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Neispravan identifikator spremnika %s" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format msgid "A source for browsing the DPAP server “%s”" msgstr "Izvor za pregledavanje DPAP poslužitelja “%s”" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Fotografije" @@ -123,12 +123,12 @@ msgid "A source for browsing the filesystem" msgstr "Izvor za pregledavanje datotečnog sustava" -#: src/filesystem/grl-filesystem.c:1170 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "Datoteka %s ne postoji" -#: src/filesystem/grl-filesystem.c:1248 src/youtube/grl-youtube.c:1505 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Nemoguće dobivanje medija iz %s" @@ -207,7 +207,7 @@ msgstr "Nemoguća obrada odgovora" #: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 -#: src/podcasts/grl-podcasts.c:1363 src/shoutcast/grl-shoutcast.c:417 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Prazan odgovor" @@ -252,6 +252,7 @@ #: src/local-metadata/grl-local-metadata.c:381 #: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" @@ -304,6 +305,7 @@ #: src/metadata-store/grl-metadata-store.c:598 #: src/metadata-store/grl-metadata-store.c:617 #: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" @@ -363,32 +365,32 @@ msgid "Failed to parse content" msgstr "Neuspjela obrada sadržaja" -#: src/podcasts/grl-podcasts.c:1297 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Neuspjela obrada sadržaja podcasta" -#: src/podcasts/grl-podcasts.c:1452 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Neuspjelo preuzimanje informacija podcasta" -#: src/podcasts/grl-podcasts.c:1492 src/podcasts/grl-podcasts.c:1512 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Neuspjelo preuzimanje popisa podcasta: %s" -#: src/podcasts/grl-podcasts.c:1565 src/podcasts/grl-podcasts.c:1580 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Neuspjelo preuzimanje informacija strujanja podcasta" -#: src/podcasts/grl-podcasts.c:1618 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Neuspjelo preuzimanje metapodataka podcasta" -#: src/podcasts/grl-podcasts.c:1802 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "Nemoguće stvaranje spremnika. Samo kanali su prihvatljivi" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "URL je potreban" @@ -519,41 +521,44 @@ msgstr "Udaljeni podaci ne sadrže valjani identifikator" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Neuspjeli zahtjev: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Neuspjelo preuzimanje medija s uri-ja: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Prazan zahtjev" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format msgid "ID “%s” is not known in this source" msgstr "ID “%s” nije poznat u ovom izvoru" +#: src/tracker3/grl-tracker-source-priv.h:47 +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "Priključak za pretraživanje multimedijskog sadržaja pomoću Trackera3" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "Priključak za pretraživanje multimedijskog sadržaja pomoću Trackera" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -msgid "Removable — %s" -msgstr "Uklonjivi — %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Lokalne datoteke" - #: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "Izvor za pregledavanje i pretraživanje Vimeo video snimke" @@ -614,3 +619,9 @@ #, c-format msgid "Invalid feed identifier %s" msgstr "Neispravan identifikator kanala %s" + +#~ msgid "Removable — %s" +#~ msgstr "Uklonjivi — %s" + +#~ msgid "Local files" +#~ msgstr "Lokalne datoteke" diff -Nru grilo-plugins-0.3.11/po/id.po grilo-plugins-0.3.12/po/id.po --- grilo-plugins-0.3.11/po/id.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/id.po 2020-09-03 05:36:44.361467800 +0000 @@ -2,59 +2,59 @@ # Copyright (C) 2013 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. # Andika Triwidada , 2013, 2014. -# +# Kukuh Syafaat , 2018, 2020. msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-07-06 09:16+0000\n" -"PO-Revision-Date: 2018-07-14 22:35+0700\n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-26 21:44+0700\n" "Last-Translator: Kukuh Syafaat \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 2.4.1\n" -#: src/bookmarks/grl-bookmarks.c:65 +#: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" -msgstr "Penanda taut" +msgstr "Markah" -#: src/bookmarks/grl-bookmarks.c:66 +#: src/bookmarks/grl-bookmarks.c:61 msgid "A source for organizing media bookmarks" -msgstr "Sumber untuk mengatur penanda taut media" +msgstr "Sumber untuk mengatur markah media" -#: src/bookmarks/grl-bookmarks.c:434 +#: src/bookmarks/grl-bookmarks.c:427 msgid "Failed to get bookmark metadata" -msgstr "Gagal untuk mendapat metadata penanda taut" +msgstr "Gagal untuk mendapat metadata markah" -#: src/bookmarks/grl-bookmarks.c:464 src/bookmarks/grl-bookmarks.c:481 +#: src/bookmarks/grl-bookmarks.c:457 src/bookmarks/grl-bookmarks.c:474 #, c-format msgid "Failed to find bookmarks: %s" -msgstr "Gagal menemukan penanda taut: %s" +msgstr "Gagal menemukan markah: %s" -#: src/bookmarks/grl-bookmarks.c:633 src/podcasts/grl-podcasts.c:826 -#: src/podcasts/grl-podcasts.c:858 src/podcasts/grl-podcasts.c:890 +#: src/bookmarks/grl-bookmarks.c:626 src/podcasts/grl-podcasts.c:823 +#: src/podcasts/grl-podcasts.c:855 src/podcasts/grl-podcasts.c:887 #, c-format msgid "Failed to remove: %s" msgstr "Gagal menghapus: %s" -#: src/bookmarks/grl-bookmarks.c:773 src/podcasts/grl-podcasts.c:931 -#: src/podcasts/grl-podcasts.c:964 src/podcasts/grl-podcasts.c:1811 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Gagal menyimpan: %s" -#: src/bookmarks/grl-bookmarks.c:847 src/bookmarks/grl-bookmarks.c:882 -#: src/bookmarks/grl-bookmarks.c:913 src/bookmarks/grl-bookmarks.c:971 -#: src/metadata-store/grl-metadata-store.c:881 src/podcasts/grl-podcasts.c:1667 -#: src/podcasts/grl-podcasts.c:1711 src/podcasts/grl-podcasts.c:1745 -#: src/podcasts/grl-podcasts.c:1780 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Tak ada koneksi basis data" -#: src/chromaprint/grl-chromaprint.c:46 +#: src/chromaprint/grl-chromaprint.c:41 msgid "A plugin to get metadata using gstreamer framework" msgstr "Pengaya untuk memperoleh metadata memakai kerangka kerja gstreamer" @@ -63,52 +63,52 @@ msgid "A source for browsing the DLNA server “%s”" msgstr "Sumber untuk meramban server DLNA “%s”" -#: src/dleyna/grl-dleyna-source.c:278 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "Pengunggahan gagal, sumber target dihancurkan" -#: src/dleyna/grl-dleyna-source.c:380 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "Pengunggahan gagal, “%s”, ditransfer %lu dari %lu byte." -#: src/dleyna/grl-dleyna-source.c:885 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "Gagal mengambil properti butir (galat BrowseObjects %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1524 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "Pengunggahan gagal, kurang URL pada objek media yang akan ditransfer" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format msgid "A source for browsing the DAAP server “%s”" msgstr "Sumber untuk meramban server DAAP “%s”" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:795 -#: src/magnatune/grl-magnatune.c:127 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 +#: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Album" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:784 -#: src/magnatune/grl-magnatune.c:126 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 +#: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Artis" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1122 -#: src/jamendo/grl-jamendo.c:1233 src/magnatune/grl-magnatune.c:873 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 +#: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Identifier wadah tak valid %s" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format msgid "A source for browsing the DPAP server “%s”" msgstr "Sumber untuk meramban server DPAP “%s”" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Foto" @@ -120,28 +120,28 @@ msgid "A source for browsing the filesystem" msgstr "Sumber untuk meramban sistem berkas" -#: src/filesystem/grl-filesystem.c:1179 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "Berkas %s tak ada" -#: src/filesystem/grl-filesystem.c:1257 src/youtube/grl-youtube.c:1512 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Tak bisa mendapat media dari %s" -#: src/flickr/grl-flickr.c:63 +#: src/flickr/grl-flickr.c:58 msgid "A source for browsing and searching Flickr photos" msgstr "Sumber untuk meramban dan mencari foto Flickr" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:67 +#: src/flickr/grl-flickr.c:62 #, c-format msgid "%s’s Flickr" msgstr "Flickr milik %s" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:69 +#: src/flickr/grl-flickr.c:64 #, c-format msgid "A source for browsing and searching %s’s flickr photos" msgstr "Sumber untuk meramban dan mencari foto flickr milik %s" @@ -198,43 +198,43 @@ msgid "Top tracks" msgstr "Trek top" -#: src/jamendo/grl-jamendo.c:348 src/jamendo/grl-jamendo.c:708 -#: src/shoutcast/grl-shoutcast.c:416 src/shoutcast/grl-shoutcast.c:470 +#: src/jamendo/grl-jamendo.c:341 src/jamendo/grl-jamendo.c:701 +#: src/shoutcast/grl-shoutcast.c:409 src/shoutcast/grl-shoutcast.c:463 msgid "Failed to parse response" msgstr "Gagal mengurai respon" -#: src/jamendo/grl-jamendo.c:356 src/jamendo/grl-jamendo.c:363 -#: src/podcasts/grl-podcasts.c:1368 src/shoutcast/grl-shoutcast.c:424 +#: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Respon kosong" -#: src/jamendo/grl-jamendo.c:677 src/shoutcast/grl-shoutcast.c:558 +#: src/jamendo/grl-jamendo.c:670 src/shoutcast/grl-shoutcast.c:551 #, c-format msgid "Failed to connect: %s" msgstr "Gagal menyambung: %s" -#: src/jamendo/grl-jamendo.c:806 +#: src/jamendo/grl-jamendo.c:799 msgid "Feeds" msgstr "Asupan" -#: src/jamendo/grl-jamendo.c:990 src/jamendo/grl-jamendo.c:1035 -#: src/jamendo/grl-jamendo.c:1062 +#: src/jamendo/grl-jamendo.c:983 src/jamendo/grl-jamendo.c:1028 +#: src/jamendo/grl-jamendo.c:1055 #, c-format msgid "Invalid identifier %s" msgstr "Identifier tak valid %s" -#: src/jamendo/grl-jamendo.c:1049 src/youtube/grl-youtube.c:1104 -#: src/youtube/grl-youtube.c:1237 src/youtube/grl-youtube.c:1449 +#: src/jamendo/grl-jamendo.c:1042 src/youtube/grl-youtube.c:1097 +#: src/youtube/grl-youtube.c:1230 src/youtube/grl-youtube.c:1442 #, c-format msgid "Invalid category identifier %s" msgstr "Identifier kategori tak valid %s" -#: src/jamendo/grl-jamendo.c:1228 +#: src/jamendo/grl-jamendo.c:1221 #, c-format msgid "Failed to browse: %s is a track" msgstr "Gagal meramban: %s adalah suatu trek" -#: src/jamendo/grl-jamendo.c:1287 +#: src/jamendo/grl-jamendo.c:1280 #, c-format msgid "Malformed query “%s”" msgstr "Kueri salah bentuk \"%s\"" @@ -247,85 +247,87 @@ msgid "A source providing locally available metadata" msgstr "Sumber yang menyediakan metadata yang tersedia secara lokal" -#: src/local-metadata/grl-local-metadata.c:388 -#: src/metadata-store/grl-metadata-store.c:791 src/raitv/grl-raitv.c:878 +#: src/local-metadata/grl-local-metadata.c:381 +#: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" msgstr "Gagal menentukan: %s" -#: src/local-metadata/grl-local-metadata.c:682 +#: src/local-metadata/grl-local-metadata.c:673 msgid "Cannot resolve any of the given keys" msgstr "Tak bisa menentukan sebarang kunci yang diberikan" -#: src/local-metadata/grl-local-metadata.c:686 +#: src/local-metadata/grl-local-metadata.c:677 msgid "A GIO supported URL for images is required" msgstr "Perlu URL yang didukung GIO bagi citra" -#: src/magnatune/grl-magnatune.c:128 +#: src/magnatune/grl-magnatune.c:123 msgid "Genres" msgstr "Genre" -#: src/magnatune/grl-magnatune.c:136 +#: src/magnatune/grl-magnatune.c:131 msgid "A source for browsing music" msgstr "Sumber untuk meramban musik" -#: src/magnatune/grl-magnatune.c:428 +#: src/magnatune/grl-magnatune.c:421 #, c-format msgid "Failed to get database from magnatune: %s" msgstr "Gagal mendapat basis data dari magnatune: %s" -#: src/magnatune/grl-magnatune.c:458 +#: src/magnatune/grl-magnatune.c:451 #, c-format msgid "Failed to save database from magnatune: “%s”" msgstr "Gagal menyimpan basis data dari magnatune: “%s”" -#: src/magnatune/grl-magnatune.c:729 +#: src/magnatune/grl-magnatune.c:722 #, c-format msgid "Failed to get table from magnatune db: %s" msgstr "Gagal mendapat tabel dari db magnatune: %s" -#: src/magnatune/grl-magnatune.c:745 +#: src/magnatune/grl-magnatune.c:738 #, c-format msgid "Fail before returning media to user: %s" msgstr "Gagal sebelum mengembalikan media ke pengguna: %s" -#: src/metadata-store/grl-metadata-store.c:45 +#: src/metadata-store/grl-metadata-store.c:40 msgid "Metadata Store" msgstr "Penyimpanan Metadata" -#: src/metadata-store/grl-metadata-store.c:46 +#: src/metadata-store/grl-metadata-store.c:41 msgid "A plugin for storing extra metadata information" msgstr "Pengaya untuk menyimpan informasi metadata ekstra" -#: src/metadata-store/grl-metadata-store.c:605 -#: src/metadata-store/grl-metadata-store.c:624 -#: src/metadata-store/grl-metadata-store.c:836 +#: src/metadata-store/grl-metadata-store.c:598 +#: src/metadata-store/grl-metadata-store.c:617 +#: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" msgstr "Gagal memutakhirkan metadata: %s" -#: src/metadata-store/grl-metadata-store.c:606 +#: src/metadata-store/grl-metadata-store.c:599 msgid "specified keys are not writable" msgstr "kunci yang dinyatakan tak dapat ditulisi" -#: src/metadata-store/grl-metadata-store.c:646 +#: src/metadata-store/grl-metadata-store.c:639 msgid "Failed to update metadata" msgstr "Gagal memutakhirkan metadata" -#: src/metadata-store/grl-metadata-store.c:792 -#: src/metadata-store/grl-metadata-store.c:837 +#: src/metadata-store/grl-metadata-store.c:785 +#: src/metadata-store/grl-metadata-store.c:830 msgid "“source-id” not available" msgstr "\"source-id\" tak tersedia" -#: src/metadata-store/grl-metadata-store.c:812 +#: src/metadata-store/grl-metadata-store.c:805 msgid "Failed to resolve" msgstr "Gagal menentukan" -#: src/metadata-store/grl-metadata-store.c:949 -#: src/metadata-store/grl-metadata-store.c:986 src/raitv/grl-raitv.c:432 -#: src/shoutcast/grl-shoutcast.c:756 src/vimeo/grl-vimeo.c:547 +#: src/metadata-store/grl-metadata-store.c:942 +#: src/metadata-store/grl-metadata-store.c:979 src/raitv/grl-raitv.c:423 +#: src/shoutcast/grl-shoutcast.c:749 src/vimeo/grl-vimeo.c:540 #, c-format msgid "Failed to search: %s" msgstr "Gagal mencari: %s" @@ -346,50 +348,50 @@ msgid "A source for browsing optical media" msgstr "Sumber untuk meramban media optis" -#: src/podcasts/grl-podcasts.c:153 +#: src/podcasts/grl-podcasts.c:148 msgid "A source for browsing podcasts" msgstr "Sumber untuk meramban podcast" -#: src/podcasts/grl-podcasts.c:762 src/podcasts/grl-podcasts.c:782 +#: src/podcasts/grl-podcasts.c:759 src/podcasts/grl-podcasts.c:779 #, c-format msgid "Failed to get podcast streams: %s" msgstr "Gagal mendapat stream podcast: %s" -#: src/podcasts/grl-podcasts.c:1248 src/podcasts/grl-podcasts.c:1257 -#: src/podcasts/grl-podcasts.c:1267 +#: src/podcasts/grl-podcasts.c:1245 src/podcasts/grl-podcasts.c:1254 +#: src/podcasts/grl-podcasts.c:1264 msgid "Failed to parse content" msgstr "Gagal mengurai isi" -#: src/podcasts/grl-podcasts.c:1302 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Gagal mengurai isi podcast" -#: src/podcasts/grl-podcasts.c:1457 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Gagal mendapat informasi podcast" -#: src/podcasts/grl-podcasts.c:1497 src/podcasts/grl-podcasts.c:1517 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Gagal mendapat daftar podcast: %s" -#: src/podcasts/grl-podcasts.c:1570 src/podcasts/grl-podcasts.c:1585 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Gagal mendapat metadata stream podcast" -#: src/podcasts/grl-podcasts.c:1623 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Gagal mendapat metadata podcast" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "Tak bisa membuat wada. Hanya asupan yang diterima" -#: src/podcasts/grl-podcasts.c:1812 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "Perlu URL" -#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:78 +#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:73 msgid "Most Popular" msgstr "Paling Populer" @@ -401,213 +403,222 @@ msgid "A source for browsing and searching Rai.tv videos" msgstr "Sumber untuk meramban dan mencari video Rai.tv" -#: src/raitv/grl-raitv.c:171 +#: src/raitv/grl-raitv.c:164 msgid "All" msgstr "Semua" -#: src/raitv/grl-raitv.c:172 +#: src/raitv/grl-raitv.c:165 msgid "Black and White" msgstr "Hitam Putih" -#: src/raitv/grl-raitv.c:173 +#: src/raitv/grl-raitv.c:166 msgid "Cinema" msgstr "Bioskop" -#: src/raitv/grl-raitv.c:174 +#: src/raitv/grl-raitv.c:167 msgid "Comedians" msgstr "Komedian" -#: src/raitv/grl-raitv.c:175 +#: src/raitv/grl-raitv.c:168 msgid "Chronicle" msgstr "Chronicle" -#: src/raitv/grl-raitv.c:176 +#: src/raitv/grl-raitv.c:169 msgid "Culture" msgstr "Kebudayaan" -#: src/raitv/grl-raitv.c:177 +#: src/raitv/grl-raitv.c:170 msgid "Economy" msgstr "Ekonomi" -#: src/raitv/grl-raitv.c:178 +#: src/raitv/grl-raitv.c:171 msgid "Fiction" msgstr "Fiksi" -#: src/raitv/grl-raitv.c:179 +#: src/raitv/grl-raitv.c:172 msgid "Junior" msgstr "Junior" -#: src/raitv/grl-raitv.c:180 +#: src/raitv/grl-raitv.c:173 msgid "Investigations" msgstr "Investigasi" -#: src/raitv/grl-raitv.c:181 +#: src/raitv/grl-raitv.c:174 msgid "Interviews" msgstr "Wawancara" -#: src/raitv/grl-raitv.c:182 +#: src/raitv/grl-raitv.c:175 msgid "Music" msgstr "Musik" -#: src/raitv/grl-raitv.c:183 +#: src/raitv/grl-raitv.c:176 msgid "News" msgstr "Berita" -#: src/raitv/grl-raitv.c:184 +#: src/raitv/grl-raitv.c:177 msgid "Health" msgstr "Kesehatan" -#: src/raitv/grl-raitv.c:185 +#: src/raitv/grl-raitv.c:178 msgid "Satire" msgstr "Satir" -#: src/raitv/grl-raitv.c:187 +#: src/raitv/grl-raitv.c:180 msgid "Society" msgstr "Society" -#: src/raitv/grl-raitv.c:188 +#: src/raitv/grl-raitv.c:181 msgid "Show" msgstr "Pertunjukan" -#: src/raitv/grl-raitv.c:189 +#: src/raitv/grl-raitv.c:182 msgid "Sport" msgstr "Olah raga" -#: src/raitv/grl-raitv.c:190 +#: src/raitv/grl-raitv.c:183 msgid "History" msgstr "Sejarah" -#: src/raitv/grl-raitv.c:191 +#: src/raitv/grl-raitv.c:184 msgid "Politics" msgstr "Politik" -#: src/raitv/grl-raitv.c:192 +#: src/raitv/grl-raitv.c:185 msgid "Leisure" msgstr "Santai" -#: src/raitv/grl-raitv.c:193 +#: src/raitv/grl-raitv.c:186 msgid "Travel" msgstr "Travel" -#: src/raitv/grl-raitv.c:625 +#: src/raitv/grl-raitv.c:616 #, c-format msgid "Failed to browse: %s" msgstr "Gagal meramban: %s" -#: src/shoutcast/grl-shoutcast.c:65 +#: src/shoutcast/grl-shoutcast.c:60 msgid "A source for browsing SHOUTcast radios" msgstr "Sumber untuk meramban radio SHOUTcast" -#: src/shoutcast/grl-shoutcast.c:462 +#: src/shoutcast/grl-shoutcast.c:455 #, c-format msgid "Cannot find media %s" msgstr "Tak bisa temukan media %s" -#: src/shoutcast/grl-shoutcast.c:757 src/vimeo/grl-vimeo.c:548 +#: src/shoutcast/grl-shoutcast.c:750 src/vimeo/grl-vimeo.c:541 msgid "non-NULL search text is required" msgstr "diperlukan teks pencarian bukan NULL" -#: src/thetvdb/grl-thetvdb.c:98 +#: src/thetvdb/grl-thetvdb.c:93 msgid "A source for fetching metadata of television shows" msgstr "Suatu sumber untuk mengambil metadata pertunjukan televisi" -#: src/tmdb/grl-tmdb.c:1004 +#: src/tmdb/grl-tmdb.c:998 msgid "Remote data does not contain valid identifier" msgstr "Data remote tak memuat identifier yang valid" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Gagal mengkuiri: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Gagal mendapat media dari uri: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Kuiri kosong" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format msgid "ID “%s” is not known in this source" msgstr "ID “%s” tidak dikenal dalam sumber" +#: src/tracker3/grl-tracker-source-priv.h:47 +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "Pengaya untuk mencari isi multimedia memakai Tracker3" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "Pengaya untuk mencari isi multimedia memakai Tracker" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -msgid "Removable — %s" -msgstr "Lepas Pasang — %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Berkas lokal" - -#: src/vimeo/grl-vimeo.c:56 +#: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "Sumber untuk meramban dan mencari video Vimeo" -#: src/youtube/grl-youtube.c:60 +#: src/youtube/grl-youtube.c:55 msgid "Standard feeds" msgstr "Asupan standar" -#: src/youtube/grl-youtube.c:63 +#: src/youtube/grl-youtube.c:58 msgid "Categories" msgstr "Kategori" -#: src/youtube/grl-youtube.c:69 +#: src/youtube/grl-youtube.c:64 msgid "Top Rated" msgstr "Peringkat Top" -#: src/youtube/grl-youtube.c:72 +#: src/youtube/grl-youtube.c:67 msgid "Top Favorites" msgstr "Favorit Top" -#: src/youtube/grl-youtube.c:75 +#: src/youtube/grl-youtube.c:70 msgid "Most Viewed" msgstr "Paling Banyak Dilihat" -#: src/youtube/grl-youtube.c:81 +#: src/youtube/grl-youtube.c:76 msgid "Most Recent" msgstr "Terkini" -#: src/youtube/grl-youtube.c:84 +#: src/youtube/grl-youtube.c:79 msgid "Most Discussed" msgstr "Paling Banyak Didiskusikan" -#: src/youtube/grl-youtube.c:87 +#: src/youtube/grl-youtube.c:82 msgid "Most Linked" msgstr "Paling Banyak Ditaut" -#: src/youtube/grl-youtube.c:90 +#: src/youtube/grl-youtube.c:85 msgid "Most Responded" msgstr "Paling Banyak Direspon" -#: src/youtube/grl-youtube.c:93 +#: src/youtube/grl-youtube.c:88 msgid "Recently Featured" msgstr "Baru-baru Ini Ditonjolkan" -#: src/youtube/grl-youtube.c:96 +#: src/youtube/grl-youtube.c:91 msgid "Watch On Mobile" msgstr "Lihat Di Mobile" -#: src/youtube/grl-youtube.c:115 +#: src/youtube/grl-youtube.c:110 msgid "A source for browsing and searching YouTube videos" msgstr "Sumber untuk meramban dan mencari video YouTube" -#: src/youtube/grl-youtube.c:863 +#: src/youtube/grl-youtube.c:856 msgid "Failed to get feed" msgstr "Gagal mendapat asupan" -#: src/youtube/grl-youtube.c:1040 src/youtube/grl-youtube.c:1428 +#: src/youtube/grl-youtube.c:1033 src/youtube/grl-youtube.c:1421 #, c-format msgid "Invalid feed identifier %s" msgstr "Identifier asupan tak valid %s" + +#~ msgid "Removable — %s" +#~ msgstr "Lepas Pasang — %s" + +#~ msgid "Local files" +#~ msgstr "Berkas lokal" diff -Nru grilo-plugins-0.3.11/po/lt.po grilo-plugins-0.3.12/po/lt.po --- grilo-plugins-0.3.11/po/lt.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/lt.po 2020-09-03 05:36:44.361467800 +0000 @@ -1,14 +1,14 @@ # Lithuanian translation for grilo-plugins. # Copyright (C) 2013 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. -# Aurimas Černius , 2013, 2014, 2015, 2016, 2018. +# Aurimas Černius , 2013-2020. # msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-07-06 09:16+0000\n" -"PO-Revision-Date: 2018-07-27 22:08+0300\n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-25 22:24+0300\n" "Last-Translator: Aurimas Černius \n" "Language-Team: Lietuvių \n" "Language: lt\n" @@ -16,105 +16,101 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" -"%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Gtranslator 2.91.7\n" +"%100<10 || n%100>=20) ? 1 : 2)\n" +"X-Generator: Gtranslator 3.36.0\n" -#: src/bookmarks/grl-bookmarks.c:65 +#: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" msgstr "Žymelės" -#: src/bookmarks/grl-bookmarks.c:66 +#: src/bookmarks/grl-bookmarks.c:61 msgid "A source for organizing media bookmarks" msgstr "Šaltinis medijos žymėms tvarkyti" -#: src/bookmarks/grl-bookmarks.c:434 +#: src/bookmarks/grl-bookmarks.c:427 msgid "Failed to get bookmark metadata" msgstr "Nepavyko gauti žymelės metaduomenų" -#: src/bookmarks/grl-bookmarks.c:464 src/bookmarks/grl-bookmarks.c:481 +#: src/bookmarks/grl-bookmarks.c:457 src/bookmarks/grl-bookmarks.c:474 #, c-format msgid "Failed to find bookmarks: %s" msgstr "Nepavyko rasti gairių: %s" -#: src/bookmarks/grl-bookmarks.c:633 src/podcasts/grl-podcasts.c:826 -#: src/podcasts/grl-podcasts.c:858 src/podcasts/grl-podcasts.c:890 +#: src/bookmarks/grl-bookmarks.c:626 src/podcasts/grl-podcasts.c:823 +#: src/podcasts/grl-podcasts.c:855 src/podcasts/grl-podcasts.c:887 #, c-format msgid "Failed to remove: %s" msgstr "Nepavyko pašalinti: %s" -#: src/bookmarks/grl-bookmarks.c:773 src/podcasts/grl-podcasts.c:931 -#: src/podcasts/grl-podcasts.c:964 src/podcasts/grl-podcasts.c:1811 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Nepavyko įrašyti: %s" -#: src/bookmarks/grl-bookmarks.c:847 src/bookmarks/grl-bookmarks.c:882 -#: src/bookmarks/grl-bookmarks.c:913 src/bookmarks/grl-bookmarks.c:971 -#: src/metadata-store/grl-metadata-store.c:881 src/podcasts/grl-podcasts.c:1667 -#: src/podcasts/grl-podcasts.c:1711 src/podcasts/grl-podcasts.c:1745 -#: src/podcasts/grl-podcasts.c:1780 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Nėra duomenų bazės ryšio" -#: src/chromaprint/grl-chromaprint.c:46 +#: src/chromaprint/grl-chromaprint.c:41 msgid "A plugin to get metadata using gstreamer framework" msgstr "Įskiepis metaduomenims gauti naudojant gstreamer karkasą" #: src/dleyna/grl-dleyna-source.c:34 #, c-format -#| msgid "A source for browsing the DLNA server '%s'" msgid "A source for browsing the DLNA server “%s”" msgstr "Šaltinis DLNA serveriui „%s“ naršyti" -#: src/dleyna/grl-dleyna-source.c:278 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "Atnaujinti nepavyko, paskirties šaltinis sunaikintas" -#: src/dleyna/grl-dleyna-source.c:380 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format -#| msgid "Upload failed, '%s', transferred %lu of %lu bytes" msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "Nusiųsti nepavyko, „%s“, perduota %lu baitų iš %lu" -#: src/dleyna/grl-dleyna-source.c:885 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "Nepavyko gauti elemento savybių (BrowseObjects klaida %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1524 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "Nesiųsti nepavyko, URL trūksta perduodamo daugialypės terpės objekto" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format -#| msgid "A source for browsing the DAAP server '%s'" msgid "A source for browsing the DAAP server “%s”" msgstr "Šaltinis DAAP serveriui „%s“ naršyti" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:795 -#: src/magnatune/grl-magnatune.c:127 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 +#: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Albumai" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:784 -#: src/magnatune/grl-magnatune.c:126 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 +#: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Atlikėjai" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1122 -#: src/jamendo/grl-jamendo.c:1233 src/magnatune/grl-magnatune.c:873 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 +#: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Netinkamas konteinerio identifikatorius %s" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format -#| msgid "A source for browsing the DPAP server '%s'" msgid "A source for browsing the DPAP server “%s”" msgstr "Šaltinis DPAP serveriui „%s“ naršyti" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Nuotraukos" @@ -126,31 +122,29 @@ msgid "A source for browsing the filesystem" msgstr "Šaltinis failų sistemai naršyti" -#: src/filesystem/grl-filesystem.c:1179 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "Failo %s nėra" -#: src/filesystem/grl-filesystem.c:1257 src/youtube/grl-youtube.c:1512 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Nepavyko gauti medijos iš %s" -#: src/flickr/grl-flickr.c:63 +#: src/flickr/grl-flickr.c:58 msgid "A source for browsing and searching Flickr photos" msgstr "Šaltinis Flickr fotografijoms naršyti ir ieškoti" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:67 +#: src/flickr/grl-flickr.c:62 #, c-format -#| msgid "%s's Flickr" msgid "%s’s Flickr" msgstr "%s Flickr" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:69 +#: src/flickr/grl-flickr.c:64 #, c-format -#| msgid "A source for browsing and searching %s's flickr photos" msgid "A source for browsing and searching %s’s flickr photos" msgstr "Šaltinis %s flickr fotografijoms naršyti ir ieškoti" @@ -206,45 +200,44 @@ msgid "Top tracks" msgstr "Populiariausi takeliai" -#: src/jamendo/grl-jamendo.c:348 src/jamendo/grl-jamendo.c:708 -#: src/shoutcast/grl-shoutcast.c:416 src/shoutcast/grl-shoutcast.c:470 +#: src/jamendo/grl-jamendo.c:341 src/jamendo/grl-jamendo.c:701 +#: src/shoutcast/grl-shoutcast.c:409 src/shoutcast/grl-shoutcast.c:463 msgid "Failed to parse response" msgstr "Nepavyko perskaityti atsako" -#: src/jamendo/grl-jamendo.c:356 src/jamendo/grl-jamendo.c:363 -#: src/podcasts/grl-podcasts.c:1368 src/shoutcast/grl-shoutcast.c:424 +#: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Tuščias atsakas" -#: src/jamendo/grl-jamendo.c:677 src/shoutcast/grl-shoutcast.c:558 +#: src/jamendo/grl-jamendo.c:670 src/shoutcast/grl-shoutcast.c:551 #, c-format msgid "Failed to connect: %s" msgstr "Nepavyko prisijungti: %s" -#: src/jamendo/grl-jamendo.c:806 +#: src/jamendo/grl-jamendo.c:799 msgid "Feeds" msgstr "Įrašai" -#: src/jamendo/grl-jamendo.c:990 src/jamendo/grl-jamendo.c:1035 -#: src/jamendo/grl-jamendo.c:1062 +#: src/jamendo/grl-jamendo.c:983 src/jamendo/grl-jamendo.c:1028 +#: src/jamendo/grl-jamendo.c:1055 #, c-format msgid "Invalid identifier %s" msgstr "Netinkamas identifikatorius %s" -#: src/jamendo/grl-jamendo.c:1049 src/youtube/grl-youtube.c:1104 -#: src/youtube/grl-youtube.c:1237 src/youtube/grl-youtube.c:1449 +#: src/jamendo/grl-jamendo.c:1042 src/youtube/grl-youtube.c:1097 +#: src/youtube/grl-youtube.c:1230 src/youtube/grl-youtube.c:1442 #, c-format msgid "Invalid category identifier %s" msgstr "Netinkamas kategorijos identifikatorius %s" -#: src/jamendo/grl-jamendo.c:1228 +#: src/jamendo/grl-jamendo.c:1221 #, c-format msgid "Failed to browse: %s is a track" msgstr "Nepavyko naršyti: %s yra takelis" -#: src/jamendo/grl-jamendo.c:1287 +#: src/jamendo/grl-jamendo.c:1280 #, c-format -#| msgid "Malformed query \"%s\"" msgid "Malformed query “%s”" msgstr "Netinkamai suformuota užklausa „%s“" @@ -256,87 +249,87 @@ msgid "A source providing locally available metadata" msgstr "Šaltinis vietoje saugomiems metaduomenims pateikti" -#: src/local-metadata/grl-local-metadata.c:388 -#: src/metadata-store/grl-metadata-store.c:791 src/raitv/grl-raitv.c:878 +#: src/local-metadata/grl-local-metadata.c:381 +#: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" msgstr "Nepavyko išspręsti: %s" -#: src/local-metadata/grl-local-metadata.c:682 +#: src/local-metadata/grl-local-metadata.c:673 msgid "Cannot resolve any of the given keys" msgstr "Nepavyko išspręsti jokių pateiktų raktų" -#: src/local-metadata/grl-local-metadata.c:686 +#: src/local-metadata/grl-local-metadata.c:677 msgid "A GIO supported URL for images is required" msgstr "Reikalingas GIO palaikomas URL paveikslėliams" -#: src/magnatune/grl-magnatune.c:128 +#: src/magnatune/grl-magnatune.c:123 msgid "Genres" msgstr "Žanrai" -#: src/magnatune/grl-magnatune.c:136 +#: src/magnatune/grl-magnatune.c:131 msgid "A source for browsing music" msgstr "Šaltinis muzikai naršyti" -#: src/magnatune/grl-magnatune.c:428 +#: src/magnatune/grl-magnatune.c:421 #, c-format msgid "Failed to get database from magnatune: %s" msgstr "Nepavyko gauti duomenų bazės iš magnatune: %s" -#: src/magnatune/grl-magnatune.c:458 +#: src/magnatune/grl-magnatune.c:451 #, c-format -#| msgid "Failed to save database from magnatune - '%s'" msgid "Failed to save database from magnatune: “%s”" msgstr "Nepavyko įrašyti duomenų bazės iš magnatune - „%s“" -#: src/magnatune/grl-magnatune.c:729 +#: src/magnatune/grl-magnatune.c:722 #, c-format msgid "Failed to get table from magnatune db: %s" msgstr "Nepavyko gauti lentelės iš magnatune db: %s" -#: src/magnatune/grl-magnatune.c:745 +#: src/magnatune/grl-magnatune.c:738 #, c-format msgid "Fail before returning media to user: %s" msgstr "Klaida prieš grąžinant mediją naudotojui: %s" -#: src/metadata-store/grl-metadata-store.c:45 +#: src/metadata-store/grl-metadata-store.c:40 msgid "Metadata Store" msgstr "Metaduomenų saugykla" -#: src/metadata-store/grl-metadata-store.c:46 +#: src/metadata-store/grl-metadata-store.c:41 msgid "A plugin for storing extra metadata information" msgstr "Įskiepis papildomiems metaduomenims saugoti" -#: src/metadata-store/grl-metadata-store.c:605 -#: src/metadata-store/grl-metadata-store.c:624 -#: src/metadata-store/grl-metadata-store.c:836 +#: src/metadata-store/grl-metadata-store.c:598 +#: src/metadata-store/grl-metadata-store.c:617 +#: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" msgstr "Nepavyko atnaujinti metaduomenų: %s" -#: src/metadata-store/grl-metadata-store.c:606 +#: src/metadata-store/grl-metadata-store.c:599 msgid "specified keys are not writable" msgstr "nurodyti raktai nėra rašomi" -#: src/metadata-store/grl-metadata-store.c:646 +#: src/metadata-store/grl-metadata-store.c:639 msgid "Failed to update metadata" msgstr "Nepavyko atnaujinti metaduomenų" -#: src/metadata-store/grl-metadata-store.c:792 -#: src/metadata-store/grl-metadata-store.c:837 -#| msgid "\"source-id\" not available" +#: src/metadata-store/grl-metadata-store.c:785 +#: src/metadata-store/grl-metadata-store.c:830 msgid "“source-id” not available" msgstr "„source-id“ neprieinamas" -#: src/metadata-store/grl-metadata-store.c:812 +#: src/metadata-store/grl-metadata-store.c:805 msgid "Failed to resolve" msgstr "Nepavyko išspręsti" -#: src/metadata-store/grl-metadata-store.c:949 -#: src/metadata-store/grl-metadata-store.c:986 src/raitv/grl-raitv.c:432 -#: src/shoutcast/grl-shoutcast.c:756 src/vimeo/grl-vimeo.c:547 +#: src/metadata-store/grl-metadata-store.c:942 +#: src/metadata-store/grl-metadata-store.c:979 src/raitv/grl-raitv.c:423 +#: src/shoutcast/grl-shoutcast.c:749 src/vimeo/grl-vimeo.c:540 #, c-format msgid "Failed to search: %s" msgstr "Nepavyko ieškoti: %s" @@ -357,50 +350,50 @@ msgid "A source for browsing optical media" msgstr "Šaltinis optinei medijai naršyti" -#: src/podcasts/grl-podcasts.c:153 +#: src/podcasts/grl-podcasts.c:148 msgid "A source for browsing podcasts" msgstr "Šaltinis tinklalaidėms naršyti" -#: src/podcasts/grl-podcasts.c:762 src/podcasts/grl-podcasts.c:782 +#: src/podcasts/grl-podcasts.c:759 src/podcasts/grl-podcasts.c:779 #, c-format msgid "Failed to get podcast streams: %s" msgstr "Nepavyko gauti tinklalaidžių srautų: %s" -#: src/podcasts/grl-podcasts.c:1248 src/podcasts/grl-podcasts.c:1257 -#: src/podcasts/grl-podcasts.c:1267 +#: src/podcasts/grl-podcasts.c:1245 src/podcasts/grl-podcasts.c:1254 +#: src/podcasts/grl-podcasts.c:1264 msgid "Failed to parse content" msgstr "Nepavyko perskaityti turinio" -#: src/podcasts/grl-podcasts.c:1302 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Nepavyko perskaityti tinklalaidės turinio" -#: src/podcasts/grl-podcasts.c:1457 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Nepavyko gauti tinklalaidės informacijos" -#: src/podcasts/grl-podcasts.c:1497 src/podcasts/grl-podcasts.c:1517 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Nepavyko gauti tinklalaidžių sąrašo: %s" -#: src/podcasts/grl-podcasts.c:1570 src/podcasts/grl-podcasts.c:1585 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Nepavyko gauti tinklalaidės srauto metaduomenų" -#: src/podcasts/grl-podcasts.c:1623 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Nepavyko gauti tinklalaidės metaduomenų" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "Nepavyko sukurti konteinerių. Priimami tik įrašai" -#: src/podcasts/grl-podcasts.c:1812 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "Būtinas URL" -#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:78 +#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:73 msgid "Most Popular" msgstr "Populiariausi" @@ -412,219 +405,228 @@ msgid "A source for browsing and searching Rai.tv videos" msgstr "Šaltinis Rai.tv filmams naršyti ir ieškoti" -#: src/raitv/grl-raitv.c:171 +#: src/raitv/grl-raitv.c:164 msgid "All" msgstr "Visi" -#: src/raitv/grl-raitv.c:172 +#: src/raitv/grl-raitv.c:165 msgid "Black and White" msgstr "Juodai-balti" -#: src/raitv/grl-raitv.c:173 +#: src/raitv/grl-raitv.c:166 msgid "Cinema" msgstr "Kino filmai" -#: src/raitv/grl-raitv.c:174 +#: src/raitv/grl-raitv.c:167 msgid "Comedians" msgstr "Komedijos" -#: src/raitv/grl-raitv.c:175 +#: src/raitv/grl-raitv.c:168 msgid "Chronicle" msgstr "Kronikos" -#: src/raitv/grl-raitv.c:176 +#: src/raitv/grl-raitv.c:169 msgid "Culture" msgstr "Kultūra" -#: src/raitv/grl-raitv.c:177 +#: src/raitv/grl-raitv.c:170 msgid "Economy" msgstr "Ekonomika" -#: src/raitv/grl-raitv.c:178 +#: src/raitv/grl-raitv.c:171 msgid "Fiction" msgstr "Fantastika" -#: src/raitv/grl-raitv.c:179 +#: src/raitv/grl-raitv.c:172 msgid "Junior" msgstr "Vaikams" -#: src/raitv/grl-raitv.c:180 +#: src/raitv/grl-raitv.c:173 msgid "Investigations" msgstr "Detektyvai" -#: src/raitv/grl-raitv.c:181 +#: src/raitv/grl-raitv.c:174 msgid "Interviews" msgstr "Interviu" -#: src/raitv/grl-raitv.c:182 +#: src/raitv/grl-raitv.c:175 msgid "Music" msgstr "Muzika" -#: src/raitv/grl-raitv.c:183 +#: src/raitv/grl-raitv.c:176 msgid "News" msgstr "Naujienos" -#: src/raitv/grl-raitv.c:184 +#: src/raitv/grl-raitv.c:177 msgid "Health" msgstr "Sveikata" -#: src/raitv/grl-raitv.c:185 +#: src/raitv/grl-raitv.c:178 msgid "Satire" msgstr "Satyra" -#: src/raitv/grl-raitv.c:187 +#: src/raitv/grl-raitv.c:180 msgid "Society" msgstr "Visuomenė" -#: src/raitv/grl-raitv.c:188 +#: src/raitv/grl-raitv.c:181 msgid "Show" msgstr "Šou" -#: src/raitv/grl-raitv.c:189 +#: src/raitv/grl-raitv.c:182 msgid "Sport" msgstr "Sportas" -#: src/raitv/grl-raitv.c:190 +#: src/raitv/grl-raitv.c:183 msgid "History" msgstr "Istorija" -#: src/raitv/grl-raitv.c:191 +#: src/raitv/grl-raitv.c:184 msgid "Politics" msgstr "Politika" -#: src/raitv/grl-raitv.c:192 +#: src/raitv/grl-raitv.c:185 msgid "Leisure" msgstr "Laisvalaikis" -#: src/raitv/grl-raitv.c:193 +#: src/raitv/grl-raitv.c:186 msgid "Travel" msgstr "Kelionės" -#: src/raitv/grl-raitv.c:625 +#: src/raitv/grl-raitv.c:616 #, c-format msgid "Failed to browse: %s" msgstr "Nepavyko naršyti: %s" -#: src/shoutcast/grl-shoutcast.c:65 +#: src/shoutcast/grl-shoutcast.c:60 msgid "A source for browsing SHOUTcast radios" msgstr "Šaltinis SHOUTcast radijo sotims naršyti" -#: src/shoutcast/grl-shoutcast.c:462 +#: src/shoutcast/grl-shoutcast.c:455 #, c-format msgid "Cannot find media %s" msgstr "Nepavyko rasti medijos %s" -#: src/shoutcast/grl-shoutcast.c:757 src/vimeo/grl-vimeo.c:548 +#: src/shoutcast/grl-shoutcast.c:750 src/vimeo/grl-vimeo.c:541 msgid "non-NULL search text is required" msgstr "Reikalingas ne NULL paieškos tekstas" -#: src/thetvdb/grl-thetvdb.c:98 +#: src/thetvdb/grl-thetvdb.c:93 msgid "A source for fetching metadata of television shows" msgstr "Šaltinis televizijos laidų metaduomenims gauti" -#: src/tmdb/grl-tmdb.c:1004 +#: src/tmdb/grl-tmdb.c:998 msgid "Remote data does not contain valid identifier" msgstr "Nutolę duomenys neturi tinkamo identifikatoriaus" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Nepavyko užklausti: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Nepavyko gauti medijos iš uri: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Tuščia užklausa" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format -#| msgid "ID '%s' is not known in this source" msgid "ID “%s” is not known in this source" msgstr "Šiame šaltinyje ID „%s“ nėra žinomas" +#: src/tracker3/grl-tracker-source-priv.h:47 +#| msgid "A plugin for searching multimedia content using Tracker" +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "Įskiepis daugialypės terpės turinio paieškai naudojant Tracker3" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "Įskiepis daugialypės terpės turinio paieškai naudojant Tracker" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -#| msgid "Removable - %s" -msgid "Removable — %s" -msgstr "Išimama laikmena – %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Vietiniai failai" - -#: src/vimeo/grl-vimeo.c:56 +#: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "Šaltinis Vimeo filmams naršyti ir ieškoti" -#: src/youtube/grl-youtube.c:60 +#: src/youtube/grl-youtube.c:55 msgid "Standard feeds" msgstr "Standartiniai įrašai" -#: src/youtube/grl-youtube.c:63 +#: src/youtube/grl-youtube.c:58 msgid "Categories" msgstr "Kategorijos" -#: src/youtube/grl-youtube.c:69 +#: src/youtube/grl-youtube.c:64 msgid "Top Rated" msgstr "Geriausiai įvertinti" -#: src/youtube/grl-youtube.c:72 +#: src/youtube/grl-youtube.c:67 msgid "Top Favorites" msgstr "Labiausiai mėgstami" -#: src/youtube/grl-youtube.c:75 +#: src/youtube/grl-youtube.c:70 msgid "Most Viewed" msgstr "Dažniausiai žiūrimi" -#: src/youtube/grl-youtube.c:81 +#: src/youtube/grl-youtube.c:76 msgid "Most Recent" msgstr "Naujausi" -#: src/youtube/grl-youtube.c:84 +#: src/youtube/grl-youtube.c:79 msgid "Most Discussed" msgstr "Daugiausiai aptariami" -#: src/youtube/grl-youtube.c:87 +#: src/youtube/grl-youtube.c:82 msgid "Most Linked" msgstr "Daugiausiai saistomi" -#: src/youtube/grl-youtube.c:90 +#: src/youtube/grl-youtube.c:85 msgid "Most Responded" msgstr "Daugiausiai atsakymų" -#: src/youtube/grl-youtube.c:93 +#: src/youtube/grl-youtube.c:88 msgid "Recently Featured" msgstr "Neseniai pasirodę" -#: src/youtube/grl-youtube.c:96 +#: src/youtube/grl-youtube.c:91 msgid "Watch On Mobile" msgstr "Žiūrėti mobiliame įrenginyje" -#: src/youtube/grl-youtube.c:115 +#: src/youtube/grl-youtube.c:110 msgid "A source for browsing and searching YouTube videos" msgstr "Šaltinis YouTube filmams naršyti ir ieškoti" -#: src/youtube/grl-youtube.c:863 +#: src/youtube/grl-youtube.c:856 msgid "Failed to get feed" msgstr "Nepavyko gauti įrašo" -#: src/youtube/grl-youtube.c:1040 src/youtube/grl-youtube.c:1428 +#: src/youtube/grl-youtube.c:1033 src/youtube/grl-youtube.c:1421 #, c-format msgid "Invalid feed identifier %s" msgstr "Netinkamas įrašo identifikatorius %s" +#~| msgid "Removable - %s" +#~ msgid "Removable — %s" +#~ msgstr "Išimama laikmena – %s" + +#~ msgid "Local files" +#~ msgstr "Vietiniai failai" + #~ msgid "Album art Provider from Last.FM" #~ msgstr "Albumų viršelių tiekėjas iš Last.FM" diff -Nru grilo-plugins-0.3.11/po/nl.po grilo-plugins-0.3.12/po/nl.po --- grilo-plugins-0.3.11/po/nl.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/nl.po 2020-09-03 05:36:44.362468000 +0000 @@ -1,15 +1,15 @@ # Dutch translation for grilo-plugins. # Copyright (C) 2016 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. -# Nathan Follens , 2016, 2019. +# Nathan Follens , 2016, 2019-2020. # Justin van Steijn , 2016. # msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-08-01 17:25+0000\n" -"PO-Revision-Date: 2019-02-24 12:47+0100\n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-25 15:20+0200\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch \n" "Language: nl\n" @@ -17,7 +17,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.2.1\n" +"X-Generator: Poedit 2.4.1\n" #: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" @@ -42,17 +42,17 @@ msgid "Failed to remove: %s" msgstr "Verwijderen mislukt: %s" -#: src/bookmarks/grl-bookmarks.c:766 src/podcasts/grl-podcasts.c:928 -#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1806 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Opslaan mislukt: %s" -#: src/bookmarks/grl-bookmarks.c:840 src/bookmarks/grl-bookmarks.c:875 -#: src/bookmarks/grl-bookmarks.c:906 src/bookmarks/grl-bookmarks.c:964 -#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1662 -#: src/podcasts/grl-podcasts.c:1706 src/podcasts/grl-podcasts.c:1740 -#: src/podcasts/grl-podcasts.c:1775 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Geen databaseverbinding" @@ -67,52 +67,52 @@ msgid "A source for browsing the DLNA server “%s”" msgstr "Een bron voor het doorbladeren van de DLNA-server ‘%s’" -#: src/dleyna/grl-dleyna-source.c:273 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "Uploaden mislukt, doelbron vernietigd" -#: src/dleyna/grl-dleyna-source.c:375 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "Uploaden mislukt, ‘%s’, %lu van %lu bytes overgedragen" -#: src/dleyna/grl-dleyna-source.c:880 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "Ophalen van item-eigenschappen mislukt (BrowseObjects-fout %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1519 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "Uploaden mislukt, URL ontbreekt op het over te dragen media-object" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format msgid "A source for browsing the DAAP server “%s”" msgstr "Een bron voor het doorbladeren van de DAAP-server ‘%s’" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:788 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 #: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Albums" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:777 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 #: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Artiesten" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1115 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 #: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Ongeldige container-identificatie %s" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format msgid "A source for browsing the DPAP server “%s”" msgstr "Een bron voor het doorbladeren van de DPAP-server ‘%s’" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Foto's" @@ -124,12 +124,12 @@ msgid "A source for browsing the filesystem" msgstr "Een bron voor het doorbladeren van het bestandssysteem" -#: src/filesystem/grl-filesystem.c:1170 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "Bestand %s bestaat niet" -#: src/filesystem/grl-filesystem.c:1248 src/youtube/grl-youtube.c:1505 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Kan media van %s niet opvragen" @@ -208,7 +208,7 @@ msgstr "Verwerken van antwoord mislukt" #: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 -#: src/podcasts/grl-podcasts.c:1363 src/shoutcast/grl-shoutcast.c:417 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Leeg antwoord" @@ -253,6 +253,7 @@ #: src/local-metadata/grl-local-metadata.c:381 #: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" @@ -305,6 +306,7 @@ #: src/metadata-store/grl-metadata-store.c:598 #: src/metadata-store/grl-metadata-store.c:617 #: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" @@ -364,32 +366,32 @@ msgid "Failed to parse content" msgstr "Verwerken van inhoud mislukt" -#: src/podcasts/grl-podcasts.c:1297 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Verwerken van podcast-inhoud mislukt" -#: src/podcasts/grl-podcasts.c:1452 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Opvragen van podcast-informatie mislukt" -#: src/podcasts/grl-podcasts.c:1492 src/podcasts/grl-podcasts.c:1512 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Opvragen van podcast-lijst mislukt: %s" -#: src/podcasts/grl-podcasts.c:1565 src/podcasts/grl-podcasts.c:1580 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Opvragen van podcast-stream-metadata mislukt" -#: src/podcasts/grl-podcasts.c:1618 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Opvragen van podcast-metadata mislukt" -#: src/podcasts/grl-podcasts.c:1802 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "Kan geen containers aanmaken. Enkel feeds worden aanvaard" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "URL vereist" @@ -520,41 +522,44 @@ msgstr "Gegevens op afstand bevatten geen geldige identificatie" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Zoekopdracht mislukt: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Opvragen van media van URI mislukt: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Lege zoekopdracht" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format msgid "ID “%s” is not known in this source" msgstr "ID ‘%s’ is niet bekend in deze bron" +#: src/tracker3/grl-tracker-source-priv.h:47 +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "Een plug-in voor het doorzoeken van multimedia-materiaal met Tracker3" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "Een plug-in voor het doorzoeken van multimedia-materiaal met Tracker" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -msgid "Removable — %s" -msgstr "Verwijderbaar — %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Lokale bestanden" - #: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "Een bron voor het doorbladeren en zoeken van Vimeo-filmpjes" @@ -615,3 +620,9 @@ #, c-format msgid "Invalid feed identifier %s" msgstr "Ongeldige feed-identificatie %s" + +#~ msgid "Removable — %s" +#~ msgstr "Verwijderbaar — %s" + +#~ msgid "Local files" +#~ msgstr "Lokale bestanden" diff -Nru grilo-plugins-0.3.11/po/pl.po grilo-plugins-0.3.12/po/pl.po --- grilo-plugins-0.3.11/po/pl.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/pl.po 2020-09-03 05:36:44.362468000 +0000 @@ -1,15 +1,15 @@ # Polish translation for grilo-plugins. -# Copyright © 2013-2018 the grilo-plugins authors. +# Copyright © 2013-2020 the grilo-plugins authors. # This file is distributed under the same license as the grilo-plugins package. -# Piotr Drąg , 2013-2018. -# Aviary.pl , 2013-2018. +# Piotr Drąg , 2013-2020. +# Aviary.pl , 2013-2020. # msgid "" msgstr "" "Project-Id-Version: grilo-plugins\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-07-06 09:16+0000\n" -"PO-Revision-Date: 2018-07-06 15:55+0200\n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-29 11:08+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" @@ -19,44 +19,44 @@ "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -#: src/bookmarks/grl-bookmarks.c:65 +#: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" msgstr "Zakładki" -#: src/bookmarks/grl-bookmarks.c:66 +#: src/bookmarks/grl-bookmarks.c:61 msgid "A source for organizing media bookmarks" msgstr "Źródło do organizowania zakładek multimediów" -#: src/bookmarks/grl-bookmarks.c:434 +#: src/bookmarks/grl-bookmarks.c:427 msgid "Failed to get bookmark metadata" msgstr "Pobranie metadanych zakładki się nie powiodło" -#: src/bookmarks/grl-bookmarks.c:464 src/bookmarks/grl-bookmarks.c:481 +#: src/bookmarks/grl-bookmarks.c:457 src/bookmarks/grl-bookmarks.c:474 #, c-format msgid "Failed to find bookmarks: %s" msgstr "Odnalezienie zakładek się nie powiodło: %s" -#: src/bookmarks/grl-bookmarks.c:633 src/podcasts/grl-podcasts.c:826 -#: src/podcasts/grl-podcasts.c:858 src/podcasts/grl-podcasts.c:890 +#: src/bookmarks/grl-bookmarks.c:626 src/podcasts/grl-podcasts.c:823 +#: src/podcasts/grl-podcasts.c:855 src/podcasts/grl-podcasts.c:887 #, c-format msgid "Failed to remove: %s" msgstr "Usunięcie się nie powiodło: %s" -#: src/bookmarks/grl-bookmarks.c:773 src/podcasts/grl-podcasts.c:931 -#: src/podcasts/grl-podcasts.c:964 src/podcasts/grl-podcasts.c:1811 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Przechowanie się nie powiodło: %s" -#: src/bookmarks/grl-bookmarks.c:847 src/bookmarks/grl-bookmarks.c:882 -#: src/bookmarks/grl-bookmarks.c:913 src/bookmarks/grl-bookmarks.c:971 -#: src/metadata-store/grl-metadata-store.c:881 src/podcasts/grl-podcasts.c:1667 -#: src/podcasts/grl-podcasts.c:1711 src/podcasts/grl-podcasts.c:1745 -#: src/podcasts/grl-podcasts.c:1780 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Brak połączenia z bazą danych" -#: src/chromaprint/grl-chromaprint.c:46 +#: src/chromaprint/grl-chromaprint.c:41 msgid "A plugin to get metadata using gstreamer framework" msgstr "Wtyczka do pobierania metadanych używając biblioteki GStreamer" @@ -65,55 +65,55 @@ msgid "A source for browsing the DLNA server “%s”" msgstr "Źródło do przeglądania serwera DLNA „%s”" -#: src/dleyna/grl-dleyna-source.c:278 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "Wysłanie się nie powiodło, zniszczono źródło docelowe" -#: src/dleyna/grl-dleyna-source.c:380 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "Wysłanie się nie powiodło, „%s”, przesłano %lu z %lu B" -#: src/dleyna/grl-dleyna-source.c:885 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "" "Pobranie właściwości elementu się nie powiodło (błąd BrowseObjects %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1524 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "" "Wysłanie się nie powiodło, brak adresu URL na obiekcie multimediów do " "przesłania" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format msgid "A source for browsing the DAAP server “%s”" msgstr "Źródło do przeglądania serwera DAAP „%s”" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:795 -#: src/magnatune/grl-magnatune.c:127 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 +#: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Albumy" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:784 -#: src/magnatune/grl-magnatune.c:126 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 +#: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Wykonawcy" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1122 -#: src/jamendo/grl-jamendo.c:1233 src/magnatune/grl-magnatune.c:873 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 +#: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Nieprawidłowy identyfikator kontenera %s" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format msgid "A source for browsing the DPAP server “%s”" msgstr "Źródło do przeglądania serwera DPAP „%s”" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Zdjęcia" @@ -125,28 +125,28 @@ msgid "A source for browsing the filesystem" msgstr "Źródło do przeglądania systemu plików" -#: src/filesystem/grl-filesystem.c:1179 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "Plik %s nie istnieje" -#: src/filesystem/grl-filesystem.c:1257 src/youtube/grl-youtube.c:1512 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Nie można pobrać multimediów z %s" -#: src/flickr/grl-flickr.c:63 +#: src/flickr/grl-flickr.c:58 msgid "A source for browsing and searching Flickr photos" msgstr "Źródło do przeglądania i przeszukiwania zdjęć w serwisie Flickr" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:67 +#: src/flickr/grl-flickr.c:62 #, c-format msgid "%s’s Flickr" msgstr "Flickr użytkownika %s" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:69 +#: src/flickr/grl-flickr.c:64 #, c-format msgid "A source for browsing and searching %s’s flickr photos" msgstr "" @@ -187,7 +187,7 @@ #: src/jamendo/grl-jamendo.c:151 msgid "Tracks of the week" -msgstr "Ścieżki tygodnia" +msgstr "Utwory tygodnia" #: src/jamendo/grl-jamendo.c:153 msgid "New releases" @@ -203,45 +203,45 @@ #: src/jamendo/grl-jamendo.c:159 msgid "Top tracks" -msgstr "Najczęściej odsłuchiwane ścieżki" +msgstr "Najczęściej odsłuchiwane utwory" -#: src/jamendo/grl-jamendo.c:348 src/jamendo/grl-jamendo.c:708 -#: src/shoutcast/grl-shoutcast.c:416 src/shoutcast/grl-shoutcast.c:470 +#: src/jamendo/grl-jamendo.c:341 src/jamendo/grl-jamendo.c:701 +#: src/shoutcast/grl-shoutcast.c:409 src/shoutcast/grl-shoutcast.c:463 msgid "Failed to parse response" msgstr "Przetworzenie odpowiedzi się nie powiodło" -#: src/jamendo/grl-jamendo.c:356 src/jamendo/grl-jamendo.c:363 -#: src/podcasts/grl-podcasts.c:1368 src/shoutcast/grl-shoutcast.c:424 +#: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Pusta odpowiedź" -#: src/jamendo/grl-jamendo.c:677 src/shoutcast/grl-shoutcast.c:558 +#: src/jamendo/grl-jamendo.c:670 src/shoutcast/grl-shoutcast.c:551 #, c-format msgid "Failed to connect: %s" msgstr "Połączenie się nie powiodło: %s" -#: src/jamendo/grl-jamendo.c:806 +#: src/jamendo/grl-jamendo.c:799 msgid "Feeds" msgstr "Kanały" -#: src/jamendo/grl-jamendo.c:990 src/jamendo/grl-jamendo.c:1035 -#: src/jamendo/grl-jamendo.c:1062 +#: src/jamendo/grl-jamendo.c:983 src/jamendo/grl-jamendo.c:1028 +#: src/jamendo/grl-jamendo.c:1055 #, c-format msgid "Invalid identifier %s" msgstr "Nieprawidłowy identyfikator %s" -#: src/jamendo/grl-jamendo.c:1049 src/youtube/grl-youtube.c:1104 -#: src/youtube/grl-youtube.c:1237 src/youtube/grl-youtube.c:1449 +#: src/jamendo/grl-jamendo.c:1042 src/youtube/grl-youtube.c:1097 +#: src/youtube/grl-youtube.c:1230 src/youtube/grl-youtube.c:1442 #, c-format msgid "Invalid category identifier %s" msgstr "Nieprawidłowy identyfikator kategorii %s" -#: src/jamendo/grl-jamendo.c:1228 +#: src/jamendo/grl-jamendo.c:1221 #, c-format msgid "Failed to browse: %s is a track" -msgstr "Przeglądanie się nie powiodło: %s jest ścieżką" +msgstr "Przeglądanie się nie powiodło: %s jest utworem" -#: src/jamendo/grl-jamendo.c:1287 +#: src/jamendo/grl-jamendo.c:1280 #, c-format msgid "Malformed query “%s”" msgstr "Błędnie sformatowane zapytanie „%s”" @@ -254,85 +254,87 @@ msgid "A source providing locally available metadata" msgstr "Źródło dostarczające lokalnie dostępne metadane" -#: src/local-metadata/grl-local-metadata.c:388 -#: src/metadata-store/grl-metadata-store.c:791 src/raitv/grl-raitv.c:878 +#: src/local-metadata/grl-local-metadata.c:381 +#: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" msgstr "Rozwiązanie się nie powiodło: %s" -#: src/local-metadata/grl-local-metadata.c:682 +#: src/local-metadata/grl-local-metadata.c:673 msgid "Cannot resolve any of the given keys" msgstr "Nie można rozwiązać żadnego z podanych kluczy" -#: src/local-metadata/grl-local-metadata.c:686 +#: src/local-metadata/grl-local-metadata.c:677 msgid "A GIO supported URL for images is required" msgstr "Wymagany jest adres URL dla obrazów obsługiwany przez bibliotekę GIO" -#: src/magnatune/grl-magnatune.c:128 +#: src/magnatune/grl-magnatune.c:123 msgid "Genres" msgstr "Gatunki" -#: src/magnatune/grl-magnatune.c:136 +#: src/magnatune/grl-magnatune.c:131 msgid "A source for browsing music" msgstr "Źródło do przeglądania muzyki" -#: src/magnatune/grl-magnatune.c:428 +#: src/magnatune/grl-magnatune.c:421 #, c-format msgid "Failed to get database from magnatune: %s" msgstr "Pobranie bazy danych ze sklepu Magnatune się nie powiodło: %s" -#: src/magnatune/grl-magnatune.c:458 +#: src/magnatune/grl-magnatune.c:451 #, c-format msgid "Failed to save database from magnatune: “%s”" msgstr "Zapisanie bazy danych ze sklepu Magnatune się nie powiodło: „%s”" -#: src/magnatune/grl-magnatune.c:729 +#: src/magnatune/grl-magnatune.c:722 #, c-format msgid "Failed to get table from magnatune db: %s" msgstr "Pobranie tablicy z bazy danych sklepu Magnatune się nie powiodło: %s" -#: src/magnatune/grl-magnatune.c:745 +#: src/magnatune/grl-magnatune.c:738 #, c-format msgid "Fail before returning media to user: %s" msgstr "Niepowodzenie przed zwróceniem multimediów do użytkownika: %s" -#: src/metadata-store/grl-metadata-store.c:45 +#: src/metadata-store/grl-metadata-store.c:40 msgid "Metadata Store" msgstr "Przechowalnia metadanych" -#: src/metadata-store/grl-metadata-store.c:46 +#: src/metadata-store/grl-metadata-store.c:41 msgid "A plugin for storing extra metadata information" msgstr "Wtyczka do przechowywania dodatkowych informacji o metadanych" -#: src/metadata-store/grl-metadata-store.c:605 -#: src/metadata-store/grl-metadata-store.c:624 -#: src/metadata-store/grl-metadata-store.c:836 +#: src/metadata-store/grl-metadata-store.c:598 +#: src/metadata-store/grl-metadata-store.c:617 +#: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" msgstr "Zaktualizowanie metadanych się nie powiodło: %s" -#: src/metadata-store/grl-metadata-store.c:606 +#: src/metadata-store/grl-metadata-store.c:599 msgid "specified keys are not writable" msgstr "podane klucze nie są zapisywalne" -#: src/metadata-store/grl-metadata-store.c:646 +#: src/metadata-store/grl-metadata-store.c:639 msgid "Failed to update metadata" msgstr "Zaktualizowanie metadanych się nie powiodło" -#: src/metadata-store/grl-metadata-store.c:792 -#: src/metadata-store/grl-metadata-store.c:837 +#: src/metadata-store/grl-metadata-store.c:785 +#: src/metadata-store/grl-metadata-store.c:830 msgid "“source-id” not available" msgstr "„source-id” jest niedostępne" -#: src/metadata-store/grl-metadata-store.c:812 +#: src/metadata-store/grl-metadata-store.c:805 msgid "Failed to resolve" msgstr "Rozwiązanie się nie powiodło" -#: src/metadata-store/grl-metadata-store.c:949 -#: src/metadata-store/grl-metadata-store.c:986 src/raitv/grl-raitv.c:432 -#: src/shoutcast/grl-shoutcast.c:756 src/vimeo/grl-vimeo.c:547 +#: src/metadata-store/grl-metadata-store.c:942 +#: src/metadata-store/grl-metadata-store.c:979 src/raitv/grl-raitv.c:423 +#: src/shoutcast/grl-shoutcast.c:749 src/vimeo/grl-vimeo.c:540 #, c-format msgid "Failed to search: %s" msgstr "Wyszukanie się nie powiodło: %s" @@ -353,50 +355,50 @@ msgid "A source for browsing optical media" msgstr "Źródło do przeglądania nośników optycznych" -#: src/podcasts/grl-podcasts.c:153 +#: src/podcasts/grl-podcasts.c:148 msgid "A source for browsing podcasts" msgstr "Źródło do przeglądania podcastów" -#: src/podcasts/grl-podcasts.c:762 src/podcasts/grl-podcasts.c:782 +#: src/podcasts/grl-podcasts.c:759 src/podcasts/grl-podcasts.c:779 #, c-format msgid "Failed to get podcast streams: %s" msgstr "Pobranie strumieni podcastu się nie powiodło: %s" -#: src/podcasts/grl-podcasts.c:1248 src/podcasts/grl-podcasts.c:1257 -#: src/podcasts/grl-podcasts.c:1267 +#: src/podcasts/grl-podcasts.c:1245 src/podcasts/grl-podcasts.c:1254 +#: src/podcasts/grl-podcasts.c:1264 msgid "Failed to parse content" msgstr "Przetworzenie treści się nie powiodło" -#: src/podcasts/grl-podcasts.c:1302 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Przetworzenie treści podcastu się nie powiodło" -#: src/podcasts/grl-podcasts.c:1457 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Pobranie informacji o podcaście się nie powiodło" -#: src/podcasts/grl-podcasts.c:1497 src/podcasts/grl-podcasts.c:1517 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Pobranie listy podcastów się nie powiodło: %s" -#: src/podcasts/grl-podcasts.c:1570 src/podcasts/grl-podcasts.c:1585 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Pobranie metadanych strumienia podcastu się nie powiodło" -#: src/podcasts/grl-podcasts.c:1623 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Pobranie metadanych podcastu się nie powiodło" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" -msgstr "Nie można utworzyć kontenerów. Tylko kanały są akceptowane" +msgstr "Nie można utworzyć kontenerów. Tylko kanały są przyjmowane" -#: src/podcasts/grl-podcasts.c:1812 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "Wymagany jest adres URL" -#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:78 +#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:73 msgid "Most Popular" msgstr "Najpopularniejsze" @@ -408,215 +410,219 @@ msgid "A source for browsing and searching Rai.tv videos" msgstr "Źródło do przeglądania i przeszukiwania nagrań wideo w serwisie Rai.tv" -#: src/raitv/grl-raitv.c:171 +#: src/raitv/grl-raitv.c:164 msgid "All" msgstr "Wszystko" -#: src/raitv/grl-raitv.c:172 +#: src/raitv/grl-raitv.c:165 msgid "Black and White" msgstr "Czarno-białe" -#: src/raitv/grl-raitv.c:173 +#: src/raitv/grl-raitv.c:166 msgid "Cinema" msgstr "Kino" -#: src/raitv/grl-raitv.c:174 +#: src/raitv/grl-raitv.c:167 msgid "Comedians" msgstr "Stand-up i kabarety" -#: src/raitv/grl-raitv.c:175 +#: src/raitv/grl-raitv.c:168 msgid "Chronicle" msgstr "Kronika" -#: src/raitv/grl-raitv.c:176 +#: src/raitv/grl-raitv.c:169 msgid "Culture" msgstr "Kultura" -#: src/raitv/grl-raitv.c:177 +#: src/raitv/grl-raitv.c:170 msgid "Economy" msgstr "Ekonomia" -#: src/raitv/grl-raitv.c:178 +#: src/raitv/grl-raitv.c:171 msgid "Fiction" msgstr "Fikcja" -#: src/raitv/grl-raitv.c:179 +#: src/raitv/grl-raitv.c:172 msgid "Junior" msgstr "Dla dzieci" -#: src/raitv/grl-raitv.c:180 +#: src/raitv/grl-raitv.c:173 msgid "Investigations" msgstr "Śledztwa" -#: src/raitv/grl-raitv.c:181 +#: src/raitv/grl-raitv.c:174 msgid "Interviews" msgstr "Wywiady" -#: src/raitv/grl-raitv.c:182 +#: src/raitv/grl-raitv.c:175 msgid "Music" msgstr "Muzyka" -#: src/raitv/grl-raitv.c:183 +#: src/raitv/grl-raitv.c:176 msgid "News" msgstr "Wiadomości" -#: src/raitv/grl-raitv.c:184 +#: src/raitv/grl-raitv.c:177 msgid "Health" msgstr "Zdrowie" -#: src/raitv/grl-raitv.c:185 +#: src/raitv/grl-raitv.c:178 msgid "Satire" msgstr "Satyra" -#: src/raitv/grl-raitv.c:187 +#: src/raitv/grl-raitv.c:180 msgid "Society" msgstr "Społeczeństwo" -#: src/raitv/grl-raitv.c:188 +#: src/raitv/grl-raitv.c:181 msgid "Show" msgstr "Seriale" -#: src/raitv/grl-raitv.c:189 +#: src/raitv/grl-raitv.c:182 msgid "Sport" msgstr "Sport" -#: src/raitv/grl-raitv.c:190 +#: src/raitv/grl-raitv.c:183 msgid "History" msgstr "Historia" -#: src/raitv/grl-raitv.c:191 +#: src/raitv/grl-raitv.c:184 msgid "Politics" msgstr "Polityka" -#: src/raitv/grl-raitv.c:192 +#: src/raitv/grl-raitv.c:185 msgid "Leisure" msgstr "Wypoczynek" -#: src/raitv/grl-raitv.c:193 +#: src/raitv/grl-raitv.c:186 msgid "Travel" msgstr "Podróże" -#: src/raitv/grl-raitv.c:625 +#: src/raitv/grl-raitv.c:616 #, c-format msgid "Failed to browse: %s" msgstr "Przeglądanie się nie powiodło: %s" -#: src/shoutcast/grl-shoutcast.c:65 +#: src/shoutcast/grl-shoutcast.c:60 msgid "A source for browsing SHOUTcast radios" msgstr "Źródło do przeglądania stacji radiowych SHOUTcast" -#: src/shoutcast/grl-shoutcast.c:462 +#: src/shoutcast/grl-shoutcast.c:455 #, c-format msgid "Cannot find media %s" msgstr "Nie można odnaleźć multimediów %s" -#: src/shoutcast/grl-shoutcast.c:757 src/vimeo/grl-vimeo.c:548 +#: src/shoutcast/grl-shoutcast.c:750 src/vimeo/grl-vimeo.c:541 msgid "non-NULL search text is required" msgstr "Wymagany jest niepusty wyszukiwany tekst" -#: src/thetvdb/grl-thetvdb.c:98 +#: src/thetvdb/grl-thetvdb.c:93 msgid "A source for fetching metadata of television shows" msgstr "Źródło do pobierania metadanych programów telewizyjnych" -#: src/tmdb/grl-tmdb.c:1004 +#: src/tmdb/grl-tmdb.c:998 msgid "Remote data does not contain valid identifier" msgstr "Zdalne dane nie zawierają prawidłowego identyfikatora" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Odpytanie się nie powiodło: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Pobranie multimediów z adresu URI się nie powiodło: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Puste zapytanie" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format msgid "ID “%s” is not known in this source" msgstr "Identyfikator „%s” nie jest znany w tym źródle" +#: src/tracker3/grl-tracker-source-priv.h:47 +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "" +"Wtyczka do przeszukiwania treści multimedialnych używając usługi Tracker 3" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "" -"Wtyczka do przeszukiwania treści multimedialnych używając programu Tracker" - -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -msgid "Removable — %s" -msgstr "Wymienne — %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Lokalne pliki" +"Wtyczka do przeszukiwania treści multimedialnych używając usługi Tracker" -#: src/vimeo/grl-vimeo.c:56 +#: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "Źródło do przeglądania i przeszukiwania nagrań wideo w serwisie Vimeo" -#: src/youtube/grl-youtube.c:60 +#: src/youtube/grl-youtube.c:55 msgid "Standard feeds" msgstr "Standardowe kanały" -#: src/youtube/grl-youtube.c:63 +#: src/youtube/grl-youtube.c:58 msgid "Categories" msgstr "Kategorie" -#: src/youtube/grl-youtube.c:69 +#: src/youtube/grl-youtube.c:64 msgid "Top Rated" msgstr "Najwyżej oceniane" -#: src/youtube/grl-youtube.c:72 +#: src/youtube/grl-youtube.c:67 msgid "Top Favorites" msgstr "Najczęściej dodawane do ulubionych" -#: src/youtube/grl-youtube.c:75 +#: src/youtube/grl-youtube.c:70 msgid "Most Viewed" msgstr "Najczęściej oglądane" -#: src/youtube/grl-youtube.c:81 +#: src/youtube/grl-youtube.c:76 msgid "Most Recent" msgstr "Najnowsze" -#: src/youtube/grl-youtube.c:84 +#: src/youtube/grl-youtube.c:79 msgid "Most Discussed" msgstr "Najbardziej dyskutowane" -#: src/youtube/grl-youtube.c:87 +#: src/youtube/grl-youtube.c:82 msgid "Most Linked" msgstr "Najczęściej umieszczane na innych stronach" -#: src/youtube/grl-youtube.c:90 +#: src/youtube/grl-youtube.c:85 msgid "Most Responded" msgstr "Z największą liczbą odpowiedzi" -#: src/youtube/grl-youtube.c:93 +#: src/youtube/grl-youtube.c:88 msgid "Recently Featured" msgstr "Ostatnio promowane" -#: src/youtube/grl-youtube.c:96 +#: src/youtube/grl-youtube.c:91 msgid "Watch On Mobile" -msgstr "Oglądaj na telefonie komórkowym" +msgstr "Oglądaj na telefonie" -#: src/youtube/grl-youtube.c:115 +#: src/youtube/grl-youtube.c:110 msgid "A source for browsing and searching YouTube videos" msgstr "" "Źródło do przeglądania i przeszukiwania nagrań wideo w serwisie YouTube" -#: src/youtube/grl-youtube.c:863 +#: src/youtube/grl-youtube.c:856 msgid "Failed to get feed" msgstr "Pobranie kanału się nie powiodło" -#: src/youtube/grl-youtube.c:1040 src/youtube/grl-youtube.c:1428 +#: src/youtube/grl-youtube.c:1033 src/youtube/grl-youtube.c:1421 #, c-format msgid "Invalid feed identifier %s" msgstr "Nieprawidłowy identyfikator kanału %s" diff -Nru grilo-plugins-0.3.11/po/POTFILES.in grilo-plugins-0.3.12/po/POTFILES.in --- grilo-plugins-0.3.11/po/POTFILES.in 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/POTFILES.in 2020-09-03 05:36:44.358468000 +0000 @@ -20,6 +20,10 @@ src/shoutcast/grl-shoutcast.c src/thetvdb/grl-thetvdb.c src/tmdb/grl-tmdb.c +src/tracker3/grl-tracker.c +src/tracker3/grl-tracker-source-api.c +src/tracker3/grl-tracker-source-priv.h +src/tracker3/grl-tracker-utils.c src/tracker/grl-tracker.c src/tracker/grl-tracker-source-api.c src/tracker/grl-tracker-source-priv.h diff -Nru grilo-plugins-0.3.11/po/pt_BR.po grilo-plugins-0.3.12/po/pt_BR.po --- grilo-plugins-0.3.11/po/pt_BR.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/pt_BR.po 2020-09-03 05:36:44.363468000 +0000 @@ -1,63 +1,63 @@ # Brazilian Portuguese translation for grilo-plugins. -# Copyright (C) 2018 grilo-plugins's COPYRIGHT HOLDER +# Copyright (C) 2020 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. -# Rafael Fontenelle , 2013, 2014, 2018. # Enrico Nicoletto , 2013, 2014, 2016. # Bruno Lopes da Silva , 2018. +# Rafael Fontenelle , 2013-2020. # msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-07-07 08:57+0000\n" -"PO-Revision-Date: 2018-07-08 11:24-0300\n" -"Last-Translator: Bruno Lopes da Silva \n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-24 22:50-0300\n" +"Last-Translator: Rafael Fontenelle \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: Poedit 2.0.8\n" +"Plural-Forms: nplurals=2; plural=(n > 1)\n" +"X-Generator: Gtranslator 3.36.0\n" -#: src/bookmarks/grl-bookmarks.c:65 +#: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" msgstr "Marcadores" -#: src/bookmarks/grl-bookmarks.c:66 +#: src/bookmarks/grl-bookmarks.c:61 msgid "A source for organizing media bookmarks" msgstr "Uma fonte para organizar marcadores de mídia" -#: src/bookmarks/grl-bookmarks.c:434 +#: src/bookmarks/grl-bookmarks.c:427 msgid "Failed to get bookmark metadata" msgstr "Falha ao obter metadados de marcador" -#: src/bookmarks/grl-bookmarks.c:464 src/bookmarks/grl-bookmarks.c:481 +#: src/bookmarks/grl-bookmarks.c:457 src/bookmarks/grl-bookmarks.c:474 #, c-format msgid "Failed to find bookmarks: %s" msgstr "Falha ao localizar os marcadores: %s" -#: src/bookmarks/grl-bookmarks.c:633 src/podcasts/grl-podcasts.c:826 -#: src/podcasts/grl-podcasts.c:858 src/podcasts/grl-podcasts.c:890 +#: src/bookmarks/grl-bookmarks.c:626 src/podcasts/grl-podcasts.c:823 +#: src/podcasts/grl-podcasts.c:855 src/podcasts/grl-podcasts.c:887 #, c-format msgid "Failed to remove: %s" msgstr "Falha ao remover: %s" -#: src/bookmarks/grl-bookmarks.c:773 src/podcasts/grl-podcasts.c:931 -#: src/podcasts/grl-podcasts.c:964 src/podcasts/grl-podcasts.c:1811 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Falha ao armazenar: %s" -#: src/bookmarks/grl-bookmarks.c:847 src/bookmarks/grl-bookmarks.c:882 -#: src/bookmarks/grl-bookmarks.c:913 src/bookmarks/grl-bookmarks.c:971 -#: src/metadata-store/grl-metadata-store.c:881 src/podcasts/grl-podcasts.c:1667 -#: src/podcasts/grl-podcasts.c:1711 src/podcasts/grl-podcasts.c:1745 -#: src/podcasts/grl-podcasts.c:1780 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Nenhuma conexão com o banco de dados" -#: src/chromaprint/grl-chromaprint.c:46 +#: src/chromaprint/grl-chromaprint.c:41 msgid "A plugin to get metadata using gstreamer framework" msgstr "Um plug-in para obter metadados usando o framework gstreamer" @@ -66,52 +66,52 @@ msgid "A source for browsing the DLNA server “%s”" msgstr "Uma fonte para acessar o servidor DLNA “%s”" -#: src/dleyna/grl-dleyna-source.c:278 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "O envio falhou, fonte de destino destruída" -#: src/dleyna/grl-dleyna-source.c:380 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "O envio falhou, “%s”, foram transferidos %lu de %lu bytes" -#: src/dleyna/grl-dleyna-source.c:885 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "Falha ao obter propriedades do item (erro de BrowseObjects %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1524 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "Envio falhou, faltando URL no objeto de mídia a ser transferido" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format msgid "A source for browsing the DAAP server “%s”" msgstr "Uma fonte para acessar o servidor DAAP “%s”" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:795 -#: src/magnatune/grl-magnatune.c:127 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 +#: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Álbuns" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:784 -#: src/magnatune/grl-magnatune.c:126 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 +#: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Artistas" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1122 -#: src/jamendo/grl-jamendo.c:1233 src/magnatune/grl-magnatune.c:873 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 +#: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Identificador de recipiente %s inválido" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format msgid "A source for browsing the DPAP server “%s”" msgstr "Uma fonte para acessar o servidor DPAP “%s”" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Fontos" @@ -123,28 +123,28 @@ msgid "A source for browsing the filesystem" msgstr "Uma fonte para acessar o sistema de arquivos" -#: src/filesystem/grl-filesystem.c:1179 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "O arquivo %s não existe" -#: src/filesystem/grl-filesystem.c:1257 src/youtube/grl-youtube.c:1512 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Não foi possível obter a mídia de %s" -#: src/flickr/grl-flickr.c:63 +#: src/flickr/grl-flickr.c:58 msgid "A source for browsing and searching Flickr photos" msgstr "Uma fonte para acessar e pesquisar por fotos do Flickr" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:67 +#: src/flickr/grl-flickr.c:62 #, c-format msgid "%s’s Flickr" msgstr "Flickr de %s" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:69 +#: src/flickr/grl-flickr.c:64 #, c-format msgid "A source for browsing and searching %s’s flickr photos" msgstr "Uma fonte para navegar e pesquisar por fotos do Flickr de %s" @@ -201,43 +201,43 @@ msgid "Top tracks" msgstr "Faixas principais" -#: src/jamendo/grl-jamendo.c:348 src/jamendo/grl-jamendo.c:708 -#: src/shoutcast/grl-shoutcast.c:416 src/shoutcast/grl-shoutcast.c:470 +#: src/jamendo/grl-jamendo.c:341 src/jamendo/grl-jamendo.c:701 +#: src/shoutcast/grl-shoutcast.c:409 src/shoutcast/grl-shoutcast.c:463 msgid "Failed to parse response" msgstr "Falha ao analisar resposta" -#: src/jamendo/grl-jamendo.c:356 src/jamendo/grl-jamendo.c:363 -#: src/podcasts/grl-podcasts.c:1368 src/shoutcast/grl-shoutcast.c:424 +#: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Resposta vazia" -#: src/jamendo/grl-jamendo.c:677 src/shoutcast/grl-shoutcast.c:558 +#: src/jamendo/grl-jamendo.c:670 src/shoutcast/grl-shoutcast.c:551 #, c-format msgid "Failed to connect: %s" msgstr "Falha ao conectar: %s" -#: src/jamendo/grl-jamendo.c:806 +#: src/jamendo/grl-jamendo.c:799 msgid "Feeds" msgstr "Feeds" -#: src/jamendo/grl-jamendo.c:990 src/jamendo/grl-jamendo.c:1035 -#: src/jamendo/grl-jamendo.c:1062 +#: src/jamendo/grl-jamendo.c:983 src/jamendo/grl-jamendo.c:1028 +#: src/jamendo/grl-jamendo.c:1055 #, c-format msgid "Invalid identifier %s" msgstr "Identificador %s inválido" -#: src/jamendo/grl-jamendo.c:1049 src/youtube/grl-youtube.c:1104 -#: src/youtube/grl-youtube.c:1237 src/youtube/grl-youtube.c:1449 +#: src/jamendo/grl-jamendo.c:1042 src/youtube/grl-youtube.c:1097 +#: src/youtube/grl-youtube.c:1230 src/youtube/grl-youtube.c:1442 #, c-format msgid "Invalid category identifier %s" msgstr "Identificador de categoria %s inválido" -#: src/jamendo/grl-jamendo.c:1228 +#: src/jamendo/grl-jamendo.c:1221 #, c-format msgid "Failed to browse: %s is a track" msgstr "Falha ao acessar: %s é uma faixa" -#: src/jamendo/grl-jamendo.c:1287 +#: src/jamendo/grl-jamendo.c:1280 #, c-format msgid "Malformed query “%s”" msgstr "Consulta “%s” malformada" @@ -250,85 +250,87 @@ msgid "A source providing locally available metadata" msgstr "Uma fonte fornecendo metadados disponíveis localmente" -#: src/local-metadata/grl-local-metadata.c:388 -#: src/metadata-store/grl-metadata-store.c:791 src/raitv/grl-raitv.c:878 +#: src/local-metadata/grl-local-metadata.c:381 +#: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" msgstr "Falha ao resolver: %s" -#: src/local-metadata/grl-local-metadata.c:682 +#: src/local-metadata/grl-local-metadata.c:673 msgid "Cannot resolve any of the given keys" msgstr "Não foi possível resolver qualquer das chaves fornecidas" -#: src/local-metadata/grl-local-metadata.c:686 +#: src/local-metadata/grl-local-metadata.c:677 msgid "A GIO supported URL for images is required" msgstr "É necessária uma URL com suporte no GIO para imagens" -#: src/magnatune/grl-magnatune.c:128 +#: src/magnatune/grl-magnatune.c:123 msgid "Genres" msgstr "Gêneros" -#: src/magnatune/grl-magnatune.c:136 +#: src/magnatune/grl-magnatune.c:131 msgid "A source for browsing music" msgstr "Uma fonte para navegar entre músicas" -#: src/magnatune/grl-magnatune.c:428 +#: src/magnatune/grl-magnatune.c:421 #, c-format msgid "Failed to get database from magnatune: %s" msgstr "Falha ao obter base de dados de magnatune: %s" -#: src/magnatune/grl-magnatune.c:458 +#: src/magnatune/grl-magnatune.c:451 #, c-format msgid "Failed to save database from magnatune: “%s”" msgstr "Falha ao salvar base de dados do magnatune: “%s”" -#: src/magnatune/grl-magnatune.c:729 +#: src/magnatune/grl-magnatune.c:722 #, c-format msgid "Failed to get table from magnatune db: %s" msgstr "Falha ao obter tabela da base de dados magnatune: %s" -#: src/magnatune/grl-magnatune.c:745 +#: src/magnatune/grl-magnatune.c:738 #, c-format msgid "Fail before returning media to user: %s" msgstr "Falha antes de retornar mídia ao usuário: %s" -#: src/metadata-store/grl-metadata-store.c:45 +#: src/metadata-store/grl-metadata-store.c:40 msgid "Metadata Store" msgstr "Armazenamento de metadados" -#: src/metadata-store/grl-metadata-store.c:46 +#: src/metadata-store/grl-metadata-store.c:41 msgid "A plugin for storing extra metadata information" msgstr "Um plug-in para armazenar informação extra de metadados" -#: src/metadata-store/grl-metadata-store.c:605 -#: src/metadata-store/grl-metadata-store.c:624 -#: src/metadata-store/grl-metadata-store.c:836 +#: src/metadata-store/grl-metadata-store.c:598 +#: src/metadata-store/grl-metadata-store.c:617 +#: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" msgstr "Falha ao atualizar metadados: %s" -#: src/metadata-store/grl-metadata-store.c:606 +#: src/metadata-store/grl-metadata-store.c:599 msgid "specified keys are not writable" msgstr "chaves especificadas não podem ser escrita" -#: src/metadata-store/grl-metadata-store.c:646 +#: src/metadata-store/grl-metadata-store.c:639 msgid "Failed to update metadata" msgstr "Falha ao atualizar metadados" -#: src/metadata-store/grl-metadata-store.c:792 -#: src/metadata-store/grl-metadata-store.c:837 +#: src/metadata-store/grl-metadata-store.c:785 +#: src/metadata-store/grl-metadata-store.c:830 msgid "“source-id” not available" msgstr "“source-id” não disponível" -#: src/metadata-store/grl-metadata-store.c:812 +#: src/metadata-store/grl-metadata-store.c:805 msgid "Failed to resolve" msgstr "Falha ao resolver" -#: src/metadata-store/grl-metadata-store.c:949 -#: src/metadata-store/grl-metadata-store.c:986 src/raitv/grl-raitv.c:432 -#: src/shoutcast/grl-shoutcast.c:756 src/vimeo/grl-vimeo.c:547 +#: src/metadata-store/grl-metadata-store.c:942 +#: src/metadata-store/grl-metadata-store.c:979 src/raitv/grl-raitv.c:423 +#: src/shoutcast/grl-shoutcast.c:749 src/vimeo/grl-vimeo.c:540 #, c-format msgid "Failed to search: %s" msgstr "Falha ao pesquisar: %s" @@ -349,50 +351,50 @@ msgid "A source for browsing optical media" msgstr "Uma fonte para acessar mídias óticas" -#: src/podcasts/grl-podcasts.c:153 +#: src/podcasts/grl-podcasts.c:148 msgid "A source for browsing podcasts" msgstr "Uma fonte para acessar podcasts" -#: src/podcasts/grl-podcasts.c:762 src/podcasts/grl-podcasts.c:782 +#: src/podcasts/grl-podcasts.c:759 src/podcasts/grl-podcasts.c:779 #, c-format msgid "Failed to get podcast streams: %s" msgstr "Falha ao obter os fluxos do podcast: %s" -#: src/podcasts/grl-podcasts.c:1248 src/podcasts/grl-podcasts.c:1257 -#: src/podcasts/grl-podcasts.c:1267 +#: src/podcasts/grl-podcasts.c:1245 src/podcasts/grl-podcasts.c:1254 +#: src/podcasts/grl-podcasts.c:1264 msgid "Failed to parse content" msgstr "Falha ao analisar o conteúdo" -#: src/podcasts/grl-podcasts.c:1302 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Falha ao analisar o conteúdo do podcast" -#: src/podcasts/grl-podcasts.c:1457 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Falha ao obter informações do podcast" -#: src/podcasts/grl-podcasts.c:1497 src/podcasts/grl-podcasts.c:1517 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Falha ao obter a lista de podcasts: %s" -#: src/podcasts/grl-podcasts.c:1570 src/podcasts/grl-podcasts.c:1585 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Falha ao obter metadados de fluxo de podcast" -#: src/podcasts/grl-podcasts.c:1623 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Falha ao obter metadados de podcast" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "Não foi possível criar recipientes. Apenas feeds são aceitos" -#: src/podcasts/grl-podcasts.c:1812 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "URL obrigatória" -#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:78 +#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:73 msgid "Most Popular" msgstr "Mais populares" @@ -404,218 +406,228 @@ msgid "A source for browsing and searching Rai.tv videos" msgstr "Uma fonte para acessar e pesquisar por vídeos do Rai.tv" -#: src/raitv/grl-raitv.c:171 +#: src/raitv/grl-raitv.c:164 msgid "All" msgstr "Todas" -#: src/raitv/grl-raitv.c:172 +#: src/raitv/grl-raitv.c:165 msgid "Black and White" msgstr "Preto e Branco" -#: src/raitv/grl-raitv.c:173 +#: src/raitv/grl-raitv.c:166 msgid "Cinema" msgstr "Cinema" -#: src/raitv/grl-raitv.c:174 +#: src/raitv/grl-raitv.c:167 msgid "Comedians" msgstr "Comédias" -#: src/raitv/grl-raitv.c:175 +#: src/raitv/grl-raitv.c:168 msgid "Chronicle" msgstr "Crônica" -#: src/raitv/grl-raitv.c:176 +#: src/raitv/grl-raitv.c:169 msgid "Culture" msgstr "Cultura" -#: src/raitv/grl-raitv.c:177 +#: src/raitv/grl-raitv.c:170 msgid "Economy" msgstr "Econômica" -#: src/raitv/grl-raitv.c:178 +#: src/raitv/grl-raitv.c:171 msgid "Fiction" msgstr "Ficção" -#: src/raitv/grl-raitv.c:179 +#: src/raitv/grl-raitv.c:172 msgid "Junior" msgstr "Júnior" -#: src/raitv/grl-raitv.c:180 +#: src/raitv/grl-raitv.c:173 msgid "Investigations" msgstr "Investigações" -#: src/raitv/grl-raitv.c:181 +#: src/raitv/grl-raitv.c:174 msgid "Interviews" msgstr "Entrevistas" -#: src/raitv/grl-raitv.c:182 +#: src/raitv/grl-raitv.c:175 msgid "Music" msgstr "Música" -#: src/raitv/grl-raitv.c:183 +#: src/raitv/grl-raitv.c:176 msgid "News" msgstr "Notícias" -#: src/raitv/grl-raitv.c:184 +#: src/raitv/grl-raitv.c:177 msgid "Health" msgstr "Saúde" -#: src/raitv/grl-raitv.c:185 +#: src/raitv/grl-raitv.c:178 msgid "Satire" msgstr "Sátira" -#: src/raitv/grl-raitv.c:187 +#: src/raitv/grl-raitv.c:180 msgid "Society" msgstr "Sociedade" -#: src/raitv/grl-raitv.c:188 +#: src/raitv/grl-raitv.c:181 msgid "Show" msgstr "Show" -#: src/raitv/grl-raitv.c:189 +#: src/raitv/grl-raitv.c:182 msgid "Sport" msgstr "Esporte" -#: src/raitv/grl-raitv.c:190 +#: src/raitv/grl-raitv.c:183 msgid "History" msgstr "Histórico" -#: src/raitv/grl-raitv.c:191 +#: src/raitv/grl-raitv.c:184 msgid "Politics" msgstr "Políticas" -#: src/raitv/grl-raitv.c:192 +#: src/raitv/grl-raitv.c:185 msgid "Leisure" msgstr "Lazer" -#: src/raitv/grl-raitv.c:193 +#: src/raitv/grl-raitv.c:186 msgid "Travel" msgstr "Viagens" -#: src/raitv/grl-raitv.c:625 +#: src/raitv/grl-raitv.c:616 #, c-format msgid "Failed to browse: %s" msgstr "Falha ao acessar: %s" # nota: o texto em caixa alta é do próprio SHOUTcast (vide site). Mantive o estilo. -#: src/shoutcast/grl-shoutcast.c:65 +#: src/shoutcast/grl-shoutcast.c:60 msgid "A source for browsing SHOUTcast radios" msgstr "Uma fonte para acessar SHOUTcast das rádios" -#: src/shoutcast/grl-shoutcast.c:462 +#: src/shoutcast/grl-shoutcast.c:455 #, c-format msgid "Cannot find media %s" msgstr "Não foi possível localizar a mídia %s" -#: src/shoutcast/grl-shoutcast.c:757 src/vimeo/grl-vimeo.c:548 +#: src/shoutcast/grl-shoutcast.c:750 src/vimeo/grl-vimeo.c:541 msgid "non-NULL search text is required" msgstr "Um texto de pesquisa não-NULL é obrigatório" -#: src/thetvdb/grl-thetvdb.c:98 +#: src/thetvdb/grl-thetvdb.c:93 msgid "A source for fetching metadata of television shows" msgstr "Uma fonte para obter metadados de shows de televisão" -#: src/tmdb/grl-tmdb.c:1004 +#: src/tmdb/grl-tmdb.c:998 msgid "Remote data does not contain valid identifier" msgstr "Dados remotos não contêm um identificador válido" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Falha ao consultar: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Falha ao obter mídia a partir da uri: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Consulta vazia" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format msgid "ID “%s” is not known in this source" msgstr "ID “%s” não é conhecido nesta fonte" +#: src/tracker3/grl-tracker-source-priv.h:47 +#| msgid "A plugin for searching multimedia content using Tracker" +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "Um plug-in para pesquisar por conteúdo de multimídia usando Tracker3" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "Um plug-in para pesquisar por conteúdo de multimídia usando Tracker" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -msgid "Removable — %s" -msgstr "Removível — %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Arquivos locais" - -#: src/vimeo/grl-vimeo.c:56 +#: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "Uma fonte para acessar e pesquisar por vídeos do Vimeo" -#: src/youtube/grl-youtube.c:60 +#: src/youtube/grl-youtube.c:55 msgid "Standard feeds" msgstr "Feeds padrões" -#: src/youtube/grl-youtube.c:63 +#: src/youtube/grl-youtube.c:58 msgid "Categories" msgstr "Categorias" -#: src/youtube/grl-youtube.c:69 +#: src/youtube/grl-youtube.c:64 msgid "Top Rated" msgstr "Popular" -#: src/youtube/grl-youtube.c:72 +#: src/youtube/grl-youtube.c:67 msgid "Top Favorites" msgstr "Mais favoritos" -#: src/youtube/grl-youtube.c:75 +#: src/youtube/grl-youtube.c:70 msgid "Most Viewed" msgstr "Mais vistos" -#: src/youtube/grl-youtube.c:81 +#: src/youtube/grl-youtube.c:76 msgid "Most Recent" msgstr "Mais recentes" -#: src/youtube/grl-youtube.c:84 +#: src/youtube/grl-youtube.c:79 msgid "Most Discussed" msgstr "Mais discutidos" -#: src/youtube/grl-youtube.c:87 +#: src/youtube/grl-youtube.c:82 msgid "Most Linked" msgstr "Mais relacionados" -#: src/youtube/grl-youtube.c:90 +#: src/youtube/grl-youtube.c:85 msgid "Most Responded" msgstr "Mais respondidos" -#: src/youtube/grl-youtube.c:93 +#: src/youtube/grl-youtube.c:88 msgid "Recently Featured" msgstr "Destaques recentes" -#: src/youtube/grl-youtube.c:96 +#: src/youtube/grl-youtube.c:91 msgid "Watch On Mobile" msgstr "Assista no celular" -#: src/youtube/grl-youtube.c:115 +#: src/youtube/grl-youtube.c:110 msgid "A source for browsing and searching YouTube videos" msgstr "Uma fonte para acessar e pesquisar por vídeos do YouTube" -#: src/youtube/grl-youtube.c:863 +#: src/youtube/grl-youtube.c:856 msgid "Failed to get feed" msgstr "Falha ao obter feed" -#: src/youtube/grl-youtube.c:1040 src/youtube/grl-youtube.c:1428 +#: src/youtube/grl-youtube.c:1033 src/youtube/grl-youtube.c:1421 #, c-format msgid "Invalid feed identifier %s" msgstr "Identificador de feed %s inválido" +#~ msgid "Removable — %s" +#~ msgstr "Removível — %s" + +#~ msgid "Local files" +#~ msgstr "Arquivos locais" + #~ msgid "Apple Movie Trailers" #~ msgstr "Apple Movie Trailers" diff -Nru grilo-plugins-0.3.11/po/ro.po grilo-plugins-0.3.12/po/ro.po --- grilo-plugins-0.3.11/po/ro.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/ro.po 2020-09-03 05:36:44.363468000 +0000 @@ -7,8 +7,8 @@ msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-07-06 09:16+0000\n" -"PO-Revision-Date: 2018-07-17 19:21+0300\n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-27 10:16+0200\n" "Last-Translator: Florentina Mușat \n" "Language-Team: Gnome Romanian Translation Team\n" @@ -18,47 +18,47 @@ "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);;\n" -"X-Generator: Poedit 2.0.9\n" +"X-Generator: Poedit 2.4.1\n" "X-Project-Style: gnome\n" -#: src/bookmarks/grl-bookmarks.c:65 +#: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" msgstr "Semne de carte" -#: src/bookmarks/grl-bookmarks.c:66 +#: src/bookmarks/grl-bookmarks.c:61 msgid "A source for organizing media bookmarks" msgstr "O sursă pentru organizarea semnelor de carte pentru media" -#: src/bookmarks/grl-bookmarks.c:434 +#: src/bookmarks/grl-bookmarks.c:427 msgid "Failed to get bookmark metadata" msgstr "Nu s-au putut obține metadatele de semn de carte" -#: src/bookmarks/grl-bookmarks.c:464 src/bookmarks/grl-bookmarks.c:481 +#: src/bookmarks/grl-bookmarks.c:457 src/bookmarks/grl-bookmarks.c:474 #, c-format msgid "Failed to find bookmarks: %s" msgstr "Nu s-au putut găsi semnele de carte: %s" -#: src/bookmarks/grl-bookmarks.c:633 src/podcasts/grl-podcasts.c:826 -#: src/podcasts/grl-podcasts.c:858 src/podcasts/grl-podcasts.c:890 +#: src/bookmarks/grl-bookmarks.c:626 src/podcasts/grl-podcasts.c:823 +#: src/podcasts/grl-podcasts.c:855 src/podcasts/grl-podcasts.c:887 #, c-format msgid "Failed to remove: %s" msgstr "Nu s-a putut elimina: %s" -#: src/bookmarks/grl-bookmarks.c:773 src/podcasts/grl-podcasts.c:931 -#: src/podcasts/grl-podcasts.c:964 src/podcasts/grl-podcasts.c:1811 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Nu s-a putut stoca: %s" -#: src/bookmarks/grl-bookmarks.c:847 src/bookmarks/grl-bookmarks.c:882 -#: src/bookmarks/grl-bookmarks.c:913 src/bookmarks/grl-bookmarks.c:971 -#: src/metadata-store/grl-metadata-store.c:881 src/podcasts/grl-podcasts.c:1667 -#: src/podcasts/grl-podcasts.c:1711 src/podcasts/grl-podcasts.c:1745 -#: src/podcasts/grl-podcasts.c:1780 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Nicio conexiune la baza de date" -#: src/chromaprint/grl-chromaprint.c:46 +#: src/chromaprint/grl-chromaprint.c:41 msgid "A plugin to get metadata using gstreamer framework" msgstr "Un modul pentru a obține metadate utilizând o platformă gstreamer" @@ -67,53 +67,53 @@ msgid "A source for browsing the DLNA server “%s”" msgstr "O sursă pentru navigarea serverului DLNA „%s”" -#: src/dleyna/grl-dleyna-source.c:278 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "Încărcare eșuată, sursa țintă distrusă" -#: src/dleyna/grl-dleyna-source.c:380 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "Încărcarea a eșuat, „%s”, transferat %lu din %lu octeți" -#: src/dleyna/grl-dleyna-source.c:885 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "" "Nu s-au putut obține proprietățile elementului (Eroare BrowseObjects %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1524 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "Încărcarea a eșuat, lipsește un URL de la obiectul media de transferat" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format msgid "A source for browsing the DAAP server “%s”" msgstr "O sursă pentru navigarea serverului DAAP „%s”" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:795 -#: src/magnatune/grl-magnatune.c:127 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 +#: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Albume" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:784 -#: src/magnatune/grl-magnatune.c:126 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 +#: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Artiști" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1122 -#: src/jamendo/grl-jamendo.c:1233 src/magnatune/grl-magnatune.c:873 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 +#: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Identificator de recipient nevalid %s" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format msgid "A source for browsing the DPAP server “%s”" msgstr "O sursă pentru navigarea serverului DPAP „%s”" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Imagini" @@ -125,28 +125,28 @@ msgid "A source for browsing the filesystem" msgstr "O sursă pentru navigarea sistemului de fișiere" -#: src/filesystem/grl-filesystem.c:1179 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "Fișierul %s nu există" -#: src/filesystem/grl-filesystem.c:1257 src/youtube/grl-youtube.c:1512 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Nu se poate obține media de la %s" -#: src/flickr/grl-flickr.c:63 +#: src/flickr/grl-flickr.c:58 msgid "A source for browsing and searching Flickr photos" msgstr "O sursă pentru navigarea și căutarea de fotografii Flickr" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:67 +#: src/flickr/grl-flickr.c:62 #, c-format msgid "%s’s Flickr" msgstr "Flickr-ul lui %s" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:69 +#: src/flickr/grl-flickr.c:64 #, c-format msgid "A source for browsing and searching %s’s flickr photos" msgstr "O sursă pentru navigarea și căutarea fotografiilor flickr ale lui %s" @@ -203,43 +203,43 @@ msgid "Top tracks" msgstr "Top piste" -#: src/jamendo/grl-jamendo.c:348 src/jamendo/grl-jamendo.c:708 -#: src/shoutcast/grl-shoutcast.c:416 src/shoutcast/grl-shoutcast.c:470 +#: src/jamendo/grl-jamendo.c:341 src/jamendo/grl-jamendo.c:701 +#: src/shoutcast/grl-shoutcast.c:409 src/shoutcast/grl-shoutcast.c:463 msgid "Failed to parse response" msgstr "Nu s-a putut parsa răspunsul" -#: src/jamendo/grl-jamendo.c:356 src/jamendo/grl-jamendo.c:363 -#: src/podcasts/grl-podcasts.c:1368 src/shoutcast/grl-shoutcast.c:424 +#: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Răspuns gol" -#: src/jamendo/grl-jamendo.c:677 src/shoutcast/grl-shoutcast.c:558 +#: src/jamendo/grl-jamendo.c:670 src/shoutcast/grl-shoutcast.c:551 #, c-format msgid "Failed to connect: %s" msgstr "Nu s-a putut conecta: %s" -#: src/jamendo/grl-jamendo.c:806 +#: src/jamendo/grl-jamendo.c:799 msgid "Feeds" msgstr "Fluxuri" -#: src/jamendo/grl-jamendo.c:990 src/jamendo/grl-jamendo.c:1035 -#: src/jamendo/grl-jamendo.c:1062 +#: src/jamendo/grl-jamendo.c:983 src/jamendo/grl-jamendo.c:1028 +#: src/jamendo/grl-jamendo.c:1055 #, c-format msgid "Invalid identifier %s" msgstr "Identificator nevalid %s" -#: src/jamendo/grl-jamendo.c:1049 src/youtube/grl-youtube.c:1104 -#: src/youtube/grl-youtube.c:1237 src/youtube/grl-youtube.c:1449 +#: src/jamendo/grl-jamendo.c:1042 src/youtube/grl-youtube.c:1097 +#: src/youtube/grl-youtube.c:1230 src/youtube/grl-youtube.c:1442 #, c-format msgid "Invalid category identifier %s" msgstr "Identificator de categorie nevalid %s" -#: src/jamendo/grl-jamendo.c:1228 +#: src/jamendo/grl-jamendo.c:1221 #, c-format msgid "Failed to browse: %s is a track" msgstr "Nu s-a putut naviga: %s este o pistă" -#: src/jamendo/grl-jamendo.c:1287 +#: src/jamendo/grl-jamendo.c:1280 #, c-format msgid "Malformed query “%s”" msgstr "Interogare eronată „%s”" @@ -252,85 +252,87 @@ msgid "A source providing locally available metadata" msgstr "O sursă care furnizează metadate disponibile local" -#: src/local-metadata/grl-local-metadata.c:388 -#: src/metadata-store/grl-metadata-store.c:791 src/raitv/grl-raitv.c:878 +#: src/local-metadata/grl-local-metadata.c:381 +#: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" msgstr "Nu s-a putut rezolva: %s" -#: src/local-metadata/grl-local-metadata.c:682 +#: src/local-metadata/grl-local-metadata.c:673 msgid "Cannot resolve any of the given keys" msgstr "Nu s-au putut rezolva niciuna din cheile date" -#: src/local-metadata/grl-local-metadata.c:686 +#: src/local-metadata/grl-local-metadata.c:677 msgid "A GIO supported URL for images is required" msgstr "Un URL suportat de GIO pentru imagini este necesar" -#: src/magnatune/grl-magnatune.c:128 +#: src/magnatune/grl-magnatune.c:123 msgid "Genres" msgstr "Genuri" -#: src/magnatune/grl-magnatune.c:136 +#: src/magnatune/grl-magnatune.c:131 msgid "A source for browsing music" msgstr "O sursă pentru navigarea de muzică" -#: src/magnatune/grl-magnatune.c:428 +#: src/magnatune/grl-magnatune.c:421 #, c-format msgid "Failed to get database from magnatune: %s" msgstr "Nu s-a putut obține baza de date de la magnatune: %s" -#: src/magnatune/grl-magnatune.c:458 +#: src/magnatune/grl-magnatune.c:451 #, c-format msgid "Failed to save database from magnatune: “%s”" msgstr "Nu s-a putut salva baza de date de la magnatune: „%s”" -#: src/magnatune/grl-magnatune.c:729 +#: src/magnatune/grl-magnatune.c:722 #, c-format msgid "Failed to get table from magnatune db: %s" msgstr "Nu s-a putut obține tabelul de la baza de date magnatune: %s" -#: src/magnatune/grl-magnatune.c:745 +#: src/magnatune/grl-magnatune.c:738 #, c-format msgid "Fail before returning media to user: %s" msgstr "Eșec înainte de a întoarce media la utilizator: %s" -#: src/metadata-store/grl-metadata-store.c:45 +#: src/metadata-store/grl-metadata-store.c:40 msgid "Metadata Store" msgstr "Stocare metadate" -#: src/metadata-store/grl-metadata-store.c:46 +#: src/metadata-store/grl-metadata-store.c:41 msgid "A plugin for storing extra metadata information" msgstr "Un modul pentru stocarea informațiilor de metadate extra" -#: src/metadata-store/grl-metadata-store.c:605 -#: src/metadata-store/grl-metadata-store.c:624 -#: src/metadata-store/grl-metadata-store.c:836 +#: src/metadata-store/grl-metadata-store.c:598 +#: src/metadata-store/grl-metadata-store.c:617 +#: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" msgstr "Nu s-au putut actualiza metadatele: %s" -#: src/metadata-store/grl-metadata-store.c:606 +#: src/metadata-store/grl-metadata-store.c:599 msgid "specified keys are not writable" msgstr "cheile specificate nu sunt inscripționabile" -#: src/metadata-store/grl-metadata-store.c:646 +#: src/metadata-store/grl-metadata-store.c:639 msgid "Failed to update metadata" msgstr "Nu s-au putut actualiza metadatele" -#: src/metadata-store/grl-metadata-store.c:792 -#: src/metadata-store/grl-metadata-store.c:837 +#: src/metadata-store/grl-metadata-store.c:785 +#: src/metadata-store/grl-metadata-store.c:830 msgid "“source-id” not available" msgstr "„source-id” nu este disponibil" -#: src/metadata-store/grl-metadata-store.c:812 +#: src/metadata-store/grl-metadata-store.c:805 msgid "Failed to resolve" msgstr "Nu s-a putut rezolva" -#: src/metadata-store/grl-metadata-store.c:949 -#: src/metadata-store/grl-metadata-store.c:986 src/raitv/grl-raitv.c:432 -#: src/shoutcast/grl-shoutcast.c:756 src/vimeo/grl-vimeo.c:547 +#: src/metadata-store/grl-metadata-store.c:942 +#: src/metadata-store/grl-metadata-store.c:979 src/raitv/grl-raitv.c:423 +#: src/shoutcast/grl-shoutcast.c:749 src/vimeo/grl-vimeo.c:540 #, c-format msgid "Failed to search: %s" msgstr "Nu s-a putut căuta: %s" @@ -351,50 +353,50 @@ msgid "A source for browsing optical media" msgstr "O sursă pentru navigarea de medii optice" -#: src/podcasts/grl-podcasts.c:153 +#: src/podcasts/grl-podcasts.c:148 msgid "A source for browsing podcasts" msgstr "O sursă pentru navigarea de podcasturi" -#: src/podcasts/grl-podcasts.c:762 src/podcasts/grl-podcasts.c:782 +#: src/podcasts/grl-podcasts.c:759 src/podcasts/grl-podcasts.c:779 #, c-format msgid "Failed to get podcast streams: %s" msgstr "Nu s-au putut obține fluxurile de podcast: %s" -#: src/podcasts/grl-podcasts.c:1248 src/podcasts/grl-podcasts.c:1257 -#: src/podcasts/grl-podcasts.c:1267 +#: src/podcasts/grl-podcasts.c:1245 src/podcasts/grl-podcasts.c:1254 +#: src/podcasts/grl-podcasts.c:1264 msgid "Failed to parse content" msgstr "Nu s-a putut parsa conținutul" -#: src/podcasts/grl-podcasts.c:1302 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Nu s-a putut parsa conținuturile podcastului" -#: src/podcasts/grl-podcasts.c:1457 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Nu s-au putut obține informațiile podcastului" -#: src/podcasts/grl-podcasts.c:1497 src/podcasts/grl-podcasts.c:1517 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Nu s-a putut obține lista de podcasturi: %s" -#: src/podcasts/grl-podcasts.c:1570 src/podcasts/grl-podcasts.c:1585 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Nu s-au putut obține metadatele pentru fluxul de podcast" -#: src/podcasts/grl-podcasts.c:1623 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Nu s-au putut obține metadatele de podcast" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "Nu se pot crea recipiente. Doar fluxurile sunt acceptate" -#: src/podcasts/grl-podcasts.c:1812 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "URL cerut" -#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:78 +#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:73 msgid "Most Popular" msgstr "Cele mai populare" @@ -406,213 +408,222 @@ msgid "A source for browsing and searching Rai.tv videos" msgstr "O sursă pentru navigarea și căutarea de video Rai.tv" -#: src/raitv/grl-raitv.c:171 +#: src/raitv/grl-raitv.c:164 msgid "All" msgstr "Toate" -#: src/raitv/grl-raitv.c:172 +#: src/raitv/grl-raitv.c:165 msgid "Black and White" msgstr "Alb-negru" -#: src/raitv/grl-raitv.c:173 +#: src/raitv/grl-raitv.c:166 msgid "Cinema" msgstr "Cinema" -#: src/raitv/grl-raitv.c:174 +#: src/raitv/grl-raitv.c:167 msgid "Comedians" msgstr "Comedieni" -#: src/raitv/grl-raitv.c:175 +#: src/raitv/grl-raitv.c:168 msgid "Chronicle" msgstr "Cronică" -#: src/raitv/grl-raitv.c:176 +#: src/raitv/grl-raitv.c:169 msgid "Culture" msgstr "Cultură" -#: src/raitv/grl-raitv.c:177 +#: src/raitv/grl-raitv.c:170 msgid "Economy" msgstr "Economie" -#: src/raitv/grl-raitv.c:178 +#: src/raitv/grl-raitv.c:171 msgid "Fiction" msgstr "Ficțiune" -#: src/raitv/grl-raitv.c:179 +#: src/raitv/grl-raitv.c:172 msgid "Junior" msgstr "Juniori" -#: src/raitv/grl-raitv.c:180 +#: src/raitv/grl-raitv.c:173 msgid "Investigations" msgstr "Investigații" -#: src/raitv/grl-raitv.c:181 +#: src/raitv/grl-raitv.c:174 msgid "Interviews" msgstr "Interviuri" -#: src/raitv/grl-raitv.c:182 +#: src/raitv/grl-raitv.c:175 msgid "Music" msgstr "Muzică" -#: src/raitv/grl-raitv.c:183 +#: src/raitv/grl-raitv.c:176 msgid "News" msgstr "Știri" -#: src/raitv/grl-raitv.c:184 +#: src/raitv/grl-raitv.c:177 msgid "Health" msgstr "Sănătate" -#: src/raitv/grl-raitv.c:185 +#: src/raitv/grl-raitv.c:178 msgid "Satire" msgstr "Satiră" -#: src/raitv/grl-raitv.c:187 +#: src/raitv/grl-raitv.c:180 msgid "Society" msgstr "Societate" -#: src/raitv/grl-raitv.c:188 +#: src/raitv/grl-raitv.c:181 msgid "Show" msgstr "Spectacol" -#: src/raitv/grl-raitv.c:189 +#: src/raitv/grl-raitv.c:182 msgid "Sport" msgstr "Sport" -#: src/raitv/grl-raitv.c:190 +#: src/raitv/grl-raitv.c:183 msgid "History" msgstr "Istorie" -#: src/raitv/grl-raitv.c:191 +#: src/raitv/grl-raitv.c:184 msgid "Politics" msgstr "Politică" -#: src/raitv/grl-raitv.c:192 +#: src/raitv/grl-raitv.c:185 msgid "Leisure" msgstr "Relaxare" -#: src/raitv/grl-raitv.c:193 +#: src/raitv/grl-raitv.c:186 msgid "Travel" msgstr "Călătorie" -#: src/raitv/grl-raitv.c:625 +#: src/raitv/grl-raitv.c:616 #, c-format msgid "Failed to browse: %s" msgstr "Nu s-a putut naviga: %s" -#: src/shoutcast/grl-shoutcast.c:65 +#: src/shoutcast/grl-shoutcast.c:60 msgid "A source for browsing SHOUTcast radios" msgstr "O sursă pentru navigarea de radio-uri SHOUTcast" -#: src/shoutcast/grl-shoutcast.c:462 +#: src/shoutcast/grl-shoutcast.c:455 #, c-format msgid "Cannot find media %s" msgstr "Nu s-a putut găsi media %s" -#: src/shoutcast/grl-shoutcast.c:757 src/vimeo/grl-vimeo.c:548 +#: src/shoutcast/grl-shoutcast.c:750 src/vimeo/grl-vimeo.c:541 msgid "non-NULL search text is required" msgstr "un termen de căutare diferit de NULL este necesar" -#: src/thetvdb/grl-thetvdb.c:98 +#: src/thetvdb/grl-thetvdb.c:93 msgid "A source for fetching metadata of television shows" msgstr "O sursă pentru aducerea de metadate a emisiunilor de televiziune" -#: src/tmdb/grl-tmdb.c:1004 +#: src/tmdb/grl-tmdb.c:998 msgid "Remote data does not contain valid identifier" msgstr "Datele la distanță nu conțin un identificator valid" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Nu s-a putut interoga: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Nu s-a putut obține media de la uri: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Interogare goală" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format msgid "ID “%s” is not known in this source" msgstr "ID-ul „%s” nu este cunoscut în această sursă" +#: src/tracker3/grl-tracker-source-priv.h:47 +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "Un modul pentru căutarea de conținut multimedia utilizând Tracker3" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "Un modul pentru căutarea de conținut multimedia utilizând Tracker" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -msgid "Removable — %s" -msgstr "Detașabil — %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Fișiere locale" - -#: src/vimeo/grl-vimeo.c:56 +#: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "O sursă pentru navigarea și căutarea de videouri Vimeo" -#: src/youtube/grl-youtube.c:60 +#: src/youtube/grl-youtube.c:55 msgid "Standard feeds" msgstr "Fluxuri standard" -#: src/youtube/grl-youtube.c:63 +#: src/youtube/grl-youtube.c:58 msgid "Categories" msgstr "Categorii" -#: src/youtube/grl-youtube.c:69 +#: src/youtube/grl-youtube.c:64 msgid "Top Rated" msgstr "Cele mai bine cotate" -#: src/youtube/grl-youtube.c:72 +#: src/youtube/grl-youtube.c:67 msgid "Top Favorites" msgstr "Top favorite" -#: src/youtube/grl-youtube.c:75 +#: src/youtube/grl-youtube.c:70 msgid "Most Viewed" msgstr "Cele mai vizualizate" -#: src/youtube/grl-youtube.c:81 +#: src/youtube/grl-youtube.c:76 msgid "Most Recent" msgstr "Cele mai recente" -#: src/youtube/grl-youtube.c:84 +#: src/youtube/grl-youtube.c:79 msgid "Most Discussed" msgstr "Cele mai discutate" -#: src/youtube/grl-youtube.c:87 +#: src/youtube/grl-youtube.c:82 msgid "Most Linked" msgstr "Cele mai distribuite" -#: src/youtube/grl-youtube.c:90 +#: src/youtube/grl-youtube.c:85 msgid "Most Responded" msgstr "Cele mai răspunse" -#: src/youtube/grl-youtube.c:93 +#: src/youtube/grl-youtube.c:88 msgid "Recently Featured" msgstr "Recomandate recent" -#: src/youtube/grl-youtube.c:96 +#: src/youtube/grl-youtube.c:91 msgid "Watch On Mobile" msgstr "Vedeți pe mobil" -#: src/youtube/grl-youtube.c:115 +#: src/youtube/grl-youtube.c:110 msgid "A source for browsing and searching YouTube videos" msgstr "O sursă pentru navigarea și căutarea de video Youtube" -#: src/youtube/grl-youtube.c:863 +#: src/youtube/grl-youtube.c:856 msgid "Failed to get feed" msgstr "Nu s-a putut obține fluxul" -#: src/youtube/grl-youtube.c:1040 src/youtube/grl-youtube.c:1428 +#: src/youtube/grl-youtube.c:1033 src/youtube/grl-youtube.c:1421 #, c-format msgid "Invalid feed identifier %s" msgstr "Identificator de flux nevalid %s" + +#~ msgid "Removable — %s" +#~ msgstr "Detașabil — %s" + +#~ msgid "Local files" +#~ msgstr "Fișiere locale" diff -Nru grilo-plugins-0.3.11/po/sl.po grilo-plugins-0.3.12/po/sl.po --- grilo-plugins-0.3.11/po/sl.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/sl.po 2020-09-03 05:36:44.363468000 +0000 @@ -2,14 +2,14 @@ # Copyright (C) 2013 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. # -# Matej Urbančič , 2013-2016. +# Matej Urbančič , 2013–2020. # msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-07-09 13:13+0000\n" -"PO-Revision-Date: 2018-07-11 21:47+0200\n" +"POT-Creation-Date: 2020-08-26 15:45+0000\n" +"PO-Revision-Date: 2020-08-26 21:23+0200\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenščina \n" "Language: sl_SI\n" @@ -19,46 +19,46 @@ "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" -"X-Generator: Poedit 2.0.6\n" +"X-Generator: Poedit 2.3\n" -#: src/bookmarks/grl-bookmarks.c:65 +#: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" msgstr "Zaznamki" -#: src/bookmarks/grl-bookmarks.c:66 +#: src/bookmarks/grl-bookmarks.c:61 msgid "A source for organizing media bookmarks" msgstr "Vir za organiziranje zaznamkov predstavnih predmetov" -#: src/bookmarks/grl-bookmarks.c:434 +#: src/bookmarks/grl-bookmarks.c:427 msgid "Failed to get bookmark metadata" msgstr "Pridobivanje metapodatkov zaznamka je spodletelo" -#: src/bookmarks/grl-bookmarks.c:464 src/bookmarks/grl-bookmarks.c:481 +#: src/bookmarks/grl-bookmarks.c:457 src/bookmarks/grl-bookmarks.c:474 #, c-format msgid "Failed to find bookmarks: %s" msgstr "Ni mogoče najti zaznamkov: %s" -#: src/bookmarks/grl-bookmarks.c:633 src/podcasts/grl-podcasts.c:826 -#: src/podcasts/grl-podcasts.c:858 src/podcasts/grl-podcasts.c:890 +#: src/bookmarks/grl-bookmarks.c:626 src/podcasts/grl-podcasts.c:823 +#: src/podcasts/grl-podcasts.c:855 src/podcasts/grl-podcasts.c:887 #, c-format msgid "Failed to remove: %s" msgstr "Ni mogoče odstraniti: %s" -#: src/bookmarks/grl-bookmarks.c:773 src/podcasts/grl-podcasts.c:931 -#: src/podcasts/grl-podcasts.c:964 src/podcasts/grl-podcasts.c:1811 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Ni mogoče shraniti: %s" -#: src/bookmarks/grl-bookmarks.c:847 src/bookmarks/grl-bookmarks.c:882 -#: src/bookmarks/grl-bookmarks.c:913 src/bookmarks/grl-bookmarks.c:971 -#: src/metadata-store/grl-metadata-store.c:881 src/podcasts/grl-podcasts.c:1667 -#: src/podcasts/grl-podcasts.c:1711 src/podcasts/grl-podcasts.c:1745 -#: src/podcasts/grl-podcasts.c:1780 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Ni povezave z zbirko podatkov" -#: src/chromaprint/grl-chromaprint.c:46 +#: src/chromaprint/grl-chromaprint.c:41 msgid "A plugin to get metadata using gstreamer framework" msgstr "Vstavek za pridobitev metapodatkov z uporabo systema gstreamer" @@ -67,52 +67,52 @@ msgid "A source for browsing the DLNA server “%s”" msgstr "Vir za brskanje po strežniku DLNA »%s«" -#: src/dleyna/grl-dleyna-source.c:278 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "Pošiljanje vzorca je spodletelo, ciljni vir je uničen" -#: src/dleyna/grl-dleyna-source.c:380 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "Pošiljanje je spodletelo, »%s«, preneseno %lu od %lu bajtov" -#: src/dleyna/grl-dleyna-source.c:885 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "Ni mogoče pridobiti podrobnosti predmeta (napaka BrowseObjects %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1524 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "Pošiljanje vzorca je spodletelo, manjka naslov URL predmeta za prenos" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format msgid "A source for browsing the DAAP server “%s”" msgstr "Vir za brskanje strežnika DAAP »%s«" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:795 -#: src/magnatune/grl-magnatune.c:127 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 +#: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Albumi" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:784 -#: src/magnatune/grl-magnatune.c:126 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 +#: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Izvajalci" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1122 -#: src/jamendo/grl-jamendo.c:1233 src/magnatune/grl-magnatune.c:873 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 +#: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Določilo vsebnika %s je neveljavno " -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format msgid "A source for browsing the DPAP server “%s”" msgstr "Vir za brskanje strežnika DPAP »%s«" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Fotografije" @@ -124,28 +124,28 @@ msgid "A source for browsing the filesystem" msgstr "Vir za brskanje po datotečnem sistemu" -#: src/filesystem/grl-filesystem.c:1179 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "Datoteka %s ne obstaja" -#: src/filesystem/grl-filesystem.c:1257 src/youtube/grl-youtube.c:1512 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Ni mogoče pridobiti vsebine iz %s" -#: src/flickr/grl-flickr.c:63 +#: src/flickr/grl-flickr.c:58 msgid "A source for browsing and searching Flickr photos" msgstr "Vir za brskanje in iskanje fotografij Flickr" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:67 +#: src/flickr/grl-flickr.c:62 #, c-format msgid "%s’s Flickr" msgstr "Flickr uporabnika %s" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:69 +#: src/flickr/grl-flickr.c:64 #, c-format msgid "A source for browsing and searching %s’s flickr photos" msgstr "Vir za brskanje in iskanje fotografij flickr uporabnika %s" @@ -202,43 +202,43 @@ msgid "Top tracks" msgstr "Najboljši posnetki" -#: src/jamendo/grl-jamendo.c:348 src/jamendo/grl-jamendo.c:708 -#: src/shoutcast/grl-shoutcast.c:416 src/shoutcast/grl-shoutcast.c:470 +#: src/jamendo/grl-jamendo.c:341 src/jamendo/grl-jamendo.c:701 +#: src/shoutcast/grl-shoutcast.c:409 src/shoutcast/grl-shoutcast.c:463 msgid "Failed to parse response" msgstr "Razčlenjevanje odgovora je spodletelo" -#: src/jamendo/grl-jamendo.c:356 src/jamendo/grl-jamendo.c:363 -#: src/podcasts/grl-podcasts.c:1368 src/shoutcast/grl-shoutcast.c:424 +#: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Odziv brez vsebine" -#: src/jamendo/grl-jamendo.c:677 src/shoutcast/grl-shoutcast.c:558 +#: src/jamendo/grl-jamendo.c:670 src/shoutcast/grl-shoutcast.c:551 #, c-format msgid "Failed to connect: %s" msgstr "Napaka med povezovanjem: %s" -#: src/jamendo/grl-jamendo.c:806 +#: src/jamendo/grl-jamendo.c:799 msgid "Feeds" msgstr "Viri" -#: src/jamendo/grl-jamendo.c:990 src/jamendo/grl-jamendo.c:1035 -#: src/jamendo/grl-jamendo.c:1062 +#: src/jamendo/grl-jamendo.c:983 src/jamendo/grl-jamendo.c:1028 +#: src/jamendo/grl-jamendo.c:1055 #, c-format msgid "Invalid identifier %s" msgstr "Neveljaven določilnik %s" -#: src/jamendo/grl-jamendo.c:1049 src/youtube/grl-youtube.c:1104 -#: src/youtube/grl-youtube.c:1237 src/youtube/grl-youtube.c:1449 +#: src/jamendo/grl-jamendo.c:1042 src/youtube/grl-youtube.c:1097 +#: src/youtube/grl-youtube.c:1230 src/youtube/grl-youtube.c:1442 #, c-format msgid "Invalid category identifier %s" msgstr "Določilo kategorije %s je neveljavno " -#: src/jamendo/grl-jamendo.c:1228 +#: src/jamendo/grl-jamendo.c:1221 #, c-format msgid "Failed to browse: %s is a track" msgstr "Brskanje je spodletelo: %s je posnetek" -#: src/jamendo/grl-jamendo.c:1287 +#: src/jamendo/grl-jamendo.c:1280 #, c-format msgid "Malformed query “%s”" msgstr "Napačno oblikovana zahteva poizvedbe »%s«" @@ -251,86 +251,88 @@ msgid "A source providing locally available metadata" msgstr "Vir krajevno dostopnih metapodatkov" -#: src/local-metadata/grl-local-metadata.c:388 -#: src/metadata-store/grl-metadata-store.c:791 src/raitv/grl-raitv.c:878 +#: src/local-metadata/grl-local-metadata.c:381 +#: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" msgstr "Razreševanje je spodletelo: %s" -#: src/local-metadata/grl-local-metadata.c:682 +#: src/local-metadata/grl-local-metadata.c:673 msgid "Cannot resolve any of the given keys" msgstr "Ni mogoče razrešiti nobenega izmed podanih ključev" -#: src/local-metadata/grl-local-metadata.c:686 +#: src/local-metadata/grl-local-metadata.c:677 msgid "A GIO supported URL for images is required" msgstr "Zahtevan je z GIO podprt naslov URL slik" -#: src/magnatune/grl-magnatune.c:128 +#: src/magnatune/grl-magnatune.c:123 msgid "Genres" msgstr "Zvrsti" -#: src/magnatune/grl-magnatune.c:136 +#: src/magnatune/grl-magnatune.c:131 msgid "A source for browsing music" msgstr "Vir brskanja glasbenih datotek" -#: src/magnatune/grl-magnatune.c:428 +#: src/magnatune/grl-magnatune.c:421 #, c-format msgid "Failed to get database from magnatune: %s" msgstr "Pridobivanje podatkovne zbirke magnatune je spodletelo: %s" -#: src/magnatune/grl-magnatune.c:458 +#: src/magnatune/grl-magnatune.c:451 #, c-format msgid "Failed to save database from magnatune: “%s”" msgstr "Shranjevanje podatkovne zbirke iz magnatune je spodletelo: »%s«" -#: src/magnatune/grl-magnatune.c:729 +#: src/magnatune/grl-magnatune.c:722 #, c-format msgid "Failed to get table from magnatune db: %s" msgstr "" "Pridobivanje razpredelnice podatkovne zbirke magnatune je spodletelo: %s" -#: src/magnatune/grl-magnatune.c:745 +#: src/magnatune/grl-magnatune.c:738 #, c-format msgid "Fail before returning media to user: %s" msgstr "Opravilo je spodletelo pred posredovanjem vsebine uporabniku: %s" -#: src/metadata-store/grl-metadata-store.c:45 +#: src/metadata-store/grl-metadata-store.c:40 msgid "Metadata Store" msgstr "Shramba metapodatkov" -#: src/metadata-store/grl-metadata-store.c:46 +#: src/metadata-store/grl-metadata-store.c:41 msgid "A plugin for storing extra metadata information" msgstr "Vstavek za shranjevanje dodatnih metapodatkov" -#: src/metadata-store/grl-metadata-store.c:605 -#: src/metadata-store/grl-metadata-store.c:624 -#: src/metadata-store/grl-metadata-store.c:836 +#: src/metadata-store/grl-metadata-store.c:598 +#: src/metadata-store/grl-metadata-store.c:617 +#: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" msgstr "Posodabljanje metapodatkov je spodletelo: %s" -#: src/metadata-store/grl-metadata-store.c:606 +#: src/metadata-store/grl-metadata-store.c:599 msgid "specified keys are not writable" msgstr "V navedene ključe ni mogoče pisati" -#: src/metadata-store/grl-metadata-store.c:646 +#: src/metadata-store/grl-metadata-store.c:639 msgid "Failed to update metadata" msgstr "Posodabljanje metapodatkov je spodletelo" -#: src/metadata-store/grl-metadata-store.c:792 -#: src/metadata-store/grl-metadata-store.c:837 +#: src/metadata-store/grl-metadata-store.c:785 +#: src/metadata-store/grl-metadata-store.c:830 msgid "“source-id” not available" msgstr "Podatek »source-id« ni na voljo" -#: src/metadata-store/grl-metadata-store.c:812 +#: src/metadata-store/grl-metadata-store.c:805 msgid "Failed to resolve" msgstr "Razreševanje je spodletelo" -#: src/metadata-store/grl-metadata-store.c:949 -#: src/metadata-store/grl-metadata-store.c:986 src/raitv/grl-raitv.c:432 -#: src/shoutcast/grl-shoutcast.c:756 src/vimeo/grl-vimeo.c:547 +#: src/metadata-store/grl-metadata-store.c:942 +#: src/metadata-store/grl-metadata-store.c:979 src/raitv/grl-raitv.c:423 +#: src/shoutcast/grl-shoutcast.c:749 src/vimeo/grl-vimeo.c:540 #, c-format msgid "Failed to search: %s" msgstr "Iskanje je spodletelo: %s" @@ -351,50 +353,50 @@ msgid "A source for browsing optical media" msgstr "Vir za brskanje optičnih nosilcev" -#: src/podcasts/grl-podcasts.c:153 +#: src/podcasts/grl-podcasts.c:148 msgid "A source for browsing podcasts" msgstr "Vir za brskanje podcastov" -#: src/podcasts/grl-podcasts.c:762 src/podcasts/grl-podcasts.c:782 +#: src/podcasts/grl-podcasts.c:759 src/podcasts/grl-podcasts.c:779 #, c-format msgid "Failed to get podcast streams: %s" msgstr "Pridobivanje pretokov podcastov je spodletelo: %s" -#: src/podcasts/grl-podcasts.c:1248 src/podcasts/grl-podcasts.c:1257 -#: src/podcasts/grl-podcasts.c:1267 +#: src/podcasts/grl-podcasts.c:1245 src/podcasts/grl-podcasts.c:1254 +#: src/podcasts/grl-podcasts.c:1264 msgid "Failed to parse content" msgstr "Razčlenitev vsebine je spodletela" -#: src/podcasts/grl-podcasts.c:1302 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Razčlenjevanje vsebine podcastov je spodletelo" -#: src/podcasts/grl-podcasts.c:1457 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Pridobivanje podrobnosti podcastov je spodletelo" -#: src/podcasts/grl-podcasts.c:1497 src/podcasts/grl-podcasts.c:1517 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Pridobivanje seznama podcastov je spodletelo: %s" -#: src/podcasts/grl-podcasts.c:1570 src/podcasts/grl-podcasts.c:1585 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Pridobivanje metapodatkov pretoka podcasta je spodletelo" -#: src/podcasts/grl-podcasts.c:1623 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Pridobivanje metapodatkov podcasta je spodletelo." -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "Vsebnikov ni mogoče ustvariti. Sprejmejo se le viri" -#: src/podcasts/grl-podcasts.c:1812 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "Zahtevani URL" -#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:78 +#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:73 msgid "Most Popular" msgstr "Najbolj priljubljeno" @@ -406,217 +408,226 @@ msgid "A source for browsing and searching Rai.tv videos" msgstr "Vir za brskanje in iskanje videov Rai.tv" -#: src/raitv/grl-raitv.c:171 +#: src/raitv/grl-raitv.c:164 msgid "All" msgstr "Vse" -#: src/raitv/grl-raitv.c:172 +#: src/raitv/grl-raitv.c:165 msgid "Black and White" msgstr "Črno-belo" -#: src/raitv/grl-raitv.c:173 +#: src/raitv/grl-raitv.c:166 msgid "Cinema" msgstr "Kino" -#: src/raitv/grl-raitv.c:174 +#: src/raitv/grl-raitv.c:167 msgid "Comedians" msgstr "Komiki" -#: src/raitv/grl-raitv.c:175 +#: src/raitv/grl-raitv.c:168 msgid "Chronicle" msgstr "Kronike" -#: src/raitv/grl-raitv.c:176 +#: src/raitv/grl-raitv.c:169 msgid "Culture" msgstr "Kultura" -#: src/raitv/grl-raitv.c:177 +#: src/raitv/grl-raitv.c:170 msgid "Economy" msgstr "Ekonomija" -#: src/raitv/grl-raitv.c:178 +#: src/raitv/grl-raitv.c:171 msgid "Fiction" msgstr "Fikcija" -#: src/raitv/grl-raitv.c:179 +#: src/raitv/grl-raitv.c:172 msgid "Junior" msgstr "Mladinsko" -#: src/raitv/grl-raitv.c:180 +#: src/raitv/grl-raitv.c:173 msgid "Investigations" msgstr "Preiskave" -#: src/raitv/grl-raitv.c:181 +#: src/raitv/grl-raitv.c:174 msgid "Interviews" msgstr "Intervjuji" -#: src/raitv/grl-raitv.c:182 +#: src/raitv/grl-raitv.c:175 msgid "Music" msgstr "Glasba" -#: src/raitv/grl-raitv.c:183 +#: src/raitv/grl-raitv.c:176 msgid "News" msgstr "Novice" -#: src/raitv/grl-raitv.c:184 +#: src/raitv/grl-raitv.c:177 msgid "Health" msgstr "Zdravje" -#: src/raitv/grl-raitv.c:185 +#: src/raitv/grl-raitv.c:178 msgid "Satire" msgstr "Satira" -#: src/raitv/grl-raitv.c:187 +#: src/raitv/grl-raitv.c:180 msgid "Society" msgstr "Družba" -#: src/raitv/grl-raitv.c:188 +#: src/raitv/grl-raitv.c:181 msgid "Show" msgstr "Pokaži" -#: src/raitv/grl-raitv.c:189 +#: src/raitv/grl-raitv.c:182 msgid "Sport" msgstr "Šport" -#: src/raitv/grl-raitv.c:190 +#: src/raitv/grl-raitv.c:183 msgid "History" msgstr "Zgodovina" -#: src/raitv/grl-raitv.c:191 +#: src/raitv/grl-raitv.c:184 msgid "Politics" msgstr "Politika" -#: src/raitv/grl-raitv.c:192 +#: src/raitv/grl-raitv.c:185 msgid "Leisure" msgstr "Prosti čas" -#: src/raitv/grl-raitv.c:193 +#: src/raitv/grl-raitv.c:186 msgid "Travel" msgstr "Potovanja" -#: src/raitv/grl-raitv.c:625 +#: src/raitv/grl-raitv.c:616 #, c-format msgid "Failed to browse: %s" msgstr "Brskanje je spodletelo: %s" -#: src/shoutcast/grl-shoutcast.c:65 +#: src/shoutcast/grl-shoutcast.c:60 msgid "A source for browsing SHOUTcast radios" msgstr "Vir za brskanje po postajah SHOUTcast" -#: src/shoutcast/grl-shoutcast.c:462 +#: src/shoutcast/grl-shoutcast.c:455 #, c-format msgid "Cannot find media %s" msgstr "Ni mogoče najti nosilca %s" -#: src/shoutcast/grl-shoutcast.c:757 src/vimeo/grl-vimeo.c:548 +#: src/shoutcast/grl-shoutcast.c:750 src/vimeo/grl-vimeo.c:541 msgid "non-NULL search text is required" msgstr "Iskalno besedilo ne more biti prazna vrednost" -#: src/thetvdb/grl-thetvdb.c:98 +#: src/thetvdb/grl-thetvdb.c:93 msgid "A source for fetching metadata of television shows" msgstr "Vir za pridobivanje metapodatkov televizijskih oddaj" -#: src/tmdb/grl-tmdb.c:1004 +#: src/tmdb/grl-tmdb.c:998 msgid "Remote data does not contain valid identifier" msgstr "Oddaljeni podatki ne vsebujejo veljavnih določil" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Poizvedba je spodletela: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Pridobivanje predstavne vsebine je spodletelo: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Prazna poizvedba" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format msgid "ID “%s” is not known in this source" msgstr "V tem viru ID »%s« ni znan" +#: src/tracker3/grl-tracker-source-priv.h:47 +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "Vstavek za iskanje predstavnih vsebin z uporabo sistema Tracker3" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "Vstavek za iskanje predstavnih vsebin z uporabo sistema Tracker" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -msgid "Removable — %s" -msgstr "Odstranljivo – %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Krajevne datoteke" - -#: src/vimeo/grl-vimeo.c:56 +#: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "Vir za brskanje in iskanje videov Vimeo" -#: src/youtube/grl-youtube.c:60 +#: src/youtube/grl-youtube.c:55 msgid "Standard feeds" msgstr "Običajni viri" -#: src/youtube/grl-youtube.c:63 +#: src/youtube/grl-youtube.c:58 msgid "Categories" msgstr "Kategorije" -#: src/youtube/grl-youtube.c:69 +#: src/youtube/grl-youtube.c:64 msgid "Top Rated" msgstr "Najbolje ocenjeno" -#: src/youtube/grl-youtube.c:72 +#: src/youtube/grl-youtube.c:67 msgid "Top Favorites" msgstr "Najbolj priljubljeno" -#: src/youtube/grl-youtube.c:75 +#: src/youtube/grl-youtube.c:70 msgid "Most Viewed" msgstr "Z največ ogledi" -#: src/youtube/grl-youtube.c:81 +#: src/youtube/grl-youtube.c:76 msgid "Most Recent" msgstr "Najnovejše" -#: src/youtube/grl-youtube.c:84 +#: src/youtube/grl-youtube.c:79 msgid "Most Discussed" msgstr "Največkrat obravnavano" -#: src/youtube/grl-youtube.c:87 +#: src/youtube/grl-youtube.c:82 msgid "Most Linked" msgstr "Največkrat povezano" -#: src/youtube/grl-youtube.c:90 +#: src/youtube/grl-youtube.c:85 msgid "Most Responded" msgstr "Največkrat odgovorjeno" -#: src/youtube/grl-youtube.c:93 +#: src/youtube/grl-youtube.c:88 msgid "Recently Featured" msgstr "Nedavno izpostavljeno" -#: src/youtube/grl-youtube.c:96 +#: src/youtube/grl-youtube.c:91 msgid "Watch On Mobile" msgstr "Oglej si na mobilni napravi" -#: src/youtube/grl-youtube.c:115 +#: src/youtube/grl-youtube.c:110 msgid "A source for browsing and searching YouTube videos" msgstr "Vir za brskanje in iskanje videov YouTube" -#: src/youtube/grl-youtube.c:863 +#: src/youtube/grl-youtube.c:856 msgid "Failed to get feed" msgstr "Pridobivanje vira je spodletelo" -#: src/youtube/grl-youtube.c:1040 src/youtube/grl-youtube.c:1428 +#: src/youtube/grl-youtube.c:1033 src/youtube/grl-youtube.c:1421 #, c-format msgid "Invalid feed identifier %s" msgstr "Določilo obvestilnika %s je neveljavno " +#~ msgid "Removable — %s" +#~ msgstr "Odstranljivo – %s" + +#~ msgid "Local files" +#~ msgstr "Krajevne datoteke" + #~ msgid "Album art Provider from Last.FM" #~ msgstr "Ponudnik ovitkov albumov z Last.FM" diff -Nru grilo-plugins-0.3.11/po/sv.po grilo-plugins-0.3.12/po/sv.po --- grilo-plugins-0.3.11/po/sv.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/sv.po 2020-09-03 05:36:44.363468000 +0000 @@ -1,15 +1,15 @@ # Swedish translation for grilo-plugins. -# Copyright © 2014, 2015, 2018 grilo-plugins's COPYRIGHT HOLDER +# Copyright © 2014-2020 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. # Mattias Eriksson , 2014. -# Anders Jonsson , 2015, 2018. +# Anders Jonsson , 2015, 2018, 2020. # msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-07-06 09:16+0000\n" -"PO-Revision-Date: 2018-07-18 13:17+0200\n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-24 17:36+0200\n" "Last-Translator: Anders Jonsson \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -17,46 +17,46 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.0.8\n" +"X-Generator: Poedit 2.4.1\n" -#: src/bookmarks/grl-bookmarks.c:65 +#: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" msgstr "Bokmärken" -#: src/bookmarks/grl-bookmarks.c:66 +#: src/bookmarks/grl-bookmarks.c:61 msgid "A source for organizing media bookmarks" msgstr "En källa för att organisera bokmärken för media" -#: src/bookmarks/grl-bookmarks.c:434 +#: src/bookmarks/grl-bookmarks.c:427 msgid "Failed to get bookmark metadata" msgstr "Misslyckades med att hämta bokmärkes-metadata" -#: src/bookmarks/grl-bookmarks.c:464 src/bookmarks/grl-bookmarks.c:481 +#: src/bookmarks/grl-bookmarks.c:457 src/bookmarks/grl-bookmarks.c:474 #, c-format msgid "Failed to find bookmarks: %s" msgstr "Misslyckades med att hitta bokmärken: %s" -#: src/bookmarks/grl-bookmarks.c:633 src/podcasts/grl-podcasts.c:826 -#: src/podcasts/grl-podcasts.c:858 src/podcasts/grl-podcasts.c:890 +#: src/bookmarks/grl-bookmarks.c:626 src/podcasts/grl-podcasts.c:823 +#: src/podcasts/grl-podcasts.c:855 src/podcasts/grl-podcasts.c:887 #, c-format msgid "Failed to remove: %s" msgstr "Misslyckades med att ta bort: %s" -#: src/bookmarks/grl-bookmarks.c:773 src/podcasts/grl-podcasts.c:931 -#: src/podcasts/grl-podcasts.c:964 src/podcasts/grl-podcasts.c:1811 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Misslyckades med att lagra: %s" -#: src/bookmarks/grl-bookmarks.c:847 src/bookmarks/grl-bookmarks.c:882 -#: src/bookmarks/grl-bookmarks.c:913 src/bookmarks/grl-bookmarks.c:971 -#: src/metadata-store/grl-metadata-store.c:881 src/podcasts/grl-podcasts.c:1667 -#: src/podcasts/grl-podcasts.c:1711 src/podcasts/grl-podcasts.c:1745 -#: src/podcasts/grl-podcasts.c:1780 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Ingen databasanslutning" -#: src/chromaprint/grl-chromaprint.c:46 +#: src/chromaprint/grl-chromaprint.c:41 msgid "A plugin to get metadata using gstreamer framework" msgstr "En insticksmodul för att hämta metadata med gstreamer-ramverket" @@ -65,52 +65,52 @@ msgid "A source for browsing the DLNA server “%s”" msgstr "En källa för att bläddra på DLNA-servern ”%s”" -#: src/dleyna/grl-dleyna-source.c:278 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "Sändning misslyckades, målkällan förstörd" -#: src/dleyna/grl-dleyna-source.c:380 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "Sändning misslyckades, ”%s”, överförde %lu av %lu byte" -#: src/dleyna/grl-dleyna-source.c:885 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "Misslyckades med att anskaffa objektegenskaper (BrowseObjects-fel %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1524 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "Sändning misslyckades, URL saknas på mediaobjektet som ska överföras" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format msgid "A source for browsing the DAAP server “%s”" msgstr "En källa för att bläddra på DAAP-servern ”%s”" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:795 -#: src/magnatune/grl-magnatune.c:127 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 +#: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Album" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:784 -#: src/magnatune/grl-magnatune.c:126 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 +#: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Artister" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1122 -#: src/jamendo/grl-jamendo.c:1233 src/magnatune/grl-magnatune.c:873 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 +#: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Ogiltig behållaridentifierare %s" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format msgid "A source for browsing the DPAP server “%s”" msgstr "En källa för att bläddra på DPAP-servern ”%s”" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Foton" @@ -122,28 +122,28 @@ msgid "A source for browsing the filesystem" msgstr "En källa för att bläddra på filsystemet" -#: src/filesystem/grl-filesystem.c:1179 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "Fil %s finns inte" -#: src/filesystem/grl-filesystem.c:1257 src/youtube/grl-youtube.c:1512 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Kunde inte erhålla media från %s" -#: src/flickr/grl-flickr.c:63 +#: src/flickr/grl-flickr.c:58 msgid "A source for browsing and searching Flickr photos" msgstr "En källa för att bläddra och söka bland foton på Flickr" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:67 +#: src/flickr/grl-flickr.c:62 #, c-format msgid "%s’s Flickr" msgstr "Flickr för %s" #. "%s" is a full user name, like "John Doe" -#: src/flickr/grl-flickr.c:69 +#: src/flickr/grl-flickr.c:64 #, c-format msgid "A source for browsing and searching %s’s flickr photos" msgstr "En källa för att bläddra och söka bland foton på flickr som tillhör %s" @@ -200,43 +200,43 @@ msgid "Top tracks" msgstr "Topplåtar" -#: src/jamendo/grl-jamendo.c:348 src/jamendo/grl-jamendo.c:708 -#: src/shoutcast/grl-shoutcast.c:416 src/shoutcast/grl-shoutcast.c:470 +#: src/jamendo/grl-jamendo.c:341 src/jamendo/grl-jamendo.c:701 +#: src/shoutcast/grl-shoutcast.c:409 src/shoutcast/grl-shoutcast.c:463 msgid "Failed to parse response" msgstr "Misslyckades med att tolka svar" -#: src/jamendo/grl-jamendo.c:356 src/jamendo/grl-jamendo.c:363 -#: src/podcasts/grl-podcasts.c:1368 src/shoutcast/grl-shoutcast.c:424 +#: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Tomt svar" -#: src/jamendo/grl-jamendo.c:677 src/shoutcast/grl-shoutcast.c:558 +#: src/jamendo/grl-jamendo.c:670 src/shoutcast/grl-shoutcast.c:551 #, c-format msgid "Failed to connect: %s" msgstr "Anslutning misslyckades: %s" -#: src/jamendo/grl-jamendo.c:806 +#: src/jamendo/grl-jamendo.c:799 msgid "Feeds" msgstr "Flöden" -#: src/jamendo/grl-jamendo.c:990 src/jamendo/grl-jamendo.c:1035 -#: src/jamendo/grl-jamendo.c:1062 +#: src/jamendo/grl-jamendo.c:983 src/jamendo/grl-jamendo.c:1028 +#: src/jamendo/grl-jamendo.c:1055 #, c-format msgid "Invalid identifier %s" msgstr "Ogiltig identifierare %s" -#: src/jamendo/grl-jamendo.c:1049 src/youtube/grl-youtube.c:1104 -#: src/youtube/grl-youtube.c:1237 src/youtube/grl-youtube.c:1449 +#: src/jamendo/grl-jamendo.c:1042 src/youtube/grl-youtube.c:1097 +#: src/youtube/grl-youtube.c:1230 src/youtube/grl-youtube.c:1442 #, c-format msgid "Invalid category identifier %s" msgstr "Ogiltig kategoriidentifierare %s" -#: src/jamendo/grl-jamendo.c:1228 +#: src/jamendo/grl-jamendo.c:1221 #, c-format msgid "Failed to browse: %s is a track" msgstr "Misslyckades med bläddring: %s är en låt" -#: src/jamendo/grl-jamendo.c:1287 +#: src/jamendo/grl-jamendo.c:1280 #, c-format msgid "Malformed query “%s”" msgstr "Felaktig sökfråga ”%s”" @@ -249,85 +249,87 @@ msgid "A source providing locally available metadata" msgstr "En källa som tillhandahåller lokalt tillgänglig metadata" -#: src/local-metadata/grl-local-metadata.c:388 -#: src/metadata-store/grl-metadata-store.c:791 src/raitv/grl-raitv.c:878 +#: src/local-metadata/grl-local-metadata.c:381 +#: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" msgstr "Misslyckades med att slå upp: %s" -#: src/local-metadata/grl-local-metadata.c:682 +#: src/local-metadata/grl-local-metadata.c:673 msgid "Cannot resolve any of the given keys" msgstr "Kan inte slå upp någon av de givna nycklarna" -#: src/local-metadata/grl-local-metadata.c:686 +#: src/local-metadata/grl-local-metadata.c:677 msgid "A GIO supported URL for images is required" msgstr "En GIO-stödd URL för bilder krävs" -#: src/magnatune/grl-magnatune.c:128 +#: src/magnatune/grl-magnatune.c:123 msgid "Genres" msgstr "Genrer" -#: src/magnatune/grl-magnatune.c:136 +#: src/magnatune/grl-magnatune.c:131 msgid "A source for browsing music" msgstr "En källa för att bläddra bland musik" -#: src/magnatune/grl-magnatune.c:428 +#: src/magnatune/grl-magnatune.c:421 #, c-format msgid "Failed to get database from magnatune: %s" msgstr "Misslyckades med att hämta databas från magnatune: %s" -#: src/magnatune/grl-magnatune.c:458 +#: src/magnatune/grl-magnatune.c:451 #, c-format msgid "Failed to save database from magnatune: “%s”" msgstr "Misslyckades med att spara databas från magnatune: ”%s”" -#: src/magnatune/grl-magnatune.c:729 +#: src/magnatune/grl-magnatune.c:722 #, c-format msgid "Failed to get table from magnatune db: %s" msgstr "Misslyckades med att hämta tabell från magnatunedatabasen: %s" -#: src/magnatune/grl-magnatune.c:745 +#: src/magnatune/grl-magnatune.c:738 #, c-format msgid "Fail before returning media to user: %s" msgstr "Misslyckas innan media överlämnas till användare: %s" -#: src/metadata-store/grl-metadata-store.c:45 +#: src/metadata-store/grl-metadata-store.c:40 msgid "Metadata Store" msgstr "Metadata-lager" -#: src/metadata-store/grl-metadata-store.c:46 +#: src/metadata-store/grl-metadata-store.c:41 msgid "A plugin for storing extra metadata information" msgstr "En insticksmodul för att lagra extra metadata-information" -#: src/metadata-store/grl-metadata-store.c:605 -#: src/metadata-store/grl-metadata-store.c:624 -#: src/metadata-store/grl-metadata-store.c:836 +#: src/metadata-store/grl-metadata-store.c:598 +#: src/metadata-store/grl-metadata-store.c:617 +#: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" msgstr "Misslyckades med att uppdatera metadata: %s" -#: src/metadata-store/grl-metadata-store.c:606 +#: src/metadata-store/grl-metadata-store.c:599 msgid "specified keys are not writable" -msgstr "Angivna nycklar är inte skrivbara" +msgstr "angivna nycklar är inte skrivbara" -#: src/metadata-store/grl-metadata-store.c:646 +#: src/metadata-store/grl-metadata-store.c:639 msgid "Failed to update metadata" msgstr "Misslyckades med att uppdatera metadata" -#: src/metadata-store/grl-metadata-store.c:792 -#: src/metadata-store/grl-metadata-store.c:837 +#: src/metadata-store/grl-metadata-store.c:785 +#: src/metadata-store/grl-metadata-store.c:830 msgid "“source-id” not available" msgstr "”source-id” är inte tillgängligt" -#: src/metadata-store/grl-metadata-store.c:812 +#: src/metadata-store/grl-metadata-store.c:805 msgid "Failed to resolve" msgstr "Uppslagning misslyckades" -#: src/metadata-store/grl-metadata-store.c:949 -#: src/metadata-store/grl-metadata-store.c:986 src/raitv/grl-raitv.c:432 -#: src/shoutcast/grl-shoutcast.c:756 src/vimeo/grl-vimeo.c:547 +#: src/metadata-store/grl-metadata-store.c:942 +#: src/metadata-store/grl-metadata-store.c:979 src/raitv/grl-raitv.c:423 +#: src/shoutcast/grl-shoutcast.c:749 src/vimeo/grl-vimeo.c:540 #, c-format msgid "Failed to search: %s" msgstr "Sökning misslyckades: %s" @@ -348,50 +350,50 @@ msgid "A source for browsing optical media" msgstr "En källa för att bläddra på optiskt media" -#: src/podcasts/grl-podcasts.c:153 +#: src/podcasts/grl-podcasts.c:148 msgid "A source for browsing podcasts" msgstr "En källa för att bläddra bland poddsändningar" -#: src/podcasts/grl-podcasts.c:762 src/podcasts/grl-podcasts.c:782 +#: src/podcasts/grl-podcasts.c:759 src/podcasts/grl-podcasts.c:779 #, c-format msgid "Failed to get podcast streams: %s" msgstr "Misslyckades med att hämta strömmar för poddsändning: %s" -#: src/podcasts/grl-podcasts.c:1248 src/podcasts/grl-podcasts.c:1257 -#: src/podcasts/grl-podcasts.c:1267 +#: src/podcasts/grl-podcasts.c:1245 src/podcasts/grl-podcasts.c:1254 +#: src/podcasts/grl-podcasts.c:1264 msgid "Failed to parse content" msgstr "Misslyckades med att tolka innehåll" -#: src/podcasts/grl-podcasts.c:1302 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Misslyckades med att tolka innehåll för poddsändning" -#: src/podcasts/grl-podcasts.c:1457 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Misslyckades med att hämta information för poddsändning" -#: src/podcasts/grl-podcasts.c:1497 src/podcasts/grl-podcasts.c:1517 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Misslyckades med att hämta poddsändnings-förteckning: %s" -#: src/podcasts/grl-podcasts.c:1570 src/podcasts/grl-podcasts.c:1585 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Misslyckades med att hämta metadata-ström för poddsändning" -#: src/podcasts/grl-podcasts.c:1623 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Misslyckades med att hämta metadata för poddsändning" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "Kan inte skapa behållare. Endast flöden accepteras" -#: src/podcasts/grl-podcasts.c:1812 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "URL krävs" -#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:78 +#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:73 msgid "Most Popular" msgstr "Populärast" @@ -403,217 +405,226 @@ msgid "A source for browsing and searching Rai.tv videos" msgstr "En källa för att bläddra och söka bland filmer på Rai.tv" -#: src/raitv/grl-raitv.c:171 +#: src/raitv/grl-raitv.c:164 msgid "All" msgstr "Alla" -#: src/raitv/grl-raitv.c:172 +#: src/raitv/grl-raitv.c:165 msgid "Black and White" msgstr "Svartvita" -#: src/raitv/grl-raitv.c:173 +#: src/raitv/grl-raitv.c:166 msgid "Cinema" msgstr "Bio" -#: src/raitv/grl-raitv.c:174 +#: src/raitv/grl-raitv.c:167 msgid "Comedians" msgstr "Komiker" -#: src/raitv/grl-raitv.c:175 +#: src/raitv/grl-raitv.c:168 msgid "Chronicle" msgstr "Krönikor" -#: src/raitv/grl-raitv.c:176 +#: src/raitv/grl-raitv.c:169 msgid "Culture" msgstr "Kultur" -#: src/raitv/grl-raitv.c:177 +#: src/raitv/grl-raitv.c:170 msgid "Economy" msgstr "Ekonomi" -#: src/raitv/grl-raitv.c:178 +#: src/raitv/grl-raitv.c:171 msgid "Fiction" msgstr "Fiktion" -#: src/raitv/grl-raitv.c:179 +#: src/raitv/grl-raitv.c:172 msgid "Junior" msgstr "Ungdom" -#: src/raitv/grl-raitv.c:180 +#: src/raitv/grl-raitv.c:173 msgid "Investigations" msgstr "Granskningar" -#: src/raitv/grl-raitv.c:181 +#: src/raitv/grl-raitv.c:174 msgid "Interviews" msgstr "Intervjuer" -#: src/raitv/grl-raitv.c:182 +#: src/raitv/grl-raitv.c:175 msgid "Music" msgstr "Musik" -#: src/raitv/grl-raitv.c:183 +#: src/raitv/grl-raitv.c:176 msgid "News" msgstr "Nyheter" -#: src/raitv/grl-raitv.c:184 +#: src/raitv/grl-raitv.c:177 msgid "Health" msgstr "Hälsa" -#: src/raitv/grl-raitv.c:185 +#: src/raitv/grl-raitv.c:178 msgid "Satire" msgstr "Satir" -#: src/raitv/grl-raitv.c:187 +#: src/raitv/grl-raitv.c:180 msgid "Society" msgstr "Samhälle" -#: src/raitv/grl-raitv.c:188 +#: src/raitv/grl-raitv.c:181 msgid "Show" msgstr "Föreställning" -#: src/raitv/grl-raitv.c:189 +#: src/raitv/grl-raitv.c:182 msgid "Sport" msgstr "Sport" -#: src/raitv/grl-raitv.c:190 +#: src/raitv/grl-raitv.c:183 msgid "History" msgstr "Historia" -#: src/raitv/grl-raitv.c:191 +#: src/raitv/grl-raitv.c:184 msgid "Politics" msgstr "Politik" -#: src/raitv/grl-raitv.c:192 +#: src/raitv/grl-raitv.c:185 msgid "Leisure" msgstr "Fritid" -#: src/raitv/grl-raitv.c:193 +#: src/raitv/grl-raitv.c:186 msgid "Travel" msgstr "Resor" -#: src/raitv/grl-raitv.c:625 +#: src/raitv/grl-raitv.c:616 #, c-format msgid "Failed to browse: %s" msgstr "Bläddring misslyckades: %s" -#: src/shoutcast/grl-shoutcast.c:65 +#: src/shoutcast/grl-shoutcast.c:60 msgid "A source for browsing SHOUTcast radios" msgstr "En källa för att bläddra bland SHOUTcast-radiosändningar" -#: src/shoutcast/grl-shoutcast.c:462 +#: src/shoutcast/grl-shoutcast.c:455 #, c-format msgid "Cannot find media %s" msgstr "Kan inte hitta media %s" -#: src/shoutcast/grl-shoutcast.c:757 src/vimeo/grl-vimeo.c:548 +#: src/shoutcast/grl-shoutcast.c:750 src/vimeo/grl-vimeo.c:541 msgid "non-NULL search text is required" msgstr "icke-NULL söktext krävs" -#: src/thetvdb/grl-thetvdb.c:98 +#: src/thetvdb/grl-thetvdb.c:93 msgid "A source for fetching metadata of television shows" msgstr "En källa för att hämta metadata för tv-program" -#: src/tmdb/grl-tmdb.c:1004 +#: src/tmdb/grl-tmdb.c:998 msgid "Remote data does not contain valid identifier" msgstr "Fjärrdata innehåller ingen giltig identifierare" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Sökfråga misslyckades: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Misslyckades med att hämta media från uri: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Tom sökfråga" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format msgid "ID “%s” is not known in this source" msgstr "ID:t ”%s” är inte känt i denna källa" +#: src/tracker3/grl-tracker-source-priv.h:47 +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "En insticksmodul för att söka efter multimediainnehåll via Tracker3" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "En insticksmodul för att söka efter multimediainnehåll via Tracker" -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -msgid "Removable — %s" -msgstr "Flyttbar — %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Lokala filer" - -#: src/vimeo/grl-vimeo.c:56 +#: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "En källa för att bläddra och söka bland filmer på Vimeo" -#: src/youtube/grl-youtube.c:60 +#: src/youtube/grl-youtube.c:55 msgid "Standard feeds" msgstr "Standardflöden" -#: src/youtube/grl-youtube.c:63 +#: src/youtube/grl-youtube.c:58 msgid "Categories" msgstr "Kategorier" -#: src/youtube/grl-youtube.c:69 +#: src/youtube/grl-youtube.c:64 msgid "Top Rated" msgstr "Högst betyg" -#: src/youtube/grl-youtube.c:72 +#: src/youtube/grl-youtube.c:67 msgid "Top Favorites" msgstr "Populärast" -#: src/youtube/grl-youtube.c:75 +#: src/youtube/grl-youtube.c:70 msgid "Most Viewed" msgstr "Mest sedda" -#: src/youtube/grl-youtube.c:81 +#: src/youtube/grl-youtube.c:76 msgid "Most Recent" msgstr "Senaste" -#: src/youtube/grl-youtube.c:84 +#: src/youtube/grl-youtube.c:79 msgid "Most Discussed" msgstr "Mest omtalade" -#: src/youtube/grl-youtube.c:87 +#: src/youtube/grl-youtube.c:82 msgid "Most Linked" msgstr "Mest länkade" -#: src/youtube/grl-youtube.c:90 +#: src/youtube/grl-youtube.c:85 msgid "Most Responded" msgstr "Mest besvarade" -#: src/youtube/grl-youtube.c:93 +#: src/youtube/grl-youtube.c:88 msgid "Recently Featured" msgstr "Senaste presenterade" -#: src/youtube/grl-youtube.c:96 +#: src/youtube/grl-youtube.c:91 msgid "Watch On Mobile" msgstr "Titta på mobil" -#: src/youtube/grl-youtube.c:115 +#: src/youtube/grl-youtube.c:110 msgid "A source for browsing and searching YouTube videos" msgstr "En källa för att bläddra och söka bland filmer på YouTube" -#: src/youtube/grl-youtube.c:863 +#: src/youtube/grl-youtube.c:856 msgid "Failed to get feed" msgstr "Misslyckades med att hämta flöde" -#: src/youtube/grl-youtube.c:1040 src/youtube/grl-youtube.c:1428 +#: src/youtube/grl-youtube.c:1033 src/youtube/grl-youtube.c:1421 #, c-format msgid "Invalid feed identifier %s" msgstr "Flödet har en ogiltig identifierare %s" +#~ msgid "Removable — %s" +#~ msgstr "Flyttbar — %s" + +#~ msgid "Local files" +#~ msgstr "Lokala filer" + #~ msgid "Album art Provider from Last.FM" #~ msgstr "Skivomslagsleverantör för Last.FM" diff -Nru grilo-plugins-0.3.11/po/tr.po grilo-plugins-0.3.12/po/tr.po --- grilo-plugins-0.3.11/po/tr.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/tr.po 2020-09-03 05:36:44.363468000 +0000 @@ -4,14 +4,14 @@ # Simge Sezgin , 2015. # Necdet Yücel , 2015. # Muhammet Kara , 2014, 2015. -# Emin Tufan Çetin , 2017, 2018. +# Emin Tufan Çetin , 2017, 2018, 2020. # msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" -"POT-Creation-Date: 2018-08-01 17:25+0000\n" -"PO-Revision-Date: 2018-08-05 01:11+0300\n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-30 12:13+0300\n" "Last-Translator: Emin Tufan Çetin \n" "Language-Team: Türkçe \n" "Language: tr\n" @@ -28,7 +28,7 @@ #: src/bookmarks/grl-bookmarks.c:61 msgid "A source for organizing media bookmarks" -msgstr "Ortam imlerini düzenlemek için bir kaynak" +msgstr "Ortam imlerini düzenlemek için kaynak" #: src/bookmarks/grl-bookmarks.c:427 msgid "Failed to get bookmark metadata" @@ -45,79 +45,75 @@ msgid "Failed to remove: %s" msgstr "Kaldırma başarısız oldu: %s" -#: src/bookmarks/grl-bookmarks.c:766 src/podcasts/grl-podcasts.c:928 -#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1806 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Kaydetme başarısız oldu: %s" -#: src/bookmarks/grl-bookmarks.c:840 src/bookmarks/grl-bookmarks.c:875 -#: src/bookmarks/grl-bookmarks.c:906 src/bookmarks/grl-bookmarks.c:964 -#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1662 -#: src/podcasts/grl-podcasts.c:1706 src/podcasts/grl-podcasts.c:1740 -#: src/podcasts/grl-podcasts.c:1775 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Veri tabanı bağlantısı yok" #: src/chromaprint/grl-chromaprint.c:41 msgid "A plugin to get metadata using gstreamer framework" -msgstr "Gstreamer çerçevesini kullanarak üst veriyi alan bir eklenti" +msgstr "Gstreamer çerçevesini kullanarak üst veriyi alan eklenti" #: src/dleyna/grl-dleyna-source.c:34 #, c-format -#| msgid "A source for browsing the DLNA server '%s'" msgid "A source for browsing the DLNA server “%s”" -msgstr "“%s” DLNA sunucusunu taramak için bir kaynak" +msgstr "“%s” DLNA sunucusunu taramak için kaynak" -#: src/dleyna/grl-dleyna-source.c:273 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "Karşıya yükleme başarısız, hedef kaynak yok" -#: src/dleyna/grl-dleyna-source.c:375 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format -#| msgid "Upload failed, '%s', transferred %lu of %lu bytes" msgid "Upload failed, “%s”, transferred %lu of %lu bytes" msgstr "Karşıya yükleme başarısız, “%s”, %lu / %lu bayt aktarıldı" -#: src/dleyna/grl-dleyna-source.c:880 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" msgstr "Öge özellikleri alınamadı (BrowseObjects hatası %d: %s)" -#: src/dleyna/grl-dleyna-source.c:1519 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" msgstr "Karşıya yükleme başarısız, aktarılan ortam nesnesinin URLʼsi eksik" -#: src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format -#| msgid "A source for browsing the DAAP server '%s'" msgid "A source for browsing the DAAP server “%s”" -msgstr "“%s” DAAP sunucusunu taramak için bir kaynak" +msgstr "“%s” DAAP sunucusunu taramak için kaynak" -#: src/dmap/grl-daap-db.c:62 src/jamendo/grl-jamendo.c:788 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 #: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "Albümler" -#: src/dmap/grl-daap-db.c:64 src/jamendo/grl-jamendo.c:777 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 #: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "Sanatçılar" -#: src/dmap/grl-daap-db.c:292 src/jamendo/grl-jamendo.c:1115 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 #: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" msgstr "Geçersiz kap tanımlayıcısı %s" -#: src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format -#| msgid "A source for browsing the DPAP server '%s'" msgid "A source for browsing the DPAP server “%s”" -msgstr "“%s” DPAP sunucusunu taramak için bir kaynak" +msgstr "“%s” DPAP sunucusunu taramak için kaynak" -#: src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "Fotoğraflar" @@ -127,35 +123,33 @@ #: src/filesystem/grl-filesystem.c:59 msgid "A source for browsing the filesystem" -msgstr "Dosya sistemini taramak için bir kaynak" +msgstr "Dosya sistemini taramak için kaynak" -#: src/filesystem/grl-filesystem.c:1170 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "%s dosyası yok" -#: src/filesystem/grl-filesystem.c:1248 src/youtube/grl-youtube.c:1505 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "%s üzerinde ortam alınamıyor" #: src/flickr/grl-flickr.c:58 msgid "A source for browsing and searching Flickr photos" -msgstr "Flickr fotoğraflarını aramak ve taramak için bir kaynak" +msgstr "Flickr fotoğraflarını aramak ve taramak için kaynak" #. "%s" is a full user name, like "John Doe" #: src/flickr/grl-flickr.c:62 #, c-format -#| msgid "%s's Flickr" msgid "%s’s Flickr" msgstr "%s Flickrʼı" #. "%s" is a full user name, like "John Doe" #: src/flickr/grl-flickr.c:64 #, c-format -#| msgid "A source for browsing and searching %s's flickr photos" msgid "A source for browsing and searching %s’s flickr photos" -msgstr "%s flickr fotoğraflarını aramak ve taramak için bir kaynak" +msgstr "%s flickr fotoğraflarını aramak ve taramak için kaynak" #: src/freebox/grl-freebox.c:48 msgid "Freebox TV" @@ -163,7 +157,7 @@ #: src/freebox/grl-freebox.c:49 msgid "A source for browsing Freebox TV channels" -msgstr "Freebox TV kanallarını taramak için bir kaynak" +msgstr "Freebox TV kanallarını taramak için kaynak" #: src/freebox/grl-freebox.c:52 msgid "Freebox Radio" @@ -171,7 +165,7 @@ #: src/freebox/grl-freebox.c:53 msgid "A source for browsing Freebox radio channels" -msgstr "Freebox radyo kanallarını taramak için bir kaynak" +msgstr "Freebox radyo kanallarını taramak için kaynak" #: src/gravatar/grl-gravatar.c:46 msgid "Avatar provider from Gravatar" @@ -183,7 +177,7 @@ #: src/jamendo/grl-jamendo.c:91 msgid "A source for browsing and searching Jamendo music" -msgstr "Jamendo music üzerinde aramak ve taramak için bir kaynak" +msgstr "Jamendo music üzerinde aramak ve taramak için kaynak" #: src/jamendo/grl-jamendo.c:149 msgid "Albums of the week" @@ -215,7 +209,7 @@ msgstr "Yanıt ayrıştırılamadı" #: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 -#: src/podcasts/grl-podcasts.c:1363 src/shoutcast/grl-shoutcast.c:417 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "Boş yanıt" @@ -247,7 +241,6 @@ #: src/jamendo/grl-jamendo.c:1280 #, c-format -#| msgid "Malformed query \"%s\"" msgid "Malformed query “%s”" msgstr "Kusurlu sorgu “%s”" @@ -257,10 +250,11 @@ #: src/local-metadata/grl-local-metadata.c:43 msgid "A source providing locally available metadata" -msgstr "Yerel olarak kullanılabilir üst veriyi sağlayan bir kaynak" +msgstr "Yerel olarak kullanılabilir üst veriyi sağlayan kaynak" #: src/local-metadata/grl-local-metadata.c:381 #: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 #: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" @@ -272,7 +266,7 @@ #: src/local-metadata/grl-local-metadata.c:677 msgid "A GIO supported URL for images is required" -msgstr "Görüntüler için bir GIO destekli URL gereklidir" +msgstr "Görüntüler için GIO destekli URL gereklidir" #: src/magnatune/grl-magnatune.c:123 msgid "Genres" @@ -280,7 +274,7 @@ #: src/magnatune/grl-magnatune.c:131 msgid "A source for browsing music" -msgstr "Müzikleri taramak için bir kaynak" +msgstr "Müzikleri taramak için kaynak" #: src/magnatune/grl-magnatune.c:421 #, c-format @@ -289,7 +283,6 @@ #: src/magnatune/grl-magnatune.c:451 #, c-format -#| msgid "Failed to save database from magnatune - '%s'" msgid "Failed to save database from magnatune: “%s”" msgstr "Magnatuneʼden veri tabanı kaydedilemedi: “%s”" @@ -309,11 +302,12 @@ #: src/metadata-store/grl-metadata-store.c:41 msgid "A plugin for storing extra metadata information" -msgstr "Fazladan üst veri bilgisi depolayan bir eklenti" +msgstr "Ek üst veri bilgisi depolayan eklenti" #: src/metadata-store/grl-metadata-store.c:598 #: src/metadata-store/grl-metadata-store.c:617 #: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 #: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" @@ -329,7 +323,6 @@ #: src/metadata-store/grl-metadata-store.c:785 #: src/metadata-store/grl-metadata-store.c:830 -#| msgid "\"source-id\" not available" msgid "“source-id” not available" msgstr "“source-id” kullanılabilir değil" @@ -350,7 +343,7 @@ #: src/opensubtitles/grl-opensubtitles.c:41 msgid "A source providing a list of subtitles for a video" -msgstr "Bir video için altyazıların listesini sunan bir kaynak" +msgstr "Video için alt yazıların listesini sunan kaynak" #: src/optical-media/grl-optical-media.c:44 msgid "Optical Media" @@ -358,11 +351,11 @@ #: src/optical-media/grl-optical-media.c:45 msgid "A source for browsing optical media" -msgstr "Optik ortamı taramak için bir kaynak" +msgstr "Optik ortamı taramak için kaynak" #: src/podcasts/grl-podcasts.c:148 msgid "A source for browsing podcasts" -msgstr "İnternet radyolarını taramak için bir kaynak" +msgstr "İnternet radyolarını taramak için kaynak" #: src/podcasts/grl-podcasts.c:759 src/podcasts/grl-podcasts.c:779 #, c-format @@ -374,32 +367,32 @@ msgid "Failed to parse content" msgstr "İçeriği ayrıştırma başarısız" -#: src/podcasts/grl-podcasts.c:1297 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "İnternet radyosu içeriğini ayrıştırma başarısız" -#: src/podcasts/grl-podcasts.c:1452 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "İnternet radyosu bilgisi alma başarısız" -#: src/podcasts/grl-podcasts.c:1492 src/podcasts/grl-podcasts.c:1512 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "İnternet radyosu listesi alma başarısız: %s" -#: src/podcasts/grl-podcasts.c:1565 src/podcasts/grl-podcasts.c:1580 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "İnternet radyosu akış üst verisini alma başarısız" -#: src/podcasts/grl-podcasts.c:1618 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "İnternet radyosu üst verisi alma başarısız" -#: src/podcasts/grl-podcasts.c:1802 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" -msgstr "Kaplar oluşturulamıyor. Sadece beslemeler kabul edildi" +msgstr "Kaplar oluşturulamıyor. Yalnızca beslemeler kabul edildi" -#: src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "URL gerekli" @@ -413,7 +406,7 @@ #: src/raitv/grl-raitv.c:93 msgid "A source for browsing and searching Rai.tv videos" -msgstr "Rai.tv videolarını aramak ve taramak için bir kaynak" +msgstr "Rai.tv videolarını aramak ve taramak için kaynak" #: src/raitv/grl-raitv.c:164 msgid "All" @@ -510,7 +503,7 @@ #: src/shoutcast/grl-shoutcast.c:60 msgid "A source for browsing SHOUTcast radios" -msgstr "SHOUTcast radyolarını taramak için bir kaynak" +msgstr "SHOUTcast radyolarını taramak için kaynak" #: src/shoutcast/grl-shoutcast.c:455 #, c-format @@ -523,53 +516,54 @@ #: src/thetvdb/grl-thetvdb.c:93 msgid "A source for fetching metadata of television shows" -msgstr "Televizyon gösterilerinin üst verisini getirmek için bir kaynak" +msgstr "Televizyon gösterilerinin üst verisini getirmek için kaynak" #: src/tmdb/grl-tmdb.c:998 msgid "Remote data does not contain valid identifier" -msgstr "Uzak veri geçerli bir tanımlayıcı içermiyor" +msgstr "Uzak veri geçerli tanımlayıcı içermiyor" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 #: src/tracker/grl-tracker-source-api.c:401 #: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Sorgulama başarısız: %s" +#: src/tracker3/grl-tracker-source-api.c:418 #: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "Şu uri üzerinden ortam getirme başarısız: %s" -#: src/tracker/grl-tracker-source-api.c:806 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Boş sorgu" -#: src/tracker/grl-tracker-source-api.c:1088 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 #, c-format -#| msgid "ID '%s' is not known in this source" msgid "ID “%s” is not known in this source" msgstr "“%s” IDʼsi bu kaynakta bilinmiyor" +#: src/tracker3/grl-tracker-source-priv.h:47 +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "Tracker3 kullanarak çoklu ortam içeriği aramak için eklenti" + #: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" -msgstr "Tracker kullanarak çoklu ortam içeriği aramak için bir eklenti" - -#: src/tracker/grl-tracker-utils.c:738 -#, c-format -#| msgid "Removable - %s" -msgid "Removable — %s" -msgstr "Kaldırılabilir — %s" - -#: src/tracker/grl-tracker-utils.c:750 -msgid "Local files" -msgstr "Yerel dosyalar" +msgstr "Tracker kullanarak çoklu ortam içeriği aramak için eklenti" #: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" -msgstr "Vimeo videolarını aramak ve taramak için bir kaynak" +msgstr "Vimeo videolarını aramak ve taramak için kaynak" #: src/youtube/grl-youtube.c:55 msgid "Standard feeds" @@ -617,7 +611,7 @@ #: src/youtube/grl-youtube.c:110 msgid "A source for browsing and searching YouTube videos" -msgstr "Youtube videolarını taramak ve aramak için bir kaynak" +msgstr "Youtube videolarını taramak ve aramak için kaynak" #: src/youtube/grl-youtube.c:856 msgid "Failed to get feed" @@ -628,6 +622,13 @@ msgid "Invalid feed identifier %s" msgstr "Geçersiz besleme tanımlayıcısı %s" +#~| msgid "Removable - %s" +#~ msgid "Removable — %s" +#~ msgstr "Kaldırılabilir — %s" + +#~ msgid "Local files" +#~ msgstr "Yerel dosyalar" + #~ msgid "Apple Movie Trailers" #~ msgstr "Apple Film Fragmanları" diff -Nru grilo-plugins-0.3.11/po/uk.po grilo-plugins-0.3.12/po/uk.po --- grilo-plugins-0.3.11/po/uk.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/uk.po 2020-09-03 05:36:44.364467900 +0000 @@ -1,614 +1,624 @@ # Ukrainian translation for grilo-plugins. # Copyright (C) 2014 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. -# Mykola Tkach , 2014. # +# Mykola Tkach , 2014. +# Yuri Chornoivan , 2020. msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" -"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=grilo-plugins&keywords=I18N+L10N&component=general\n" -"POT-Creation-Date: 2014-02-05 09:44+0000\n" -"PO-Revision-Date: 2014-02-06 19:02+0300\n" -"Last-Translator: Mykola Tkach \n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-24 20:10+0300\n" +"Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" - -#: ../src/apple-trailers/grl-apple-trailers.c:55 -msgid "Apple Movie Trailers" -msgstr "Трейлери до фільмів Apple" - -#: ../src/apple-trailers/grl-apple-trailers.c:56 -msgid "A plugin for browsing Apple Movie Trailers" -msgstr "Додаток огляду трейлерів до фільмів Apple" - -#: ../src/apple-trailers/grl-apple-trailers.c:462 -#: ../src/jamendo/grl-jamendo.c:336 -#: ../src/jamendo/grl-jamendo.c:696 -#: ../src/shoutcast/grl-shoutcast.c:416 -#: ../src/shoutcast/grl-shoutcast.c:472 -msgid "Failed to parse response" -msgstr "Не вдалося розібрати відповідь" - -#: ../src/apple-trailers/grl-apple-trailers.c:470 -#: ../src/jamendo/grl-jamendo.c:344 -#: ../src/jamendo/grl-jamendo.c:351 -#: ../src/podcasts/grl-podcasts.c:1360 -#: ../src/shoutcast/grl-shoutcast.c:424 -msgid "Empty response" -msgstr "Порожня відповідь" - -#: ../src/apple-trailers/grl-apple-trailers.c:529 -#: ../src/jamendo/grl-jamendo.c:666 -#: ../src/lastfm-albumart/grl-lastfm-albumart.c:251 -#: ../src/shoutcast/grl-shoutcast.c:565 -#, c-format -msgid "Failed to connect: %s" -msgstr "Не вдалося під'єднатися: %s" +"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" +"%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"X-Generator: Lokalize 20.11.70\n" -#: ../src/bliptv/grl-bliptv.c:60 -msgid "A source for browsing and searching Blip.tv videos" -msgstr "Джерело для огляду та пошуку відео у Blip.tv" - -#: ../src/bookmarks/grl-bookmarks.c:119 +#: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" msgstr "Закладки" -#: ../src/bookmarks/grl-bookmarks.c:120 +#: src/bookmarks/grl-bookmarks.c:61 msgid "A source for organizing media bookmarks" msgstr "Джерело для організування закладок до медіаконтенту" -#: ../src/bookmarks/grl-bookmarks.c:441 -#: ../src/bookmarks/grl-bookmarks.c:456 +#: src/bookmarks/grl-bookmarks.c:427 msgid "Failed to get bookmark metadata" msgstr "Не вдалося отримати метадані закладки" -#: ../src/bookmarks/grl-bookmarks.c:486 -#: ../src/bookmarks/grl-bookmarks.c:506 +#: src/bookmarks/grl-bookmarks.c:457 src/bookmarks/grl-bookmarks.c:474 #, c-format -msgid "Failed to get bookmarks list: %s" -msgstr "Не вдалося отримати перелік закладок: %s" +msgid "Failed to find bookmarks: %s" +msgstr "Не вдалося знайти закладки: %s" -#: ../src/bookmarks/grl-bookmarks.c:592 -#: ../src/podcasts/grl-podcasts.c:817 -#: ../src/podcasts/grl-podcasts.c:849 -#: ../src/podcasts/grl-podcasts.c:881 +#: src/bookmarks/grl-bookmarks.c:626 src/podcasts/grl-podcasts.c:823 +#: src/podcasts/grl-podcasts.c:855 src/podcasts/grl-podcasts.c:887 #, c-format msgid "Failed to remove: %s" msgstr "Не вдалося вилучити: %s" -#: ../src/bookmarks/grl-bookmarks.c:660 -#: ../src/bookmarks/grl-bookmarks.c:718 -#: ../src/podcasts/grl-podcasts.c:922 -#: ../src/podcasts/grl-podcasts.c:955 -#: ../src/podcasts/grl-podcasts.c:1804 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "Не вдалося зберегти: %s" -#: ../src/bookmarks/grl-bookmarks.c:772 -#: ../src/bookmarks/grl-bookmarks.c:807 -#: ../src/bookmarks/grl-bookmarks.c:839 -#: ../src/bookmarks/grl-bookmarks.c:901 -#: ../src/metadata-store/grl-metadata-store.c:852 -#: ../src/podcasts/grl-podcasts.c:1660 -#: ../src/podcasts/grl-podcasts.c:1704 -#: ../src/podcasts/grl-podcasts.c:1738 -#: ../src/podcasts/grl-podcasts.c:1773 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "Немає з'єднання з базою даних" -#: ../src/dmap/grl-dmap.c:51 +#: src/chromaprint/grl-chromaprint.c:41 +msgid "A plugin to get metadata using gstreamer framework" +msgstr "Додаток для отримання метаданих за допомогою бібліотек gstreamer" + +#: src/dleyna/grl-dleyna-source.c:34 +#, c-format +msgid "A source for browsing the DLNA server “%s”" +msgstr "Джерело для огляду сервера DLNA «%s»" + +#: src/dleyna/grl-dleyna-source.c:279 +msgid "Upload failed, target source destroyed" +msgstr "Не вдалося вивантажити, джерело призначення було знищено" + +#: src/dleyna/grl-dleyna-source.c:382 +#, c-format +msgid "Upload failed, “%s”, transferred %lu of %lu bytes" +msgstr "Не вдалося вивантажити, «%s», передано %lu з %lu байтів" + +#: src/dleyna/grl-dleyna-source.c:933 +#, c-format +msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" +msgstr "Не вдалося отримати властивості запису (помилка BrowseObjects %d: %s)" + +#: src/dleyna/grl-dleyna-source.c:1572 +#, c-format +msgid "Upload failed, URL missing on the media object to be transferred" +msgstr "" +"Не вдалося вивантажити, у мультимедійному об'єкті не вказано адреси для " +"перенесення даних" + +#: src/dmap/grl-daap.c:51 +#, c-format +msgid "A source for browsing the DAAP server “%s”" +msgstr "Джерело для огляду сервера DAAP «%s»" + +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 +#: src/magnatune/grl-magnatune.c:122 +msgid "Albums" +msgstr "Альбоми" + +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 +#: src/magnatune/grl-magnatune.c:121 +msgid "Artists" +msgstr "Виконавці" + +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 +#: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 +#, c-format +msgid "Invalid container identifier %s" +msgstr "Некоректний ідентифікатор контейнера %s" + +#: src/dmap/grl-dpap.c:51 #, c-format -msgid "A source for browsing the DMAP server '%s'" -msgstr "Джерело для огляду сервера DMAP «%s»" +msgid "A source for browsing the DPAP server “%s”" +msgstr "Джерело для огляду сервера DPAP «%s»" -#: ../src/filesystem/grl-filesystem.c:77 +#: src/dmap/grl-dpap-db.c:40 +msgid "Photos" +msgstr "Фотографії" + +#: src/filesystem/grl-filesystem.c:58 msgid "Filesystem" msgstr "Файлова система" -#: ../src/filesystem/grl-filesystem.c:78 +#: src/filesystem/grl-filesystem.c:59 msgid "A source for browsing the filesystem" msgstr "Джерело для огляду файлової системи" -#: ../src/filesystem/grl-filesystem.c:1343 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "Файл %s не існує" -#: ../src/filesystem/grl-filesystem.c:1420 -#: ../src/youtube/grl-youtube.c:1638 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "Не вдалося отримати медіаконтент з %s" -#: ../src/flickr/grl-flickr.c:63 +#: src/flickr/grl-flickr.c:58 msgid "A source for browsing and searching Flickr photos" msgstr "Джерело для огляду та пошуку фотографій Flickr" #. "%s" is a full user name, like "John Doe" -#: ../src/flickr/grl-flickr.c:67 +#: src/flickr/grl-flickr.c:62 #, c-format -msgid "%s's Flickr" +msgid "%s’s Flickr" msgstr "Flickr користувача %s" #. "%s" is a full user name, like "John Doe" -#: ../src/flickr/grl-flickr.c:69 +#: src/flickr/grl-flickr.c:64 #, c-format -msgid "A source for browsing and searching %s's flickr photos" +msgid "A source for browsing and searching %s’s flickr photos" msgstr "Джерело для огляду та пошуку фотографій flickr користувача %s" -#: ../src/gravatar/grl-gravatar.c:48 +#: src/freebox/grl-freebox.c:48 +msgid "Freebox TV" +msgstr "Телебачення Freebox" + +#: src/freebox/grl-freebox.c:49 +msgid "A source for browsing Freebox TV channels" +msgstr "Джерело для навігації каналами телебачення Freebox" + +#: src/freebox/grl-freebox.c:52 +msgid "Freebox Radio" +msgstr "Радіо Freebox" + +#: src/freebox/grl-freebox.c:53 +msgid "A source for browsing Freebox radio channels" +msgstr "Джерело для навігації радіоканалами Freebox" + +#: src/gravatar/grl-gravatar.c:46 msgid "Avatar provider from Gravatar" msgstr "Постачальник аватарів від Gravatar" -#: ../src/gravatar/grl-gravatar.c:49 +#: src/gravatar/grl-gravatar.c:47 msgid "A plugin to get avatars for artist and author fields" msgstr "Додаток отримання аватарів за полями «Виконавець» та «Автор»" -#: ../src/jamendo/grl-jamendo.c:93 +#: src/jamendo/grl-jamendo.c:91 msgid "A source for browsing and searching Jamendo music" msgstr "Джерело для огляду та пошуку музики Jamendo" -#: ../src/jamendo/grl-jamendo.c:149 +#: src/jamendo/grl-jamendo.c:149 msgid "Albums of the week" msgstr "Альбоми тижня" -#: ../src/jamendo/grl-jamendo.c:151 +#: src/jamendo/grl-jamendo.c:151 msgid "Tracks of the week" msgstr "Треки тижня" -#: ../src/jamendo/grl-jamendo.c:153 +#: src/jamendo/grl-jamendo.c:153 msgid "New releases" msgstr "Нові випуски" -#: ../src/jamendo/grl-jamendo.c:155 +#: src/jamendo/grl-jamendo.c:155 msgid "Top artists" msgstr "Верхівка виконавців" -#: ../src/jamendo/grl-jamendo.c:157 +#: src/jamendo/grl-jamendo.c:157 msgid "Top albums" msgstr "Верхівка альбомів" -#: ../src/jamendo/grl-jamendo.c:159 +#: src/jamendo/grl-jamendo.c:159 msgid "Top tracks" msgstr "Верхівка доріжок" -#: ../src/jamendo/grl-jamendo.c:774 -#: ../src/magnatune/grl-magnatune.c:120 -msgid "Artists" -msgstr "Виконавці" +#: src/jamendo/grl-jamendo.c:341 src/jamendo/grl-jamendo.c:701 +#: src/shoutcast/grl-shoutcast.c:409 src/shoutcast/grl-shoutcast.c:463 +msgid "Failed to parse response" +msgstr "Не вдалося розібрати відповідь" -#: ../src/jamendo/grl-jamendo.c:785 -#: ../src/magnatune/grl-magnatune.c:121 -msgid "Albums" -msgstr "Альбоми" +#: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 +msgid "Empty response" +msgstr "Порожня відповідь" + +#: src/jamendo/grl-jamendo.c:670 src/shoutcast/grl-shoutcast.c:551 +#, c-format +msgid "Failed to connect: %s" +msgstr "Не вдалося під'єднатися: %s" -#: ../src/jamendo/grl-jamendo.c:796 +#: src/jamendo/grl-jamendo.c:799 msgid "Feeds" msgstr "Канали" -#: ../src/jamendo/grl-jamendo.c:982 -#: ../src/jamendo/grl-jamendo.c:1027 -#: ../src/jamendo/grl-jamendo.c:1054 +#: src/jamendo/grl-jamendo.c:983 src/jamendo/grl-jamendo.c:1028 +#: src/jamendo/grl-jamendo.c:1055 #, c-format msgid "Invalid identifier %s" msgstr "Некоректний ідентифікатор %s" -#: ../src/jamendo/grl-jamendo.c:1041 -#: ../src/youtube/grl-youtube.c:1202 -#: ../src/youtube/grl-youtube.c:1345 -#: ../src/youtube/grl-youtube.c:1565 +#: src/jamendo/grl-jamendo.c:1042 src/youtube/grl-youtube.c:1097 +#: src/youtube/grl-youtube.c:1230 src/youtube/grl-youtube.c:1442 #, c-format msgid "Invalid category identifier %s" msgstr "Некоректний ідентифікатор категорії %s" -#: ../src/jamendo/grl-jamendo.c:1116 -#: ../src/jamendo/grl-jamendo.c:1191 -#: ../src/magnatune/grl-magnatune.c:829 -#, c-format -msgid "Invalid container identifier %s" -msgstr "Некоректний ідентифікатор контейнера %s" - -#: ../src/jamendo/grl-jamendo.c:1186 +#: src/jamendo/grl-jamendo.c:1221 #, c-format msgid "Failed to browse: %s is a track" msgstr "Не вдалося переглянути: %s — доріжка" -#: ../src/jamendo/grl-jamendo.c:1248 +#: src/jamendo/grl-jamendo.c:1280 #, c-format -msgid "Malformed query \"%s\"" +msgid "Malformed query “%s”" msgstr "Некоректно сформований запит «%s»" -#: ../src/lastfm-albumart/grl-lastfm-albumart.c:60 -msgid "Album art Provider from Last.FM" -msgstr "Постачальник обкладинок від Last.FM" - -#: ../src/lastfm-albumart/grl-lastfm-albumart.c:61 -msgid "A plugin for getting album arts using Last.FM as backend" -msgstr "Додаток отримання обкладинок через Last.FM" - -#: ../src/local-metadata/grl-local-metadata.c:42 +#: src/local-metadata/grl-local-metadata.c:42 msgid "Local Metadata Provider" msgstr "Постачальник локальних метаданих" -#: ../src/local-metadata/grl-local-metadata.c:43 +#: src/local-metadata/grl-local-metadata.c:43 msgid "A source providing locally available metadata" msgstr "Джерело, що постачає локально доступні метадані" -#: ../src/local-metadata/grl-local-metadata.c:481 -#: ../src/metadata-store/grl-metadata-store.c:760 -#: ../src/raitv/grl-raitv.c:869 -#: ../src/tracker/grl-tracker-source-api.c:460 +#: src/local-metadata/grl-local-metadata.c:381 +#: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 +#: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" msgstr "Не вдалося розв'язати: %s" -#: ../src/local-metadata/grl-local-metadata.c:1014 +#: src/local-metadata/grl-local-metadata.c:673 msgid "Cannot resolve any of the given keys" msgstr "Не вдалося розв'язати жодного з наданих ключів" -#: ../src/local-metadata/grl-local-metadata.c:1018 +#: src/local-metadata/grl-local-metadata.c:677 msgid "A GIO supported URL for images is required" msgstr "Для зображень потрібна URL з підтримкою GIO" -#: ../src/magnatune/grl-magnatune.c:122 +#: src/magnatune/grl-magnatune.c:123 msgid "Genres" msgstr "Жанри" -#: ../src/magnatune/grl-magnatune.c:130 +#: src/magnatune/grl-magnatune.c:131 msgid "A source for browsing music" msgstr "Джерело для огляду музики" -#: ../src/magnatune/grl-magnatune.c:406 +#: src/magnatune/grl-magnatune.c:421 #, c-format msgid "Failed to get database from magnatune: %s" msgstr "Не вдалося отримати базу даних з magnatune: %s" -#: ../src/magnatune/grl-magnatune.c:436 +#: src/magnatune/grl-magnatune.c:451 #, c-format -msgid "Failed to save database from magnatune - '%s'" +msgid "Failed to save database from magnatune: “%s”" msgstr "Не вдалося зберегти базу даних з magnatune — «%s»" -#: ../src/magnatune/grl-magnatune.c:684 +#: src/magnatune/grl-magnatune.c:722 #, c-format msgid "Failed to get table from magnatune db: %s" msgstr "Не вдалося отримати таблицю з бази даних magnatune: %s" -#: ../src/magnatune/grl-magnatune.c:700 +#: src/magnatune/grl-magnatune.c:738 #, c-format msgid "Fail before returning media to user: %s" msgstr "Трапилася помилка перед поверненням медіаконтента користувачу: %s" -#: ../src/metadata-store/grl-metadata-store.c:47 +#: src/metadata-store/grl-metadata-store.c:40 msgid "Metadata Store" msgstr "Сховище метаданих" -#: ../src/metadata-store/grl-metadata-store.c:48 +#: src/metadata-store/grl-metadata-store.c:41 msgid "A plugin for storing extra metadata information" msgstr "Додаток зберігання додаткової інформації метаданих" -#: ../src/metadata-store/grl-metadata-store.c:574 -#: ../src/metadata-store/grl-metadata-store.c:593 -#: ../src/metadata-store/grl-metadata-store.c:805 -#: ../src/tracker/grl-tracker-source-api.c:511 +#: src/metadata-store/grl-metadata-store.c:598 +#: src/metadata-store/grl-metadata-store.c:617 +#: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 +#: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" msgstr "Не вдалося оновити метадані: %s" -#: ../src/metadata-store/grl-metadata-store.c:575 +#: src/metadata-store/grl-metadata-store.c:599 msgid "specified keys are not writable" msgstr "вказані ключі не записувані" -#: ../src/metadata-store/grl-metadata-store.c:615 +#: src/metadata-store/grl-metadata-store.c:639 msgid "Failed to update metadata" msgstr "Не вдалося оновити метадані" -#: ../src/metadata-store/grl-metadata-store.c:761 -#: ../src/metadata-store/grl-metadata-store.c:806 -msgid "\"source-id\" not available" +#: src/metadata-store/grl-metadata-store.c:785 +#: src/metadata-store/grl-metadata-store.c:830 +msgid "“source-id” not available" msgstr "«source-id» недоступний" -#: ../src/metadata-store/grl-metadata-store.c:781 -#: ../src/upnp/grl-upnp.c:1433 +#: src/metadata-store/grl-metadata-store.c:805 msgid "Failed to resolve" msgstr "Не вдалося розв'язати" -#: ../src/metadata-store/grl-metadata-store.c:920 -#: ../src/metadata-store/grl-metadata-store.c:957 -#: ../src/raitv/grl-raitv.c:420 -#: ../src/shoutcast/grl-shoutcast.c:759 -#: ../src/vimeo/grl-vimeo.c:534 +#: src/metadata-store/grl-metadata-store.c:942 +#: src/metadata-store/grl-metadata-store.c:979 src/raitv/grl-raitv.c:423 +#: src/shoutcast/grl-shoutcast.c:749 src/vimeo/grl-vimeo.c:540 #, c-format msgid "Failed to search: %s" msgstr "Не вдалося знайти: %s" -#: ../src/optical-media/grl-optical-media.c:46 +#: src/opensubtitles/grl-opensubtitles.c:40 +msgid "OpenSubtitles Provider" +msgstr "Надавач OpenSubtitles" + +#: src/opensubtitles/grl-opensubtitles.c:41 +msgid "A source providing a list of subtitles for a video" +msgstr "Джерело, яка надає список субтитрів до відео" + +#: src/optical-media/grl-optical-media.c:44 msgid "Optical Media" msgstr "Оптичний носій" -#: ../src/optical-media/grl-optical-media.c:47 +#: src/optical-media/grl-optical-media.c:45 msgid "A source for browsing optical media" msgstr "Джерело для огляду оптичних носіїв" -#: ../src/podcasts/grl-podcasts.c:155 +#: src/podcasts/grl-podcasts.c:148 msgid "A source for browsing podcasts" msgstr "Джерело для огляду радіотрансляції" -#: ../src/podcasts/grl-podcasts.c:753 -#: ../src/podcasts/grl-podcasts.c:773 +#: src/podcasts/grl-podcasts.c:759 src/podcasts/grl-podcasts.c:779 #, c-format msgid "Failed to get podcast streams: %s" msgstr "Не вдалося отримати потоки радіотрансляції: %s" -#: ../src/podcasts/grl-podcasts.c:1239 -#: ../src/podcasts/grl-podcasts.c:1248 -#: ../src/podcasts/grl-podcasts.c:1258 +#: src/podcasts/grl-podcasts.c:1245 src/podcasts/grl-podcasts.c:1254 +#: src/podcasts/grl-podcasts.c:1264 msgid "Failed to parse content" msgstr "Не вдалося розібрати вміст" -#: ../src/podcasts/grl-podcasts.c:1291 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "Не вдалося розібрати вміст радіотрансляції" -#: ../src/podcasts/grl-podcasts.c:1449 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "Не вдалося отримати інформацію про радіотрансляцію" -#: ../src/podcasts/grl-podcasts.c:1489 -#: ../src/podcasts/grl-podcasts.c:1509 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "Не вдалося отримати перелік радіотрансляцій: %s" -#: ../src/podcasts/grl-podcasts.c:1563 -#: ../src/podcasts/grl-podcasts.c:1578 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "Не вдалося отримати метадані потоку радіотрансляції" -#: ../src/podcasts/grl-podcasts.c:1616 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "Не вдалося отримати метадані радіотрансляції" -#: ../src/podcasts/grl-podcasts.c:1800 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" msgstr "Не вдалося створити контейнери. Допустимі лише подачі" -#: ../src/podcasts/grl-podcasts.c:1805 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "Потрібна URL" -#: ../src/raitv/grl-raitv.c:49 -#: ../src/youtube/grl-youtube.c:78 +#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:73 msgid "Most Popular" msgstr "Найпопулярніше" -#: ../src/raitv/grl-raitv.c:52 +#: src/raitv/grl-raitv.c:52 msgid "Recent" msgstr "Останнє" -#: ../src/raitv/grl-raitv.c:95 +#: src/raitv/grl-raitv.c:93 msgid "A source for browsing and searching Rai.tv videos" msgstr "Джерело для огляду та пошуку відеозаписів Rai.tv" -#: ../src/raitv/grl-raitv.c:173 +#: src/raitv/grl-raitv.c:164 msgid "All" msgstr "Усе" -#: ../src/raitv/grl-raitv.c:174 +#: src/raitv/grl-raitv.c:165 msgid "Black and White" msgstr "Чорне і біле" -#: ../src/raitv/grl-raitv.c:175 +#: src/raitv/grl-raitv.c:166 msgid "Cinema" msgstr "Кіно" -#: ../src/raitv/grl-raitv.c:176 +#: src/raitv/grl-raitv.c:167 msgid "Comedians" msgstr "Комедії" -#: ../src/raitv/grl-raitv.c:177 +#: src/raitv/grl-raitv.c:168 msgid "Chronicle" msgstr "Хроніка" -#: ../src/raitv/grl-raitv.c:178 +#: src/raitv/grl-raitv.c:169 msgid "Culture" msgstr "Культура" -#: ../src/raitv/grl-raitv.c:179 +#: src/raitv/grl-raitv.c:170 msgid "Economy" msgstr "Економіка" -#: ../src/raitv/grl-raitv.c:180 +#: src/raitv/grl-raitv.c:171 msgid "Fiction" msgstr "Художня література" -#: ../src/raitv/grl-raitv.c:181 +#: src/raitv/grl-raitv.c:172 msgid "Junior" msgstr "Молодь" -#: ../src/raitv/grl-raitv.c:182 +#: src/raitv/grl-raitv.c:173 msgid "Investigations" msgstr "Дослідження" -#: ../src/raitv/grl-raitv.c:183 +#: src/raitv/grl-raitv.c:174 msgid "Interviews" msgstr "Інтерв'ю" -#: ../src/raitv/grl-raitv.c:184 +#: src/raitv/grl-raitv.c:175 msgid "Music" msgstr "Музика" -#: ../src/raitv/grl-raitv.c:185 +#: src/raitv/grl-raitv.c:176 msgid "News" msgstr "Новини" -#: ../src/raitv/grl-raitv.c:186 +#: src/raitv/grl-raitv.c:177 msgid "Health" msgstr "Здоров'я" -#: ../src/raitv/grl-raitv.c:187 +#: src/raitv/grl-raitv.c:178 msgid "Satire" msgstr "Гумор" -#: ../src/raitv/grl-raitv.c:189 +#: src/raitv/grl-raitv.c:180 msgid "Society" msgstr "Суспільство" -#: ../src/raitv/grl-raitv.c:190 +#: src/raitv/grl-raitv.c:181 msgid "Show" msgstr "Розваги" -#: ../src/raitv/grl-raitv.c:191 +#: src/raitv/grl-raitv.c:182 msgid "Sport" msgstr "Спорт" -#: ../src/raitv/grl-raitv.c:192 +#: src/raitv/grl-raitv.c:183 msgid "History" msgstr "Історія" -#: ../src/raitv/grl-raitv.c:193 +#: src/raitv/grl-raitv.c:184 msgid "Politics" msgstr "Політика" -#: ../src/raitv/grl-raitv.c:194 +#: src/raitv/grl-raitv.c:185 msgid "Leisure" msgstr "Дозвілля" -#: ../src/raitv/grl-raitv.c:195 +#: src/raitv/grl-raitv.c:186 msgid "Travel" msgstr "Мандрівки" -#: ../src/raitv/grl-raitv.c:616 +#: src/raitv/grl-raitv.c:616 #, c-format msgid "Failed to browse: %s" msgstr "Не вдалося виконати огляд: %s" -#: ../src/shoutcast/grl-shoutcast.c:67 +#: src/shoutcast/grl-shoutcast.c:60 msgid "A source for browsing SHOUTcast radios" msgstr "Джерело для огляду радіостанцій SHOUTcast" -#: ../src/shoutcast/grl-shoutcast.c:462 +#: src/shoutcast/grl-shoutcast.c:455 #, c-format msgid "Cannot find media %s" msgstr "Не вдалося знайти медіаконтент %s" -#: ../src/shoutcast/grl-shoutcast.c:760 -#: ../src/vimeo/grl-vimeo.c:535 +#: src/shoutcast/grl-shoutcast.c:750 src/vimeo/grl-vimeo.c:541 msgid "non-NULL search text is required" msgstr "Рядок пошуку повинен бути непорожнім" -#: ../src/tmdb/grl-tmdb.c:962 +#: src/thetvdb/grl-thetvdb.c:93 +msgid "A source for fetching metadata of television shows" +msgstr "Джерело для отримання метаданих щодо телепрограм" + +#: src/tmdb/grl-tmdb.c:998 msgid "Remote data does not contain valid identifier" msgstr "Віддалені дані не містять коректного ідентифікатора" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse -#: ../src/tracker/grl-tracker-source-api.c:332 -#: ../src/tracker/grl-tracker-source-api.c:414 +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 +#: src/tracker/grl-tracker-source-api.c:401 +#: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "Не вдалося виконати запит: %s" -#: ../src/tracker/grl-tracker-source-api.c:628 +#: src/tracker3/grl-tracker-source-api.c:418 +#: src/tracker/grl-tracker-source-api.c:585 +#, c-format +msgid "Failed to get media from uri: %s" +msgstr "Не вдалося отримати мультимедійні дані з адреси: %s" + +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "Порожній запит" -#: ../src/tracker/grl-tracker-source-priv.h:44 +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 +#, c-format +msgid "ID “%s” is not known in this source" +msgstr "Ідентифікатор «%s» є невідомим у цьому джерелі" + +#: src/tracker3/grl-tracker-source-priv.h:47 +#| msgid "A plugin for searching multimedia content using Tracker" +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "Додаток пошуку мультимедійних даних за допомогою Tracker3" + +#: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "Додаток пошуку мультимедійного контенту за допомогою Tracker" -#: ../src/tracker/grl-tracker-utils.c:606 -#, c-format -msgid "Removable - %s" -msgstr "Змінний — %s" - -#: ../src/tracker/grl-tracker-utils.c:618 -msgid "Local files" -msgstr "Локальні файли" - -#: ../src/upnp/grl-upnp.c:53 -#, c-format -msgid "A source for browsing the UPnP server '%s'" -msgstr "Джерело для огляду сервера UPnP «%s»" - -#: ../src/upnp/grl-upnp.c:1263 -#: ../src/upnp/grl-upnp.c:1320 -msgid "Failed to browse" -msgstr "Не вдалося виконати огляд" - -#: ../src/upnp/grl-upnp.c:1383 -msgid "Failed to query" -msgstr "Не вдалося виконати запит" - -#: ../src/upnp/grl-upnp.c:1502 -#, c-format -msgid "Unable to listen for changes in %s" -msgstr "Неможливо відстежити зміни у %s" - -#: ../src/vimeo/grl-vimeo.c:58 +#: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "Джерело для огляду та пошуку відеозаписів Vimeo" -#: ../src/youtube/grl-youtube.c:60 +#: src/youtube/grl-youtube.c:55 msgid "Standard feeds" msgstr "Стандартні подачі" -#: ../src/youtube/grl-youtube.c:63 +#: src/youtube/grl-youtube.c:58 msgid "Categories" msgstr "Категорії" -#: ../src/youtube/grl-youtube.c:69 +#: src/youtube/grl-youtube.c:64 msgid "Top Rated" msgstr "Верхівка найкращих" -#: ../src/youtube/grl-youtube.c:72 +#: src/youtube/grl-youtube.c:67 msgid "Top Favorites" msgstr "Верхівка улюблених" -#: ../src/youtube/grl-youtube.c:75 +#: src/youtube/grl-youtube.c:70 msgid "Most Viewed" msgstr "Найпереглядуваніше" -#: ../src/youtube/grl-youtube.c:81 +#: src/youtube/grl-youtube.c:76 msgid "Most Recent" msgstr "Найостанніше" -#: ../src/youtube/grl-youtube.c:84 +#: src/youtube/grl-youtube.c:79 msgid "Most Discussed" msgstr "Найобговорюваніше" -#: ../src/youtube/grl-youtube.c:87 +#: src/youtube/grl-youtube.c:82 msgid "Most Linked" msgstr "Найадресованіше" -#: ../src/youtube/grl-youtube.c:90 +#: src/youtube/grl-youtube.c:85 msgid "Most Responded" msgstr "Найжвавіше" -#: ../src/youtube/grl-youtube.c:93 +#: src/youtube/grl-youtube.c:88 msgid "Recently Featured" msgstr "Нещодавнє особливе" -#: ../src/youtube/grl-youtube.c:96 +#: src/youtube/grl-youtube.c:91 msgid "Watch On Mobile" msgstr "Дивитися мобільну версію" -#: ../src/youtube/grl-youtube.c:117 +#: src/youtube/grl-youtube.c:110 msgid "A source for browsing and searching YouTube videos" msgstr "Джерело для огляду та пошуку відеозаписів YouTube" -#: ../src/youtube/grl-youtube.c:951 +#: src/youtube/grl-youtube.c:856 msgid "Failed to get feed" msgstr "Не вдалося отримати подачу" -#: ../src/youtube/grl-youtube.c:1129 -#: ../src/youtube/grl-youtube.c:1545 +#: src/youtube/grl-youtube.c:1033 src/youtube/grl-youtube.c:1421 #, c-format msgid "Invalid feed identifier %s" msgstr "Некоректний ідентифікатор подачі %s" - diff -Nru grilo-plugins-0.3.11/po/zh_CN.po grilo-plugins-0.3.12/po/zh_CN.po --- grilo-plugins-0.3.11/po/zh_CN.po 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/po/zh_CN.po 2020-09-03 05:36:44.364467900 +0000 @@ -1,618 +1,631 @@ # Chinese (China) translation for grilo-plugins. -# Copyright (C) 2013 grilo-plugins's COPYRIGHT HOLDER +# Copyright (C) 2013-2018 grilo-plugins's COPYRIGHT HOLDER # This file is distributed under the same license as the grilo-plugins package. # 甘露(Gan Lu) , 2013. # Wylmer Wang , 2014. +# Dingzhong Chen , 2018. # msgid "" msgstr "" "Project-Id-Version: grilo-plugins master\n" -"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" -"product=grilo&keywords=I18N+L10N&component=plugins\n" -"POT-Creation-Date: 2016-10-24 15:28+0000\n" -"PO-Revision-Date: 2016-10-30 00:09+0800\n" -"Last-Translator: liushuyu \n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo-plugins/issues\n" +"POT-Creation-Date: 2020-08-24 15:08+0000\n" +"PO-Revision-Date: 2020-08-27 09:04-0400\n" +"Last-Translator: Dingzhong Chen \n" "Language-Team: Chinese (China) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.11\n" +"X-Generator: Poedit 2.4.1\n" +"Plural-Forms: nplurals=1; plural=0;\n" -#: ../src/bookmarks/grl-bookmarks.c:65 +#: src/bookmarks/grl-bookmarks.c:60 msgid "Bookmarks" msgstr "书签" -#: ../src/bookmarks/grl-bookmarks.c:66 +#: src/bookmarks/grl-bookmarks.c:61 msgid "A source for organizing media bookmarks" msgstr "用于组织媒体书签的源" -#: ../src/bookmarks/grl-bookmarks.c:434 +#: src/bookmarks/grl-bookmarks.c:427 msgid "Failed to get bookmark metadata" msgstr "无法得到书签元数据" -#: ../src/bookmarks/grl-bookmarks.c:464 ../src/bookmarks/grl-bookmarks.c:481 +#: src/bookmarks/grl-bookmarks.c:457 src/bookmarks/grl-bookmarks.c:474 #, c-format msgid "Failed to find bookmarks: %s" msgstr "无法得到书签:%s" -#: ../src/bookmarks/grl-bookmarks.c:633 ../src/podcasts/grl-podcasts.c:828 -#: ../src/podcasts/grl-podcasts.c:860 ../src/podcasts/grl-podcasts.c:892 +#: src/bookmarks/grl-bookmarks.c:626 src/podcasts/grl-podcasts.c:823 +#: src/podcasts/grl-podcasts.c:855 src/podcasts/grl-podcasts.c:887 #, c-format msgid "Failed to remove: %s" msgstr "无法删除:%s" -#: ../src/bookmarks/grl-bookmarks.c:773 ../src/podcasts/grl-podcasts.c:933 -#: ../src/podcasts/grl-podcasts.c:966 ../src/podcasts/grl-podcasts.c:1811 +#: src/bookmarks/grl-bookmarks.c:768 src/podcasts/grl-podcasts.c:928 +#: src/podcasts/grl-podcasts.c:961 src/podcasts/grl-podcasts.c:1813 #, c-format msgid "Failed to store: %s" msgstr "无法存储:%s" -#: ../src/bookmarks/grl-bookmarks.c:847 ../src/bookmarks/grl-bookmarks.c:882 -#: ../src/bookmarks/grl-bookmarks.c:913 ../src/bookmarks/grl-bookmarks.c:971 -#: ../src/metadata-store/grl-metadata-store.c:869 -#: ../src/podcasts/grl-podcasts.c:1667 ../src/podcasts/grl-podcasts.c:1711 -#: ../src/podcasts/grl-podcasts.c:1745 ../src/podcasts/grl-podcasts.c:1780 +#: src/bookmarks/grl-bookmarks.c:842 src/bookmarks/grl-bookmarks.c:877 +#: src/bookmarks/grl-bookmarks.c:908 src/bookmarks/grl-bookmarks.c:966 +#: src/metadata-store/grl-metadata-store.c:874 src/podcasts/grl-podcasts.c:1669 +#: src/podcasts/grl-podcasts.c:1713 src/podcasts/grl-podcasts.c:1747 +#: src/podcasts/grl-podcasts.c:1782 msgid "No database connection" msgstr "无数据库连接" -#: ../src/chromaprint/grl-chromaprint.c:46 +#: src/chromaprint/grl-chromaprint.c:41 msgid "A plugin to get metadata using gstreamer framework" msgstr "通过使用 gstreamer 框架获取元数据的插件" -#: ../src/dleyna/grl-dleyna-source.c:34 +#: src/dleyna/grl-dleyna-source.c:34 #, c-format -msgid "A source for browsing the DLNA server '%s'" -msgstr "用于浏览 DLNA 服务器 '%s' 的源" +msgid "A source for browsing the DLNA server “%s”" +msgstr "用于浏览 DLNA 服务器“%s”的源" -#: ../src/dleyna/grl-dleyna-source.c:278 +#: src/dleyna/grl-dleyna-source.c:279 msgid "Upload failed, target source destroyed" msgstr "上传失败,目标源已经损坏" -#: ../src/dleyna/grl-dleyna-source.c:380 +#: src/dleyna/grl-dleyna-source.c:382 #, c-format -msgid "Upload failed, '%s', transferred %lu of %lu bytes" -msgstr "上传失败,'%s',已传输 %lu 字节,总共 %lu" +msgid "Upload failed, “%s”, transferred %lu of %lu bytes" +msgstr "上传失败,“%s”,已传输 %lu 字节,总共 %lu" -#: ../src/dleyna/grl-dleyna-source.c:881 +#: src/dleyna/grl-dleyna-source.c:933 #, c-format msgid "Failed to retrieve item properties (BrowseObjects error %d: %s)" -msgstr "获取项目属性失败(BrowseObjects 出错 %d: %s)" +msgstr "获取项目属性失败(BrowseObjects 出错 %d:%s)" -#: ../src/dleyna/grl-dleyna-source.c:1520 +#: src/dleyna/grl-dleyna-source.c:1572 #, c-format msgid "Upload failed, URL missing on the media object to be transferred" -msgstr "上传失败,要传输的媒体对象的 URL 丢失。" +msgstr "上传失败,要传输的媒体对象的 URL 丢失" -#: ../src/dmap/grl-daap.c:50 +#: src/dmap/grl-daap.c:51 #, c-format -msgid "A source for browsing the DAAP server '%s'" -msgstr "用于浏览 DAAP 服务器 '%s' 的源" +msgid "A source for browsing the DAAP server “%s”" +msgstr "用于浏览 DAAP 服务器“%s”的源" -#: ../src/dmap/grl-daap-db.c:62 ../src/jamendo/grl-jamendo.c:795 -#: ../src/magnatune/grl-magnatune.c:121 +#: src/dmap/grl-daap-db.c:66 src/jamendo/grl-jamendo.c:788 +#: src/magnatune/grl-magnatune.c:122 msgid "Albums" msgstr "专辑" -#: ../src/dmap/grl-daap-db.c:64 ../src/jamendo/grl-jamendo.c:784 -#: ../src/magnatune/grl-magnatune.c:120 +#: src/dmap/grl-daap-db.c:68 src/jamendo/grl-jamendo.c:777 +#: src/magnatune/grl-magnatune.c:121 msgid "Artists" msgstr "艺人" -#: ../src/dmap/grl-daap-db.c:292 ../src/jamendo/grl-jamendo.c:1122 -#: ../src/jamendo/grl-jamendo.c:1233 ../src/magnatune/grl-magnatune.c:841 +#: src/dmap/grl-daap-db.c:291 src/jamendo/grl-jamendo.c:1115 +#: src/jamendo/grl-jamendo.c:1226 src/magnatune/grl-magnatune.c:866 #, c-format msgid "Invalid container identifier %s" -msgstr "无效的容器识别码 %s" +msgstr "无效的容器标识符 %s" -#: ../src/dmap/grl-dpap.c:50 +#: src/dmap/grl-dpap.c:51 #, c-format -msgid "A source for browsing the DPAP server '%s'" -msgstr "用于浏览 DPAP 服务器 '%s' 的源" +msgid "A source for browsing the DPAP server “%s”" +msgstr "用于浏览 DPAP 服务器“%s”的源" -#: ../src/dmap/grl-dpap-db.c:36 +#: src/dmap/grl-dpap-db.c:40 msgid "Photos" msgstr "照片" -#: ../src/filesystem/grl-filesystem.c:58 +#: src/filesystem/grl-filesystem.c:58 msgid "Filesystem" msgstr "文件系统" -#: ../src/filesystem/grl-filesystem.c:59 +#: src/filesystem/grl-filesystem.c:59 msgid "A source for browsing the filesystem" msgstr "用于浏览文件系统的源" -#: ../src/filesystem/grl-filesystem.c:1179 +#: src/filesystem/grl-filesystem.c:1171 #, c-format msgid "File %s does not exist" msgstr "文件 %s 不存在" -#: ../src/filesystem/grl-filesystem.c:1257 ../src/youtube/grl-youtube.c:1512 +#: src/filesystem/grl-filesystem.c:1249 src/youtube/grl-youtube.c:1505 #, c-format msgid "Cannot get media from %s" msgstr "无法从 %s 获得媒体" -#: ../src/flickr/grl-flickr.c:61 +#: src/flickr/grl-flickr.c:58 msgid "A source for browsing and searching Flickr photos" msgstr "用于浏览和搜索 Flickr 照片的源" #. "%s" is a full user name, like "John Doe" -#: ../src/flickr/grl-flickr.c:65 +#: src/flickr/grl-flickr.c:62 #, c-format -msgid "%s's Flickr" +msgid "%s’s Flickr" msgstr "%s 的 Flickr" #. "%s" is a full user name, like "John Doe" -#: ../src/flickr/grl-flickr.c:67 +#: src/flickr/grl-flickr.c:64 #, c-format -msgid "A source for browsing and searching %s's flickr photos" +msgid "A source for browsing and searching %s’s flickr photos" msgstr "用于浏览和搜索 %s 的 Flickr 照片的源" -#: ../src/freebox/grl-freebox.c:48 +#: src/freebox/grl-freebox.c:48 msgid "Freebox TV" -msgstr "Freebox TV" +msgstr "Freebox 电视" -#: ../src/freebox/grl-freebox.c:49 +#: src/freebox/grl-freebox.c:49 msgid "A source for browsing Freebox TV channels" -msgstr "用于浏览 Freebox TV 频道的源" +msgstr "用于浏览 Freebox 电视频道的源" -#: ../src/freebox/grl-freebox.c:52 +#: src/freebox/grl-freebox.c:52 msgid "Freebox Radio" msgstr "Freebox 电台" -#: ../src/freebox/grl-freebox.c:53 +#: src/freebox/grl-freebox.c:53 msgid "A source for browsing Freebox radio channels" msgstr "用于浏览 Freebox 电台频道的源" -#: ../src/gravatar/grl-gravatar.c:46 +#: src/gravatar/grl-gravatar.c:46 msgid "Avatar provider from Gravatar" msgstr "Gravatar 提供的头像" -#: ../src/gravatar/grl-gravatar.c:47 +#: src/gravatar/grl-gravatar.c:47 msgid "A plugin to get avatars for artist and author fields" msgstr "从艺人及作者字段处得到头像的插件" -#: ../src/jamendo/grl-jamendo.c:91 +#: src/jamendo/grl-jamendo.c:91 msgid "A source for browsing and searching Jamendo music" msgstr "用于浏览及搜索 Jamendo 音乐的源" -#: ../src/jamendo/grl-jamendo.c:149 +#: src/jamendo/grl-jamendo.c:149 msgid "Albums of the week" msgstr "本周专辑之星" -#: ../src/jamendo/grl-jamendo.c:151 +#: src/jamendo/grl-jamendo.c:151 msgid "Tracks of the week" msgstr "本周曲目之星" -#: ../src/jamendo/grl-jamendo.c:153 +#: src/jamendo/grl-jamendo.c:153 msgid "New releases" msgstr "新发行" -#: ../src/jamendo/grl-jamendo.c:155 +#: src/jamendo/grl-jamendo.c:155 msgid "Top artists" msgstr "顶级艺人" -#: ../src/jamendo/grl-jamendo.c:157 +#: src/jamendo/grl-jamendo.c:157 msgid "Top albums" msgstr "顶级专辑" -#: ../src/jamendo/grl-jamendo.c:159 +#: src/jamendo/grl-jamendo.c:159 msgid "Top tracks" msgstr "顶级曲目" -#: ../src/jamendo/grl-jamendo.c:348 ../src/jamendo/grl-jamendo.c:708 -#: ../src/shoutcast/grl-shoutcast.c:416 ../src/shoutcast/grl-shoutcast.c:470 +#: src/jamendo/grl-jamendo.c:341 src/jamendo/grl-jamendo.c:701 +#: src/shoutcast/grl-shoutcast.c:409 src/shoutcast/grl-shoutcast.c:463 msgid "Failed to parse response" msgstr "无法解析应答" -#: ../src/jamendo/grl-jamendo.c:356 ../src/jamendo/grl-jamendo.c:363 -#: ../src/podcasts/grl-podcasts.c:1368 ../src/shoutcast/grl-shoutcast.c:424 +#: src/jamendo/grl-jamendo.c:349 src/jamendo/grl-jamendo.c:356 +#: src/podcasts/grl-podcasts.c:1370 src/shoutcast/grl-shoutcast.c:417 msgid "Empty response" msgstr "无应答" -#: ../src/jamendo/grl-jamendo.c:677 ../src/shoutcast/grl-shoutcast.c:558 +#: src/jamendo/grl-jamendo.c:670 src/shoutcast/grl-shoutcast.c:551 #, c-format msgid "Failed to connect: %s" msgstr "无法连接:%s" -#: ../src/jamendo/grl-jamendo.c:806 +# 原来翻译为“飞递”,搜索是 feedsky 的商业名,应该不是通用翻译吧。 +#: src/jamendo/grl-jamendo.c:799 msgid "Feeds" -msgstr "飞递" +msgstr "订阅源" -#: ../src/jamendo/grl-jamendo.c:990 ../src/jamendo/grl-jamendo.c:1035 -#: ../src/jamendo/grl-jamendo.c:1062 +#: src/jamendo/grl-jamendo.c:983 src/jamendo/grl-jamendo.c:1028 +#: src/jamendo/grl-jamendo.c:1055 #, c-format msgid "Invalid identifier %s" -msgstr "无效的识别码 %s" +msgstr "无效的标识符 %s" -#: ../src/jamendo/grl-jamendo.c:1049 ../src/youtube/grl-youtube.c:1104 -#: ../src/youtube/grl-youtube.c:1237 ../src/youtube/grl-youtube.c:1449 +#: src/jamendo/grl-jamendo.c:1042 src/youtube/grl-youtube.c:1097 +#: src/youtube/grl-youtube.c:1230 src/youtube/grl-youtube.c:1442 #, c-format msgid "Invalid category identifier %s" -msgstr "无效的分类识别码 %s" +msgstr "无效的分类标识符 %s" -#: ../src/jamendo/grl-jamendo.c:1228 +#: src/jamendo/grl-jamendo.c:1221 #, c-format msgid "Failed to browse: %s is a track" msgstr "无法浏览:%s 是一条音轨" -#: ../src/jamendo/grl-jamendo.c:1287 +#: src/jamendo/grl-jamendo.c:1280 #, c-format -msgid "Malformed query \"%s\"" -msgstr "查询格式不对 \"%s\"" +msgid "Malformed query “%s”" +msgstr "格式错误的查询“%s”" -#: ../src/local-metadata/grl-local-metadata.c:42 +#: src/local-metadata/grl-local-metadata.c:42 msgid "Local Metadata Provider" msgstr "本地元数据提供者" -#: ../src/local-metadata/grl-local-metadata.c:43 +#: src/local-metadata/grl-local-metadata.c:43 msgid "A source providing locally available metadata" msgstr "提供本地可用元数据的源" -#: ../src/local-metadata/grl-local-metadata.c:388 -#: ../src/metadata-store/grl-metadata-store.c:779 ../src/raitv/grl-raitv.c:874 -#: ../src/tracker/grl-tracker-source-api.c:527 +#: src/local-metadata/grl-local-metadata.c:381 +#: src/metadata-store/grl-metadata-store.c:784 src/raitv/grl-raitv.c:869 +#: src/tracker3/grl-tracker-source-api.c:381 +#: src/tracker/grl-tracker-source-api.c:530 #, c-format msgid "Failed to resolve: %s" msgstr "无法解析:%s" -#: ../src/local-metadata/grl-local-metadata.c:682 +#: src/local-metadata/grl-local-metadata.c:673 msgid "Cannot resolve any of the given keys" msgstr "给定的键均无法解析" -#: ../src/local-metadata/grl-local-metadata.c:686 +#: src/local-metadata/grl-local-metadata.c:677 msgid "A GIO supported URL for images is required" msgstr "需要映像有一个 GIO 支持的 URL" -#: ../src/magnatune/grl-magnatune.c:122 +#: src/magnatune/grl-magnatune.c:123 msgid "Genres" msgstr "流派" -#: ../src/magnatune/grl-magnatune.c:130 +#: src/magnatune/grl-magnatune.c:131 msgid "A source for browsing music" msgstr "用于浏览音乐的源" -#: ../src/magnatune/grl-magnatune.c:422 +#: src/magnatune/grl-magnatune.c:421 #, c-format msgid "Failed to get database from magnatune: %s" msgstr "无法从 Magnatune 商店获得数据库:%s" -#: ../src/magnatune/grl-magnatune.c:452 +#: src/magnatune/grl-magnatune.c:451 #, c-format -msgid "Failed to save database from magnatune - '%s'" -msgstr "无法从 Magnatune 处保存数据库 - '%s'" +msgid "Failed to save database from magnatune: “%s”" +msgstr "无法从 Magnatune 处保存数据库:“%s”" -#: ../src/magnatune/grl-magnatune.c:697 +#: src/magnatune/grl-magnatune.c:722 #, c-format msgid "Failed to get table from magnatune db: %s" msgstr "无法从 Magnatune 数据库得到数据库表:%s" -#: ../src/magnatune/grl-magnatune.c:713 +#: src/magnatune/grl-magnatune.c:738 #, c-format msgid "Fail before returning media to user: %s" msgstr "在归还媒体给用户前失败:%s" -#: ../src/metadata-store/grl-metadata-store.c:45 +#: src/metadata-store/grl-metadata-store.c:40 msgid "Metadata Store" msgstr "元数据存储" -#: ../src/metadata-store/grl-metadata-store.c:46 +#: src/metadata-store/grl-metadata-store.c:41 msgid "A plugin for storing extra metadata information" msgstr "存储额元数据信息的插件" -#: ../src/metadata-store/grl-metadata-store.c:593 -#: ../src/metadata-store/grl-metadata-store.c:612 -#: ../src/metadata-store/grl-metadata-store.c:824 -#: ../src/tracker/grl-tracker-source-api.c:637 +#: src/metadata-store/grl-metadata-store.c:598 +#: src/metadata-store/grl-metadata-store.c:617 +#: src/metadata-store/grl-metadata-store.c:829 +#: src/tracker3/grl-tracker-source-api.c:471 +#: src/tracker/grl-tracker-source-api.c:640 #, c-format msgid "Failed to update metadata: %s" msgstr "无法更新元数据:%s" -#: ../src/metadata-store/grl-metadata-store.c:594 +#: src/metadata-store/grl-metadata-store.c:599 msgid "specified keys are not writable" msgstr "指定的键不可写" -#: ../src/metadata-store/grl-metadata-store.c:634 +#: src/metadata-store/grl-metadata-store.c:639 msgid "Failed to update metadata" msgstr "无法更新元数据" -#: ../src/metadata-store/grl-metadata-store.c:780 -#: ../src/metadata-store/grl-metadata-store.c:825 -msgid "\"source-id\" not available" -msgstr "\"source-id\" 不可用" +#: src/metadata-store/grl-metadata-store.c:785 +#: src/metadata-store/grl-metadata-store.c:830 +msgid "“source-id” not available" +msgstr "“source-id”不可用" -#: ../src/metadata-store/grl-metadata-store.c:800 +#: src/metadata-store/grl-metadata-store.c:805 msgid "Failed to resolve" msgstr "解析失败" -#: ../src/metadata-store/grl-metadata-store.c:937 -#: ../src/metadata-store/grl-metadata-store.c:974 ../src/raitv/grl-raitv.c:432 -#: ../src/shoutcast/grl-shoutcast.c:756 ../src/vimeo/grl-vimeo.c:547 +#: src/metadata-store/grl-metadata-store.c:942 +#: src/metadata-store/grl-metadata-store.c:979 src/raitv/grl-raitv.c:423 +#: src/shoutcast/grl-shoutcast.c:749 src/vimeo/grl-vimeo.c:540 #, c-format msgid "Failed to search: %s" msgstr "无法搜索:%s" -#: ../src/opensubtitles/grl-opensubtitles.c:40 +#: src/opensubtitles/grl-opensubtitles.c:40 msgid "OpenSubtitles Provider" msgstr "OpenSubtitles 提供者" -#: ../src/opensubtitles/grl-opensubtitles.c:41 +#: src/opensubtitles/grl-opensubtitles.c:41 msgid "A source providing a list of subtitles for a video" msgstr "为视频提供一系列字母的源" -#: ../src/optical-media/grl-optical-media.c:44 +#: src/optical-media/grl-optical-media.c:44 msgid "Optical Media" msgstr "光媒介" -#: ../src/optical-media/grl-optical-media.c:45 +#: src/optical-media/grl-optical-media.c:45 msgid "A source for browsing optical media" msgstr "用于浏览光媒介的源" -#: ../src/podcasts/grl-podcasts.c:153 +#: src/podcasts/grl-podcasts.c:148 msgid "A source for browsing podcasts" msgstr "用于浏览播客的源" -#: ../src/podcasts/grl-podcasts.c:764 ../src/podcasts/grl-podcasts.c:784 +#: src/podcasts/grl-podcasts.c:759 src/podcasts/grl-podcasts.c:779 #, c-format msgid "Failed to get podcast streams: %s" msgstr "无法获得播客流:%s" -#: ../src/podcasts/grl-podcasts.c:1250 ../src/podcasts/grl-podcasts.c:1259 -#: ../src/podcasts/grl-podcasts.c:1269 +#: src/podcasts/grl-podcasts.c:1245 src/podcasts/grl-podcasts.c:1254 +#: src/podcasts/grl-podcasts.c:1264 msgid "Failed to parse content" msgstr "无法解析内容" -#: ../src/podcasts/grl-podcasts.c:1302 +#: src/podcasts/grl-podcasts.c:1275 src/podcasts/grl-podcasts.c:1304 msgid "Failed to parse podcast contents" msgstr "无法解析播客内容" -#: ../src/podcasts/grl-podcasts.c:1457 +#: src/podcasts/grl-podcasts.c:1459 msgid "Failed to get podcast information" msgstr "无法获得播客信息" -#: ../src/podcasts/grl-podcasts.c:1497 ../src/podcasts/grl-podcasts.c:1517 +#: src/podcasts/grl-podcasts.c:1499 src/podcasts/grl-podcasts.c:1519 #, c-format msgid "Failed to get podcasts list: %s" msgstr "无法获得播客清单:%s" -#: ../src/podcasts/grl-podcasts.c:1570 ../src/podcasts/grl-podcasts.c:1585 +#: src/podcasts/grl-podcasts.c:1572 src/podcasts/grl-podcasts.c:1587 msgid "Failed to get podcast stream metadata" msgstr "无法获得播客流元数据" -#: ../src/podcasts/grl-podcasts.c:1623 +#: src/podcasts/grl-podcasts.c:1625 msgid "Failed to get podcast metadata" msgstr "无法获得播客元数据" -#: ../src/podcasts/grl-podcasts.c:1807 +#: src/podcasts/grl-podcasts.c:1809 msgid "Cannot create containers. Only feeds are accepted" -msgstr "无法创建容器。仅接受飞递" +msgstr "无法创建容器。仅接受订阅源(feed)" -#: ../src/podcasts/grl-podcasts.c:1812 +#: src/podcasts/grl-podcasts.c:1814 msgid "URL required" msgstr "要求 URL" -#: ../src/raitv/grl-raitv.c:49 ../src/youtube/grl-youtube.c:78 +#: src/raitv/grl-raitv.c:49 src/youtube/grl-youtube.c:73 msgid "Most Popular" msgstr "最为流行" -#: ../src/raitv/grl-raitv.c:52 +#: src/raitv/grl-raitv.c:52 msgid "Recent" msgstr "近期" -#: ../src/raitv/grl-raitv.c:93 +#: src/raitv/grl-raitv.c:93 msgid "A source for browsing and searching Rai.tv videos" msgstr "用于浏览及搜索 Rai.tv 视频的源" -#: ../src/raitv/grl-raitv.c:171 +#: src/raitv/grl-raitv.c:164 msgid "All" msgstr "全部" -#: ../src/raitv/grl-raitv.c:172 +#: src/raitv/grl-raitv.c:165 msgid "Black and White" -msgstr "黑与白" +msgstr "黑白" -#: ../src/raitv/grl-raitv.c:173 +#: src/raitv/grl-raitv.c:166 msgid "Cinema" msgstr "影院" -#: ../src/raitv/grl-raitv.c:174 +#: src/raitv/grl-raitv.c:167 msgid "Comedians" msgstr "谐星" -#: ../src/raitv/grl-raitv.c:175 +#: src/raitv/grl-raitv.c:168 msgid "Chronicle" msgstr "纪事" -#: ../src/raitv/grl-raitv.c:176 +#: src/raitv/grl-raitv.c:169 msgid "Culture" msgstr "文化" -#: ../src/raitv/grl-raitv.c:177 +#: src/raitv/grl-raitv.c:170 msgid "Economy" msgstr "经济" -#: ../src/raitv/grl-raitv.c:178 +#: src/raitv/grl-raitv.c:171 msgid "Fiction" msgstr "小说" -#: ../src/raitv/grl-raitv.c:179 +#: src/raitv/grl-raitv.c:172 msgid "Junior" msgstr "青春" -#: ../src/raitv/grl-raitv.c:180 +#: src/raitv/grl-raitv.c:173 msgid "Investigations" msgstr "调查" -#: ../src/raitv/grl-raitv.c:181 +#: src/raitv/grl-raitv.c:174 msgid "Interviews" msgstr "面谈" -#: ../src/raitv/grl-raitv.c:182 +#: src/raitv/grl-raitv.c:175 msgid "Music" msgstr "音乐" -#: ../src/raitv/grl-raitv.c:183 +#: src/raitv/grl-raitv.c:176 msgid "News" msgstr "新闻" -#: ../src/raitv/grl-raitv.c:184 +#: src/raitv/grl-raitv.c:177 msgid "Health" msgstr "健康" -#: ../src/raitv/grl-raitv.c:185 +#: src/raitv/grl-raitv.c:178 msgid "Satire" msgstr "讽刺" -#: ../src/raitv/grl-raitv.c:187 +#: src/raitv/grl-raitv.c:180 msgid "Society" msgstr "社会" -#: ../src/raitv/grl-raitv.c:188 +#: src/raitv/grl-raitv.c:181 msgid "Show" msgstr "秀逗" -#: ../src/raitv/grl-raitv.c:189 +#: src/raitv/grl-raitv.c:182 msgid "Sport" msgstr "运动" -#: ../src/raitv/grl-raitv.c:190 +#: src/raitv/grl-raitv.c:183 msgid "History" msgstr "历史" -#: ../src/raitv/grl-raitv.c:191 +#: src/raitv/grl-raitv.c:184 msgid "Politics" msgstr "政治" -#: ../src/raitv/grl-raitv.c:192 +#: src/raitv/grl-raitv.c:185 msgid "Leisure" msgstr "休闲" -#: ../src/raitv/grl-raitv.c:193 +#: src/raitv/grl-raitv.c:186 msgid "Travel" msgstr "旅游" -#: ../src/raitv/grl-raitv.c:625 +#: src/raitv/grl-raitv.c:616 #, c-format msgid "Failed to browse: %s" msgstr "无法浏览:%s" -#: ../src/shoutcast/grl-shoutcast.c:65 +#: src/shoutcast/grl-shoutcast.c:60 msgid "A source for browsing SHOUTcast radios" msgstr "用于浏览 SHOUTcast 广播的源" -#: ../src/shoutcast/grl-shoutcast.c:462 +#: src/shoutcast/grl-shoutcast.c:455 #, c-format msgid "Cannot find media %s" msgstr "无法找到媒介 %s" -#: ../src/shoutcast/grl-shoutcast.c:757 ../src/vimeo/grl-vimeo.c:548 +#: src/shoutcast/grl-shoutcast.c:750 src/vimeo/grl-vimeo.c:541 msgid "non-NULL search text is required" msgstr "要求非空的搜索文本" -#: ../src/thetvdb/grl-thetvdb.c:98 +#: src/thetvdb/grl-thetvdb.c:93 msgid "A source for fetching metadata of television shows" msgstr "获取电视节目元数据的源" -#: ../src/tmdb/grl-tmdb.c:1004 +#: src/tmdb/grl-tmdb.c:998 msgid "Remote data does not contain valid identifier" -msgstr "远端数据未包含有效的识别码" +msgstr "远端数据未包含有效的标识符" #. I can haz templatze ?? +#. Schedule the next row to parse +#. I can haz templatze ?? #. Only emit this last one if more result than expected #. Schedule the next line to parse -#: ../src/tracker/grl-tracker-source-api.c:398 -#: ../src/tracker/grl-tracker-source-api.c:481 +#: src/tracker3/grl-tracker-source-api.c:243 +#: src/tracker3/grl-tracker-source-api.c:319 +#: src/tracker/grl-tracker-source-api.c:401 +#: src/tracker/grl-tracker-source-api.c:484 #, c-format msgid "Failed to query: %s" msgstr "无法查询:%s" -#: ../src/tracker/grl-tracker-source-api.c:582 +#: src/tracker3/grl-tracker-source-api.c:418 +#: src/tracker/grl-tracker-source-api.c:585 #, c-format msgid "Failed to get media from uri: %s" msgstr "无法从 uri: %s 处得到媒体" -#: ../src/tracker/grl-tracker-source-api.c:802 +#: src/tracker3/grl-tracker-source-api.c:603 +#: src/tracker/grl-tracker-source-api.c:816 msgid "Empty query" msgstr "空查询" -#: ../src/tracker/grl-tracker-source-api.c:1077 -#, c-format -msgid "ID '%s' is not known in this source" -msgstr "在此源中 ID “%s” 为未知" +#: src/tracker3/grl-tracker-source-api.c:824 +#: src/tracker3/grl-tracker-source-api.c:920 +#: src/tracker/grl-tracker-source-api.c:1087 +#, c-format +msgid "ID “%s” is not known in this source" +msgstr "在此源中 ID“%s”为未知" + +#: src/tracker3/grl-tracker-source-priv.h:47 +msgid "A plugin for searching multimedia content using Tracker3" +msgstr "使用 Tracker3 搜索多媒体内容的插件" -#: ../src/tracker/grl-tracker-source-priv.h:44 +#: src/tracker/grl-tracker-source-priv.h:44 msgid "A plugin for searching multimedia content using Tracker" msgstr "使用 Tracker 搜索多媒体内容的插件" -#: ../src/tracker/grl-tracker-utils.c:691 -#, c-format -msgid "Removable - %s" -msgstr "可移动 - %s" - -#: ../src/tracker/grl-tracker-utils.c:703 -msgid "Local files" -msgstr "本地文件" - -#: ../src/vimeo/grl-vimeo.c:56 +#: src/vimeo/grl-vimeo.c:51 msgid "A source for browsing and searching Vimeo videos" msgstr "用于浏览及搜索 Vimeo 视频的源" -#: ../src/youtube/grl-youtube.c:60 +#: src/youtube/grl-youtube.c:55 msgid "Standard feeds" -msgstr "标准飞递" +msgstr "标准订阅源" -#: ../src/youtube/grl-youtube.c:63 +#: src/youtube/grl-youtube.c:58 msgid "Categories" msgstr "分类" -#: ../src/youtube/grl-youtube.c:69 +#: src/youtube/grl-youtube.c:64 msgid "Top Rated" msgstr "最高评分" -#: ../src/youtube/grl-youtube.c:72 +#: src/youtube/grl-youtube.c:67 msgid "Top Favorites" msgstr "最受欢迎" -#: ../src/youtube/grl-youtube.c:75 +#: src/youtube/grl-youtube.c:70 msgid "Most Viewed" msgstr "最多查看" -#: ../src/youtube/grl-youtube.c:81 +#: src/youtube/grl-youtube.c:76 msgid "Most Recent" -msgstr "最最近期" +msgstr "最新动态" -#: ../src/youtube/grl-youtube.c:84 +#: src/youtube/grl-youtube.c:79 msgid "Most Discussed" msgstr "最多讨论" -#: ../src/youtube/grl-youtube.c:87 +#: src/youtube/grl-youtube.c:82 msgid "Most Linked" -msgstr "最多被链" +msgstr "最多引用" -#: ../src/youtube/grl-youtube.c:90 +#: src/youtube/grl-youtube.c:85 msgid "Most Responded" -msgstr "最多响应" +msgstr "最多回复" -#: ../src/youtube/grl-youtube.c:93 +#: src/youtube/grl-youtube.c:88 msgid "Recently Featured" -msgstr "最近精选" +msgstr "近期精选" -#: ../src/youtube/grl-youtube.c:96 +#: src/youtube/grl-youtube.c:91 msgid "Watch On Mobile" msgstr "在移动设备上观看" -#: ../src/youtube/grl-youtube.c:115 +#: src/youtube/grl-youtube.c:110 msgid "A source for browsing and searching YouTube videos" msgstr "用于浏览及搜索 YouTube 视频的源" -#: ../src/youtube/grl-youtube.c:863 +#: src/youtube/grl-youtube.c:856 msgid "Failed to get feed" -msgstr "无法获得飞递" +msgstr "获取订阅源失败" -#: ../src/youtube/grl-youtube.c:1040 ../src/youtube/grl-youtube.c:1428 +#: src/youtube/grl-youtube.c:1033 src/youtube/grl-youtube.c:1421 #, c-format msgid "Invalid feed identifier %s" -msgstr "无效的飞递识别码 %s" +msgstr "无效的订阅源标识符 %s" + +#~ msgid "Removable — %s" +#~ msgstr "可移动——%s" + +#~ msgid "Local files" +#~ msgstr "本地文件" #~ msgid "Apple Movie Trailers" #~ msgstr "苹果电影格式预告片" diff -Nru grilo-plugins-0.3.11/src/dleyna/grl-dleyna-servers-manager.c grilo-plugins-0.3.12/src/dleyna/grl-dleyna-servers-manager.c --- grilo-plugins-0.3.11/src/dleyna/grl-dleyna-servers-manager.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dleyna/grl-dleyna-servers-manager.c 2020-09-03 05:36:44.366468000 +0000 @@ -97,7 +97,7 @@ gpointer *data) { grl_dleyna_server_new_for_bus (G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, - "com.intel.dleyna-server", object_path, NULL, + DLEYNA_DBUS_NAME, object_path, NULL, grl_dleyna_servers_manager_server_new_cb, self); } @@ -205,7 +205,7 @@ self->priv = priv = grl_dleyna_servers_manager_get_instance_private (self); grl_dleyna_manager_proxy_new_for_bus (G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, - "com.intel.dleyna-server", "/com/intel/dLeynaServer", NULL, + DLEYNA_DBUS_NAME, "/com/intel/dLeynaServer", NULL, grl_dleyna_servers_manager_proxy_new_cb, g_object_ref (self)); priv->servers = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref); } diff -Nru grilo-plugins-0.3.11/src/dleyna/grl-dleyna-source.c grilo-plugins-0.3.12/src/dleyna/grl-dleyna-source.c --- grilo-plugins-0.3.11/src/dleyna/grl-dleyna-source.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dleyna/grl-dleyna-source.c 2020-09-03 05:36:44.366468000 +0000 @@ -36,8 +36,6 @@ #define MEDIA_ID_PREFIX "dleyna:" #define MEDIA_ID_PREFIX_LENGTH 7 -#define DLEYNA_DBUS_NAME "com.intel.dleyna-server" - #define DLEYNA_SEARCH_SPEC \ "(DisplayName contains \"%s\" or " \ "Album contains \"%s\" or " \ @@ -74,6 +72,14 @@ }; typedef enum { + CONTAINER_TYPE_ALBUM, + CONTAINER_TYPE_ARTIST, + CONTAINER_TYPE_GENRE, + CONTAINER_TYPE_UNKNOWN, + CONTAINER_TYPE_NOT_CONTAINER +} ContainerType; + +typedef enum { DLEYNA_CHANGE_TYPE_ADD = 1, DLEYNA_CHANGE_TYPE_MOD = 2, DLEYNA_CHANGE_TYPE_DEL = 3, @@ -297,21 +303,22 @@ } else { gchar **cap; - gboolean type, displayname, album, artist, parent; - type = displayname = album = artist = parent = FALSE; + gboolean type, type_ex, displayname, album, artist, parent; + type = type_ex = displayname = album = artist = parent = FALSE; GRL_DEBUG ("%s caps:", G_STRFUNC); for (cap = (gchar **) search_caps; *cap != NULL; cap++) { GRL_DEBUG (" %s", *cap); type = type || (g_strcmp0(*cap, "Type") == 0); + type_ex = type_ex || (g_strcmp0 (*cap, "TypeEx") == 0); displayname = displayname || (g_strcmp0(*cap, "DisplayName") == 0); album = album || (g_strcmp0(*cap, "Album") == 0); artist = artist || (g_strcmp0(*cap, "Artist") == 0); parent = parent || (g_strcmp0(*cap, "Parent") == 0); } - source->priv->search_enabled = type && (displayname || album || artist); - source->priv->browse_filtered_enabled = type && parent; + source->priv->search_enabled = type && type_ex && (displayname || album || artist); + source->priv->browse_filtered_enabled = type && type_ex && parent; } GRL_DEBUG ("%s %s search:%d filtered:%d", G_STRFUNC, grl_source_get_id (GRL_SOURCE (source)), @@ -463,10 +470,32 @@ } } +static ContainerType +get_container_type (const gchar *type_ex) +{ + ContainerType con_type = CONTAINER_TYPE_UNKNOWN; + + if (g_strcmp0 (type_ex, "container.person.musicArtist") == 0) { + con_type = CONTAINER_TYPE_ARTIST; + } + if (g_strcmp0 (type_ex, "container.album.musicAlbum") == 0) { + con_type = CONTAINER_TYPE_ALBUM; + } + if (g_strcmp0 (type_ex, "container.genre.musicGenre") == 0) { + con_type = CONTAINER_TYPE_GENRE; + } + if (g_str_has_prefix (type_ex, "item")) { + con_type = CONTAINER_TYPE_NOT_CONTAINER; + } + + return con_type; +} + static void media_set_property (GrlMedia *media, const gchar *key, - GVariant *value) + GVariant *value, + ContainerType container_type) { const gchar *s; gint i; @@ -478,6 +507,23 @@ else if (g_strcmp0 (key, "DisplayName") == 0) { s = g_variant_get_string (value, NULL); grl_media_set_title (media, s); + switch (container_type) { + case CONTAINER_TYPE_ALBUM: + grl_media_set_album (media, s); + break; + case CONTAINER_TYPE_ARTIST: + grl_media_set_artist (media, s); + break; + case CONTAINER_TYPE_GENRE: + grl_media_set_genre (media, s); + break; + case CONTAINER_TYPE_NOT_CONTAINER: + grl_media_set_title (media, s); + break; + default: + grl_media_set_title (media, s); + break; + } } else if (g_strcmp0 (key, "URLs") == 0 && g_variant_n_children (value) > 0) { g_variant_get_child (value, 0, "&s", &s); @@ -497,19 +543,19 @@ } else if (g_strcmp0 (key, "Artist") == 0) { s = g_variant_get_string (value, NULL); - if (grl_media_is_audio (media)) { + if (grl_media_is_audio (media) || grl_media_is_container (media)) { grl_media_set_artist (media, s); } } else if (g_strcmp0 (key, "Album") == 0) { s = g_variant_get_string (value, NULL); - if (grl_media_is_audio (media)) { + if (grl_media_is_audio (media) || grl_media_is_container (media)) { grl_media_set_album (media, s); } } else if (g_strcmp0 (key, "Genre") == 0) { s = g_variant_get_string (value, NULL); - if (grl_media_is_audio (media)) { + if (grl_media_is_audio (media) || grl_media_is_container (media)) { grl_media_set_genre (media, s); } } @@ -572,7 +618,8 @@ static GrlMedia * populate_media_from_variant (GrlMedia *media, - GVariant *variant) + GVariant *variant, + ContainerType container_type) { GVariantIter iter; const gchar *key; @@ -580,7 +627,7 @@ g_variant_iter_init (&iter, variant); while (g_variant_iter_next (&iter, "{&sv}", &key, &value)) { - media_set_property (media, key, value); + media_set_property (media, key, value, container_type); g_variant_unref (value); } @@ -592,8 +639,12 @@ { GrlMedia *media; const gchar *type = NULL; + const gchar *type_ex = NULL; g_variant_lookup (variant, "Type", "&s", &type); + g_variant_lookup (variant, "TypeEx", "&s", &type_ex); + + ContainerType container_type = get_container_type (type_ex); if (type == NULL) { media = grl_media_new (); @@ -621,7 +672,7 @@ media = grl_media_new (); } - populate_media_from_variant (media, variant); + populate_media_from_variant (media, variant, container_type); return media; } @@ -743,6 +794,7 @@ filter = g_ptr_array_new (); g_ptr_array_add (filter, "Path"); /* always retrieve the items' DBus path */ g_ptr_array_add (filter, "Type"); /* and their object type */ + g_ptr_array_add (filter, "TypeEx"); /* and their object extended type */ while (keys != NULL) { properties_add_for_key (filter, GRLPOINTER_TO_KEYID (keys->data)); keys = g_list_next (keys); @@ -849,6 +901,7 @@ GAsyncResult *res, gpointer user_data) { + ContainerType container_type = CONTAINER_TYPE_UNKNOWN; GrlDleynaMediaDevice *device = GRL_DLEYNA_MEDIA_DEVICE (object); GrlSourceResolveSpec *rs = user_data; GVariant *results, *dict, *item_error; @@ -883,7 +936,7 @@ return; } - populate_media_from_variant (rs->media, dict); + populate_media_from_variant (rs->media, dict, container_type); rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, NULL); } diff -Nru grilo-plugins-0.3.11/src/dmap/grl-common.c grilo-plugins-0.3.12/src/dmap/grl-common.c --- grilo-plugins-0.3.11/src/dmap/grl-common.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-common.c 2020-09-03 05:36:44.366468000 +0000 @@ -33,13 +33,27 @@ #include #include +#include "grl-dmap-compat.h" #include "grl-common.h" gchar * -grl_dmap_build_url (DMAPMdnsBrowserService *service) +grl_dmap_build_url (DmapMdnsService *service) { - return g_strdup_printf ("%s://%s:%u", - service->service_name, - service->host, - service->port); + gchar *url = NULL; + gchar *service_name, *host; + guint port; + + service_name = grl_dmap_service_get_service_name (service); + host = grl_dmap_service_get_host (service); + port = grl_dmap_service_get_port (service); + + url = g_strdup_printf ("%s://%s:%u", + service_name, + host, + port); + + g_free (service_name); + g_free (host); + + return url; } diff -Nru grilo-plugins-0.3.11/src/dmap/grl-common.h grilo-plugins-0.3.12/src/dmap/grl-common.h --- grilo-plugins-0.3.11/src/dmap/grl-common.h 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-common.h 2020-09-03 05:36:44.366468000 +0000 @@ -24,9 +24,6 @@ #ifndef _GRL_COMMON_H_ #define _GRL_COMMON_H_ -#include -#include - typedef struct { GrlSourceResultCb callback; GrlSource *source; @@ -41,9 +38,9 @@ typedef struct { ResultCbAndArgs cb; - DMAPDb *db; + DmapDb *db; } ResultCbAndArgsAndDb; -gchar *grl_dmap_build_url (DMAPMdnsBrowserService *service); +gchar *grl_dmap_build_url (DmapMdnsService *service); #endif /* _GRL_COMMON_H_ */ diff -Nru grilo-plugins-0.3.11/src/dmap/grl-daap.c grilo-plugins-0.3.12/src/dmap/grl-daap.c --- grilo-plugins-0.3.11/src/dmap/grl-daap.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-daap.c 2020-09-03 05:36:44.367467900 +0000 @@ -33,6 +33,7 @@ #include #include +#include "grl-daap-compat.h" #include "grl-common.h" #include "grl-daap.h" #include "grl-daap-db.h" @@ -42,7 +43,7 @@ /* --------- Logging -------- */ #define GRL_LOG_DOMAIN_DEFAULT daap_log_domain -GRL_LOG_DOMAIN_STATIC(daap_log_domain); +GRL_LOG_DOMAIN_STATIC (daap_log_domain); /* --- Plugin information --- */ @@ -52,12 +53,12 @@ /* --- Grilo DAAP Private --- */ struct _GrlDaapSourcePrivate { - DMAPMdnsBrowserService *service; + DmapMdnsService *service; }; /* --- Data types --- */ -static GrlDaapSource *grl_daap_source_new (DMAPMdnsBrowserService *service); +static GrlDaapSource *grl_daap_source_new (DmapMdnsService *service); static void grl_daap_source_finalize (GObject *object); @@ -74,16 +75,16 @@ GrlSourceSearchSpec *ss); -static void grl_daap_service_added_cb (DMAPMdnsBrowser *browser, - DMAPMdnsBrowserService *service, +static void grl_daap_service_added_cb (DmapMdnsBrowser *browser, + DmapMdnsService *service, GrlPlugin *plugin); -static void grl_daap_service_removed_cb (DMAPMdnsBrowser *browser, +static void grl_daap_service_removed_cb (DmapMdnsBrowser *browser, const gchar *service_name, GrlPlugin *plugin); /* ===================== Globals ======================= */ -static DMAPMdnsBrowser *browser; +static DmapMdnsBrowser *browser; /* Maps URIs to DBs */ static GHashTable *connections; /* Map DAAP services to Grilo media sources */ @@ -106,24 +107,24 @@ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - browser = dmap_mdns_browser_new (DMAP_MDNS_BROWSER_SERVICE_TYPE_DAAP); + browser = dmap_mdns_browser_new (DMAP_MDNS_SERVICE_TYPE_DAAP); connections = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); g_signal_connect (G_OBJECT (browser), - "service-added", + "service-added", G_CALLBACK (grl_daap_service_added_cb), (gpointer) plugin); g_signal_connect (G_OBJECT (browser), - "service-removed", + "service-removed", G_CALLBACK (grl_daap_service_removed_cb), (gpointer) plugin); if (!dmap_mdns_browser_start (browser, &error)) { GRL_DEBUG ("error starting browser. code: %d message: %s", - error->code, - error->message); + error->code, + error->message); g_error_free (error); g_hash_table_unref (connections); @@ -138,12 +139,12 @@ GRL_PLUGIN_DEFINE (GRL_MAJOR, GRL_MINOR, DAAP_PLUGIN_ID, - "DAAP", - "A plugin for browsing DAAP servers", - "W. Michael Petullo", + "DAAP", + "A plugin for browsing DAAP servers", + "W. Michael Petullo", VERSION, - "LGPL", - "http://www.flyn.org", + "LGPL", + "http://www.flyn.org", grl_daap_plugin_init, NULL, NULL); @@ -153,8 +154,10 @@ G_DEFINE_TYPE_WITH_PRIVATE (GrlDaapSource, grl_daap_source, GRL_TYPE_SOURCE) static GrlDaapSource * -grl_daap_source_new (DMAPMdnsBrowserService *service) +grl_daap_source_new (DmapMdnsService *service) { + gchar *name; + gchar *service_name; gchar *source_desc; gchar *source_id; @@ -162,20 +165,25 @@ GRL_DEBUG ("grl_daap_source_new"); - source_desc = g_strdup_printf (SOURCE_DESC_TEMPLATE, service->name); - source_id = g_strdup_printf (SOURCE_ID_TEMPLATE, service->name); + name = grl_dmap_service_get_name (service); + service_name = grl_dmap_service_get_service_name (service); + + source_desc = g_strdup_printf (SOURCE_DESC_TEMPLATE, name); + source_id = g_strdup_printf (SOURCE_ID_TEMPLATE, name); source = g_object_new (GRL_DAAP_SOURCE_TYPE, - "source-id", source_id, - "source-name", service->name, - "source-desc", source_desc, - "supported-media", GRL_SUPPORTED_MEDIA_AUDIO, + "source-id", source_id, + "source-name", service_name, + "source-desc", source_desc, + "supported-media", GRL_SUPPORTED_MEDIA_AUDIO, NULL); source->priv->service = service; g_free (source_desc); g_free (source_id); + g_free (service_name); + g_free (name); return source; } @@ -209,14 +217,14 @@ static void grl_daap_do_browse (ResultCbAndArgsAndDb *cb_and_db) { - grl_daap_db_browse(GRL_DAAP_DB(cb_and_db->db), - cb_and_db->cb.container, - cb_and_db->cb.source, - cb_and_db->cb.op_id, - cb_and_db->cb.skip, - cb_and_db->cb.count, - cb_and_db->cb.callback, - cb_and_db->cb.user_data); + grl_daap_db_browse (GRL_DAAP_DB (cb_and_db->db), + cb_and_db->cb.container, + cb_and_db->cb.source, + cb_and_db->cb.op_id, + cb_and_db->cb.skip, + cb_and_db->cb.count, + cb_and_db->cb.callback, + cb_and_db->cb.user_data); g_free (cb_and_db); } @@ -224,19 +232,19 @@ static void grl_daap_do_search (ResultCbAndArgsAndDb *cb_and_db) { - grl_daap_db_search(GRL_DAAP_DB(cb_and_db->db), - cb_and_db->cb.source, - cb_and_db->cb.op_id, - (GHRFunc) cb_and_db->cb.predicate, - cb_and_db->cb.predicate_data, - cb_and_db->cb.callback, - cb_and_db->cb.user_data); + grl_daap_db_search (GRL_DAAP_DB (cb_and_db->db), + cb_and_db->cb.source, + cb_and_db->cb.op_id, + (GHRFunc) cb_and_db->cb.predicate, + cb_and_db->cb.predicate_data, + cb_and_db->cb.callback, + cb_and_db->cb.user_data); g_free (cb_and_db); } static void -browse_connected_cb (DMAPConnection *connection, +browse_connected_cb (DmapConnection *connection, gboolean result, const char *reason, ResultCbAndArgsAndDb *cb_and_db) @@ -261,7 +269,7 @@ } static void -search_connected_cb (DMAPConnection *connection, +search_connected_cb (DmapConnection *connection, gboolean result, const char *reason, ResultCbAndArgsAndDb *cb_and_db) @@ -286,8 +294,8 @@ } static void -grl_daap_service_added_cb (DMAPMdnsBrowser *browser, - DMAPMdnsBrowserService *service, +grl_daap_service_added_cb (DmapMdnsBrowser *browser, + DmapMdnsService *service, GrlPlugin *plugin) { GrlRegistry *registry = grl_registry_get_default (); @@ -301,13 +309,16 @@ GRL_SOURCE (source), NULL); if (source != NULL) { - g_hash_table_insert (sources, g_strdup (service->name), g_object_ref (source)); + gchar *name; + name = grl_dmap_service_get_name (service); + g_hash_table_insert (sources, g_strdup (name), g_object_ref (source)); g_object_remove_weak_pointer (G_OBJECT (source), (gpointer *) &source); + g_free (name); } } static void -grl_daap_service_removed_cb (DMAPMdnsBrowser *browser, +grl_daap_service_removed_cb (DmapMdnsBrowser *browser, const gchar *service_name, GrlPlugin *plugin) { @@ -323,14 +334,14 @@ } static void -grl_daap_connect (gchar *name, gchar *host, guint port, ResultCbAndArgsAndDb *cb_and_db, DMAPConnectionCallback callback) +grl_daap_connect (gchar *name, gchar *host, guint port, ResultCbAndArgsAndDb *cb_and_db, DmapConnectionFunc callback) { - DMAPRecordFactory *factory; - DMAPConnection *connection; + DmapRecordFactory *factory; + DmapConnection *connection; factory = DMAP_RECORD_FACTORY (grl_daap_record_factory_new ()); - connection = DMAP_CONNECTION (daap_connection_new (name, host, port, DMAP_DB (cb_and_db->db), factory)); - dmap_connection_connect (connection, (DMAPConnectionCallback) callback, cb_and_db); + connection = DMAP_CONNECTION (dmap_av_connection_new (name, host, port, DMAP_DB (cb_and_db->db), factory)); + dmap_connection_start (connection, (DmapConnectionFunc) callback, cb_and_db); } static gboolean @@ -397,15 +408,25 @@ browse_connected_cb (NULL, TRUE, NULL, cb_and_db); } else { /* Connect */ + gchar *name, *host; + guint port; + cb_and_db->db = DMAP_DB (grl_daap_db_new ()); - grl_daap_connect (dmap_source->priv->service->name, - dmap_source->priv->service->host, - dmap_source->priv->service->port, + name = grl_dmap_service_get_name (dmap_source->priv->service); + host = grl_dmap_service_get_host (dmap_source->priv->service); + port = grl_dmap_service_get_port (dmap_source->priv->service); + + grl_daap_connect (name, + host, + port, cb_and_db, - (DMAPConnectionCallback) browse_connected_cb); + (DmapConnectionFunc) browse_connected_cb); g_hash_table_insert (connections, g_strdup (url), cb_and_db->db); + + g_free (name); + g_free (host); } g_free (url); @@ -417,7 +438,7 @@ GrlDaapSource *dmap_source = GRL_DAAP_SOURCE (source); ResultCbAndArgsAndDb *cb_and_db; - DMAPMdnsBrowserService *service = dmap_source->priv->service; + DmapMdnsService *service = dmap_source->priv->service; gchar *url = grl_dmap_build_url (service); cb_and_db = g_new (ResultCbAndArgsAndDb, 1); @@ -435,9 +456,25 @@ search_connected_cb (NULL, TRUE, NULL, cb_and_db); } else { /* Connect */ + gchar *name, *host; + guint port; + cb_and_db->db = DMAP_DB (grl_daap_db_new ()); - grl_daap_connect (service->name, service->host, service->port, cb_and_db, (DMAPConnectionCallback) search_connected_cb); + + name = grl_dmap_service_get_name (dmap_source->priv->service); + host = grl_dmap_service_get_host (dmap_source->priv->service); + port = grl_dmap_service_get_port (dmap_source->priv->service); + + grl_daap_connect (name, + host, + port, + cb_and_db, + (DmapConnectionFunc) search_connected_cb); + g_hash_table_insert (connections, g_strdup (url), cb_and_db->db); + + g_free (name); + g_free (host); } g_free (url); diff -Nru grilo-plugins-0.3.11/src/dmap/grl-daap-compat.h grilo-plugins-0.3.12/src/dmap/grl-daap-compat.h --- grilo-plugins-0.3.11/src/dmap/grl-daap-compat.h 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-daap-compat.h 2020-09-03 05:36:44.366468000 +0000 @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2019 W. Michael Petullo + * Copyright (C) 2019 Igalia S.L. + * + * Contact: W. Michael Petullo + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef _GRL_DAAP_COMPAT_H_ +#define _GRL_DAAP_COMPAT_H_ + +#include "grl-dmap-compat.h" + +#ifdef LIBDMAPSHARING_COMPAT + +DMAPRecord *grl_daap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data, GError **error); +guint grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record, GError **error); + +/* Building against libdmapsharing 3 API. */ + +#define dmap_av_connection_new daap_connection_new +#define DmapAvRecord DAAPRecord +#define DmapAvRecordInterface DAAPRecordIface +#define DMAP_AV_RECORD DAAP_RECORD +#define DMAP_TYPE_AV_RECORD DAAP_TYPE_RECORD +#define DMAP_IS_AV_RECORD IS_DAAP_RECORD + +static inline DmapRecord * +grl_daap_record_factory_create_compat (DmapRecordFactory *factory, gpointer user_data) +{ + return grl_daap_record_factory_create (factory, user_data, NULL); +} + +static inline guint +grl_daap_db_add_compat (DmapDb *_db, DmapRecord *_record) +{ + return grl_daap_db_add (_db, _record, NULL); +} + +#else + +/* Building against libdmapsharing 4 API. */ + +DmapRecord *grl_daap_record_factory_create (DmapRecordFactory *factory, gpointer user_data, GError **error); +guint grl_daap_db_add (DmapDb *_db, DmapRecord *_record, GError **error); + +static inline DmapRecord * +grl_daap_record_factory_create_compat (DmapRecordFactory *factory, gpointer user_data, GError **error) +{ + return grl_daap_record_factory_create (factory, user_data, error); +} + +static inline guint +grl_daap_db_add_compat (DmapDb *_db, DmapRecord *_record, GError **error) +{ + return grl_daap_db_add (_db, _record, error); +} + +#endif + +#endif /* _GRL_DAAP_COMPAT_H_ */ diff -Nru grilo-plugins-0.3.11/src/dmap/grl-daap-db.c grilo-plugins-0.3.12/src/dmap/grl-daap-db.c --- grilo-plugins-0.3.11/src/dmap/grl-daap-db.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-daap-db.c 2020-09-03 05:36:44.367467900 +0000 @@ -54,8 +54,12 @@ #include #include #include +#include #include +#include +#include "grl-daap-compat.h" +#include "grl-common.h" #include "grl-daap-db.h" #define ALBUMS_ID "albums" @@ -66,7 +70,7 @@ /* Media ID's start at max and go down. Container ID's start at 1 and go up. */ static guint nextid = G_MAXINT; /* NOTE: this should be G_MAXUINT, but iPhoto can't handle it. */ -struct GrlDAAPDbPrivate { +struct GrlDaapDbPrivate { /* Contains each album container (tracked with albums hash table) */ GrlMedia *albums_container; @@ -95,31 +99,31 @@ return g_str_equal (grl_media_get_id (GRL_MEDIA (a)), grl_media_get_id (GRL_MEDIA (b))); } -GrlDAAPDb * +GrlDaapDb * grl_daap_db_new (void) { - GrlDAAPDb *db = g_object_new (TYPE_GRL_DAAP_DB, NULL); + GrlDaapDb *db = g_object_new (TYPE_GRL_DAAP_DB, NULL); return db; } -static DMAPRecord * -grl_daap_db_lookup_by_id (const DMAPDb *db, guint id) +static DmapRecord * +grl_daap_db_lookup_by_id (const DmapDb *db, guint id) { g_error ("Not implemented"); return NULL; } static void -grl_daap_db_foreach (const DMAPDb *db, - GHFunc func, - gpointer data) +grl_daap_db_foreach (const DmapDb *db, + DmapIdRecordFunc func, + gpointer data) { g_error ("Not implemented"); } static gint64 -grl_daap_db_count (const DMAPDb *db) +grl_daap_db_count (const DmapDb *db) { g_error ("Not implemented"); return 0; @@ -135,7 +139,7 @@ id = g_strdup_printf ("%s-%s", category_name, set_name); container = grl_media_container_new (); - grl_media_set_id (container, id); + grl_media_set_id (container, id); grl_media_set_title (container, set_name); set = g_hash_table_lookup (category, container); @@ -150,14 +154,14 @@ g_object_unref (container); } -static guint -grl_daap_db_add (DMAPDb *_db, DMAPRecord *_record) +guint +grl_daap_db_add (DmapDb *_db, DmapRecord *_record, GError **error) { - g_assert (IS_GRL_DAAP_DB (_db)); - g_assert (IS_DAAP_RECORD (_record)); + g_assert (GRL_IS_DAAP_DB (_db)); + g_assert (DMAP_IS_AV_RECORD (_record)); - GrlDAAPDb *db = GRL_DAAP_DB (_db); - DAAPRecord *record = DAAP_RECORD (_record); + GrlDaapDb *db = GRL_DAAP_DB (_db); + DmapAvRecord *record = DMAP_AV_RECORD (_record); gint duration = 0; gint32 bitrate = 0, @@ -173,26 +177,16 @@ GrlMedia *media; g_object_get (record, - "songalbum", - &album, - "songartist", - &artist, - "bitrate", - &bitrate, - "duration", - &duration, - "songgenre", - &genre, - "title", - &title, - "track", - &track, - "disc", - &disc, - "location", - &url, - "has-video", - &has_video, + "songalbum", &album, + "songartist", &artist, + "bitrate", &bitrate, + "duration", &duration, + "songgenre", &genre, + "title", &title, + "track", &track, + "disc", &disc, + "location", &url, + "has-video", &has_video, NULL); id_s = g_strdup_printf ("%u", nextid); @@ -203,8 +197,8 @@ media = grl_media_audio_new (); } - grl_media_set_id (media, id_s); - grl_media_set_duration (media, duration); + grl_media_set_id (media, id_s); + grl_media_set_duration (media, duration); if (title) { grl_media_set_title (media, title); @@ -217,7 +211,7 @@ } if (has_video == FALSE) { - grl_media_set_bitrate (media, bitrate); + grl_media_set_bitrate (media, bitrate); grl_media_set_track_number (media, track); if (disc != 0) { @@ -242,6 +236,11 @@ g_free (id_s); g_object_unref (media); + g_free (album); + g_free (artist); + g_free (genre); + g_free (title); + g_free (url); return --nextid; } @@ -249,11 +248,11 @@ static gboolean same_media (GrlMedia *a, GrlMedia *b) { - return (strcmp (grl_media_get_id (a), grl_media_get_id (b)) == 0); + return strcmp (grl_media_get_id (a), grl_media_get_id (b)) == 0; } void -grl_daap_db_browse (GrlDAAPDb *db, +grl_daap_db_browse (GrlDaapDb *db, GrlMedia *container, GrlSource *source, guint op_id, @@ -262,7 +261,7 @@ GrlSourceResultCb func, gpointer user_data) { - g_assert (IS_GRL_DAAP_DB (db)); + g_assert (GRL_IS_DAAP_DB (db)); int i; guint remaining; @@ -312,7 +311,7 @@ } void -grl_daap_db_search (GrlDAAPDb *db, +grl_daap_db_search (GrlDaapDb *db, GrlSource *source, guint op_id, GHRFunc predicate, @@ -320,7 +319,7 @@ GrlSourceResultCb func, gpointer user_data) { - g_assert (IS_GRL_DAAP_DB (db)); + g_assert (GRL_IS_DAAP_DB (db)); gint i, j, k; guint remaining = 0; @@ -334,7 +333,7 @@ results = g_hash_table_new (g_str_hash, g_str_equal); /* For albums and artists... */ - for (i = 0; i < G_N_ELEMENTS(hash_tables); i++) { + for (i = 0; i < G_N_ELEMENTS (hash_tables); i++) { g_hash_table_iter_init (&iter1, hash_tables[i]); /* For each album or artist in above... */ for (j = 0; g_hash_table_iter_next (&iter1, &key1, &val1); j++) { @@ -364,18 +363,18 @@ static void dmap_db_interface_init (gpointer iface, gpointer data) { - DMAPDbIface *daap_db = iface; + DmapDbInterface *daap_db = iface; g_assert (G_TYPE_FROM_INTERFACE (daap_db) == DMAP_TYPE_DB); - daap_db->add = grl_daap_db_add; + daap_db->add = grl_daap_db_add_compat; daap_db->lookup_by_id = grl_daap_db_lookup_by_id; daap_db->foreach = grl_daap_db_foreach; daap_db->count = grl_daap_db_count; } -G_DEFINE_TYPE_WITH_CODE (GrlDAAPDb, grl_daap_db, G_TYPE_OBJECT, - G_ADD_PRIVATE (GrlDAAPDb) +G_DEFINE_TYPE_WITH_CODE (GrlDaapDb, grl_daap_db, G_TYPE_OBJECT, + G_ADD_PRIVATE (GrlDaapDb) G_IMPLEMENT_INTERFACE (DMAP_TYPE_DB, dmap_db_interface_init)) static GObject* @@ -389,17 +388,17 @@ } static void -grl_daap_db_init (GrlDAAPDb *db) +grl_daap_db_init (GrlDaapDb *db) { db->priv = grl_daap_db_get_instance_private (db); db->priv->albums_container = grl_media_container_new (); db->priv->artists_container = grl_media_container_new (); - grl_media_set_id (GRL_MEDIA (db->priv->albums_container), ALBUMS_ID); + grl_media_set_id (GRL_MEDIA (db->priv->albums_container), ALBUMS_ID); grl_media_set_title (GRL_MEDIA (db->priv->albums_container), ALBUMS_NAME); - grl_media_set_id (GRL_MEDIA (db->priv->artists_container), ARTISTS_ID); + grl_media_set_id (GRL_MEDIA (db->priv->artists_container), ARTISTS_ID); grl_media_set_title (GRL_MEDIA (db->priv->artists_container), ARTISTS_NAME); db->priv->root = g_hash_table_new_full (container_hash, container_equal, g_object_unref, (GDestroyNotify) g_hash_table_destroy); @@ -413,9 +412,9 @@ static void grl_daap_db_finalize (GObject *object) { - GrlDAAPDb *db = GRL_DAAP_DB (object); + GrlDaapDb *db = GRL_DAAP_DB (object); - GRL_DEBUG ("Finalizing GrlDAAPDb"); + GRL_DEBUG ("Finalizing GrlDaapDb"); g_object_unref (db->priv->albums_container); g_object_unref (db->priv->artists_container); @@ -426,9 +425,9 @@ static void grl_daap_db_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) + guint prop_id, + const GValue *value, + GParamSpec *pspec) { switch (prop_id) { default: @@ -439,9 +438,9 @@ static void grl_daap_db_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) + guint prop_id, + GValue *value, + GParamSpec *pspec) { switch (prop_id) { default: @@ -452,7 +451,7 @@ static void -grl_daap_db_class_init (GrlDAAPDbClass *klass) +grl_daap_db_class_init (GrlDaapDbClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); diff -Nru grilo-plugins-0.3.11/src/dmap/grl-daap-db.h grilo-plugins-0.3.12/src/dmap/grl-daap-db.h --- grilo-plugins-0.3.11/src/dmap/grl-daap-db.h 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-daap-db.h 2020-09-03 05:36:44.367467900 +0000 @@ -24,49 +24,51 @@ #include #include +#include "grl-daap-compat.h" + G_BEGIN_DECLS -#define TYPE_GRL_DAAP_DB \ - (grl_daap_db_get_type ()) +#define TYPE_GRL_DAAP_DB (grl_daap_db_get_type ()) -#define GRL_DAAP_DB(o) \ - (G_TYPE_CHECK_INSTANCE_CAST ((o), \ - TYPE_GRL_DAAP_DB, \ - GrlDAAPDb)) - -#define GRL_DAAP_DB_CLASS(k) \ - (G_TYPE_CHECK_CLASS_CAST((k), \ - TYPE_GRL_DAAP_DB, \ - GrlDAAPDbClass)) -#define IS_GRL_DAAP_DB(o) \ - (G_TYPE_CHECK_INSTANCE_TYPE((o), \ - TYPE_GRL_DAAP_DB)) -#define IS_GRL_DAAP_DB_CLASS(k) \ - (G_TYPE_CHECK_CLASS_TYPE((k), \ - TYPE_GRL_DAAP_DB_CLASS)) - -#define GRL_DAAP_DB_GET_CLASS(o) \ - (G_TYPE_INSTANCE_GET_CLASS((o), \ - TYPE_GRL_DAAP_DB, \ - GrlDAAPDbClass)) - -#define GRL_DAAP_DB_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE((o), \ - TYPE_GRL_DAAP_DB, \ - GrlDAAPDbPrivate)) +#define GRL_DAAP_DB(o) \ + (G_TYPE_CHECK_INSTANCE_CAST ((o), \ + TYPE_GRL_DAAP_DB, \ + GrlDaapDb)) + +#define GRL_DAAP_DB_CLASS(k) \ + (G_TYPE_CHECK_CLASS_CAST ((k), \ + TYPE_GRL_DAAP_DB, \ + GrlDaapDbClass)) +#define GRL_IS_DAAP_DB(o) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((o), \ + TYPE_GRL_DAAP_DB)) + +#define GRL_IS_DAAP_DB_CLASS(k) \ + (G_TYPE_CHECK_CLASS_TYPE ((k), \ + TYPE_GRL_DAAP_DB_CLASS)) + +#define GRL_DAAP_DB_GET_CLASS(o) \ + (G_TYPE_INSTANCE_GET_CLASS ((o), \ + TYPE_GRL_DAAP_DB, \ + GrlDaapDbClass)) + +#define GRL_DAAP_DB_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ + TYPE_GRL_DAAP_DB, \ + GrlDaapDbPrivate)) -typedef struct GrlDAAPDbPrivate GrlDAAPDbPrivate; +typedef struct GrlDaapDbPrivate GrlDaapDbPrivate; typedef struct { GObject parent; - GrlDAAPDbPrivate *priv; -} GrlDAAPDb; + GrlDaapDbPrivate *priv; +} GrlDaapDb; typedef struct { GObjectClass parent; -} GrlDAAPDbClass; +} GrlDaapDbClass; -void grl_daap_db_browse (GrlDAAPDb *db, +void grl_daap_db_browse (GrlDaapDb *db, GrlMedia *container, GrlSource *source, guint op_id, @@ -75,7 +77,7 @@ GrlSourceResultCb func, gpointer user_data); -void grl_daap_db_search (GrlDAAPDb *db, +void grl_daap_db_search (GrlDaapDb *db, GrlSource *source, guint op_id, GHRFunc predicate, @@ -83,7 +85,7 @@ GrlSourceResultCb func, gpointer user_data); -GrlDAAPDb *grl_daap_db_new (void); +GrlDaapDb *grl_daap_db_new (void); GType grl_daap_db_get_type (void); diff -Nru grilo-plugins-0.3.11/src/dmap/grl-daap.h grilo-plugins-0.3.12/src/dmap/grl-daap.h --- grilo-plugins-0.3.11/src/dmap/grl-daap.h 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-daap.h 2020-09-03 05:36:44.367467900 +0000 @@ -26,31 +26,32 @@ #include -#define GRL_DAAP_SOURCE_TYPE \ - (grl_daap_source_get_type ()) +#include "grl-daap-compat.h" -#define GRL_DAAP_SOURCE(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ - GRL_DAAP_SOURCE_TYPE, \ - GrlDaapSource)) - -#define GRL_IS_DAAP_SOURCE(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ - GRL_DAAP_SOURCE_TYPE)) - -#define GRL_DAAP_SOURCE_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass), \ - GRL_DAAP_SOURCE_TYPE, \ - GrlDaapSourceClass)) - -#define GRL_IS_DAAP_SOURCE_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass), \ - GRL_DAAP_SOURCE_TYPE)) - -#define GRL_DAAP_SOURCE_GET_CLASS(obj) \ - (G_TYPE_INSTANCE_GET_CLASS ((obj), \ - GRL_DAAP_SOURCE_TYPE, \ - GrlDaapSourceClass)) +#define GRL_DAAP_SOURCE_TYPE (grl_daap_source_get_type ()) + +#define GRL_DAAP_SOURCE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + GRL_DAAP_SOURCE_TYPE, \ + GrlDaapSource)) + +#define GRL_IS_DAAP_SOURCE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + GRL_DAAP_SOURCE_TYPE)) + +#define GRL_DAAP_SOURCE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), \ + GRL_DAAP_SOURCE_TYPE, \ + GrlDaapSourceClass)) + +#define GRL_IS_DAAP_SOURCE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), \ + GRL_DAAP_SOURCE_TYPE)) + +#define GRL_DAAP_SOURCE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), \ + GRL_DAAP_SOURCE_TYPE, \ + GrlDaapSourceClass)) typedef struct _GrlDaapSourcePrivate GrlDaapSourcePrivate; typedef struct _GrlDaapSource GrlDaapSource; diff -Nru grilo-plugins-0.3.11/src/dmap/grl-daap-record.c grilo-plugins-0.3.12/src/dmap/grl-daap-record.c --- grilo-plugins-0.3.11/src/dmap/grl-daap-record.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-daap-record.c 2020-09-03 05:36:44.367467900 +0000 @@ -20,9 +20,14 @@ * */ +#include +#include + +#include "grl-daap-compat.h" +#include "grl-common.h" #include "grl-daap-record.h" -struct GrlDAAPRecordPrivate { +struct GrlDaapRecordPrivate { guint64 filesize; char *location; char *format; @@ -69,11 +74,11 @@ static void grl_daap_record_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) + guint prop_id, + const GValue *value, + GParamSpec *pspec) { - GrlDAAPRecord *record = SIMPLE_DAAP_RECORD (object); + GrlDaapRecord *record = SIMPLE_DAAP_RECORD (object); switch (prop_id) { case PROP_LOCATION: @@ -86,27 +91,27 @@ break; case PROP_ALBUM: g_free (record->priv->album); - record->priv->album = g_value_dup_string(value); + record->priv->album = g_value_dup_string (value); break; case PROP_SORT_ALBUM: g_free (record->priv->sort_album); - record->priv->sort_album = g_value_dup_string(value); + record->priv->sort_album = g_value_dup_string (value); break; case PROP_ARTIST: g_free (record->priv->artist); - record->priv->artist = g_value_dup_string(value); + record->priv->artist = g_value_dup_string (value); break; case PROP_SORT_ARTIST: g_free (record->priv->sort_artist); - record->priv->sort_artist = g_value_dup_string(value); + record->priv->sort_artist = g_value_dup_string (value); break; case PROP_GENRE: g_free (record->priv->genre); - record->priv->genre = g_value_dup_string(value); + record->priv->genre = g_value_dup_string (value); break; case PROP_FORMAT: g_free (record->priv->format); - record->priv->format = g_value_dup_string(value); + record->priv->format = g_value_dup_string (value); break; case PROP_MEDIAKIND: record->priv->mediakind = g_value_get_enum (value); @@ -142,20 +147,18 @@ record->priv->has_video = g_value_get_boolean (value); break; default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, - prop_id, - pspec); + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void grl_daap_record_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) + guint prop_id, + GValue *value, + GParamSpec *pspec) { - GrlDAAPRecord *record = SIMPLE_DAAP_RECORD (object); + GrlDaapRecord *record = SIMPLE_DAAP_RECORD (object); switch (prop_id) { case PROP_LOCATION: @@ -216,21 +219,19 @@ g_value_set_boolean (value, record->priv->has_video); break; default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, - prop_id, - pspec); + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } -GrlDAAPRecord * +GrlDaapRecord * grl_daap_record_new (void) { return SIMPLE_DAAP_RECORD (g_object_new (TYPE_SIMPLE_DAAP_RECORD, NULL)); } GInputStream * -grl_daap_record_read (DAAPRecord *record, GError **error) +grl_daap_record_read (DmapAvRecord *record, GError **error) { GFile *file; GInputStream *stream; @@ -244,7 +245,7 @@ } static void -grl_daap_record_init (GrlDAAPRecord *record) +grl_daap_record_init (GrlDaapRecord *record) { record->priv = SIMPLE_DAAP_RECORD_GET_PRIVATE (record); } @@ -252,7 +253,7 @@ static void grl_daap_record_finalize (GObject *object); static void -grl_daap_record_class_init (GrlDAAPRecordClass *klass) +grl_daap_record_class_init (GrlDaapRecordClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); @@ -284,9 +285,9 @@ static void grl_daap_record_daap_iface_init (gpointer iface, gpointer data) { - DAAPRecordIface *daap_record = iface; + DmapAvRecordInterface *daap_record = iface; - g_assert (G_TYPE_FROM_INTERFACE (daap_record) == DAAP_TYPE_RECORD); + g_assert (G_TYPE_FROM_INTERFACE (daap_record) == DMAP_TYPE_AV_RECORD); daap_record->read = grl_daap_record_read; } @@ -294,21 +295,21 @@ static void grl_daap_record_dmap_iface_init (gpointer iface, gpointer data) { - DMAPRecordIface *dmap_record = iface; + DmapRecordInterface *dmap_record = iface; g_assert (G_TYPE_FROM_INTERFACE (dmap_record) == DMAP_TYPE_RECORD); } -G_DEFINE_TYPE_WITH_CODE (GrlDAAPRecord, grl_daap_record, G_TYPE_OBJECT, - G_ADD_PRIVATE (GrlDAAPRecord) - G_IMPLEMENT_INTERFACE (DAAP_TYPE_RECORD, grl_daap_record_daap_iface_init) +G_DEFINE_TYPE_WITH_CODE (GrlDaapRecord, grl_daap_record, G_TYPE_OBJECT, + G_ADD_PRIVATE (GrlDaapRecord) + G_IMPLEMENT_INTERFACE (DMAP_TYPE_AV_RECORD, grl_daap_record_daap_iface_init) G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD, grl_daap_record_dmap_iface_init)) static void grl_daap_record_finalize (GObject *object) { - GrlDAAPRecord *record = SIMPLE_DAAP_RECORD (object); + GrlDaapRecord *record = SIMPLE_DAAP_RECORD (object); g_free (record->priv->location); g_free (record->priv->title); diff -Nru grilo-plugins-0.3.11/src/dmap/grl-daap-record-factory.c grilo-plugins-0.3.12/src/dmap/grl-daap-record-factory.c --- grilo-plugins-0.3.11/src/dmap/grl-daap-record-factory.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-daap-record-factory.c 2020-09-03 05:36:44.367467900 +0000 @@ -1,5 +1,5 @@ /* - * DAAPRecord factory class + * DmapAvRecord factory class * * Copyright (C) 2008 W. Michael Petullo * @@ -18,41 +18,46 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include +#include + +#include "grl-daap-compat.h" +#include "grl-common.h" #include "grl-daap-record-factory.h" #include "grl-daap-record.h" -DMAPRecord * -grl_daap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data) +DmapRecord * +grl_daap_record_factory_create (DmapRecordFactory *factory, gpointer user_data, GError **error) { - return DMAP_RECORD (grl_daap_record_new ()); + return DMAP_RECORD (grl_daap_record_new ()); } static void -grl_daap_record_factory_init (GrlDAAPRecordFactory *factory) +grl_daap_record_factory_init (GrlDaapRecordFactory *factory) { } static void -grl_daap_record_factory_class_init (GrlDAAPRecordFactoryClass *klass) +grl_daap_record_factory_class_init (GrlDaapRecordFactoryClass *klass) { } static void grl_daap_record_factory_interface_init (gpointer iface, gpointer data) { - DMAPRecordFactoryIface *factory = iface; + DmapRecordFactoryInterface *factory = iface; - g_assert (G_TYPE_FROM_INTERFACE (factory) == DMAP_TYPE_RECORD_FACTORY); + g_assert (G_TYPE_FROM_INTERFACE (factory) == DMAP_TYPE_RECORD_FACTORY); - factory->create = grl_daap_record_factory_create; + factory->create = grl_daap_record_factory_create_compat; } -G_DEFINE_TYPE_WITH_CODE (GrlDAAPRecordFactory, grl_daap_record_factory, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD_FACTORY, - grl_daap_record_factory_interface_init)) +G_DEFINE_TYPE_WITH_CODE (GrlDaapRecordFactory, grl_daap_record_factory, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD_FACTORY, + grl_daap_record_factory_interface_init)) -GrlDAAPRecordFactory * +GrlDaapRecordFactory * grl_daap_record_factory_new (void) { - return SIMPLE_DAAP_RECORD_FACTORY (g_object_new (TYPE_SIMPLE_DAAP_RECORD_FACTORY, NULL)); + return SIMPLE_DAAP_RECORD_FACTORY (g_object_new (TYPE_SIMPLE_DAAP_RECORD_FACTORY, NULL)); } diff -Nru grilo-plugins-0.3.11/src/dmap/grl-daap-record-factory.h grilo-plugins-0.3.12/src/dmap/grl-daap-record-factory.h --- grilo-plugins-0.3.11/src/dmap/grl-daap-record-factory.h 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-daap-record-factory.h 2020-09-03 05:36:44.367467900 +0000 @@ -1,5 +1,5 @@ /* - * GrlDAAPRecord factory class + * GrlDaapRecord factory class * * Copyright (C) 2008 W. Michael Petullo * @@ -23,49 +23,48 @@ #include +#include "grl-daap-compat.h" + G_BEGIN_DECLS -#define TYPE_SIMPLE_DAAP_RECORD_FACTORY \ - (grl_daap_record_factory_get_type ()) +#define TYPE_SIMPLE_DAAP_RECORD_FACTORY (grl_daap_record_factory_get_type ()) -#define SIMPLE_DAAP_RECORD_FACTORY(o) \ - (G_TYPE_CHECK_INSTANCE_CAST((o), \ - TYPE_SIMPLE_DAAP_RECORD_FACTORY, \ - GrlDAAPRecordFactory)) - -#define SIMPLE_DAAP_RECORD_FACTORY_CLASS(k) \ - (G_TYPE_CHECK_CLASS_CAST((k), \ - TYPE_SIMPLE_DAAP_RECORD_FACTORY, \ - GrlDAAPRecordFactoryClass)) - -#define IS_SIMPLE_DAAP_RECORD_FACTORY(o) \ - (G_TYPE_CHECK_INSTANCE_TYPE((o), \ - TYPE_SIMPLE_DAAP_RECORD_FACTORY)) - -#define IS_SIMPLE_DAAP_RECORD_FACTORY_CLASS(k) \ - (G_TYPE_CHECK_CLASS_TYPE((k), \ - TYPE_SIMPLE_DAAP_RECORD_FACTORY_CLASS)) - -#define SIMPLE_DAAP_RECORD_FACTORY_GET_CLASS(o) \ - (G_TYPE_INSTANCE_GET_CLASS((o), \ - TYPE_SIMPLE_DAAP_RECORD_FACTORY, \ - GrlDAAPRecordFactoryClass)) +#define SIMPLE_DAAP_RECORD_FACTORY(o) \ + (G_TYPE_CHECK_INSTANCE_CAST ((o), \ + TYPE_SIMPLE_DAAP_RECORD_FACTORY, \ + GrlDaapRecordFactory)) + +#define SIMPLE_DAAP_RECORD_FACTORY_CLASS(k) \ + (G_TYPE_CHECK_CLASS_CAST ((k), \ + TYPE_SIMPLE_DAAP_RECORD_FACTORY, \ + GrlDaapRecordFactoryClass)) + +#define IS_SIMPLE_DAAP_RECORD_FACTORY(o) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((o), \ + TYPE_SIMPLE_DAAP_RECORD_FACTORY)) + +#define IS_SIMPLE_DAAP_RECORD_FACTORY_CLASS(k) \ + (G_TYPE_CHECK_CLASS_TYPE ((k), \ + TYPE_SIMPLE_DAAP_RECORD_FACTORY_CLASS)) + +#define SIMPLE_DAAP_RECORD_FACTORY_GET_CLASS(o) \ + (G_TYPE_INSTANCE_GET_CLASS ((o), \ + TYPE_SIMPLE_DAAP_RECORD_FACTORY, \ + GrlDaapRecordFactoryClass)) -typedef struct GrlDAAPRecordFactoryPrivate GrlDAAPRecordFactoryPrivate; +typedef struct GrlDaapRecordFactoryPrivate GrlDaapRecordFactoryPrivate; typedef struct { GObject parent; -} GrlDAAPRecordFactory; +} GrlDaapRecordFactory; typedef struct { GObjectClass parent; -} GrlDAAPRecordFactoryClass; - -GType grl_daap_record_factory_get_type (void); +} GrlDaapRecordFactoryClass; -GrlDAAPRecordFactory *grl_daap_record_factory_new (void); +GType grl_daap_record_factory_get_type (void); -DMAPRecord *grl_daap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data); +GrlDaapRecordFactory *grl_daap_record_factory_new (void); #endif /* __SIMPLE_DAAP_RECORD_FACTORY */ diff -Nru grilo-plugins-0.3.11/src/dmap/grl-daap-record.h grilo-plugins-0.3.12/src/dmap/grl-daap-record.h --- grilo-plugins-0.3.11/src/dmap/grl-daap-record.h 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-daap-record.h 2020-09-03 05:36:44.367467900 +0000 @@ -23,55 +23,56 @@ #include +#include "grl-daap-compat.h" + G_BEGIN_DECLS -#define TYPE_SIMPLE_DAAP_RECORD \ - (grl_daap_record_get_type ()) +#define TYPE_SIMPLE_DAAP_RECORD (grl_daap_record_get_type ()) -#define SIMPLE_DAAP_RECORD(o) \ - (G_TYPE_CHECK_INSTANCE_CAST((o), \ - TYPE_SIMPLE_DAAP_RECORD, \ - GrlDAAPRecord)) - -#define SIMPLE_DAAP_RECORD_CLASS(k) \ - (G_TYPE_CHECK_CLASS_CAST((k), \ - TYPE_SIMPLE_DAAP_RECORD, \ - GrlDAAPRecordClass)) - -#define IS_SIMPLE_DAAP_RECORD(o) \ - (G_TYPE_CHECK_INSTANCE_TYPE((o), \ - TYPE_SIMPLE_DAAP_RECORD)) - -#define IS_SIMPLE_DAAP_RECORD_CLASS(k) \ - (G_TYPE_CHECK_CLASS_TYPE((k), \ - TYPE_SIMPLE_DAAP_RECORD_CLASS)) - -#define SIMPLE_DAAP_RECORD_GET_CLASS(o) \ - (G_TYPE_INSTANCE_GET_CLASS((o), \ - TYPE_SIMPLE_DAAP_RECORD, \ - GrlDAAPRecordClass)) - -#define SIMPLE_DAAP_RECORD_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE((o), \ - TYPE_SIMPLE_DAAP_RECORD, \ - GrlDAAPRecordPrivate)) +#define SIMPLE_DAAP_RECORD(o) \ + (G_TYPE_CHECK_INSTANCE_CAST ((o), \ + TYPE_SIMPLE_DAAP_RECORD, \ + GrlDaapRecord)) + +#define SIMPLE_DAAP_RECORD_CLASS(k) \ + (G_TYPE_CHECK_CLASS_CAST ((k), \ + TYPE_SIMPLE_DAAP_RECORD, \ + GrlDaapRecordClass)) + +#define IS_SIMPLE_DAAP_RECORD(o) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((o), \ + TYPE_SIMPLE_DAAP_RECORD)) + +#define IS_SIMPLE_DAAP_RECORD_CLASS(k) \ + (G_TYPE_CHECK_CLASS_TYPE ((k), \ + TYPE_SIMPLE_DAAP_RECORD_CLASS)) + +#define SIMPLE_DAAP_RECORD_GET_CLASS(o) \ + (G_TYPE_INSTANCE_GET_CLASS ((o), \ + TYPE_SIMPLE_DAAP_RECORD, \ + GrlDaapRecordClass)) + +#define SIMPLE_DAAP_RECORD_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ + TYPE_SIMPLE_DAAP_RECORD, \ + GrlDaapRecordPrivate)) -typedef struct GrlDAAPRecordPrivate GrlDAAPRecordPrivate; +typedef struct GrlDaapRecordPrivate GrlDaapRecordPrivate; typedef struct { GObject parent; - GrlDAAPRecordPrivate *priv; -} GrlDAAPRecord; + GrlDaapRecordPrivate *priv; +} GrlDaapRecord; typedef struct { GObjectClass parent; -} GrlDAAPRecordClass; +} GrlDaapRecordClass; GType grl_daap_record_get_type (void); -GrlDAAPRecord *grl_daap_record_new (void); -GInputStream *grl_daap_record_read (DAAPRecord *record, GError **error); -gint grl_daap_record_get_id (DAAPRecord *record); +GrlDaapRecord *grl_daap_record_new (void); +GInputStream *grl_daap_record_read (DmapAvRecord *record, GError **error); +gint grl_daap_record_get_id (DmapAvRecord *record); #endif /* __SIMPLE_DAAP_RECORD */ diff -Nru grilo-plugins-0.3.11/src/dmap/grl-dmap-compat.h grilo-plugins-0.3.12/src/dmap/grl-dmap-compat.h --- grilo-plugins-0.3.11/src/dmap/grl-dmap-compat.h 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-dmap-compat.h 2020-09-03 05:36:44.367467900 +0000 @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2019 W. Michael Petullo + * Copyright (C) 2019 Igalia S.L. + * + * Contact: W. Michael Petullo + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef _GRL_DMAP_COMPAT_H_ +#define _GRL_DMAP_COMPAT_H_ + +#ifdef LIBDMAPSHARING_COMPAT + +/* Building against libdmapsharing 3 API. */ + +#define DmapConnection DMAPConnection +#define DmapConnectionFunc DMAPConnectionCallback +#define dmap_connection_start dmap_connection_connect +#define DmapDb DMAPDb +#define DmapDbInterface DMAPDbIface +#define DmapIdRecordFunc GHFunc +#define DmapMdnsBrowser DMAPMdnsBrowser +#define DmapMdnsService DMAPMdnsBrowserService +#define DMAP_MDNS_SERVICE_TYPE_DAAP DMAP_MDNS_BROWSER_SERVICE_TYPE_DAAP +#define DMAP_MDNS_SERVICE_TYPE_DPAP DMAP_MDNS_BROWSER_SERVICE_TYPE_DPAP +#define DmapRecord DMAPRecord +#define DmapRecordFactory DMAPRecordFactory +#define DmapRecordFactoryInterface DMAPRecordFactoryIface +#define DmapRecordInterface DMAPRecordIface + +static inline gchar * +grl_dmap_service_get_name (DmapMdnsService *service) +{ + return g_strdup (service->name); +} + +static inline gchar * +grl_dmap_service_get_service_name (DmapMdnsService *service) +{ + return g_strdup (service->service_name); +} + +static inline gchar * +grl_dmap_service_get_host (DmapMdnsService *service) +{ + return g_strdup (service->host); +} + +static inline guint +grl_dmap_service_get_port (DmapMdnsService *service) +{ + return service->port; +} + +#else + +/* Building against libdmapsharing 4 API. */ + +static inline gchar * +grl_dmap_service_get_name (DmapMdnsService *service) +{ + gchar *name; + g_object_get (service, "name", &name, NULL); + return name; +} + +static inline gchar * +grl_dmap_service_get_service_name (DmapMdnsService *service) +{ + gchar *service_name; + g_object_get (service, "service-name", &service_name, NULL); + return service_name; +} + +static inline gchar * +grl_dmap_service_get_host (DmapMdnsService *service) +{ + gchar *host; + g_object_get (service, "host", &host, NULL); + return host; +} + +static inline guint +grl_dmap_service_get_port (DmapMdnsService *service) +{ + guint port; + g_object_get (service, "port", &port, NULL); + return port; +} + +#endif + +#endif /* _GRL_DMAP_COMPAT_H_ */ diff -Nru grilo-plugins-0.3.11/src/dmap/grl-dpap.c grilo-plugins-0.3.12/src/dmap/grl-dpap.c --- grilo-plugins-0.3.11/src/dmap/grl-dpap.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-dpap.c 2020-09-03 05:36:44.368467800 +0000 @@ -33,6 +33,7 @@ #include #include +#include "grl-dpap-compat.h" #include "grl-common.h" #include "grl-dpap.h" #include "grl-dpap-db.h" @@ -42,7 +43,7 @@ /* --------- Logging -------- */ #define GRL_LOG_DOMAIN_DEFAULT dmap_log_domain -GRL_LOG_DOMAIN_STATIC(dmap_log_domain); +GRL_LOG_DOMAIN_STATIC (dmap_log_domain); /* --- Plugin information --- */ @@ -51,18 +52,18 @@ /* --- Grilo DPAP Private --- */ -#define GRL_DPAP_SOURCE_GET_PRIVATE(object) \ - (G_TYPE_INSTANCE_GET_PRIVATE((object), \ - GRL_DPAP_SOURCE_TYPE, \ - GrlDpapSourcePrivate)) +#define GRL_DPAP_SOURCE_GET_PRIVATE(object) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((object), \ + GRL_DPAP_SOURCE_TYPE, \ + GrlDpapSourcePrivate)) struct _GrlDpapSourcePrivate { - DMAPMdnsBrowserService *service; + DmapMdnsService *service; }; /* --- Data types --- */ -static GrlDpapSource *grl_dpap_source_new (DMAPMdnsBrowserService *service); +static GrlDpapSource *grl_dpap_source_new (DmapMdnsService *service); static void grl_dpap_source_finalize (GObject *object); @@ -79,16 +80,16 @@ GrlSourceSearchSpec *ss); -static void grl_dpap_service_added_cb (DMAPMdnsBrowser *browser, - DMAPMdnsBrowserService *service, +static void grl_dpap_service_added_cb (DmapMdnsBrowser *browser, + DmapMdnsService *service, GrlPlugin *plugin); -static void grl_dpap_service_removed_cb (DMAPMdnsBrowser *browser, +static void grl_dpap_service_removed_cb (DmapMdnsBrowser *browser, const gchar *service_name, GrlPlugin *plugin); /* ===================== Globals ======================= */ -static DMAPMdnsBrowser *browser; +static DmapMdnsBrowser *browser; /* Maps URIs to DBs */ static GHashTable *connections; /* Map DPAP services to Grilo media sources */ @@ -111,24 +112,24 @@ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - browser = dmap_mdns_browser_new (DMAP_MDNS_BROWSER_SERVICE_TYPE_DPAP); + browser = dmap_mdns_browser_new (DMAP_MDNS_SERVICE_TYPE_DPAP); connections = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); sources = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); g_signal_connect (G_OBJECT (browser), - "service-added", + "service-added", G_CALLBACK (grl_dpap_service_added_cb), (gpointer) plugin); g_signal_connect (G_OBJECT (browser), - "service-removed", + "service-removed", G_CALLBACK (grl_dpap_service_removed_cb), (gpointer) plugin); if (!dmap_mdns_browser_start (browser, &error)) { GRL_DEBUG ("error starting browser. code: %d message: %s", - error->code, - error->message); + error->code, + error->message); g_error_free (error); g_hash_table_unref (connections); @@ -143,12 +144,12 @@ GRL_PLUGIN_DEFINE (GRL_MAJOR, GRL_MINOR, DPAP_PLUGIN_ID, - "DPAP", - "A plugin for browsing DPAP servers", - "W. Michael Petullo", + "DPAP", + "A plugin for browsing DPAP servers", + "W. Michael Petullo", VERSION, - "LGPL", - "http://www.flyn.org", + "LGPL", + "http://www.flyn.org", grl_dpap_plugin_init, NULL, NULL); @@ -158,8 +159,10 @@ G_DEFINE_TYPE_WITH_PRIVATE (GrlDpapSource, grl_dpap_source, GRL_TYPE_SOURCE) static GrlDpapSource * -grl_dpap_source_new (DMAPMdnsBrowserService *service) +grl_dpap_source_new (DmapMdnsService *service) { + gchar *name; + gchar *service_name; gchar *source_desc; gchar *source_id; @@ -167,20 +170,24 @@ GRL_DEBUG ("grl_dpap_source_new"); - source_desc = g_strdup_printf (SOURCE_DESC_TEMPLATE, service->name); - source_id = g_strdup_printf (SOURCE_ID_TEMPLATE, service->name); + name = grl_dmap_service_get_name (service); + service_name = grl_dmap_service_get_service_name (service); + source_desc = g_strdup_printf (SOURCE_DESC_TEMPLATE, name); + source_id = g_strdup_printf (SOURCE_ID_TEMPLATE, name); source = g_object_new (GRL_DPAP_SOURCE_TYPE, - "source-id", source_id, - "source-name", service->name, - "source-desc", source_desc, - "supported-media", GRL_SUPPORTED_MEDIA_IMAGE, + "source-id", source_id, + "source-name", service_name, + "source-desc", source_desc, + "supported-media", GRL_SUPPORTED_MEDIA_IMAGE, NULL); source->priv->service = service; g_free (source_desc); g_free (source_id); + g_free (service_name); + g_free (name); return source; } @@ -214,14 +221,14 @@ static void grl_dpap_do_browse (ResultCbAndArgsAndDb *cb_and_db) { - grl_dpap_db_browse(GRL_DPAP_DB(cb_and_db->db), - cb_and_db->cb.container, - cb_and_db->cb.source, - cb_and_db->cb.op_id, - cb_and_db->cb.skip, - cb_and_db->cb.count, - cb_and_db->cb.callback, - cb_and_db->cb.user_data); + grl_dpap_db_browse (GRL_DPAP_DB (cb_and_db->db), + cb_and_db->cb.container, + cb_and_db->cb.source, + cb_and_db->cb.op_id, + cb_and_db->cb.skip, + cb_and_db->cb.count, + cb_and_db->cb.callback, + cb_and_db->cb.user_data); g_free (cb_and_db); } @@ -229,19 +236,19 @@ static void grl_dpap_do_search (ResultCbAndArgsAndDb *cb_and_db) { - grl_dpap_db_search(GRL_DPAP_DB(cb_and_db->db), - cb_and_db->cb.source, - cb_and_db->cb.op_id, - (GHRFunc) cb_and_db->cb.predicate, - cb_and_db->cb.predicate_data, - cb_and_db->cb.callback, - cb_and_db->cb.user_data); + grl_dpap_db_search (GRL_DPAP_DB (cb_and_db->db), + cb_and_db->cb.source, + cb_and_db->cb.op_id, + (GHRFunc) cb_and_db->cb.predicate, + cb_and_db->cb.predicate_data, + cb_and_db->cb.callback, + cb_and_db->cb.user_data); g_free (cb_and_db); } static void -browse_connected_cb (DMAPConnection *connection, +browse_connected_cb (DmapConnection *connection, gboolean result, const char *reason, ResultCbAndArgsAndDb *cb_and_db) @@ -266,7 +273,7 @@ } static void -search_connected_cb (DMAPConnection *connection, +search_connected_cb (DmapConnection *connection, gboolean result, const char *reason, ResultCbAndArgsAndDb *cb_and_db) @@ -291,8 +298,8 @@ } static void -grl_dpap_service_added_cb (DMAPMdnsBrowser *browser, - DMAPMdnsBrowserService *service, +grl_dpap_service_added_cb (DmapMdnsBrowser *browser, + DmapMdnsService *service, GrlPlugin *plugin) { GrlRegistry *registry = grl_registry_get_default (); @@ -306,13 +313,16 @@ GRL_SOURCE (source), NULL); if (source != NULL) { - g_hash_table_insert (sources, g_strdup (service->name), g_object_ref (source)); + gchar *name; + name = grl_dmap_service_get_name (service); + g_hash_table_insert (sources, g_strdup (name), g_object_ref (source)); g_object_remove_weak_pointer (G_OBJECT (source), (gpointer *) &source); + g_free (name); } } static void -grl_dpap_service_removed_cb (DMAPMdnsBrowser *browser, +grl_dpap_service_removed_cb (DmapMdnsBrowser *browser, const gchar *service_name, GrlPlugin *plugin) { @@ -328,14 +338,14 @@ } static void -grl_dpap_connect (gchar *name, gchar *host, guint port, ResultCbAndArgsAndDb *cb_and_db, DMAPConnectionCallback callback) +grl_dpap_connect (gchar *name, gchar *host, guint port, ResultCbAndArgsAndDb *cb_and_db, DmapConnectionFunc callback) { - DMAPRecordFactory *factory; - DMAPConnection *connection; + DmapRecordFactory *factory; + DmapConnection *connection; factory = DMAP_RECORD_FACTORY (grl_dpap_record_factory_new ()); - connection = DMAP_CONNECTION (dpap_connection_new (name, host, port, DMAP_DB (cb_and_db->db), factory)); - dmap_connection_connect (connection, (DMAPConnectionCallback) callback, cb_and_db); + connection = DMAP_CONNECTION (dmap_image_connection_new (name, host, port, DMAP_DB (cb_and_db->db), factory)); + dmap_connection_start (connection, (DmapConnectionFunc) callback, cb_and_db); } static gboolean @@ -396,15 +406,25 @@ browse_connected_cb (NULL, TRUE, NULL, cb_and_db); } else { /* Connect */ + gchar *name, *host; + guint port; + cb_and_db->db = DMAP_DB (grl_dpap_db_new ()); - grl_dpap_connect (dmap_source->priv->service->name, - dmap_source->priv->service->host, - dmap_source->priv->service->port, + name = grl_dmap_service_get_name (dmap_source->priv->service); + host = grl_dmap_service_get_host (dmap_source->priv->service); + port = grl_dmap_service_get_port (dmap_source->priv->service); + + grl_dpap_connect (name, + host, + port, cb_and_db, - (DMAPConnectionCallback) browse_connected_cb); + (DmapConnectionFunc) browse_connected_cb); g_hash_table_insert (connections, g_strdup (url), cb_and_db->db); + + g_free (name); + g_free (host); } g_free (url); @@ -416,7 +436,7 @@ GrlDpapSource *dmap_source = GRL_DPAP_SOURCE (source); ResultCbAndArgsAndDb *cb_and_db; - DMAPMdnsBrowserService *service = dmap_source->priv->service; + DmapMdnsService *service = dmap_source->priv->service; gchar *url = grl_dmap_build_url (service); cb_and_db = g_new (ResultCbAndArgsAndDb, 1); @@ -434,9 +454,25 @@ search_connected_cb (NULL, TRUE, NULL, cb_and_db); } else { /* Connect */ + gchar *name, *host; + guint port; + cb_and_db->db = DMAP_DB (grl_dpap_db_new ()); - grl_dpap_connect (service->name, service->host, service->port, cb_and_db, (DMAPConnectionCallback) search_connected_cb); + + name = grl_dmap_service_get_name (dmap_source->priv->service); + host = grl_dmap_service_get_host (dmap_source->priv->service); + port = grl_dmap_service_get_port (dmap_source->priv->service); + + grl_dpap_connect (name, + host, + port, + cb_and_db, + (DmapConnectionFunc) search_connected_cb); + g_hash_table_insert (connections, g_strdup (url), cb_and_db->db); + + g_free (name); + g_free (host); } g_free (url); diff -Nru grilo-plugins-0.3.11/src/dmap/grl-dpap-compat.h grilo-plugins-0.3.12/src/dmap/grl-dpap-compat.h --- grilo-plugins-0.3.11/src/dmap/grl-dpap-compat.h 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-dpap-compat.h 2020-09-03 05:36:44.367467900 +0000 @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2019 W. Michael Petullo + * Copyright (C) 2019 Igalia S.L. + * + * Contact: W. Michael Petullo + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef _GRL_DPAP_COMPAT_H_ +#define _GRL_DPAP_COMPAT_H_ + +#include "grl-dmap-compat.h" + +#ifdef LIBDMAPSHARING_COMPAT + +DMAPRecord *grl_dpap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data, GError **error); +guint grl_dpap_db_add (DMAPDb *_db, DMAPRecord *_record, GError **error); + +/* Building against libdmapsharing 3 API. */ + +#define dmap_image_connection_new dpap_connection_new +#define DmapImageRecord DPAPRecord +#define DmapImageRecordInterface DPAPRecordIface +#define DMAP_IMAGE_RECORD DPAP_RECORD +#define DMAP_TYPE_IMAGE_RECORD DPAP_TYPE_RECORD +#define DMAP_IS_IMAGE_RECORD IS_DPAP_RECORD + +static inline DmapRecord * +grl_dpap_record_factory_create_compat (DmapRecordFactory *factory, gpointer user_data) +{ + return grl_dpap_record_factory_create (factory, user_data, NULL); +} + +static inline void +set_thumbnail (GValue *value, GByteArray *thumbnail) +{ + g_value_set_pointer (value, thumbnail); +} + +static inline GByteArray * +get_thumbnail (GByteArray *thumbnail, const GValue *value) +{ + if (thumbnail) + g_byte_array_unref (thumbnail); + return g_byte_array_ref (g_value_get_pointer (value)); +} + +static inline void +unref_thumbnail (GByteArray *thumbnail) +{ + g_byte_array_unref (thumbnail); +} + +static inline guint +grl_dpap_db_add_compat (DMAPDb *_db, DmapRecord *_record) +{ + return grl_dpap_db_add (_db, _record, NULL); +} + +#else + +/* Building against libdmapsharing 4 API. */ + +DmapRecord *grl_dpap_record_factory_create (DmapRecordFactory *factory, gpointer user_data, GError **error); +guint grl_dpap_db_add (DmapDb *_db, DmapRecord *_record, GError **error); + +static inline void +set_thumbnail (GValue *value, GArray *thumbnail) +{ + g_value_set_boxed (value, thumbnail); +} + +static inline GArray * +get_thumbnail (GArray *thumbnail, const GValue *value) +{ + if (thumbnail) + g_array_unref (thumbnail); + return g_value_get_boxed (value); +} + +static inline void +unref_thumbnail (GArray *thumbnail) +{ + g_array_unref (thumbnail); +} + +static inline DmapRecord * +grl_dpap_record_factory_create_compat (DmapRecordFactory *factory, gpointer user_data, GError **error) +{ + return grl_dpap_record_factory_create (factory, user_data, error); +} + +static inline guint +grl_dpap_db_add_compat (DmapDb *_db, DmapRecord *_record, GError **error) +{ + return grl_dpap_db_add (_db, _record, error); +} + +#endif + +#endif /* _GRL_DPAP_COMPAT_H_ */ diff -Nru grilo-plugins-0.3.11/src/dmap/grl-dpap-db.c grilo-plugins-0.3.12/src/dmap/grl-dpap-db.c --- grilo-plugins-0.3.11/src/dmap/grl-dpap-db.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-dpap-db.c 2020-09-03 05:36:44.367467900 +0000 @@ -24,12 +24,16 @@ #include "config.h" #endif +#include #include #include #include #include #include +#include +#include "grl-dpap-compat.h" +#include "grl-common.h" #include "grl-dpap-db.h" #define PHOTOS_ID "photos" @@ -38,7 +42,7 @@ /* Media IDs start at max and go down. Container IDs start at 1 and go up. */ static guint nextid = G_MAXINT; /* NOTE: this should be G_MAXUINT, but iPhoto can't handle it. */ -struct GrlDPAPDbPrivate { +struct GrlDpapDbPrivate { /* Contains each picture container (tracked with photos hash table) */ GrlMedia *photos_container; @@ -63,31 +67,31 @@ return g_str_equal (grl_media_get_id (GRL_MEDIA (a)), grl_media_get_id (GRL_MEDIA (b))); } -GrlDPAPDb * +GrlDpapDb * grl_dpap_db_new (void) { - GrlDPAPDb *db = g_object_new (TYPE_GRL_DPAP_DB, NULL); + GrlDpapDb *db = g_object_new (TYPE_GRL_DPAP_DB, NULL); return db; } -static DMAPRecord * -grl_dpap_db_lookup_by_id (const DMAPDb *db, guint id) +static DmapRecord * +grl_dpap_db_lookup_by_id (const DmapDb *db, guint id) { g_warning ("Not implemented"); return NULL; } static void -grl_dpap_db_foreach (const DMAPDb *db, - GHFunc func, - gpointer data) +grl_dpap_db_foreach (const DmapDb *db, + DmapIdRecordFunc func, + gpointer data) { g_warning ("Not implemented"); } static gint64 -grl_dpap_db_count (const DMAPDb *db) +grl_dpap_db_count (const DmapDb *db) { g_warning ("Not implemented"); return 0; @@ -103,7 +107,7 @@ id = g_strdup_printf ("%s-%s", category_name, set_name); container = grl_media_container_new (); - grl_media_set_id (container, id); + grl_media_set_id (container, id); grl_media_set_title (container, set_name); set = g_hash_table_lookup (category, container); @@ -118,21 +122,21 @@ g_object_unref (container); } -static guint -grl_dpap_db_add (DMAPDb *_db, DMAPRecord *_record) +guint +grl_dpap_db_add (DmapDb *_db, DmapRecord *_record, GError **error) { - g_assert (IS_GRL_DPAP_DB (_db)); - g_assert (IS_DPAP_RECORD (_record)); + g_assert (GRL_IS_DPAP_DB (_db)); + g_assert (DMAP_IS_IMAGE_RECORD (_record)); - GrlDPAPDb *db = GRL_DPAP_DB (_db); - DPAPRecord *record = DPAP_RECORD (_record); + GrlDpapDb *db = GRL_DPAP_DB (_db); + DmapImageRecord *record = DMAP_IMAGE_RECORD (_record); gint height = 0, width = 0, largefilesize = 0, creationdate = 0, rating = 0; - GByteArray *thumbnail = NULL; + GArray *thumbnail = NULL; gchar *id_s = NULL, *filename = NULL, *aspectratio = NULL, @@ -142,35 +146,24 @@ GrlMedia *media; g_object_get (record, - "large-filesize", - &largefilesize, - "creation-date", - &creationdate, - "rating", - &rating, - "filename", - &filename, - "aspect-ratio", - &aspectratio, - "pixel-height", - &height, - "pixel-width", - &width, - "format", - &format, - "comments", - &comments, - "thumbnail", - &thumbnail, - "location", - &url, + "large-filesize", &largefilesize, + "creation-date", &creationdate, + "rating", &rating, + "filename", &filename, + "aspect-ratio", &aspectratio, + "pixel-height", &height, + "pixel-width", &width, + "format", &format, + "comments", &comments, + "thumbnail", &thumbnail, + "location", &url, NULL); id_s = g_strdup_printf ("%u", nextid); media = grl_media_image_new (); - grl_media_set_id (media, id_s); + grl_media_set_id (media, id_s); if (filename) grl_media_set_title (media, filename); @@ -181,13 +174,19 @@ grl_media_set_url (media, url); } - grl_media_set_width (media, width); + grl_media_set_width (media, width); grl_media_set_height (media, height); set_insert (db->priv->photos, PHOTOS_ID, "Unknown", media); g_free (id_s); g_object_unref (media); + g_free (filename); + g_free (aspectratio); + g_free (format); + g_free (comments); + g_free (url); + g_array_unref (thumbnail); return --nextid; } @@ -195,11 +194,11 @@ static gboolean same_media (GrlMedia *a, GrlMedia *b) { - return (strcmp (grl_media_get_id (a), grl_media_get_id (b)) == 0); + return strcmp (grl_media_get_id (a), grl_media_get_id (b)) == 0; } void -grl_dpap_db_browse (GrlDPAPDb *db, +grl_dpap_db_browse (GrlDpapDb *db, GrlMedia *container, GrlSource *source, guint op_id, @@ -208,7 +207,7 @@ GrlSourceResultCb func, gpointer user_data) { - g_assert (IS_GRL_DPAP_DB (db)); + g_assert (GRL_IS_DPAP_DB (db)); int i; guint remaining; @@ -230,7 +229,7 @@ if (hash_table == NULL) { GError *error = g_error_new (GRL_CORE_ERROR, GRL_CORE_ERROR_BROWSE_FAILED, - "Invalid container identifier %s", + "Invalid container identifier %s", container_id); func (source, op_id, NULL, 0, user_data, error); goto done; @@ -251,7 +250,7 @@ } void -grl_dpap_db_search (GrlDPAPDb *db, +grl_dpap_db_search (GrlDpapDb *db, GrlSource *source, guint op_id, GHRFunc predicate, @@ -259,7 +258,7 @@ GrlSourceResultCb func, gpointer user_data) { - g_assert (IS_GRL_DPAP_DB (db)); + g_assert (GRL_IS_DPAP_DB (db)); gint i, j, k; guint remaining = 0; @@ -303,18 +302,18 @@ static void dmap_db_interface_init (gpointer iface, gpointer data) { - DMAPDbIface *dpap_db = iface; + DmapDbInterface *dpap_db = iface; g_assert (G_TYPE_FROM_INTERFACE (dpap_db) == DMAP_TYPE_DB); - dpap_db->add = grl_dpap_db_add; + dpap_db->add = grl_dpap_db_add_compat; dpap_db->lookup_by_id = grl_dpap_db_lookup_by_id; dpap_db->foreach = grl_dpap_db_foreach; dpap_db->count = grl_dpap_db_count; } -G_DEFINE_TYPE_WITH_CODE (GrlDPAPDb, grl_dpap_db, G_TYPE_OBJECT, - G_ADD_PRIVATE (GrlDPAPDb) +G_DEFINE_TYPE_WITH_CODE (GrlDpapDb, grl_dpap_db, G_TYPE_OBJECT, + G_ADD_PRIVATE (GrlDpapDb) G_IMPLEMENT_INTERFACE (DMAP_TYPE_DB, dmap_db_interface_init)) static GObject* @@ -328,13 +327,13 @@ } static void -grl_dpap_db_init (GrlDPAPDb *db) +grl_dpap_db_init (GrlDpapDb *db) { db->priv = grl_dpap_db_get_instance_private (db); db->priv->photos_container = grl_media_container_new (); - grl_media_set_id (GRL_MEDIA (db->priv->photos_container), PHOTOS_ID); + grl_media_set_id (GRL_MEDIA (db->priv->photos_container), PHOTOS_ID); grl_media_set_title (GRL_MEDIA (db->priv->photos_container), PHOTOS_NAME); db->priv->root = g_hash_table_new_full (container_hash, container_equal, g_object_unref, (GDestroyNotify) g_hash_table_destroy); @@ -346,9 +345,9 @@ static void grl_dpap_db_finalize (GObject *object) { - GrlDPAPDb *db = GRL_DPAP_DB (object); + GrlDpapDb *db = GRL_DPAP_DB (object); - GRL_DEBUG ("Finalizing GrlDPAPDb"); + GRL_DEBUG ("Finalizing GrlDpapDb"); g_object_unref (db->priv->photos_container); @@ -356,7 +355,7 @@ } static void -grl_dpap_db_class_init (GrlDPAPDbClass *klass) +grl_dpap_db_class_init (GrlDpapDbClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); diff -Nru grilo-plugins-0.3.11/src/dmap/grl-dpap-db.h grilo-plugins-0.3.12/src/dmap/grl-dpap-db.h --- grilo-plugins-0.3.11/src/dmap/grl-dpap-db.h 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-dpap-db.h 2020-09-03 05:36:44.367467900 +0000 @@ -24,50 +24,51 @@ #include #include +#include "grl-dpap-compat.h" + G_BEGIN_DECLS -#define TYPE_GRL_DPAP_DB \ - (grl_dpap_db_get_type ()) +#define TYPE_GRL_DPAP_DB (grl_dpap_db_get_type ()) -#define GRL_DPAP_DB(o) \ - (G_TYPE_CHECK_INSTANCE_CAST ((o), \ - TYPE_GRL_DPAP_DB, \ - GrlDPAPDb)) - -#define GRL_DPAP_DB_CLASS(k) \ - (G_TYPE_CHECK_CLASS_CAST((k), \ - TYPE_GRL_DPAP_DB, \ - GrlDPAPDbClass)) -#define IS_GRL_DPAP_DB(o) \ - (G_TYPE_CHECK_INSTANCE_TYPE((o), \ - TYPE_GRL_DPAP_DB)) -#define IS_GRL_DPAP_DB_CLASS(k) \ - (G_TYPE_CHECK_CLASS_TYPE((k), \ - TYPE_GRL_DPAP_DB_CLASS)) - -#define GRL_DPAP_DB_GET_CLASS(o) \ - (G_TYPE_INSTANCE_GET_CLASS((o), \ - TYPE_GRL_DPAP_DB, \ - GrlDPAPDbClass)) - -#define GRL_DPAP_DB_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE((o), \ - TYPE_GRL_DPAP_DB, \ - GrlDPAPDbPrivate)) +#define GRL_DPAP_DB(o) \ + (G_TYPE_CHECK_INSTANCE_CAST ((o), \ + TYPE_GRL_DPAP_DB, \ + GrlDpapDb)) + +#define GRL_DPAP_DB_CLASS(k) \ + (G_TYPE_CHECK_CLASS_CAST ((k), \ + TYPE_GRL_DPAP_DB, \ + GrlDpapDbClass)) +#define GRL_IS_DPAP_DB(o) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((o), \ + TYPE_GRL_DPAP_DB)) +#define GRL_IS_DPAP_DB_CLASS(k) \ + (G_TYPE_CHECK_CLASS_TYPE ((k), \ + TYPE_GRL_DPAP_DB_CLASS)) + +#define GRL_DPAP_DB_GET_CLASS(o) \ + (G_TYPE_INSTANCE_GET_CLASS ((o), \ + TYPE_GRL_DPAP_DB, \ + GrlDpapDbClass)) + +#define GRL_DPAP_DB_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ + TYPE_GRL_DPAP_DB, \ + GrlDpapDbPrivate)) -typedef struct GrlDPAPDbPrivate GrlDPAPDbPrivate; +typedef struct GrlDpapDbPrivate GrlDpapDbPrivate; typedef struct { GObject parent; - GrlDPAPDbPrivate *priv; -} GrlDPAPDb; + GrlDpapDbPrivate *priv; +} GrlDpapDb; typedef struct { GObjectClass parent; -} GrlDPAPDbClass; +} GrlDpapDbClass; -GrlDPAPDb *grl_dpap_db_new (void); -void grl_dpap_db_browse (GrlDPAPDb *_db, +GrlDpapDb *grl_dpap_db_new (void); +void grl_dpap_db_browse (GrlDpapDb *_db, GrlMedia *container, GrlSource *source, guint op_id, @@ -75,7 +76,7 @@ guint count, GrlSourceResultCb func, gpointer user_data); -void grl_dpap_db_search (GrlDPAPDb *_db, +void grl_dpap_db_search (GrlDpapDb *_db, GrlSource *source, guint op_id, GHRFunc predicate, diff -Nru grilo-plugins-0.3.11/src/dmap/grl-dpap.h grilo-plugins-0.3.12/src/dmap/grl-dpap.h --- grilo-plugins-0.3.11/src/dmap/grl-dpap.h 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-dpap.h 2020-09-03 05:36:44.368467800 +0000 @@ -26,31 +26,32 @@ #include -#define GRL_DPAP_SOURCE_TYPE \ - (grl_dpap_source_get_type ()) +#include "grl-dpap-compat.h" -#define GRL_DPAP_SOURCE(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ - GRL_DPAP_SOURCE_TYPE, \ - GrlDpapSource)) - -#define GRL_IS_DPAP_SOURCE(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ - GRL_DPAP_SOURCE_TYPE)) - -#define GRL_DPAP_SOURCE_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass), \ - GRL_DPAP_SOURCE_TYPE, \ - GrlDpapSourceClass)) - -#define GRL_IS_DPAP_SOURCE_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass), \ - GRL_DPAP_SOURCE_TYPE)) - -#define GRL_DPAP_SOURCE_GET_CLASS(obj) \ - (G_TYPE_INSTANCE_GET_CLASS ((obj), \ - GRL_DPAP_SOURCE_TYPE, \ - GrlDpapSourceClass)) +#define GRL_DPAP_SOURCE_TYPE (grl_dpap_source_get_type ()) + +#define GRL_DPAP_SOURCE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + GRL_DPAP_SOURCE_TYPE, \ + GrlDpapSource)) + +#define GRL_IS_DPAP_SOURCE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + GRL_DPAP_SOURCE_TYPE)) + +#define GRL_DPAP_SOURCE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), \ + GRL_DPAP_SOURCE_TYPE, \ + GrlDpapSourceClass)) + +#define GRL_IS_DPAP_SOURCE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), \ + GRL_DPAP_SOURCE_TYPE)) + +#define GRL_DPAP_SOURCE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), \ + GRL_DPAP_SOURCE_TYPE, \ + GrlDpapSourceClass)) typedef struct _GrlDpapSourcePrivate GrlDpapSourcePrivate; typedef struct _GrlDpapSource GrlDpapSource; diff -Nru grilo-plugins-0.3.11/src/dmap/grl-dpap-record.c grilo-plugins-0.3.12/src/dmap/grl-dpap-record.c --- grilo-plugins-0.3.11/src/dmap/grl-dpap-record.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-dpap-record.c 2020-09-03 05:36:44.368467800 +0000 @@ -20,15 +20,20 @@ * */ +#include +#include + +#include "grl-dpap-compat.h" +#include "grl-common.h" #include "grl-dpap-record.h" -struct GrlDPAPRecordPrivate { +struct GrlDpapRecordPrivate { char *location; gint largefilesize; gint creationdate; gint rating; char *filename; - GByteArray *thumbnail; + void *thumbnail; /* GByteArray or GArray, depending on libdmapsharing ver. */ char *aspectratio; gint height; gint width; @@ -54,18 +59,18 @@ static void grl_dpap_record_dmap_iface_init (gpointer iface, gpointer data); static void grl_dpap_record_dpap_iface_init (gpointer iface, gpointer data); -G_DEFINE_TYPE_WITH_CODE (GrlDPAPRecord, grl_dpap_record, G_TYPE_OBJECT, - G_ADD_PRIVATE (GrlDPAPRecord) - G_IMPLEMENT_INTERFACE (DPAP_TYPE_RECORD, grl_dpap_record_dpap_iface_init) +G_DEFINE_TYPE_WITH_CODE (GrlDpapRecord, grl_dpap_record, G_TYPE_OBJECT, + G_ADD_PRIVATE (GrlDpapRecord) + G_IMPLEMENT_INTERFACE (DMAP_TYPE_IMAGE_RECORD, grl_dpap_record_dpap_iface_init) G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD, grl_dpap_record_dmap_iface_init)) static void grl_dpap_record_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) + guint prop_id, + const GValue *value, + GParamSpec *pspec) { - GrlDPAPRecord *record = SIMPLE_DPAP_RECORD (object); + GrlDpapRecord *record = SIMPLE_DPAP_RECORD (object); switch (prop_id) { case PROP_LOCATION: @@ -104,9 +109,7 @@ record->priv->comments = g_value_dup_string (value); break; case PROP_THUMBNAIL: - if (record->priv->thumbnail) - g_byte_array_unref (record->priv->thumbnail); - record->priv->thumbnail = g_byte_array_ref (g_value_get_pointer (value)); + record->priv->thumbnail = get_thumbnail (record->priv->thumbnail, value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -116,11 +119,11 @@ static void grl_dpap_record_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) + guint prop_id, + GValue *value, + GParamSpec *pspec) { - GrlDPAPRecord *record = SIMPLE_DPAP_RECORD (object); + GrlDpapRecord *record = SIMPLE_DPAP_RECORD (object); switch (prop_id) { case PROP_LOCATION: @@ -154,7 +157,7 @@ g_value_set_static_string (value, record->priv->comments); break; case PROP_THUMBNAIL: - g_value_set_pointer (value, record->priv->thumbnail); + set_thumbnail (value, record->priv->thumbnail); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -162,14 +165,14 @@ } } -GrlDPAPRecord * +GrlDpapRecord * grl_dpap_record_new (void) { return SIMPLE_DPAP_RECORD (g_object_new (TYPE_SIMPLE_DPAP_RECORD, NULL)); } GInputStream * -grl_dpap_record_read (DPAPRecord *record, GError **error) +grl_dpap_record_read (DmapImageRecord *record, GError **error) { GFile *file; GInputStream *stream; @@ -183,7 +186,7 @@ } static void -grl_dpap_record_init (GrlDPAPRecord *record) +grl_dpap_record_init (GrlDpapRecord *record) { record->priv = grl_dpap_record_get_instance_private (record); } @@ -191,7 +194,7 @@ static void grl_dpap_record_finalize (GObject *object); static void -grl_dpap_record_class_init (GrlDPAPRecordClass *klass) +grl_dpap_record_class_init (GrlDpapRecordClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); @@ -215,9 +218,9 @@ static void grl_dpap_record_dpap_iface_init (gpointer iface, gpointer data) { - DPAPRecordIface *dpap_record = iface; + DmapImageRecordInterface *dpap_record = iface; - g_assert (G_TYPE_FROM_INTERFACE (dpap_record) == DPAP_TYPE_RECORD); + g_assert (G_TYPE_FROM_INTERFACE (dpap_record) == DMAP_TYPE_IMAGE_RECORD); dpap_record->read = grl_dpap_record_read; } @@ -225,7 +228,7 @@ static void grl_dpap_record_dmap_iface_init (gpointer iface, gpointer data) { - DMAPRecordIface *dmap_record = iface; + DmapRecordInterface *dmap_record = iface; g_assert (G_TYPE_FROM_INTERFACE (dmap_record) == DMAP_TYPE_RECORD); } @@ -233,7 +236,7 @@ static void grl_dpap_record_finalize (GObject *object) { - GrlDPAPRecord *record = SIMPLE_DPAP_RECORD (object); + GrlDpapRecord *record = SIMPLE_DPAP_RECORD (object); g_free (record->priv->location); g_free (record->priv->filename); @@ -242,7 +245,7 @@ g_free (record->priv->comments); if (record->priv->thumbnail) - g_byte_array_unref (record->priv->thumbnail); + unref_thumbnail (record->priv->thumbnail); G_OBJECT_CLASS (grl_dpap_record_parent_class)->finalize (object); } diff -Nru grilo-plugins-0.3.11/src/dmap/grl-dpap-record-factory.c grilo-plugins-0.3.12/src/dmap/grl-dpap-record-factory.c --- grilo-plugins-0.3.11/src/dmap/grl-dpap-record-factory.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-dpap-record-factory.c 2020-09-03 05:36:44.368467800 +0000 @@ -18,41 +18,48 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include +#include + +#include "grl-dpap-compat.h" +#include "grl-common.h" #include "grl-dpap-record-factory.h" #include "grl-dpap-record.h" -DMAPRecord * -grl_dpap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data) +DmapRecord * +grl_dpap_record_factory_create (DmapRecordFactory *factory, + gpointer user_data, + GError **error) { - return DMAP_RECORD (grl_dpap_record_new ()); + return DMAP_RECORD (grl_dpap_record_new ()); } static void -grl_dpap_record_factory_init (GrlDPAPRecordFactory *factory) +grl_dpap_record_factory_init (GrlDpapRecordFactory *factory) { } static void -grl_dpap_record_factory_class_init (GrlDPAPRecordFactoryClass *klass) +grl_dpap_record_factory_class_init (GrlDpapRecordFactoryClass *klass) { } static void grl_dpap_record_factory_interface_init (gpointer iface, gpointer data) { - DMAPRecordFactoryIface *factory = iface; + DmapRecordFactoryInterface *factory = iface; - g_assert (G_TYPE_FROM_INTERFACE (factory) == DMAP_TYPE_RECORD_FACTORY); + g_assert (G_TYPE_FROM_INTERFACE (factory) == DMAP_TYPE_RECORD_FACTORY); - factory->create = grl_dpap_record_factory_create; + factory->create = grl_dpap_record_factory_create_compat; } -G_DEFINE_TYPE_WITH_CODE (GrlDPAPRecordFactory, grl_dpap_record_factory, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD_FACTORY, - grl_dpap_record_factory_interface_init)) +G_DEFINE_TYPE_WITH_CODE (GrlDpapRecordFactory, grl_dpap_record_factory, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (DMAP_TYPE_RECORD_FACTORY, + grl_dpap_record_factory_interface_init)) -GrlDPAPRecordFactory * +GrlDpapRecordFactory * grl_dpap_record_factory_new (void) { - return SIMPLE_DPAP_RECORD_FACTORY (g_object_new (TYPE_SIMPLE_DPAP_RECORD_FACTORY, NULL)); + return SIMPLE_DPAP_RECORD_FACTORY (g_object_new (TYPE_SIMPLE_DPAP_RECORD_FACTORY, NULL)); } diff -Nru grilo-plugins-0.3.11/src/dmap/grl-dpap-record-factory.h grilo-plugins-0.3.12/src/dmap/grl-dpap-record-factory.h --- grilo-plugins-0.3.11/src/dmap/grl-dpap-record-factory.h 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-dpap-record-factory.h 2020-09-03 05:36:44.368467800 +0000 @@ -1,5 +1,5 @@ /* - * GrlDPAPRecord factory class + * GrlDpapRecord factory class * * Copyright (C) 2008 W. Michael Petullo * @@ -23,49 +23,50 @@ #include +#include "grl-dpap-compat.h" + G_BEGIN_DECLS -#define TYPE_SIMPLE_DPAP_RECORD_FACTORY \ - (grl_dpap_record_factory_get_type ()) +#define TYPE_SIMPLE_DPAP_RECORD_FACTORY (grl_dpap_record_factory_get_type ()) -#define SIMPLE_DPAP_RECORD_FACTORY(o) \ - (G_TYPE_CHECK_INSTANCE_CAST((o), \ - TYPE_SIMPLE_DPAP_RECORD_FACTORY, \ - GrlDPAPRecordFactory)) - -#define SIMPLE_DPAP_RECORD_FACTORY_CLASS(k) \ - (G_TYPE_CHECK_CLASS_CAST((k), \ - TYPE_SIMPLE_DPAP_RECORD_FACTORY, \ - GrlDPAPRecordFactoryClass)) +#define SIMPLE_DPAP_RECORD_FACTORY(o) \ + (G_TYPE_CHECK_INSTANCE_CAST ((o), \ + TYPE_SIMPLE_DPAP_RECORD_FACTORY, \ + GrlDpapRecordFactory)) + +#define SIMPLE_DPAP_RECORD_FACTORY_CLASS(k) \ + (G_TYPE_CHECK_CLASS_CAST ((k), \ + TYPE_SIMPLE_DPAP_RECORD_FACTORY, \ + GrlDpapRecordFactoryClass)) -#define IS_SIMPLE_DPAP_RECORD_FACTORY(o) \ - (G_TYPE_CHECK_INSTANCE_TYPE((o), \ +#define IS_SIMPLE_DPAP_RECORD_FACTORY(o) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((o), \ TYPE_SIMPLE_DPAP_RECORD_FACTORY)) -#define IS_SIMPLE_DPAP_RECORD_FACTORY_CLASS(k) \ - (G_TYPE_CHECK_CLASS_TYPE((k), \ - TYPE_SIMPLE_DPAP_RECORD_FACTORY_CLASS)) - -#define SIMPLE_DPAP_RECORD_FACTORY_GET_CLASS(o) \ - (G_TYPE_INSTANCE_GET_CLASS((o), \ - TYPE_SIMPLE_DPAP_RECORD_FACTORY, \ - GrlDPAPRecordFactoryClass)) +#define IS_SIMPLE_DPAP_RECORD_FACTORY_CLASS(k) \ + (G_TYPE_CHECK_CLASS_TYPE ((k), \ + TYPE_SIMPLE_DPAP_RECORD_FACTORY_CLASS)) + +#define SIMPLE_DPAP_RECORD_FACTORY_GET_CLASS(o) \ + (G_TYPE_INSTANCE_GET_CLASS ((o), \ + TYPE_SIMPLE_DPAP_RECORD_FACTORY, \ + GrlDpapRecordFactoryClass)) -typedef struct GrlDPAPRecordFactoryPrivate GrlDPAPRecordFactoryPrivate; +typedef struct GrlDpapRecordFactoryPrivate GrlDpapRecordFactoryPrivate; typedef struct { GObject parent; -} GrlDPAPRecordFactory; +} GrlDpapRecordFactory; typedef struct { GObjectClass parent; -} GrlDPAPRecordFactoryClass; +} GrlDpapRecordFactoryClass; -GType grl_dpap_record_factory_get_type (void); +GType grl_dpap_record_factory_get_type (void); -GrlDPAPRecordFactory *grl_dpap_record_factory_new (void); +GrlDpapRecordFactory *grl_dpap_record_factory_new (void); -DMAPRecord *grl_dpap_record_factory_create (DMAPRecordFactory *factory, gpointer user_data); +DmapRecord *grl_dpap_record_factory_create (DmapRecordFactory *factory, gpointer user_data, GError **error); #endif /* __SIMPLE_DPAP_RECORD_FACTORY */ diff -Nru grilo-plugins-0.3.11/src/dmap/grl-dpap-record.h grilo-plugins-0.3.12/src/dmap/grl-dpap-record.h --- grilo-plugins-0.3.11/src/dmap/grl-dpap-record.h 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/grl-dpap-record.h 2020-09-03 05:36:44.368467800 +0000 @@ -23,55 +23,56 @@ #include +#include "grl-dpap-compat.h" + G_BEGIN_DECLS -#define TYPE_SIMPLE_DPAP_RECORD \ - (grl_dpap_record_get_type ()) +#define TYPE_SIMPLE_DPAP_RECORD (grl_dpap_record_get_type ()) -#define SIMPLE_DPAP_RECORD(o) \ - (G_TYPE_CHECK_INSTANCE_CAST((o), \ - TYPE_SIMPLE_DPAP_RECORD, \ - GrlDPAPRecord)) - -#define SIMPLE_DPAP_RECORD_CLASS(k) \ - (G_TYPE_CHECK_CLASS_CAST((k), \ - TYPE_SIMPLE_DPAP_RECORD, \ - GrlDPAPRecordClass)) - -#define IS_SIMPLE_DPAP_RECORD(o) \ - (G_TYPE_CHECK_INSTANCE_TYPE((o), \ - TYPE_SIMPLE_DPAP_RECORD)) - -#define IS_SIMPLE_DPAP_RECORD_CLASS(k) \ - (G_TYPE_CHECK_CLASS_TYPE((k), \ - TYPE_SIMPLE_DPAP_RECORD_CLASS)) - -#define SIMPLE_DPAP_RECORD_GET_CLASS(o) \ - (G_TYPE_INSTANCE_GET_CLASS((o), \ - TYPE_SIMPLE_DPAP_RECORD, \ - GrlDPAPRecordClass)) - -#define SIMPLE_DPAP_RECORD_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE((o), \ - TYPE_SIMPLE_DPAP_RECORD, \ - GrlDPAPRecordPrivate)) +#define SIMPLE_DPAP_RECORD(o) \ + (G_TYPE_CHECK_INSTANCE_CAST ((o), \ + TYPE_SIMPLE_DPAP_RECORD, \ + GrlDpapRecord)) + +#define SIMPLE_DPAP_RECORD_CLASS(k) \ + (G_TYPE_CHECK_CLASS_CAST ((k), \ + TYPE_SIMPLE_DPAP_RECORD, \ + GrlDpapRecordClass)) + +#define IS_SIMPLE_DPAP_RECORD(o) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((o), \ + TYPE_SIMPLE_DPAP_RECORD)) + +#define IS_SIMPLE_DPAP_RECORD_CLASS(k) \ + (G_TYPE_CHECK_CLASS_TYPE ((k), \ + TYPE_SIMPLE_DPAP_RECORD_CLASS)) + +#define SIMPLE_DPAP_RECORD_GET_CLASS(o) \ + (G_TYPE_INSTANCE_GET_CLASS ((o), \ + TYPE_SIMPLE_DPAP_RECORD, \ + GrlDpapRecordClass)) + +#define SIMPLE_DPAP_RECORD_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ + TYPE_SIMPLE_DPAP_RECORD, \ + GrlDpapRecordPrivate)) -typedef struct GrlDPAPRecordPrivate GrlDPAPRecordPrivate; +typedef struct GrlDpapRecordPrivate GrlDpapRecordPrivate; typedef struct { GObject parent; - GrlDPAPRecordPrivate *priv; -} GrlDPAPRecord; + GrlDpapRecordPrivate *priv; +} GrlDpapRecord; typedef struct { GObjectClass parent; -} GrlDPAPRecordClass; +} GrlDpapRecordClass; GType grl_dpap_record_get_type (void); -GrlDPAPRecord *grl_dpap_record_new (void); -GInputStream *grl_dpap_record_read (DPAPRecord *record, GError **error); -gint grl_dpap_record_get_id (DPAPRecord *record); +GrlDpapRecord *grl_dpap_record_new (void); +GInputStream *grl_dpap_record_read (DmapImageRecord *record, GError **error); +gint grl_dpap_record_get_id (DmapImageRecord *record); #endif /* __SIMPLE_DPAP_RECORD */ diff -Nru grilo-plugins-0.3.11/src/dmap/meson.build grilo-plugins-0.3.12/src/dmap/meson.build --- grilo-plugins-0.3.11/src/dmap/meson.build 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/dmap/meson.build 2020-09-03 05:36:44.368467800 +0000 @@ -31,6 +31,15 @@ 'grl-dpap.h', ] +args = [ + '-DG_LOG_DOMAIN="GrlDmap"', + '-DHAVE_CONFIG_H', +] + +if not libdmapsharing4_dep.found() + args += '-DLIBDMAPSHARING_COMPAT' +endif + configure_file(output: 'config.h', configuration: cdata) @@ -39,17 +48,11 @@ install: true, install_dir: pluginsdir, dependencies: must_deps + plugins[dmap_idx][REQ_DEPS] + plugins[dmap_idx][OPT_DEPS], - c_args: [ - '-DG_LOG_DOMAIN="GrlDmap"', - '-DHAVE_CONFIG_H', - ]) + c_args: args) shared_library('grldpap', sources: dpap_sources, install: true, install_dir: pluginsdir, dependencies: must_deps + plugins[dmap_idx][REQ_DEPS] + plugins[dmap_idx][OPT_DEPS], - c_args: [ - '-DG_LOG_DOMAIN="GrlDmap"', - '-DHAVE_CONFIG_H', - ]) + c_args: args) diff -Nru grilo-plugins-0.3.11/src/lua-factory/grl-lua-library.c grilo-plugins-0.3.12/src/lua-factory/grl-lua-library.c --- grilo-plugins-0.3.11/src/lua-factory/grl-lua-library.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/lua-factory/grl-lua-library.c 2020-09-03 05:36:44.372468000 +0000 @@ -388,14 +388,180 @@ } } +static void +grl_util_add_key(lua_State *L, + GObject *object, + gboolean is_media) +{ + GrlRegistry *registry = grl_registry_get_default (); + GrlKeyID key_id = GRL_METADATA_KEY_INVALID; + gchar *key_name = g_strdup (lua_tostring (L, -2)); + gchar *ptr = NULL; + GType type = G_TYPE_NONE; + GValue value = { 0, }; + + /* Handled above */ + if (g_strcmp0 (key_name, "type") == 0) { + g_free (key_name); + return; + } + + /* Replace '_' to '-': convenient for the developer */ + while ((ptr = strstr (key_name, "_")) != NULL) { + *ptr = '-'; + } + + key_id = grl_registry_lookup_metadata_key (registry, key_name); + if (key_id == GRL_METADATA_KEY_INVALID) { + GRL_DEBUG ("'%s' isn't a registered key.", key_name); + if (lua_istable (L, -1)){ + grl_util_add_table_to_unregistered_media (L, GRL_MEDIA (object), key_name); + } else { + gboolean success = grl_util_init_value (L, &value, key_name); + if (success) { + success = grl_data_set_for_id (GRL_DATA (object), key_name, &value); + g_value_unset (&value); + } + if (!success) + GRL_DEBUG ("Value for %s was not set", key_name); + } + g_free (key_name); + return; + } + + type = grl_registry_lookup_metadata_key_type (registry, key_id); + + switch (type) { + case G_TYPE_INT: + case G_TYPE_INT64: + if (lua_isnumber (L, -1)) { + gint success; + gint64 value = lua_tointegerx (L, -1, &success); + if (success) { + if (type == G_TYPE_INT) { + if (is_media) { + grl_data_set_int (GRL_DATA (object), key_id, value); + } else { + grl_related_keys_set_int (GRL_RELATED_KEYS (object), key_id, value); + } + } else { + if (is_media) { + grl_data_set_int64 (GRL_DATA (object), key_id, value); + } else { + grl_related_keys_set_int64 (GRL_RELATED_KEYS (object), key_id, value); + } + } + } else { + GRL_WARNING ("'%s' requires an INT type, while a value '%s' was provided", + key_name, lua_tostring(L, -1)); + } + } else if (lua_istable (L, -1)) { + if (is_media) { + grl_util_add_table_to_media (L, GRL_MEDIA (object), key_id, key_name, type); + } else { + GRL_WARNING ("GrlRelatedKeys does not support tables"); + } + } else if (!lua_isnil (L, -1)) { + GRL_WARNING ("'%s' is not compatible for '%s'", + lua_typename (L, lua_type(L, -1)), key_name); + } + break; + + case G_TYPE_FLOAT: + if (lua_isnumber (L, -1)) { + if (is_media) { + grl_data_set_float (GRL_DATA (object), key_id, lua_tonumber (L, -1)); + } else { + grl_related_keys_set_float ( GRL_RELATED_KEYS (object), key_id, lua_tonumber (L, -1)); + } + } else if (lua_istable (L, -1)) { + if (is_media) { + grl_util_add_table_to_media (L, GRL_MEDIA (object), key_id, key_name, type); + } else { + GRL_WARNING ("GrlRelatedKeys does not support tables"); + } + } else if (!lua_isnil (L, -1)) { + GRL_WARNING ("'%s' is not compatible for '%s'", + lua_typename (L, lua_type(L, -1)), key_name); + } + break; + + case G_TYPE_STRING: + if (lua_isstring (L, -1)) { + if (is_media) { + grl_data_set_lua_string (GRL_DATA (object), key_id, key_name, lua_tostring (L, -1)); + } else { + grl_related_keys_set_string (GRL_RELATED_KEYS (object), key_id, lua_tostring (L, -1)); + } + } else if (lua_istable (L, -1)) { + if (is_media) { + grl_util_add_table_to_media (L, GRL_MEDIA (object), key_id, key_name, type); + } else { + GRL_WARNING ("GrlRelatedKeys does not support tables"); + } + } else if (!lua_isnil (L, -1)) { + GRL_WARNING ("'%s' is not compatible for '%s'", + lua_typename (L, lua_type(L, -1)), key_name); + } + break; + + case G_TYPE_BOOLEAN: + if (lua_isboolean (L, -1)) { + if (is_media) { + grl_data_set_boolean (GRL_DATA (object), key_id, lua_toboolean (L, -1)); + } else { + grl_related_keys_set_boolean (GRL_RELATED_KEYS (object), key_id, lua_toboolean (L, -1)); + } + } else if (!lua_isnil (L, -1)) { + GRL_WARNING ("'%s' is not compatible for '%s'", + lua_typename (L, lua_type(L, -1)), key_name); + } + break; + + default: + /* Non-fundamental types don't reduce to ints, so can't be + * in the switch statement */ + if (type == G_TYPE_DATE_TIME) { + GDateTime *date; + const char *date_str = lua_tostring (L, -1); + date = grl_date_time_from_iso8601 (date_str); + /* Try a number of seconds since Epoch */ + if (!date) { + gint64 date_int = g_ascii_strtoll (date_str, NULL, 0); + if (date_int) + date = g_date_time_new_from_unix_utc (date_int); + } + if (date) { + if (is_media) { + grl_data_set_boxed (GRL_DATA (object), key_id, date); + } else { + grl_related_keys_set_boxed (GRL_RELATED_KEYS (object), key_id, date); + } + g_date_time_unref (date); + } else { + GRL_WARNING ("'%s' is not a valid ISO-8601 or Epoch date", date_str); + } + } else if (type == G_TYPE_BYTE_ARRAY) { + gsize size = luaL_len (L, -1); + const guint8 *binary = (const guint8 *) lua_tostring (L, -1); + if (is_media) { + grl_data_set_binary (GRL_DATA (object), key_id, binary, size); + } else { + grl_related_keys_set_binary (GRL_RELATED_KEYS (object), key_id, binary, size); + } + } else if (!lua_isnil (L, -1)) { + GRL_WARNING ("'%s' is being ignored as G_TYPE is not being handled.", + key_name); + } + } +} + static GrlMedia * grl_util_build_media (lua_State *L, GrlMedia *user_media) { - GrlRegistry *registry; GrlMedia *media = user_media; - GValue value = { 0, }; - gboolean success; + gint array_len; if (!lua_istable (L, 1)) { if (!lua_isnil (L, 1)) @@ -422,126 +588,30 @@ lua_pop (L, 1); } - registry = grl_registry_get_default (); + lua_len (L, 1); + array_len = lua_tointeger (L, -1); + lua_pop (L, 1); + lua_pushnil (L); while (lua_next (L, 1) != 0) { - GrlKeyID key_id = GRL_METADATA_KEY_INVALID; - gchar *key_name = g_strdup (lua_tostring (L, -2)); - gchar *ptr = NULL; - GType type = G_TYPE_NONE; - - /* Handled above */ - if (g_strcmp0 (key_name, "type") == 0) { - goto next_key; - } - - /* Replace '_' to '-': convenient for the developer */ - while ((ptr = strstr (key_name, "_")) != NULL) { - *ptr = '-'; - } - - key_id = grl_registry_lookup_metadata_key (registry, key_name); - if (key_id != GRL_METADATA_KEY_INVALID) { - type = grl_registry_lookup_metadata_key_type (registry, key_id); - - switch (type) { - case G_TYPE_INT: - case G_TYPE_INT64: - if (lua_isnumber (L, -1)) { - gint success; - gint64 value = lua_tointegerx (L, -1, &success); - if (success) { - if (type == G_TYPE_INT) - grl_data_set_int (GRL_DATA (media), key_id, value); - else - grl_data_set_int64 (GRL_DATA (media), key_id, value); - } else { - GRL_WARNING ("'%s' requires an INT type, while a value '%s' was provided", - key_name, lua_tostring(L, -1)); - } - } else if (lua_istable (L, -1)) { - grl_util_add_table_to_media (L, media, key_id, key_name, type); - } else if (!lua_isnil (L, -1)) { - GRL_WARNING ("'%s' is not compatible for '%s'", - lua_typename (L, lua_type(L, -1)), key_name); - } - break; - - case G_TYPE_FLOAT: - if (lua_isnumber (L, -1)) { - grl_data_set_float (GRL_DATA (media), key_id, lua_tonumber (L, -1)); - } else if (lua_istable (L, -1)) { - grl_util_add_table_to_media (L, media, key_id, key_name, type); - } else if (!lua_isnil (L, -1)) { - GRL_WARNING ("'%s' is not compatible for '%s'", - lua_typename (L, lua_type(L, -1)), key_name); - } - break; - - case G_TYPE_STRING: - if (lua_isstring (L, -1)) { - grl_data_set_lua_string (GRL_DATA (media), key_id, key_name, lua_tostring (L, -1)); - } else if (lua_istable (L, -1)) { - grl_util_add_table_to_media (L, media, key_id, key_name, type); - } else if (!lua_isnil (L, -1)) { - GRL_WARNING ("'%s' is not compatible for '%s'", - lua_typename (L, lua_type(L, -1)), key_name); - } - break; - case G_TYPE_BOOLEAN: - if (lua_isboolean (L, -1)) { - grl_data_set_boolean (GRL_DATA (media), key_id, lua_toboolean (L, -1)); - } else if (!lua_isnil (L, -1)) { - GRL_WARNING ("'%s' is not compatible for '%s'", - lua_typename (L, lua_type(L, -1)), key_name); - } - break; - - default: - /* Non-fundamental types don't reduce to ints, so can't be - * in the switch statement */ - if (type == G_TYPE_DATE_TIME) { - GDateTime *date; - const char *date_str = lua_tostring (L, -1); - date = grl_date_time_from_iso8601 (date_str); - /* Try a number of seconds since Epoch */ - if (!date) { - gint64 date_int = g_ascii_strtoll (date_str, NULL, 0); - if (date_int) - date = g_date_time_new_from_unix_utc (date_int); - } - if (date) { - grl_data_set_boxed (GRL_DATA (media), key_id, date); - g_date_time_unref (date); - } else { - GRL_WARNING ("'%s' is not a valid ISO-8601 or Epoch date", date_str); - } - } else if (type == G_TYPE_BYTE_ARRAY) { - gsize size = luaL_len (L, -1); - const guint8 *binary = (const guint8 *) lua_tostring (L, -1); - grl_data_set_binary (GRL_DATA (media), key_id, binary, size); - } else if (!lua_isnil (L, -1)) { - GRL_WARNING ("'%s' is being ignored as G_TYPE is not being handled.", - key_name); - } + if (lua_type (L, -2) == LUA_TNUMBER && + lua_tointeger (L, -2) >= 1 && lua_tointeger (L, -2) <= array_len) { + if (lua_type (L, -1) != LUA_TTABLE) { + GRL_WARNING ("Array index should map to a table to be resolved to \ + GrlRelatedKeys"); + lua_pop (L, 1); + continue; } - } else { - GRL_DEBUG ("'%s' isn't a registered key.", key_name); - if (lua_istable (L, -1)){ - grl_util_add_table_to_unregistered_media (L, media, key_name); - } else { - success = grl_util_init_value (L, &value, key_name); - if (success) { - success = grl_data_set_for_id (GRL_DATA (media), key_name, &value); - g_value_unset (&value); - } - if (!success) - GRL_DEBUG ("Value for %s was not set", key_name); + GrlRelatedKeys *related_keys = grl_related_keys_new (); + lua_pushnil (L); + while (lua_next (L, -2) != 0) { + grl_util_add_key (L, G_OBJECT (related_keys), FALSE); + lua_pop (L, 1); } + grl_data_add_related_keys (GRL_DATA (media), related_keys); + } else { + grl_util_add_key (L, G_OBJECT (media), TRUE); } - -next_key: - g_free (key_name); lua_pop (L, 1); } return media; diff -Nru grilo-plugins-0.3.11/src/lua-factory/sources/grl-acoustid.lua grilo-plugins-0.3.12/src/lua-factory/sources/grl-acoustid.lua --- grilo-plugins-0.3.11/src/lua-factory/sources/grl-acoustid.lua 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/lua-factory/sources/grl-acoustid.lua 2020-09-03 05:36:44.372468000 +0000 @@ -99,12 +99,17 @@ function get_count(results) local count = 0 + local recordings_found = {} if results and #results > 0 then for _,result in ipairs(results) do if result.recordings and #result.recordings > 0 then for _,recording in ipairs(result.recordings) do - count = count + #recording.releasegroups + if recording.releasegroups ~= nil and + not recordings_found[recording.id] then + recordings_found[recording.id] = true + count = count + #recording.releasegroups + end end end end @@ -148,6 +153,7 @@ function lookup_cb_query (feed) local count + local recordings_found = {} if not feed then grl.callback() return @@ -169,7 +175,9 @@ #result.recordings > 0 then for _, recording in ipairs(result.recordings) do if recording.releasegroups and - #recording.releasegroups > 0 then + #recording.releasegroups > 0 and + not recordings_found[recording.id] then + recordings_found[recording.id] = true for _, releasegroup in ipairs(recording.releasegroups) do count = count - 1 media = build_media (recording, releasegroup) diff -Nru grilo-plugins-0.3.11/src/lua-factory/sources/grl-spotify-cover.lua grilo-plugins-0.3.12/src/lua-factory/sources/grl-spotify-cover.lua --- grilo-plugins-0.3.11/src/lua-factory/sources/grl-spotify-cover.lua 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/lua-factory/sources/grl-spotify-cover.lua 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ ---[[ - * Copyright (C) 2015 Bastien Nocera. - * - * Contact: Bastien Nocera - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; version 2.1 of - * the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA - * ---]] - ---------------------------- --- Source initialization -- ---------------------------- - -source = { - id = "grl-spotify-cover", - name = "Spotify Cover", - description = "a source for music covers", - supported_keys = { 'thumbnail' }, - supported_media = { 'audio' }, - resolve_keys = { - ["type"] = "audio", - required = { "artist", "album" }, - }, - tags = { 'music', 'net:internet' }, -} - ------------------- --- Source utils -- ------------------- - -SPOTIFY_SEARCH_ALBUM = 'https://api.spotify.com/v1/search?q=album:%s+artist:%s&type=album&limit=1' - ---------------------------------- --- Handlers of Grilo functions -- ---------------------------------- - -function grl_source_resolve() - local url, req - local artist, title - - req = grl.get_media_keys() - if not req or not req.artist or not req.album - or #req.artist == 0 or #req.album == 0 then - grl.callback() - return - end - - -- Prepare artist and title strings to the url - artist = grl.encode(req.artist) - album = grl.encode(req.album) - url = string.format(SPOTIFY_SEARCH_ALBUM, album, artist) - - grl.fetch(url, fetch_page_cb) -end - ---------------- --- Utilities -- ---------------- - -function fetch_page_cb(result) - local json = {} - - if not result then - grl.callback() - return - end - - json = grl.lua.json.string_to_table(result) - if not json or - not json.albums or - json.albums.total == 0 or - not json.albums.items or - not #json.albums.items or - not json.albums.items[1].images then - grl.callback() - return - end - - local media = {} - media.thumbnail = {} - for i, item in ipairs(json.albums.items[1].images) do - table.insert(media.thumbnail, item.url) - end - - grl.callback(media, 0) -end diff -Nru grilo-plugins-0.3.11/src/lua-factory/sources/grl-steam-store.lua grilo-plugins-0.3.12/src/lua-factory/sources/grl-steam-store.lua --- grilo-plugins-0.3.11/src/lua-factory/sources/grl-steam-store.lua 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/lua-factory/sources/grl-steam-store.lua 2020-09-03 05:36:44.373468000 +0000 @@ -91,7 +91,7 @@ return nil end - return string.format("%d-%d-%d", year, month_map[month], day) + return string.format("%d-%02d-%02d", year, month_map[month], day) end function fetch_game_cb(results, appid) diff -Nru grilo-plugins-0.3.11/src/lua-factory/sources/meson.build grilo-plugins-0.3.12/src/lua-factory/sources/meson.build --- grilo-plugins-0.3.11/src/lua-factory/sources/meson.build 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/lua-factory/sources/meson.build 2020-09-03 05:36:44.375468000 +0000 @@ -14,7 +14,6 @@ 'grl-lastfm-cover', 'grl-musicbrainz-coverart', 'grl-radiofrance', - 'grl-spotify-cover', 'grl-steam-store', 'grl-theaudiodb-cover', 'grl-thegamesdb', diff -Nru grilo-plugins-0.3.11/src/tracker/grl-tracker-source.c grilo-plugins-0.3.12/src/tracker/grl-tracker-source.c --- grilo-plugins-0.3.11/src/tracker/grl-tracker-source.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker/grl-tracker-source.c 2020-09-03 05:36:44.380468000 +0000 @@ -228,23 +228,6 @@ NULL); } -void -grl_tracker_del_source (GrlTrackerSource *source) -{ - GrlTrackerSourcePriv *priv = GRL_TRACKER_SOURCE_GET_PRIVATE (source); - - GRL_DEBUG ("==================>del source '%s'", - grl_source_get_name (GRL_SOURCE (source))); - - g_hash_table_remove (grl_tracker_source_sources, - grl_tracker_source_get_tracker_source (source)); - grl_tracker_source_cache_del_source (grl_tracker_item_cache, source); - priv->state = GRL_TRACKER_SOURCE_STATE_DELETED; - grl_registry_unregister_source (grl_registry_get_default (), - GRL_SOURCE (source), - NULL); -} - gboolean grl_tracker_source_can_notify (GrlTrackerSource *source) { diff -Nru grilo-plugins-0.3.11/src/tracker/grl-tracker-source.h grilo-plugins-0.3.12/src/tracker/grl-tracker-source.h --- grilo-plugins-0.3.11/src/tracker/grl-tracker-source.h 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker/grl-tracker-source.h 2020-09-03 05:36:44.380468000 +0000 @@ -88,8 +88,6 @@ void grl_tracker_add_source (GrlTrackerSource *source); -void grl_tracker_del_source (GrlTrackerSource *source); - GrlTrackerSource *grl_tracker_source_find (const gchar *id); GrlTrackerSource *grl_tracker_source_find_source (const gchar *id); diff -Nru grilo-plugins-0.3.11/src/tracker/grl-tracker-utils.c grilo-plugins-0.3.12/src/tracker/grl-tracker-utils.c --- grilo-plugins-0.3.11/src/tracker/grl-tracker-utils.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker/grl-tracker-utils.c 2020-09-03 05:36:44.380468000 +0000 @@ -108,6 +108,30 @@ } static void +set_genre (TrackerSparqlCursor *cursor, + gint column, + GrlMedia *media, + GrlKeyID key) +{ + /* Tracker concatenetes multiple genres with a comma (vorbis or flac files). + ID3 (mp3 files) does not support multiple genres. A usual workaround is + to use a delimiter character such as a semi-colon or slashes. + */ + const gchar *str = tracker_sparql_cursor_get_string (cursor, column, NULL); + gchar **genres = g_strsplit_set (str, ",;/", -1); + + if (genres) { + gint i = 0; + gchar *genre = genres[i]; + while (genre != NULL) { + grl_media_add_genre (media, g_strstrip (genre)); + genre = genres[++i]; + } + } + g_strfreev (genres); +} + +static void set_title_from_filename (TrackerSparqlCursor *cursor, gint column, GrlMedia *media, @@ -285,6 +309,12 @@ "nmm:artistName(nmm:composer(?urn))", "audio"); + insert_key_mapping_with_setter (GRL_METADATA_KEY_GENRE, + "nfo:genre", + "nfo:genre(?urn)", + "audio", + set_genre); + insert_key_mapping (GRL_METADATA_KEY_SIZE, NULL, "nfo:fileSize(?urn)", @@ -807,81 +837,6 @@ /**/ -static gchar * -get_tracker_volume_name (const gchar *uri, - const gchar *datasource) -{ - gchar *source_name = NULL; - GVolumeMonitor *volume_monitor; - GList *mounts, *mount; - GFile *file; - - if (uri != NULL && *uri != '\0') { - volume_monitor = g_volume_monitor_get (); - mounts = g_volume_monitor_get_mounts (volume_monitor); - file = g_file_new_for_uri (uri); - - mount = mounts; - while (mount != NULL) { - GFile *m_file = g_mount_get_root (G_MOUNT (mount->data)); - - if (g_file_equal (m_file, file)) { - gchar *m_name = g_mount_get_name (G_MOUNT (mount->data)); - g_object_unref (G_OBJECT (m_file)); - source_name = g_strdup_printf (_("Removable — %s"), m_name); - g_free (m_name); - break; - } - g_object_unref (G_OBJECT (m_file)); - - mount = mount->next; - } - g_list_free_full (mounts, g_object_unref); - g_object_unref (G_OBJECT (file)); - g_object_unref (G_OBJECT (volume_monitor)); - } else { - source_name = g_strdup (_("Local files")); - } - - return source_name; -} - -static gchar * -get_tracker_upnp_name (const gchar *datasource_name) -{ - return g_strdup_printf ("UPnP — %s", datasource_name); -} - -gchar * -grl_tracker_get_source_name (const gchar *rdf_type, - const gchar *uri, - const gchar *datasource, - const gchar *datasource_name) -{ - gchar *source_name = NULL; - gchar **rdf_single_type; - gint i; - - /* As rdf_type can be formed by several types, split them */ - rdf_single_type = g_strsplit (rdf_type, ",", -1); - i = g_strv_length (rdf_single_type) - 1; - - while (i >= 0) { - if (g_str_has_suffix (rdf_single_type[i], RDF_TYPE_VOLUME)) { - source_name = get_tracker_volume_name (uri, datasource); - break; - } else if (g_str_has_suffix (rdf_single_type[i], RDF_TYPE_UPNP)) { - source_name = get_tracker_upnp_name (datasource_name); - break; - } - i--; - } - - g_strfreev (rdf_single_type); - - return source_name; -} - const GList * grl_tracker_supported_keys (GrlSource *source) { diff -Nru grilo-plugins-0.3.11/src/tracker/grl-tracker-utils.h grilo-plugins-0.3.12/src/tracker/grl-tracker-utils.h --- grilo-plugins-0.3.11/src/tracker/grl-tracker-utils.h 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker/grl-tracker-utils.h 2020-09-03 05:36:44.380468000 +0000 @@ -87,9 +87,4 @@ gchar *grl_tracker_get_delete_conditional_string (const gchar *urn, const GList *keys); -gchar *grl_tracker_get_source_name (const gchar *rdf_type, - const gchar *uri, - const gchar *datasource, - const gchar *datasource_name); - #endif /* _GRL_TRACKER_UTILS_H_ */ diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker.c grilo-plugins-0.3.12/src/tracker3/grl-tracker.c --- grilo-plugins-0.3.11/src/tracker3/grl-tracker.c 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker.c 2020-09-03 05:36:44.381467800 +0000 @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2011-2012 Igalia S.L. + * Copyright (C) 2011 Intel Corporation. + * + * Contact: Iago Toral Quiroga + * + * Authors: Juan A. Suarez Romero + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "grl-tracker.h" +#include "grl-tracker-source.h" +#include "grl-tracker-source-api.h" +#include "grl-tracker-source-notif.h" +#include "grl-tracker-utils.h" + +/* --------- Logging -------- */ + +#define GRL_LOG_DOMAIN_DEFAULT tracker_general_log_domain +GRL_LOG_DOMAIN_STATIC(tracker_general_log_domain); + +/* --- Other --- */ + +gboolean grl_tracker3_plugin_init (GrlRegistry *registry, + GrlPlugin *plugin, + GList *configs); + +/* ===================== Globals ================= */ + +TrackerSparqlConnection *grl_tracker_connection = NULL; +GrlPlugin *grl_tracker_plugin; +GCancellable *grl_tracker_plugin_init_cancel = NULL; + +/* tracker plugin config */ +gchar *grl_tracker_store_path = NULL; +gchar *grl_tracker_miner_service = NULL; + +/* =================== Tracker Plugin =============== */ + +static void +init_sources (void) +{ + grl_tracker_setup_key_mappings (); + + if (grl_tracker_connection != NULL) + grl_tracker_source_sources_init (); +} + +static void +tracker_new_connection_cb (GObject *object, + GAsyncResult *res, + GrlPlugin *plugin) +{ + GError *error = NULL; + + GRL_DEBUG ("%s", __FUNCTION__); + + grl_tracker_connection = tracker_sparql_connection_new_finish (res, &error); + + if (error) { + GRL_INFO ("Could not get connection to Tracker: %s", error->message); + g_error_free (error); + return; + } + + init_sources (); +} + +static void +set_miner_service (void) +{ + g_autoptr(GKeyFile) keyfile = NULL; + const char *value; + + if (!g_file_test ("/.flatpak-info", G_FILE_TEST_EXISTS)) + return; + + keyfile = g_key_file_new (); + if (!g_key_file_load_from_file (keyfile, "/.flatpak-info", G_KEY_FILE_NONE, NULL)) + return; + + value = g_key_file_get_value (keyfile, "Policy Tracker3", "dbus:org.freedesktop.Tracker3.Miner.Files", NULL); + if (value) + return; + + value = g_key_file_get_string (keyfile, "Application", "name", NULL); + grl_tracker_miner_service = g_strdup_printf ("%s.Tracker3.Miner.Files", value); + GRL_INFO("\tRunning in sandboxed mode, using %s as miner service", + grl_tracker_miner_service); +} + +gboolean +grl_tracker3_plugin_init (GrlRegistry *registry, + GrlPlugin *plugin, + GList *configs) +{ + GrlConfig *config; + gint config_count; + GFile *store = NULL, *ontology; + TrackerSparqlConnectionFlags flags = TRACKER_SPARQL_CONNECTION_FLAGS_NONE; + + GRL_LOG_DOMAIN_INIT (tracker_general_log_domain, "tracker3-general"); + + /* Initialize i18n */ + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + + grl_tracker_source_init_requests (); + + grl_tracker_plugin = plugin; + + if (!configs) { + GRL_INFO ("\tConfiguration not provided! Using default configuration."); + } else { + config_count = g_list_length (configs); + if (config_count > 1) { + GRL_INFO ("\tProvided %i configs, but will only use one", config_count); + } + + config = GRL_CONFIG (configs->data); + + grl_tracker_store_path = + grl_config_get_string (config, "store-path"); + grl_tracker_miner_service = + grl_config_get_string (config, "miner-service"); + } + + if (!grl_tracker_miner_service) + set_miner_service (); + + grl_tracker_plugin_init_cancel = g_cancellable_new (); + if (grl_tracker_store_path) { + store = g_file_new_for_path (grl_tracker_store_path); + flags = TRACKER_SPARQL_CONNECTION_FLAGS_READONLY; + } + + ontology = tracker_sparql_get_ontology_nepomuk (); + tracker_sparql_connection_new_async (flags, + store, + ontology, + grl_tracker_plugin_init_cancel, + (GAsyncReadyCallback) tracker_new_connection_cb, + plugin); + g_clear_object (&store); + g_object_unref (ontology); + return TRUE; +} + +static void +grl_tracker3_plugin_deinit (GrlPlugin *plugin) +{ + g_cancellable_cancel (grl_tracker_plugin_init_cancel); + g_clear_object (&grl_tracker_plugin_init_cancel); + g_clear_object (&grl_tracker_connection); +} + +static void +grl_tracker3_plugin_register_keys (GrlRegistry *registry, + GrlPlugin *plugin) +{ + grl_registry_register_metadata_key (grl_registry_get_default (), + g_param_spec_string ("tracker-category", + "Tracker category", + "Category a media belongs to", + NULL, + G_PARAM_STATIC_STRINGS | + G_PARAM_READWRITE), + GRL_METADATA_KEY_INVALID, + NULL); + grl_registry_register_metadata_key (grl_registry_get_default (), + g_param_spec_string ("gibest-hash", + "Gibest hash", + "Gibest hash of the video file", + NULL, + G_PARAM_STATIC_STRINGS | + G_PARAM_READWRITE), + GRL_METADATA_KEY_INVALID, + NULL); + grl_registry_register_metadata_key (grl_registry_get_default (), + g_param_spec_string ("tracker-urn", + "Tracker URN", + "Universal resource number in Tracker's store", + NULL, + G_PARAM_STATIC_STRINGS | + G_PARAM_READWRITE), + GRL_METADATA_KEY_INVALID, + NULL); +} + +GRL_PLUGIN_DEFINE (GRL_MAJOR, + GRL_MINOR, + GRL_TRACKER_PLUGIN_ID, + "Tracker3", + "A plugin for searching multimedia content using Tracker Miners 3.x", + "Igalia S.L.", + VERSION, + "LGPL", + "http://www.igalia.com", + grl_tracker3_plugin_init, + grl_tracker3_plugin_deinit, + grl_tracker3_plugin_register_keys); diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker.h grilo-plugins-0.3.12/src/tracker3/grl-tracker.h --- grilo-plugins-0.3.11/src/tracker3/grl-tracker.h 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker.h 2020-09-03 05:36:44.381467800 +0000 @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2011 Intel Corporation. + * + * Contact: Iago Toral Quiroga + * + * Authors: Lionel Landwerlin + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef _GRL_TRACKER_H_ +#define _GRL_TRACKER_H_ + +#include + +/* ---- Plugin information --- */ + +#define GRL_TRACKER_PLUGIN_ID TRACKER3_PLUGIN_ID + +extern TrackerSparqlConnection *grl_tracker_connection; + +#endif /* _GRL_TRACKER_H_ */ diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-api.c grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-api.c --- grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-api.c 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-api.c 2020-09-03 05:36:44.380468000 +0000 @@ -0,0 +1,1134 @@ +/* + * Copyright (C) 2011-2012 Igalia S.L. + * Copyright (C) 2011 Intel Corporation. + * Copyright (C) 2020 Red Hat Inc. + * + * Contact: Carlos Garnacho + * + * Authors: Carlos Garnacho + * Lionel Landwerlin + * Juan A. Suarez Romero + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "grl-tracker.h" +#include "grl-tracker-source-api.h" +#include "grl-tracker-source-cache.h" +#include "grl-tracker-source-priv.h" +#include "grl-tracker-source-statements.h" +#include "grl-tracker-utils.h" + +/* --------- Logging -------- */ + +#define GRL_LOG_DOMAIN_DEFAULT tracker_source_request_log_domain + +GRL_LOG_DOMAIN_STATIC(tracker_source_request_log_domain); +GRL_LOG_DOMAIN_STATIC(tracker_source_result_log_domain); + +/* Inputs/requests */ +#define GRL_IDEBUG(args...) \ + GRL_LOG (tracker_source_request_log_domain, \ + GRL_LOG_LEVEL_DEBUG, args) + +/* Outputs/results */ +#define GRL_ODEBUG(args...) \ + GRL_LOG (tracker_source_result_log_domain, \ + GRL_LOG_LEVEL_DEBUG, args) + +/**/ + +/**/ + +static GrlKeyID grl_metadata_key_tracker_category; +static GHashTable *grl_tracker_operations; + +typedef struct { + GCancellable *cancel; + const GList *keys; + gpointer data; + GrlTypeFilter type_filter; +} GrlTrackerOp; + +/**/ + +static void +set_title_from_filename (GrlMedia *media) +{ + const gchar *url; + gchar *path, *display_name, *ext, *title = NULL; + guint suffix_len; + + /* Prefer the real title */ + if (grl_media_get_title (media)) + return; + + url = grl_media_get_url (media); + if (url == NULL) + return; + + path = g_filename_from_uri (url, NULL, NULL); + if (!path) + return; + display_name = g_filename_display_basename (path); + g_free (path); + ext = strrchr (display_name, '.'); + if (ext) { + suffix_len = strlen (ext); + if (suffix_len != 4 && suffix_len != 5) + goto out; + + title = g_strndup (display_name, ext - display_name); + } else { + title = g_strdup (display_name); + } + + grl_data_set_string (GRL_DATA (media), GRL_METADATA_KEY_TITLE, title); + grl_data_set_boolean (GRL_DATA (media), GRL_METADATA_KEY_TITLE_FROM_FILENAME, TRUE); + +out: + g_free (title); + g_free (display_name); +} + +static void +fill_grilo_media_from_sparql (GrlTrackerSource *source, + GrlMedia *media, + TrackerSparqlCursor *cursor, + gint column) +{ + const gchar *sparql_key = tracker_sparql_cursor_get_variable_name (cursor, + column); + tracker_grl_sparql_t *assoc = + grl_tracker_get_mapping_from_sparql (sparql_key); + union { + gint64 int_val; + gdouble double_val; + const gchar *str_val; + } val; + + GrlKeyID grl_key; + + if (assoc == NULL) { + /* Maybe the user is setting the key */ + GrlRegistry *registry = grl_registry_get_default (); + grl_key = grl_registry_lookup_metadata_key (registry, sparql_key); + if (grl_key == GRL_METADATA_KEY_INVALID) { + return; + } + } else { + grl_key = assoc->grl_key; + } + + GRL_ODEBUG ("\tSetting media prop (col=%i/var=%s/prop=%s) %s", + column, + sparql_key, + GRL_METADATA_KEY_GET_NAME (grl_key), + tracker_sparql_cursor_get_string (cursor, column, NULL)); + + if (tracker_sparql_cursor_is_bound (cursor, column) == FALSE) { + GRL_ODEBUG ("\t\tDropping, no data"); + return; + } + + if (grl_data_has_key (GRL_DATA (media), grl_key)) { + GRL_ODEBUG ("\t\tDropping, already here"); + return; + } + + if (assoc && assoc->set_value) { + assoc->set_value (cursor, column, media, assoc->grl_key); + } else { + GType grl_type = GRL_METADATA_KEY_GET_TYPE (grl_key); + if (grl_type == G_TYPE_STRING) { + /* Cache the source associated to this result. */ + if (grl_key == GRL_METADATA_KEY_ID) { + grl_tracker_source_cache_add_item (grl_tracker_item_cache, + tracker_sparql_cursor_get_integer (cursor, + column), + source); + } + val.str_val = tracker_sparql_cursor_get_string (cursor, column, NULL); + if (val.str_val != NULL) + grl_data_set_string (GRL_DATA (media), grl_key, val.str_val); + } else if (grl_type == G_TYPE_INT) { + val.int_val = tracker_sparql_cursor_get_integer (cursor, column); + grl_data_set_int (GRL_DATA (media), grl_key, val.int_val); + } else if (grl_type == G_TYPE_INT64) { + val.int_val = tracker_sparql_cursor_get_integer (cursor, column); + grl_data_set_int64 (GRL_DATA (media), grl_key, val.int_val); + } else if (grl_type == G_TYPE_FLOAT) { + val.double_val = tracker_sparql_cursor_get_double (cursor, column); + grl_data_set_float (GRL_DATA (media), grl_key, (gfloat) val.double_val); + } else if (grl_type == G_TYPE_DATE_TIME) { + val.str_val = tracker_sparql_cursor_get_string (cursor, column, NULL); + GDateTime *date_time = grl_date_time_from_iso8601 (val.str_val); + grl_data_set_boxed (GRL_DATA (media), grl_key, date_time); + g_date_time_unref (date_time); + } else { + GRL_ODEBUG ("\t\tUnexpected data type"); + } + } +} + +static GrlTrackerOp * +grl_tracker_op_new (GrlTypeFilter type_filter, + gpointer data) +{ + GrlTrackerOp *os; + + os = g_new0 (GrlTrackerOp, 1); + os->cancel = g_cancellable_new (); + os->type_filter = type_filter; + os->data = data; + + return os; +} + +static void +grl_tracker_op_free (GrlTrackerOp *os) +{ + g_object_unref (os->cancel); + g_free (os); +} + +/* I can haz templatze ?? */ +#define TRACKER_QUERY_CB(spec_type,name,error) \ + \ + static void \ + tracker_##name##_result_cb (GObject *source_object, \ + GAsyncResult *result, \ + GrlTrackerOp *os) \ + { \ + TrackerSparqlCursor *cursor = TRACKER_SPARQL_CURSOR (source_object);\ + gint col, type; \ + GError *tracker_error = NULL, *error = NULL; \ + GrlMedia *media; \ + spec_type *spec = \ + (spec_type *) os->data; \ + \ + GRL_ODEBUG ("%s", __FUNCTION__); \ + \ + if (!tracker_sparql_cursor_next_finish (cursor, \ + result, \ + &tracker_error)) { \ + if (tracker_error != NULL) { \ + GRL_WARNING ("\terror in parsing query id=%u : %s", \ + spec->operation_id, tracker_error->message); \ + \ + if (!g_error_matches (tracker_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) \ + error = g_error_new (GRL_CORE_ERROR, \ + GRL_CORE_ERROR_##error##_FAILED, \ + _("Failed to query: %s"), \ + tracker_error->message); \ + \ + spec->callback (spec->source, \ + spec->operation_id, \ + NULL, 0, \ + spec->user_data, error); \ + \ + g_clear_error (&error); \ + g_error_free (tracker_error); \ + } else { \ + GRL_ODEBUG ("\tend of parsing id=%u :)", spec->operation_id); \ + \ + spec->callback (spec->source, \ + spec->operation_id, \ + NULL, 0, \ + spec->user_data, NULL); \ + } \ + \ + grl_tracker_op_free (os); \ + g_object_unref (cursor); \ + return; \ + } \ + \ + type = tracker_sparql_cursor_get_integer (cursor, 0); \ + \ + GRL_ODEBUG ("\tParsing line of type %x", \ + type); \ + \ + media = grl_tracker_build_grilo_media ((GrlMediaType ) type); \ + \ + if (media != NULL) { \ + for (col = 1 ; \ + col < tracker_sparql_cursor_get_n_columns (cursor) ; \ + col++) { \ + fill_grilo_media_from_sparql (GRL_TRACKER_SOURCE (spec->source), \ + media, cursor, col); \ + } \ + set_title_from_filename (media); \ + \ + spec->callback (spec->source, \ + spec->operation_id, \ + media, \ + GRL_SOURCE_REMAINING_UNKNOWN, \ + spec->user_data, \ + NULL); \ + } \ + \ + /* Schedule the next row to parse */ \ + tracker_sparql_cursor_next_async (cursor, os->cancel, \ + (GAsyncReadyCallback) tracker_##name##_result_cb, \ + (gpointer) os); \ + } \ + \ + static void \ + tracker_##name##_cb (GObject *source_object, \ + GAsyncResult *result, \ + GrlTrackerOp *os) \ + { \ + TrackerSparqlStatement *statement = TRACKER_SPARQL_STATEMENT (source_object); \ + GError *tracker_error = NULL, *error = NULL; \ + spec_type *spec = (spec_type *) os->data; \ + TrackerSparqlCursor *cursor; \ + \ + GRL_ODEBUG ("%s", __FUNCTION__); \ + \ + cursor = \ + tracker_sparql_statement_execute_finish (statement, \ + result, &tracker_error); \ + \ + if (tracker_error) { \ + GRL_WARNING ("Could not execute sparql query id=%u: %s", \ + spec->operation_id, tracker_error->message); \ + \ + error = g_error_new (GRL_CORE_ERROR, \ + GRL_CORE_ERROR_##error##_FAILED, \ + _("Failed to query: %s"), \ + tracker_error->message); \ + \ + spec->callback (spec->source, spec->operation_id, NULL, 0, \ + spec->user_data, error); \ + \ + g_error_free (tracker_error); \ + g_error_free (error); \ + grl_tracker_op_free (os); \ + \ + return; \ + } \ + \ + /* Start parsing results */ \ + tracker_sparql_cursor_next_async (cursor, NULL, \ + (GAsyncReadyCallback) tracker_##name##_result_cb, \ + (gpointer) os); \ + } + +TRACKER_QUERY_CB(GrlSourceQuerySpec, query, QUERY) +TRACKER_QUERY_CB(GrlSourceBrowseSpec, browse, BROWSE) +TRACKER_QUERY_CB(GrlSourceSearchSpec, search, SEARCH) + +static void +tracker_resolve_cb (GObject *source_object, + GAsyncResult *result, + GrlTrackerOp *os) +{ + TrackerSparqlStatement *statement = TRACKER_SPARQL_STATEMENT (source_object); + GrlSourceResolveSpec *rs = (GrlSourceResolveSpec *) os->data; + gint col; + GError *tracker_error = NULL, *error = NULL; + TrackerSparqlCursor *cursor; + + GRL_ODEBUG ("%s", __FUNCTION__); + + cursor = tracker_sparql_statement_execute_finish (statement, + result, &tracker_error); + + if (!cursor) + goto end_operation; + + if (tracker_sparql_cursor_next (cursor, NULL, &tracker_error)) { + /* Translate Sparql result into Grilo result */ + for (col = 0 ; col < tracker_sparql_cursor_get_n_columns (cursor) ; col++) { + fill_grilo_media_from_sparql (GRL_TRACKER_SOURCE (rs->source), + rs->media, cursor, col); + } + set_title_from_filename (rs->media); + + rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, NULL); + } else if (!tracker_error) { + rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, NULL); + } + + end_operation: + if (tracker_error) { + GRL_WARNING ("Could not execute sparql resolve query : %s", + tracker_error->message); + + error = g_error_new (GRL_CORE_ERROR, + GRL_CORE_ERROR_RESOLVE_FAILED, + _("Failed to resolve: %s"), + tracker_error->message); + + rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, error); + + g_error_free (tracker_error); + g_error_free (error); + } + + g_clear_object (&cursor); + + grl_tracker_op_free (os); +} + +static void +tracker_media_from_uri_cb (GObject *source_object, + GAsyncResult *result, + GrlTrackerOp *os) +{ + TrackerSparqlStatement *statement = TRACKER_SPARQL_STATEMENT (source_object); \ + GrlSourceMediaFromUriSpec *mfus = (GrlSourceMediaFromUriSpec *) os->data; + GError *tracker_error = NULL, *error = NULL; + GrlMedia *media; + TrackerSparqlCursor *cursor; + gint col, type; + + GRL_ODEBUG ("%s", __FUNCTION__); + + cursor = tracker_sparql_statement_execute_finish (statement, + result, &tracker_error); + + if (tracker_error) { + GRL_WARNING ("Could not execute sparql media from uri query : %s", + tracker_error->message); + + error = g_error_new (GRL_CORE_ERROR, + GRL_CORE_ERROR_MEDIA_FROM_URI_FAILED, + _("Failed to get media from uri: %s"), + tracker_error->message); + + mfus->callback (mfus->source, mfus->operation_id, NULL, mfus->user_data, error); + + g_error_free (tracker_error); + g_error_free (error); + + goto end_operation; + } + + + if (tracker_sparql_cursor_next (cursor, NULL, NULL)) { + /* Build grilo media */ + type = tracker_sparql_cursor_get_integer (cursor, 0); + media = grl_tracker_build_grilo_media ((GrlMediaType) type); + + /* Translate Sparql result into Grilo result */ + for (col = 0 ; col < tracker_sparql_cursor_get_n_columns (cursor) ; col++) { + fill_grilo_media_from_sparql (GRL_TRACKER_SOURCE (mfus->source), + media, cursor, col); + } + set_title_from_filename (media); + + mfus->callback (mfus->source, mfus->operation_id, media, mfus->user_data, NULL); + } else { + mfus->callback (mfus->source, mfus->operation_id, NULL, mfus->user_data, NULL); + } + + end_operation: + g_clear_object (&cursor); + + grl_tracker_op_free (os); +} + +static void +tracker_store_metadata_cb (GObject *source_object, + GAsyncResult *result, + GrlTrackerOp *os) +{ + GrlSourceStoreMetadataSpec *sms = + (GrlSourceStoreMetadataSpec *) os->data; + GError *tracker_error = NULL, *error = NULL; + + g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), + result, &tracker_error); + + if (tracker_error) { + GRL_WARNING ("Could not writeback metadata: %s", + tracker_error->message); + + error = g_error_new (GRL_CORE_ERROR, + GRL_CORE_ERROR_STORE_METADATA_FAILED, + _("Failed to update metadata: %s"), + tracker_error->message); + + sms->callback (sms->source, sms->media, NULL, sms->user_data, error); + + g_error_free (tracker_error); + g_error_free (error); + } else { + sms->callback (sms->source, sms->media, NULL, sms->user_data, NULL); + } + + grl_tracker_op_free (os); +} + +/**/ + +const GList * +grl_tracker_source_writable_keys (GrlSource *source) +{ + static GList *keys = NULL; + GrlRegistry *registry; + GrlKeyID grl_metadata_key_chromaprint; + + if (!keys) { + registry = grl_registry_get_default (); + grl_metadata_key_chromaprint = grl_registry_lookup_metadata_key (registry, "chromaprint"); + + keys = grl_metadata_key_list_new (GRL_METADATA_KEY_ALBUM, + GRL_METADATA_KEY_ALBUM_DISC_NUMBER, + GRL_METADATA_KEY_ARTIST, + GRL_METADATA_KEY_ALBUM_ARTIST, + GRL_METADATA_KEY_AUTHOR, + GRL_METADATA_KEY_COMPOSER, + GRL_METADATA_KEY_CREATION_DATE, + GRL_METADATA_KEY_TITLE, + GRL_METADATA_KEY_SEASON, + GRL_METADATA_KEY_EPISODE, + GRL_METADATA_KEY_TRACK_NUMBER, + GRL_METADATA_KEY_MB_RELEASE_ID, + GRL_METADATA_KEY_MB_RELEASE_GROUP_ID, + GRL_METADATA_KEY_MB_RECORDING_ID, + GRL_METADATA_KEY_MB_TRACK_ID, + GRL_METADATA_KEY_MB_ARTIST_ID, + GRL_METADATA_KEY_PUBLICATION_DATE, + grl_metadata_key_chromaprint, + GRL_METADATA_KEY_INVALID); + } + return keys; +} + +/** + * Query is a SPARQL query. + * + * Columns must be named with the Grilo key name that the column + * represent. Unnamed or unknown columns will be ignored. + * + * First column must be the media type, and it does not need to be named. It + * must match with any value supported in rdf:type() property, or + * grilo#Container. Types understood are: + * + * + * + * + * nmm#MusicPiece + * + * + * + * + * nmm#Video + * + * + * + * + * nmm#Photo + * + * + * + * + * nmm#Artist + * + * + * + * + * nmm#MusicAlbum + * + * + * + * + * grilo#Container + * + * + * + * + * An example for searching all songs: + * + * + * + * SELECT rdf:type(?song) + * ?song AS ?id + * nie:title(?song) AS ?title + * nie:url(?song) AS ?url + * WHERE { ?song a nmm:MusicPiece } + * + * + * + * Alternatively, we can use a partial SPARQL query: just specify the sentence + * in the WHERE part. In this case, "?urn" is the ontology concept to be used in + * the clause. + * + * An example of such partial query: + * + * + * + * ?urn a nfo:Media + * + * + * + * In this case, all data required to build a full SPARQL query will be get from + * the query spec. + */ +void +grl_tracker_source_query (GrlSource *source, + GrlSourceQuerySpec *qs) +{ + GError *error = NULL; + GrlTrackerOp *os; + TrackerSparqlStatement *statement; + + GRL_IDEBUG ("%s: id=%u", __FUNCTION__, qs->operation_id); + + if (!qs->query || qs->query[0] == '\0') { + error = g_error_new_literal (GRL_CORE_ERROR, + GRL_CORE_ERROR_QUERY_FAILED, + _("Empty query")); + goto send_error; + } + + if (g_ascii_strncasecmp (qs->query, "select ", 7) == 0) { + statement = + tracker_sparql_connection_query_statement (GRL_TRACKER_SOURCE (source)->priv->tracker_connection, + qs->query, + NULL, &error); + } else { + statement = + grl_tracker_source_create_statement (GRL_TRACKER_SOURCE (source), + GRL_TRACKER_QUERY_ALL, + qs->options, + qs->keys, + qs->query, + &error); + } + + if (!statement) + goto send_error; + + os = grl_tracker_op_new (grl_operation_options_get_type_filter (qs->options), qs); + + tracker_sparql_statement_execute_async (statement, + os->cancel, + (GAsyncReadyCallback) tracker_query_cb, + os); + + g_clear_object (&statement); + + return; + + send_error: + qs->callback (qs->source, qs->operation_id, NULL, 0, qs->user_data, error); + g_error_free (error); +} + +void +grl_tracker_source_resolve (GrlSource *source, + GrlSourceResolveSpec *rs) +{ + GrlTrackerOp *os; + GrlTrackerQueryType query_type; + const gchar *arg, *value; + GError *error = NULL; + TrackerSparqlStatement *statement; + + GRL_IDEBUG ("%s: id=%i", __FUNCTION__, rs->operation_id); + + if (grl_media_get_id (rs->media) != NULL) { + query_type = GRL_TRACKER_QUERY_RESOLVE; + arg = "resource"; + value = grl_media_get_id (rs->media); + } else if (grl_media_get_url (rs->media) != NULL) { + query_type = GRL_TRACKER_QUERY_RESOLVE_URI; + arg = "uri"; + value = grl_media_get_url (rs->media); + } else { + rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, NULL); + return; + } + + statement = + grl_tracker_source_create_statement (GRL_TRACKER_SOURCE (source), + query_type, NULL, + rs->keys, NULL, &error); + if (!statement) { + rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, error); + g_error_free (error); + return; + } + + os = grl_tracker_op_new (GRL_TYPE_FILTER_ALL, rs); + + tracker_sparql_statement_bind_string (statement, arg, value); + tracker_sparql_statement_execute_async (statement, + os->cancel, + (GAsyncReadyCallback) tracker_resolve_cb, + os); + g_clear_object (&statement); +} + +gboolean +grl_tracker_source_may_resolve (GrlSource *source, + GrlMedia *media, + GrlKeyID key_id, + GList **missing_keys) +{ + GRL_IDEBUG ("%s: key=%s", __FUNCTION__, GRL_METADATA_KEY_GET_NAME (key_id)); + + if (!grl_tracker_key_is_supported (key_id)) { + return FALSE; + } + + if (media) { + if (grl_media_get_id (media) || grl_media_get_url (media)) { + return TRUE; + } else { + if (missing_keys) { + *missing_keys = g_list_append (*missing_keys, + GRLKEYID_TO_POINTER (GRL_METADATA_KEY_URL)); + } + } + } + + return FALSE; +} + +void +grl_tracker_source_store_metadata (GrlSource *source, + GrlSourceStoreMetadataSpec *sms) +{ + GrlTrackerSourcePrivate *priv = GRL_TRACKER_SOURCE (source)->priv; + TrackerResource *resource; + GrlTrackerOp *os; + + resource = grl_tracker_build_resource_from_media (sms->media, sms->keys); + + os = grl_tracker_op_new (GRL_TYPE_FILTER_ALL, sms); + + g_dbus_proxy_call (priv->writeback, + "Writeback", + g_variant_new ("(@a{sv})", + tracker_resource_serialize (resource)), + G_DBUS_CALL_FLAGS_NONE, + -1, + os->cancel, + (GAsyncReadyCallback) tracker_store_metadata_cb, + os); + g_object_unref (resource); +} + +void +grl_tracker_source_search (GrlSource *source, GrlSourceSearchSpec *ss) +{ + GrlTrackerOp *os; + GrlTrackerQueryType query_type; + GError *error = NULL; + TrackerSparqlStatement *statement; + + GRL_IDEBUG ("%s: id=%u", __FUNCTION__, ss->operation_id); + + if (!ss->text || ss->text[0] == '\0') + query_type = GRL_TRACKER_QUERY_ALL; + else + query_type = GRL_TRACKER_QUERY_FTS_SEARCH; + + statement = + grl_tracker_source_create_statement (GRL_TRACKER_SOURCE (source), + query_type, + ss->options, + ss->keys, + NULL, + &error); + + if (!statement) { + ss->callback (ss->source, ss->operation_id, NULL, 0, ss->user_data, error); + g_error_free (error); + return; + } + + os = grl_tracker_op_new (grl_operation_options_get_type_filter (ss->options), ss); + + if (ss->text && *ss->text) { + /* Make it a prefix search */ + gchar *match = g_strdup_printf ("%s*", ss->text); + tracker_sparql_statement_bind_string (statement, "match", match); + g_free (match); + } + + tracker_sparql_statement_execute_async (statement, + os->cancel, + (GAsyncReadyCallback) tracker_search_cb, + os); + g_clear_object (&statement); +} + +static gboolean +is_root_box (GrlMedia *container) +{ + if (container == NULL) + return TRUE; + if (!grl_media_get_id (container)) + return TRUE; + return FALSE; +} + +static void +grl_tracker_source_browse_category (GrlSource *source, + GrlSourceBrowseSpec *bs) +{ + GrlTrackerOp *os; + GrlMedia *media; + const gchar *category; + GError *error = NULL; + gint remaining; + GrlTypeFilter filter = grl_operation_options_get_type_filter (bs->options); + TrackerSparqlStatement *statement; + + GRL_IDEBUG ("%s: id=%u", __FUNCTION__, bs->operation_id); + + /* If the category is missing, try to get it from the + * container's ID */ + if (!is_root_box (bs->container) && + !grl_data_has_key (GRL_DATA (bs->container), + grl_metadata_key_tracker_category)) { + const char *id; + + id = grl_media_get_id (bs->container); + if (g_strcmp0 (id, "music") == 0) + category = "nmm:MusicPiece"; + else if (g_strcmp0 (id, "photos") == 0) + category = "nmm:Photo"; + else if (g_strcmp0 (id, "videos") == 0) + category = "nmm:Video"; + else { + GError *error; + + error = g_error_new (GRL_CORE_ERROR, + GRL_CORE_ERROR_BROWSE_FAILED, + _("ID “%s” is not known in this source"), + id); + + bs->callback (bs->source, bs->operation_id, NULL, 0, + bs->user_data, error); + + g_error_free (error); + return; + } + + grl_data_set_string (GRL_DATA (bs->container), + grl_metadata_key_tracker_category, + category); + } + + if (is_root_box (bs->container)) { + /* Hardcoded categories */ + if (filter == GRL_TYPE_FILTER_ALL) { + remaining = 3; + } else { + remaining = 0; + if (filter & GRL_TYPE_FILTER_AUDIO) { + remaining++; + } + if (filter & GRL_TYPE_FILTER_VIDEO) { + remaining++; + } + if (filter & GRL_TYPE_FILTER_IMAGE) { + remaining++; + } + } + + if (remaining == 0) { + bs->callback (bs->source, bs->operation_id, NULL, 0, + bs->user_data, NULL); + return; + } + + /* Special case: if everthing is filtered except one category, then skip the + intermediate level and go straightly to the elements */ + if (remaining > 1) { + if (filter & GRL_TYPE_FILTER_AUDIO) { + media = grl_media_container_new (); + grl_media_set_title (media, "Music"); + grl_media_set_id (media, "music"); + grl_data_set_string (GRL_DATA (media), + grl_metadata_key_tracker_category, + "nmm:MusicPiece"); + bs->callback (bs->source, bs->operation_id, media, --remaining, + bs->user_data, NULL); + } + + if (filter & GRL_TYPE_FILTER_IMAGE) { + media = grl_media_container_new (); + grl_media_set_title (media, "Photos"); + grl_media_set_id (media, "photos"); + grl_data_set_string (GRL_DATA (media), + grl_metadata_key_tracker_category, + "nmm:Photo"); + bs->callback (bs->source, bs->operation_id, media, --remaining, + bs->user_data, NULL); + } + + if (filter & GRL_TYPE_FILTER_VIDEO) { + media = grl_media_container_new (); + grl_media_set_title (media, "Videos"); + grl_media_set_id (media, "videos"); + grl_data_set_string (GRL_DATA (media), + grl_metadata_key_tracker_category, + "nmm:Video"); + bs->callback (bs->source, bs->operation_id, media, --remaining, + bs->user_data, NULL); + } + return; + } + } else if (grl_data_has_key (GRL_DATA (bs->container), + grl_metadata_key_tracker_category)) { + category = grl_data_get_string (GRL_DATA (bs->container), + grl_metadata_key_tracker_category); + + if (g_strcmp0 (category, "nmm:MusicPiece") == 0) + grl_operation_options_set_type_filter (bs->options, GRL_TYPE_FILTER_AUDIO); + else if (g_strcmp0 (category, "nmm:Video") == 0) + grl_operation_options_set_type_filter (bs->options, GRL_TYPE_FILTER_VIDEO); + else if (g_strcmp0 (category, "nmm:Photo") == 0) + grl_operation_options_set_type_filter (bs->options, GRL_TYPE_FILTER_IMAGE); + else { + bs->callback (bs->source, bs->operation_id, NULL, 0, + bs->user_data, error); + return; + } + } else { + GError *error; + + error = g_error_new (GRL_CORE_ERROR, + GRL_CORE_ERROR_BROWSE_FAILED, + _("ID “%s” is not known in this source"), + grl_media_get_id (bs->container)); + + bs->callback (bs->source, bs->operation_id, NULL, 0, + bs->user_data, error); + + g_error_free (error); + return; + } + + /* Use QUERY_ALL here, we use the filter type to browse specific categories */ + statement = grl_tracker_source_create_statement (GRL_TRACKER_SOURCE (source), + GRL_TRACKER_QUERY_ALL, + bs->options, + bs->keys, + NULL, + &error); + if (!statement) { + bs->callback (bs->source, bs->operation_id, NULL, 0, + bs->user_data, error); + g_error_free (error); + return; + } + + os = grl_tracker_op_new (grl_operation_options_get_type_filter (bs->options), bs); + + tracker_sparql_statement_execute_async (statement, + os->cancel, + (GAsyncReadyCallback) tracker_browse_cb, + os); + g_clear_object (&statement); +} + +void +grl_tracker_source_browse (GrlSource *source, + GrlSourceBrowseSpec *bs) +{ + /* Ensure GRL_METADATA_KEY_ID is always requested */ + if (!g_list_find (bs->keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ID))) + bs->keys = g_list_prepend (bs->keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ID)); + + grl_tracker_source_browse_category (source, bs); +} + +void +grl_tracker_source_cancel (GrlSource *source, guint operation_id) +{ + GrlTrackerOp *os; + + GRL_IDEBUG ("%s: id=%u", __FUNCTION__, operation_id); + + os = g_hash_table_lookup (grl_tracker_operations, + GSIZE_TO_POINTER (operation_id)); + + if (os != NULL) + g_cancellable_cancel (os->cancel); +} + +gboolean +grl_tracker_source_change_start (GrlSource *source, GError **error) +{ + GrlTrackerSourcePrivate *priv = GRL_TRACKER_SOURCE (source)->priv; + + priv->notifier = + grl_tracker_source_notify_new (source, priv->tracker_connection); + + return TRUE; +} + +gboolean +grl_tracker_source_change_stop (GrlSource *source, GError **error) +{ + GrlTrackerSourcePrivate *priv = GRL_TRACKER_SOURCE (source)->priv; + + g_clear_object (&priv->notifier); + + return TRUE; +} + +void +grl_tracker_source_init_requests (void) +{ + GrlRegistry *registry = grl_registry_get_default (); + + grl_metadata_key_tracker_category = + grl_registry_lookup_metadata_key (registry, "tracker-category"); + + grl_tracker_operations = g_hash_table_new (g_direct_hash, g_direct_equal); + + GRL_LOG_DOMAIN_INIT (tracker_source_request_log_domain, + "tracker-source-request"); + GRL_LOG_DOMAIN_INIT (tracker_source_result_log_domain, + "tracker-source-result"); +} + +GrlCaps * +grl_tracker_source_get_caps (GrlSource *source, + GrlSupportedOps operation) +{ + static GrlCaps *caps; + + if (!caps) { + GList *range_list; + caps = grl_caps_new (); + grl_caps_set_type_filter (caps, GRL_TYPE_FILTER_ALL); + range_list = grl_metadata_key_list_new (GRL_METADATA_KEY_DURATION, + GRL_METADATA_KEY_INVALID); + grl_caps_set_key_range_filter (caps, range_list); + g_list_free (range_list); + } + + return caps; +} + +GrlSupportedOps +grl_tracker_source_supported_operations (GrlSource *source) +{ + gboolean is_extractor; + GrlSupportedOps ops; + + /* Always supported operations. */ + ops = GRL_OP_RESOLVE | GRL_OP_MEDIA_FROM_URI | GRL_OP_SEARCH | GRL_OP_QUERY | + GRL_OP_STORE_METADATA | GRL_OP_NOTIFY_CHANGE; + + /* The extractor doesn’t support browsing; only resolving. */ + is_extractor = g_str_has_prefix (grl_source_get_id (source), + "http://www.tracker-project.org" + "/ontologies/tracker" + "#extractor-data-source,"); + if (!is_extractor) { + ops |= GRL_OP_BROWSE; + } + + return ops; +} + +gboolean +grl_tracker_source_test_media_from_uri (GrlSource *source, + const gchar *uri) +{ + GError *error = NULL; + TrackerSparqlCursor *cursor; + TrackerSparqlStatement *statement; + gboolean empty; + + statement = grl_tracker_source_create_statement (GRL_TRACKER_SOURCE (source), + GRL_TRACKER_QUERY_MEDIA_FROM_URI, + NULL, NULL, NULL, + &error); + if (!statement) { + g_critical ("Error creating statement: %s", error->message); + g_error_free (error); + return FALSE; + } + + tracker_sparql_statement_bind_string (statement, "uri", uri); + cursor = tracker_sparql_statement_execute (statement, NULL, &error); + g_object_unref (statement); + + if (error) { + GRL_WARNING ("Error when executig sparql query: %s", + error->message); + g_error_free (error); + return FALSE; + } + + /* Check if there are results */ + if (tracker_sparql_cursor_next (cursor, NULL, NULL)) { + empty = FALSE; + } else { + empty = TRUE; + } + + g_object_unref (cursor); + + return !empty; +} + +void +grl_tracker_source_get_media_from_uri (GrlSource *source, + GrlSourceMediaFromUriSpec *mfus) +{ + GError *error = NULL; + GrlTrackerOp *os; + TrackerSparqlStatement *statement; + + GRL_IDEBUG ("%s: id=%u", __FUNCTION__, mfus->operation_id); + + /* Ensure GRL_METADATA_KEY_ID is always requested */ + if (!g_list_find (mfus->keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ID))) + mfus->keys = g_list_prepend (mfus->keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ID)); + + statement = grl_tracker_source_create_statement (GRL_TRACKER_SOURCE (source), + GRL_TRACKER_QUERY_MEDIA_FROM_URI, + mfus->options, + mfus->keys, + NULL, + &error); + if (!statement) { + mfus->callback (source, mfus->operation_id, NULL, NULL, error); + g_error_free (error); + return; + } + + os = grl_tracker_op_new (GRL_TYPE_FILTER_ALL, mfus); + + tracker_sparql_statement_bind_string (statement, "uri", mfus->uri); + tracker_sparql_statement_execute_async (statement, + os->cancel, + (GAsyncReadyCallback) tracker_media_from_uri_cb, + os); + + g_clear_object (&statement); +} diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-api.h grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-api.h --- grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-api.h 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-api.h 2020-09-03 05:36:44.380468000 +0000 @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2011-2012 Igalia S.L. + * Copyright (C) 2011 Intel Corporation. + * Copyright (C) 2020 Red Hat Inc. + * + * Contact: Carlos Garnacho + * + * Authors: Carlos Garnacho + * Lionel Landwerlin + * Juan A. Suarez Romero + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef _GRL_TRACKER_SOURCE_API_H_ +#define _GRL_TRACKER_SOURCE_API_H_ + +#include "grl-tracker-source.h" + +/**/ + +void grl_tracker_source_init_requests (void); + +const GList *grl_tracker_source_writable_keys (GrlSource *source); + +void grl_tracker_source_query (GrlSource *source, + GrlSourceQuerySpec *qs); + +void grl_tracker_source_resolve (GrlSource *source, + GrlSourceResolveSpec *rs); + +gboolean grl_tracker_source_may_resolve (GrlSource *source, + GrlMedia *media, + GrlKeyID key_id, + GList **missing_keys); + +void grl_tracker_source_store_metadata (GrlSource *source, + GrlSourceStoreMetadataSpec *sms); + +void grl_tracker_source_cancel (GrlSource *source, guint operation_id); + +void grl_tracker_source_search (GrlSource *source, + GrlSourceSearchSpec *ss); + +void grl_tracker_source_browse (GrlSource *source, + GrlSourceBrowseSpec *bs); + +gboolean grl_tracker_source_change_start (GrlSource *source, + GError **error); + +gboolean grl_tracker_source_change_stop (GrlSource *source, + GError **error); + +GrlCaps *grl_tracker_source_get_caps (GrlSource *source, + GrlSupportedOps operation); + +GrlSupportedOps grl_tracker_source_supported_operations (GrlSource *source); + +gboolean grl_tracker_source_test_media_from_uri (GrlSource *source, + const gchar *uri); + +void grl_tracker_source_get_media_from_uri (GrlSource *source, + GrlSourceMediaFromUriSpec *mfus); + +#endif /* _GRL_TRACKER_SOURCE_API_H_ */ diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker-source.c grilo-plugins-0.3.12/src/tracker3/grl-tracker-source.c --- grilo-plugins-0.3.11/src/tracker3/grl-tracker-source.c 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker-source.c 2020-09-03 05:36:44.381467800 +0000 @@ -0,0 +1,262 @@ +/* + * Copyright (C) 2011-2012 Igalia S.L. + * Copyright (C) 2011 Intel Corporation. + * Copyright (C) 2020 Red Hat Inc. + * + * Contact: Carlos Garnacho + * + * Authors: Carlos Garnacho + * Juan A. Suarez Romero + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "grl-tracker.h" +#include "grl-tracker-source.h" +#include "grl-tracker-source-priv.h" +#include "grl-tracker-source-api.h" +#include "grl-tracker-source-cache.h" +#include "grl-tracker-source-notif.h" +#include "grl-tracker-utils.h" + +/* --------- Logging -------- */ + +#define GRL_LOG_DOMAIN_DEFAULT tracker_source_log_domain +GRL_LOG_DOMAIN_STATIC(tracker_source_log_domain); + +/* ------- Definitions ------- */ + +#define MEDIA_TYPE "grilo-media-type" + +#define TRACKER_ITEM_CACHE_SIZE (10000) + +#define WRITEBACK_DBUS_NAME "org.freedesktop.Tracker3.Writeback" +#define WRITEBACK_DBUS_PATH "/org/freedesktop/Tracker3/Writeback" +#define WRITEBACK_DBUS_IFACE "org.freedesktop.Tracker3.Writeback" + +/* --- Other --- */ + +enum { + PROP_0, + PROP_TRACKER_CONNECTION, +}; + +static void grl_tracker_source_set_property (GObject *object, + guint propid, + const GValue *value, + GParamSpec *pspec); + +static void grl_tracker_source_finalize (GObject *object); + +/* ===================== Globals ================= */ + +/* shared data across */ +GrlTrackerCache *grl_tracker_item_cache; + +/* ================== TrackerSource GObject ================ */ + +G_DEFINE_TYPE_WITH_PRIVATE (GrlTrackerSource, grl_tracker_source, GRL_TYPE_SOURCE); + +static GrlTrackerSource * +grl_tracker_source_new (TrackerSparqlConnection *connection) +{ + GRL_DEBUG ("%s", __FUNCTION__); + + return g_object_new (GRL_TRACKER_SOURCE_TYPE, + "source-id", GRL_TRACKER_SOURCE_ID, + "source-name", GRL_TRACKER_SOURCE_NAME, + "source-desc", GRL_TRACKER_SOURCE_DESC, + "tracker-connection", connection, + NULL); +} + +static void +grl_tracker_source_class_init (GrlTrackerSourceClass * klass) +{ + GObjectClass *g_class = G_OBJECT_CLASS (klass); + GrlSourceClass *source_class = GRL_SOURCE_CLASS (klass); + + g_class->finalize = grl_tracker_source_finalize; + g_class->set_property = grl_tracker_source_set_property; + + source_class->cancel = grl_tracker_source_cancel; + source_class->supported_keys = grl_tracker_supported_keys; + source_class->writable_keys = grl_tracker_source_writable_keys; + source_class->store_metadata = grl_tracker_source_store_metadata; + source_class->query = grl_tracker_source_query; + source_class->resolve = grl_tracker_source_resolve; + source_class->may_resolve = grl_tracker_source_may_resolve; + source_class->search = grl_tracker_source_search; + source_class->browse = grl_tracker_source_browse; + source_class->notify_change_start = grl_tracker_source_change_start; + source_class->notify_change_stop = grl_tracker_source_change_stop; + source_class->supported_operations = grl_tracker_source_supported_operations; + source_class->get_caps = grl_tracker_source_get_caps; + source_class->test_media_from_uri = grl_tracker_source_test_media_from_uri; + source_class->media_from_uri = grl_tracker_source_get_media_from_uri; + + g_object_class_install_property (g_class, + PROP_TRACKER_CONNECTION, + g_param_spec_object ("tracker-connection", + "tracker connection", + "A Tracker connection", + TRACKER_SPARQL_TYPE_CONNECTION, + G_PARAM_WRITABLE + | G_PARAM_CONSTRUCT_ONLY + | G_PARAM_STATIC_NAME)); +} + +static void +grl_tracker_source_init (GrlTrackerSource *source) +{ + GrlTrackerSourcePrivate *priv = grl_tracker_source_get_instance_private (source); + GDBusConnection *connection; + + source->priv = priv; + + priv->operations = g_hash_table_new (g_direct_hash, g_direct_equal); + + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + if (connection) { + priv->writeback = + g_dbus_proxy_new_sync (connection, + G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START_AT_CONSTRUCTION, + NULL, + WRITEBACK_DBUS_NAME, + WRITEBACK_DBUS_PATH, + WRITEBACK_DBUS_IFACE, + NULL, NULL); + } +} + +static void +grl_tracker_source_finalize (GObject *object) +{ + GrlTrackerSource *self; + + self = GRL_TRACKER_SOURCE (object); + + g_clear_object (&self->priv->notifier); + g_clear_object (&self->priv->tracker_connection); + g_clear_object (&self->priv->writeback); + + G_OBJECT_CLASS (grl_tracker_source_parent_class)->finalize (object); +} + +static void +grl_tracker_source_set_property (GObject *object, + guint propid, + const GValue *value, + GParamSpec *pspec) + +{ + GrlTrackerSourcePrivate *priv = GRL_TRACKER_SOURCE (object)->priv; + + switch (propid) { + case PROP_TRACKER_CONNECTION: + g_clear_object (&priv->tracker_connection); + priv->tracker_connection = g_object_ref (g_value_get_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec); + } +} + +TrackerSparqlConnection * +grl_tracker_source_get_tracker_connection (GrlTrackerSource *source) +{ + GrlTrackerSourcePrivate *priv; + + g_return_val_if_fail (GRL_IS_TRACKER_SOURCE (source), NULL); + + priv = source->priv; + + return priv->tracker_connection; +} + +/* =================== TrackerSource Plugin =============== */ + +void +grl_tracker_add_source (GrlTrackerSource *source) +{ + GrlTrackerSourcePrivate *priv = source->priv; + + GRL_DEBUG ("====================>add source '%s'", + grl_source_get_name (GRL_SOURCE (source))); + + priv->state = GRL_TRACKER_SOURCE_STATE_RUNNING; + grl_registry_register_source (grl_registry_get_default (), + grl_tracker_plugin, + GRL_SOURCE (g_object_ref (source)), + NULL); +} + +void +grl_tracker_del_source (GrlTrackerSource *source) +{ + GrlTrackerSourcePrivate *priv = source->priv; + + GRL_DEBUG ("==================>del source '%s'", + grl_source_get_name (GRL_SOURCE (source))); + + grl_tracker_source_cache_del_source (grl_tracker_item_cache, source); + priv->state = GRL_TRACKER_SOURCE_STATE_DELETED; + grl_registry_unregister_source (grl_registry_get_default (), + GRL_SOURCE (source), + NULL); +} + +gboolean +grl_tracker_source_can_notify (GrlTrackerSource *source) +{ + GrlTrackerSourcePrivate *priv = source->priv; + + if (priv->state == GRL_TRACKER_SOURCE_STATE_RUNNING) + return priv->notifier != NULL; + + return FALSE; +} + +void +grl_tracker_source_sources_init (void) +{ + + GRL_LOG_DOMAIN_INIT (tracker_source_log_domain, "tracker-source"); + + GRL_DEBUG ("%s", __FUNCTION__); + + grl_tracker_item_cache = + grl_tracker_source_cache_new (TRACKER_ITEM_CACHE_SIZE); + + if (grl_tracker_connection != NULL) { + GrlTrackerSource *source; + + /* One source to rule them all. */ + source = grl_tracker_source_new (grl_tracker_connection); + grl_tracker_add_source (source); + g_object_unref (source); + } +} diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-cache.c grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-cache.c --- grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-cache.c 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-cache.c 2020-09-03 05:36:44.381467800 +0000 @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2011 Intel Corporation. + * Copyright (C) 2011 Igalia S.L. + * Copyright (C) 2020 Red Hat Inc. + * + * Contact: Carlos Garnacho + * + * Authors: Carlos Garnacho + * Lionel Landwerlin + * Juan A. Suarez Romero + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include + +#include "grl-tracker-source-cache.h" + +typedef struct { + GrlTrackerSource *source; + + GHashTable *id_table; +} GrlTrackerCacheSource; + +struct _GrlTrackerCache { + gsize size_limit; + gsize size_current; + + GHashTable *id_table; + GHashTable *source_table; + GList *id_list; +}; + +static GrlTrackerCacheSource * +grl_tracker_cache_source_new (GrlTrackerSource *source) +{ + GrlTrackerCacheSource *csource = g_slice_new0 (GrlTrackerCacheSource); + + csource->source = source; + csource->id_table = g_hash_table_new (g_direct_hash, g_direct_equal); + + return csource; +} + +static void +grl_tracker_cache_source_free (GrlTrackerCacheSource *csource) +{ + g_hash_table_destroy (csource->id_table); + + g_slice_free (GrlTrackerCacheSource, csource); +} + +/**/ + +GrlTrackerCache * +grl_tracker_source_cache_new (gsize size) +{ + GrlTrackerCache *cache; + + g_return_val_if_fail (size > 0, NULL); + + cache = g_slice_new0 (GrlTrackerCache); + + if (!cache) + return NULL; + + cache->size_limit = size; + cache->id_table = g_hash_table_new (g_direct_hash, g_direct_equal); + cache->source_table = g_hash_table_new (g_direct_hash, g_direct_equal); + + return cache; +} + +void +grl_tracker_source_cache_free (GrlTrackerCache *cache) +{ + GHashTableIter iter; + gpointer key, value; + + g_return_if_fail (cache != NULL); + + g_hash_table_iter_init (&iter, cache->source_table); + while (g_hash_table_iter_next (&iter, &key, &value)) { + grl_tracker_source_cache_del_source (cache, key); + } + + if (cache->id_list) { + g_list_free (cache->id_list); + } + g_hash_table_destroy (cache->id_table); + g_hash_table_destroy (cache->source_table); + + g_slice_free (GrlTrackerCache, cache); +} + +void +grl_tracker_source_cache_add_item (GrlTrackerCache *cache, + guint id, + GrlTrackerSource *source) +{ + GList *lid; + GrlTrackerCacheSource *csource; + + g_return_if_fail (cache != NULL); + + if (g_hash_table_lookup (cache->id_table, GSIZE_TO_POINTER (id)) != NULL) + return; /* TODO: is it worth to have an LRU ? */ + + csource = g_hash_table_lookup (cache->source_table, source); + + if (!csource) { + csource = grl_tracker_cache_source_new (source); + g_hash_table_insert (cache->source_table, source, csource); + } + + if (cache->size_current >= cache->size_limit) { + lid = g_list_last (cache->id_list); /* TODO: optimize that ! */ + g_hash_table_remove (cache->id_table, lid->data); + cache->id_list = g_list_remove_link (cache->id_list, lid); + + lid->data = GSIZE_TO_POINTER (id); + lid->next = cache->id_list; + cache->id_list->prev = lid; + cache->id_list = lid; + } else { + cache->id_list = g_list_prepend (cache->id_list, GSIZE_TO_POINTER (id)); + cache->size_current++; + } + + g_hash_table_insert (cache->id_table, GSIZE_TO_POINTER (id), csource); + g_hash_table_insert (csource->id_table, GSIZE_TO_POINTER (id), + cache->id_list); +} + +void +grl_tracker_source_cache_del_source (GrlTrackerCache *cache, + GrlTrackerSource *source) +{ + GrlTrackerCacheSource *csource; + GHashTableIter iter; + gpointer key, value; + + g_return_if_fail (cache != NULL); + g_return_if_fail (source != NULL); + + csource = g_hash_table_lookup (cache->source_table, source); + + if (!csource) + return; + + g_hash_table_iter_init (&iter, csource->id_table); + + while (g_hash_table_iter_next (&iter, &key, &value)) { + g_hash_table_remove (cache->id_table, key); + cache->id_list = g_list_delete_link (cache->id_list, value); + } + + g_hash_table_remove (cache->source_table, source); + grl_tracker_cache_source_free (csource); +} + +GrlTrackerSource * +grl_tracker_source_cache_get_source (GrlTrackerCache *cache, guint id) +{ + GrlTrackerCacheSource *csource; + + g_return_val_if_fail (cache != NULL, NULL); + + csource = (GrlTrackerCacheSource *) g_hash_table_lookup (cache->id_table, + GSIZE_TO_POINTER (id)); + + if (csource) { + return csource->source; + } + + return NULL; +} diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-cache.h grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-cache.h --- grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-cache.h 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-cache.h 2020-09-03 05:36:44.381467800 +0000 @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2011 Intel Corporation. + * Copyright (C) 2011-2012 Igalia S.L. + * Copyright (C) 2020 Red Hat Inc. + * + * Contact: Carlos Garnacho + * + * Authors: Carlos Garnacho + * Lionel Landwerlin + * Juan A. Suarez Romero + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef _GRL_TRACKER_SOURCE_CACHE_H_ +#define _GRL_TRACKER_SOURCE_CACHE_H_ + +#include "grl-tracker-source.h" + +typedef struct _GrlTrackerCache GrlTrackerCache; + +GrlTrackerCache *grl_tracker_source_cache_new (gsize size); + +void grl_tracker_source_cache_free (GrlTrackerCache *cache); + +void grl_tracker_source_cache_add_item (GrlTrackerCache *cache, + guint id, + GrlTrackerSource *source); +void grl_tracker_source_cache_del_source (GrlTrackerCache *cache, + GrlTrackerSource *source); + +GrlTrackerSource *grl_tracker_source_cache_get_source (GrlTrackerCache *cache, + guint id); + +#endif /* _GRL_TRACKER_SOURCE_CACHE_H_ */ diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker-source.h grilo-plugins-0.3.12/src/tracker3/grl-tracker-source.h --- grilo-plugins-0.3.11/src/tracker3/grl-tracker-source.h 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker-source.h 2020-09-03 05:36:44.381467800 +0000 @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2011-2012 Igalia S.L. + * Copyright (C) 2020 Red Hat Inc. + * + * Contact: Carlos Garnacho + * + * Authors: Carlos Garnacho + * Juan A. Suarez Romero + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef _GRL_TRACKER_SOURCE_H_ +#define _GRL_TRACKER_SOURCE_H_ + +#include +#include + +#define GRL_TRACKER_SOURCE_TYPE \ + (grl_tracker_source_get_type ()) + +#define GRL_TRACKER_SOURCE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + GRL_TRACKER_SOURCE_TYPE, \ + GrlTrackerSource)) + +#define GRL_IS_TRACKER_SOURCE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + GRL_TRACKER_SOURCE_TYPE)) + +#define GRL_TRACKER_SOURCE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass), \ + GRL_TRACKER_SOURCE_TYPE, \ + GrlTrackerSourceClass)) + +#define GRL_IS_TRACKER_SOURCE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass), \ + GRL_TRACKER_SOURCE_TYPE)) + +#define GRL_TRACKER_SOURCE_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), \ + GRL_TRACKER_SOURCE_TYPE, \ + GrlTrackerSourceClass)) + +typedef struct _GrlTrackerSource GrlTrackerSource; +typedef struct _GrlTrackerSourcePrivate GrlTrackerSourcePrivate; + +struct _GrlTrackerSource { + + GrlSource parent; + + /*< private >*/ + GrlTrackerSourcePrivate *priv; + +}; + +typedef struct _GrlTrackerSourceClass GrlTrackerSourceClass; + +struct _GrlTrackerSourceClass { + + GrlSourceClass parent_class; + +}; + +GType grl_tracker_source_get_type (void); + +gboolean grl_tracker_source_can_notify (GrlTrackerSource *source); + +const gchar *grl_tracker_source_get_tracker_source (GrlTrackerSource *source); + +TrackerSparqlConnection *grl_tracker_source_get_tracker_connection (GrlTrackerSource *source); + +/**/ + +void grl_tracker_source_sources_init (void); + +void grl_tracker_add_source (GrlTrackerSource *source); + +void grl_tracker_del_source (GrlTrackerSource *source); + +GrlTrackerSource *grl_tracker_source_find (const gchar *id); + +GrlTrackerSource *grl_tracker_source_find_source (const gchar *id); + +#endif /* _GRL_TRACKER_SOURCE_H_ */ diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-notif.c grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-notif.c --- grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-notif.c 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-notif.c 2020-09-03 05:36:44.381467800 +0000 @@ -0,0 +1,355 @@ +/* + * Copyright (C) 2011-2012 Igalia S.L. + * Copyright (C) 2011 Intel Corporation. + * Copyright (C) 2015 Collabora Ltd. + * Copyright (C) 2020 Red Hat Inc. + * + * Contact: Carlos Garnacho + * + * Authors: Carlos Garnacho + * Lionel Landwerlin + * Juan A. Suarez Romero + * Xavier Claessens + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include + +#include "grl-tracker.h" +#include "grl-tracker-source-notif.h" +#include "grl-tracker-source-priv.h" +#include "grl-tracker-utils.h" + +#define GRL_LOG_DOMAIN_DEFAULT tracker_notif_log_domain +GRL_LOG_DOMAIN_STATIC(tracker_notif_log_domain); + +struct _GrlTrackerSourceNotify { + GObject parent; + TrackerSparqlConnection *connection; + TrackerNotifier *notifier; + GrlSource *source; + guint events_signal_id; +}; + +typedef struct { + GrlTrackerSourceNotify *notify; + GPtrArray *events; + GPtrArray *medias; + GList *keys; + GrlOperationOptions *options; + guint cur_media; +} GrlTrackerChangeBatch; + +enum { + PROP_0, + PROP_CONNECTION, + PROP_SOURCE, + N_PROPS +}; + +static GParamSpec *props[N_PROPS] = { 0, }; + +G_DEFINE_TYPE (GrlTrackerSourceNotify, grl_tracker_source_notify, G_TYPE_OBJECT) + +static void resolve_medias (GrlTrackerChangeBatch *batch); + +static GrlMedia * +media_for_event (GrlTrackerSourceNotify *self, + TrackerNotifierEvent *event, + GrlMediaType type) +{ + GrlMedia *media; + + media = grl_tracker_build_grilo_media (type); + grl_media_set_id (media, tracker_notifier_event_get_urn (event)); + + return media; +} + +static GPtrArray * +create_medias (GrlTrackerSourceNotify *self, + GPtrArray *events, + GrlMediaType media_type) +{ + TrackerNotifierEvent *event; + GPtrArray *medias; + GrlMedia *media; + gint i; + + medias = g_ptr_array_new_with_free_func (g_object_unref); + + for (i = 0; i < events->len; i++) { + event = g_ptr_array_index (events, i); + media = media_for_event (self, event, media_type); + g_ptr_array_add (medias, media); + } + + return medias; +} + +static void +handle_changes (GrlTrackerSourceNotify *self, + GPtrArray *events, + GPtrArray *medias, + TrackerNotifierEventType tracker_type, + GrlSourceChangeType change_type) +{ + TrackerNotifierEvent *event; + GPtrArray *change_list; + GrlMedia *media; + gint i; + + change_list = g_ptr_array_new (); + + for (i = 0; i < events->len; i++) { + event = g_ptr_array_index (events, i); + media = g_ptr_array_index (medias, i); + + if (tracker_notifier_event_get_event_type (event) != tracker_type) + continue; + if (grl_media_get_url (media) == NULL) + continue; + + g_ptr_array_add (change_list, g_object_ref (media)); + } + + if (change_list->len == 0) { + g_ptr_array_unref (change_list); + return; + } + + grl_source_notify_change_list (self->source, change_list, + change_type, FALSE); +} + +static void +free_batch (GrlTrackerChangeBatch *batch) +{ + g_ptr_array_unref (batch->events); + g_ptr_array_unref (batch->medias); + g_list_free (batch->keys); + g_object_unref (batch->options); + g_free (batch); +} + +static void +resolve_event_cb (GrlSource *source, + guint operation_id, + GrlMedia *media, + gpointer user_data, + const GError *error) +{ + GrlTrackerChangeBatch *batch = user_data; + + batch->cur_media++; + resolve_medias (batch); +} + +static void +resolve_medias (GrlTrackerChangeBatch *batch) +{ + GrlTrackerSourceNotify *self = batch->notify; + GrlMedia *media = NULL; + + if (batch->cur_media < batch->medias->len) + media = g_ptr_array_index (batch->medias, batch->cur_media); + + if (media) { + grl_source_resolve (self->source, + media, + batch->keys, + batch->options, + resolve_event_cb, + batch); + } else { + handle_changes (self, + batch->events, batch->medias, + TRACKER_NOTIFIER_EVENT_CREATE, + GRL_CONTENT_ADDED); + handle_changes (self, + batch->events, batch->medias, + TRACKER_NOTIFIER_EVENT_UPDATE, + GRL_CONTENT_CHANGED); + handle_changes (self, + batch->events, batch->medias, + TRACKER_NOTIFIER_EVENT_DELETE, + GRL_CONTENT_REMOVED); + free_batch (batch); + } +} + +static GrlMediaType +media_type_from_graph (const gchar *graph) +{ + if (g_str_has_suffix (graph, "#Audio")) + return GRL_MEDIA_TYPE_AUDIO; + else if (g_str_has_suffix (graph, "#Video")) + return GRL_MEDIA_TYPE_VIDEO; + else if (g_str_has_suffix (graph, "#Pictures")) + return GRL_MEDIA_TYPE_IMAGE; + + return GRL_MEDIA_TYPE_UNKNOWN; +} + +static void +notifier_event_cb (GrlTrackerSourceNotify *self, + const gchar *service, + const gchar *graph, + GPtrArray *events, + gpointer user_data) +{ + GrlMediaType type = media_type_from_graph (graph); + GrlTrackerChangeBatch *batch; + + if (type == GRL_MEDIA_TYPE_UNKNOWN) + return; + + batch = g_new0 (GrlTrackerChangeBatch, 1); + batch->notify = g_object_ref (self); + batch->events = g_ptr_array_ref (events); + batch->medias = create_medias (self, events, type); + batch->keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL, NULL); + batch->options = grl_operation_options_new (NULL); + + resolve_medias (batch); +} + +static void +grl_tracker_source_notify_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GrlTrackerSourceNotify *self = GRL_TRACKER_SOURCE_NOTIFY (object); + + switch (prop_id) { + case PROP_CONNECTION: + g_value_set_object (value, self->connection); + break; + case PROP_SOURCE: + g_value_set_object (value, self->source); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +grl_tracker_source_notify_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GrlTrackerSourceNotify *self = GRL_TRACKER_SOURCE_NOTIFY (object); + + switch (prop_id) { + case PROP_CONNECTION: + self->connection = g_value_get_object (value); + break; + case PROP_SOURCE: + self->source = g_value_get_object (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +grl_tracker_source_notify_constructed (GObject *object) +{ + GrlTrackerSourceNotify *self = GRL_TRACKER_SOURCE_NOTIFY (object); + GDBusConnection *bus_connection; + + self->notifier = + tracker_sparql_connection_create_notifier (self->connection); + + bus_connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); + tracker_notifier_signal_subscribe (self->notifier, + bus_connection, + grl_tracker_miner_service ? + grl_tracker_miner_service : + "org.freedesktop.Tracker3.Miner.Files", + NULL, + NULL); + g_object_unref (bus_connection); + + self->events_signal_id = + g_signal_connect_swapped (self->notifier, "events", + G_CALLBACK (notifier_event_cb), object); + + G_OBJECT_CLASS (grl_tracker_source_notify_parent_class)->constructed (object); +} + +static void +grl_tracker_source_notify_finalize (GObject *object) +{ + GrlTrackerSourceNotify *self = GRL_TRACKER_SOURCE_NOTIFY (object); + + if (self->events_signal_id) + g_signal_handler_disconnect (self->notifier, self->events_signal_id); + g_clear_object (&self->notifier); + G_OBJECT_CLASS (grl_tracker_source_notify_parent_class)->finalize (object); +} + +static void +grl_tracker_source_notify_class_init (GrlTrackerSourceNotifyClass *klass) +{ + GObjectClass *object_class = (GObjectClass *) klass; + + GRL_LOG_DOMAIN_INIT (tracker_notif_log_domain, "tracker-notif"); + object_class->set_property = grl_tracker_source_notify_set_property; + object_class->get_property = grl_tracker_source_notify_get_property; + object_class->finalize = grl_tracker_source_notify_finalize; + object_class->constructed = grl_tracker_source_notify_constructed; + + props[PROP_CONNECTION] = + g_param_spec_object ("connection", + "SPARQL Connection", + "SPARQL Connection", + TRACKER_TYPE_SPARQL_CONNECTION, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + props[PROP_SOURCE] = + g_param_spec_object ("source", + "Source", + "Source being notified", + GRL_TYPE_SOURCE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, N_PROPS, props); +} + +static void +grl_tracker_source_notify_init (GrlTrackerSourceNotify *self) +{ +} + +GrlTrackerSourceNotify * +grl_tracker_source_notify_new (GrlSource *source, + TrackerSparqlConnection *sparql_conn) +{ + return g_object_new (GRL_TRACKER_TYPE_SOURCE_NOTIFY, + "source", source, + "connection", sparql_conn, + NULL); +} diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-notif.h grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-notif.h --- grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-notif.h 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-notif.h 2020-09-03 05:36:44.381467800 +0000 @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2011 Intel Corporation. + * Copyright (C) 2011-2012 Igalia S.L. + * Copyright (C) 2020 Red Hat Inc. + * + * Contact: Carlos Garnacho + * + * Authors: Carlos Garnacho + * Lionel Landwerlin + * Juan A. Suarez Romero + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef _GRL_TRACKER_SOURCE_NOTIF_H_ +#define _GRL_TRACKER_SOURCE_NOTIF_H_ + +#include "grl-tracker-source.h" + +/* ------- Definitions ------- */ + +#define GRL_TRACKER_TYPE_SOURCE_NOTIFY grl_tracker_source_notify_get_type () +G_DECLARE_FINAL_TYPE (GrlTrackerSourceNotify, grl_tracker_source_notify, GRL_TRACKER, SOURCE_NOTIFY, GObject) + +/**/ + +GrlTrackerSourceNotify * grl_tracker_source_notify_new (GrlSource *source, + TrackerSparqlConnection *sparql_conn); + +#endif /* _GRL_TRACKER_SOURCE_NOTIF_H_ */ diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-priv.h grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-priv.h --- grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-priv.h 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-priv.h 2020-09-03 05:36:44.381467800 +0000 @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2011-2012 Igalia S.L. + * Copyright (C) 2011 Intel Corporation. + * Copyright (C) 2020 Red Hat Inc. + * + * Contact: Carlos Garnacho + * + * Authors: Carlos Garnacho + * Lionel Landwerlin + * Juan A. Suarez Romero + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef _GRL_TRACKER_SOURCE_PRIV_H_ +#define _GRL_TRACKER_SOURCE_PRIV_H_ + +#include "grl-tracker-source.h" +#include "grl-tracker-source-cache.h" +#include "grl-tracker-source-notif.h" + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +/* ---- Source information ---- */ + +#define GRL_TRACKER_SOURCE_ID "grl-tracker3-source" +#define GRL_TRACKER_SOURCE_NAME "Tracker3" +#define GRL_TRACKER_SOURCE_DESC _("A plugin for searching multimedia content using Tracker3") + +#define GRL_TRACKER_AUTHOR "Igalia S.L." +#define GRL_TRACKER_LICENSE "LGPL" +#define GRL_TRACKER_SITE "http://www.igalia.com" + +/**/ + +#define GRL_TRACKER_SOURCE_GET_PRIVATE(object) \ + (G_TYPE_INSTANCE_GET_PRIVATE((object), \ + GRL_TRACKER_SOURCE_TYPE, \ + GrlTrackerSourcePriv)) + +typedef enum { + GRL_TRACKER_SOURCE_STATE_INSERTING, + GRL_TRACKER_SOURCE_STATE_RUNNING, + GRL_TRACKER_SOURCE_STATE_DELETING, + GRL_TRACKER_SOURCE_STATE_DELETED, +} GrlTrackerSourceState; + +struct _GrlTrackerSourcePrivate { + TrackerSparqlConnection *tracker_connection; + GDBusProxy *writeback; + + GHashTable *operations; + GrlTrackerSourceNotify *notifier; + GList *cached_statements; + + gboolean notify_changes; + + GrlTrackerSourceState state; +}; + +/**/ + +extern GrlPlugin *grl_tracker_plugin; + +/* shared data across */ +extern GrlTrackerCache *grl_tracker_item_cache; + +/* tracker plugin config */ +extern gchar *grl_tracker_store_path; +extern gchar *grl_tracker_miner_service; + +#endif /* _GRL_TRACKER_SOURCE_PRIV_H_ */ diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-statements.c grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-statements.c --- grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-statements.c 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-statements.c 2020-09-03 05:36:44.381467800 +0000 @@ -0,0 +1,505 @@ +/* + * Copyright (C) 2011-2012 Igalia S.L. + * Copyright (C) 2011 Intel Corporation. + * Copyright (C) 2020 Red Hat Inc. + * + * Contact: Carlos Garnacho + * + * Authors: Carlos Garnacho + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "grl-tracker.h" +#include "grl-tracker-source-priv.h" +#include "grl-tracker-source-statements.h" +#include "grl-tracker-utils.h" + +#define MAX_N_CACHED_STATEMENTS 10 +#define MINER_FS_BUS_NAME "org.freedesktop.Tracker3.Miner.Files" + +typedef struct _CachedStatement CachedStatement; + +struct _CachedStatement +{ + GrlTrackerQueryType type; + GrlOperationOptions *options; + GList *keys; + TrackerSparqlStatement *stmt; + gchar *extra_sparql; +}; + +static const gchar *query_bases[GRL_TRACKER_QUERY_N_QUERIES] = { + /* GRL_TRACKER_QUERY_MEDIA_FROM_URI */ + "?urn nie:isStoredAs ~uri ", + /* GRL_TRACKER_QUERY_RESOLVE */ + "FILTER (STR(?urn) = ~resource) ", + /* GRL_TRACKER_QUERY_RESOLVE_URI */ + "FILTER (nie:isStoredAs(?urn) = ~uri) ", + /* GRL_TRACKER_QUERY_ALL */ + "", + /* GRL_TRACKER_QUERY_FTS_SEARCH */ + "?urn fts:match ~match", +}; + +static void +append_query_variables (GString *str, GList *keys, GrlTypeFilter filter) +{ + GList *l; + + for (l = keys; l; l = l->next) { + const gchar *var_name; + + if (!grl_tracker_key_get_sparql_statement (GRLPOINTER_TO_KEYID (l->data), filter)) + continue; + var_name = grl_tracker_key_get_variable_name (GRLPOINTER_TO_KEYID (l->data)); + if (!var_name) + continue; + g_string_append_printf (str, "?%s ", var_name); + } +} + +static void +append_subselect_bindings (GString *str, GList *keys, GrlTypeFilter filter) +{ + GList *l; + + for (l = keys; l; l = l->next) { + const gchar *property_statement, *name; + + property_statement = grl_tracker_key_get_sparql_statement (GRLPOINTER_TO_KEYID (l->data), filter); + if (!property_statement) + continue; + + name = grl_tracker_key_get_variable_name (GRLPOINTER_TO_KEYID (l->data)); + g_string_append_printf (str, "(%s AS ?%s) ", property_statement, name); + } +} + +static void +append_filters (GString *str, GrlOperationOptions *options) +{ + GList *filters, *ranges, *l; + const gchar *name; + + if (!options) + return; + + filters = grl_operation_options_get_key_filter_list (options); + ranges = grl_operation_options_get_key_range_filter_list (options); + + if (!filters && !ranges) + return; + + g_string_append (str, "FILTER (true "); + + for (l = filters; l; l = l->next) { + name = grl_tracker_key_get_variable_name (GRLPOINTER_TO_KEYID (l->data)); + g_string_append_printf (str, "&& ?%s = ~%s", name, name); + } + + for (l = ranges; l; l = l->next) { + GValue *min, *max; + + name = grl_tracker_key_get_variable_name (GRLPOINTER_TO_KEYID (l->data)); + grl_operation_options_get_key_range_filter (options, + GRLPOINTER_TO_KEYID (l->data), + &min, &max); + if (min) + g_string_append_printf (str, "&& ?%s >= ~min_%s ", name, name); + if (max) + g_string_append_printf (str, "&& ?%s <= ~max_%s ", name, name); + } + + g_string_append (str, ")"); + g_list_free (filters); + g_list_free (ranges); +} + +static int +key_compare (gconstpointer a, + gconstpointer b) +{ + GrlKeyID key_a = GRLPOINTER_TO_KEYID (a); + GrlKeyID key_b = GRLPOINTER_TO_KEYID (b); + + return key_a - key_b; +} + +static gboolean +key_equal (gconstpointer a, + gconstpointer b) +{ + GrlKeyID key_a = GRLPOINTER_TO_KEYID (a); + GrlKeyID key_b = GRLPOINTER_TO_KEYID (b); + + return key_a == key_b; +} + +static GList * +merge_list (GList *target, GList *list) +{ + GList *result = target; + GList *l; + + for (l = list; l; l = l->next) { + if (!g_list_find (result, l->data)) + result = g_list_insert_sorted (result, l->data, key_compare); + } + + return result; +} + +static GList * +get_all_keys (GList *keys, GrlOperationOptions *options) +{ + GList *copy, *filters = NULL, *ranges = NULL; + + copy = g_list_copy (keys); + + /* We sort over last modification date, ensure this property is there */ + if (!g_list_find (copy, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_MODIFICATION_DATE))) { + copy = g_list_insert_sorted (copy, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_MODIFICATION_DATE), + key_compare); + } + + if (!options) + return copy; + + filters = grl_operation_options_get_key_filter_list (options); + ranges = grl_operation_options_get_key_range_filter_list (options); + + copy = merge_list (copy, filters); + g_list_free (filters); + + copy = merge_list (copy, ranges); + g_list_free (ranges); + + return copy; +} + +static gchar * +create_query_string (GrlTrackerQueryType type, + GrlOperationOptions *options, + GList *keys, + const gchar *extra_sparql) +{ + GrlTypeFilter filter; + GString *str; + GList *merged_list; + + if (options) + filter = grl_operation_options_get_type_filter (options); + else + filter = GRL_TYPE_FILTER_ALL; + + str = g_string_new ("SELECT ?mediaType ?urn "); + append_query_variables (str, keys, filter); + g_string_append (str, "WHERE { "); + + merged_list = get_all_keys (keys, options); + + /* Remote miner-fs bits */ + g_string_append_printf (str, "SERVICE { ", + grl_tracker_miner_service ? + grl_tracker_miner_service : + MINER_FS_BUS_NAME); + + /* Make a subquery so we can apply limit and offset */ + g_string_append (str, "SELECT ?mediaType ?urn "); + append_query_variables (str, keys, filter); + g_string_append (str, "{ "); + + if (filter & GRL_TYPE_FILTER_AUDIO) { + g_string_append_printf (str, "{ GRAPH tracker:Audio { SELECT (%d AS ?mediaType) ?urn ", + GRL_MEDIA_TYPE_AUDIO); + append_subselect_bindings (str, merged_list, GRL_TYPE_FILTER_AUDIO); + g_string_append_printf (str, "{ ?urn a nfo:Audio . %s } } } ", + query_bases[type]); + + if (filter & (GRL_TYPE_FILTER_VIDEO | GRL_TYPE_FILTER_IMAGE)) + g_string_append (str, "UNION "); + } + + if (filter & GRL_TYPE_FILTER_VIDEO) { + g_string_append_printf (str, "{ GRAPH tracker:Video { SELECT (%d AS ?mediaType) ?urn ", + GRL_MEDIA_TYPE_VIDEO); + append_subselect_bindings (str, merged_list, GRL_TYPE_FILTER_VIDEO); + g_string_append_printf (str, "{ ?urn a nfo:Video . %s } } } ", + query_bases[type]); + + if (filter & GRL_TYPE_FILTER_IMAGE) + g_string_append (str, "UNION "); + } + + if (filter & GRL_TYPE_FILTER_IMAGE) { + g_string_append_printf (str, "{ GRAPH tracker:Pictures { SELECT (%d AS ?mediaType) ?urn ", + GRL_MEDIA_TYPE_IMAGE); + append_subselect_bindings (str, merged_list, GRL_TYPE_FILTER_IMAGE); + g_string_append_printf (str, "{ ?urn a nfo:Image . %s } } } ", + query_bases[type]); + } + + append_filters (str, options); + + g_string_append_printf (str, + "} LIMIT ~limit OFFSET ~offset" + "} %s } " + "ORDER BY ?lastModified ", + extra_sparql ? extra_sparql : ""); + + g_list_free (merged_list); + + return g_string_free (str, FALSE); +} + +static gboolean +compare_lists (GList *a, GList *b, GEqualFunc equal) +{ + GList *l1 = a, *l2 = b; + + while (l1 && l2) + { + if (!equal (l1->data, l2->data)) + return FALSE; + + l1 = l1->next; + l2 = l2->next; + } + + if ((l1 == NULL) != (l2 == NULL)) + return FALSE; + + return TRUE; +} + +static gboolean +cached_statement_matches (CachedStatement *stmt, + GrlTrackerQueryType type, + GrlOperationOptions *options, + GList *keys, + const gchar *extra_sparql) +{ + if (stmt->type != type) + return FALSE; + if (g_strcmp0 (stmt->extra_sparql, extra_sparql) != 0) + return FALSE; + if (!compare_lists (stmt->keys, keys, key_equal)) + return FALSE; + if ((stmt->options == NULL) != (options == NULL)) + return FALSE; + + if (stmt->options && options) { + GList *list_a, *list_b; + gboolean equal; + + if (grl_operation_options_get_type_filter (stmt->options) != + grl_operation_options_get_type_filter (options)) + return FALSE; + + list_a = g_list_sort (grl_operation_options_get_key_filter_list (stmt->options), key_compare); + list_b = g_list_sort (grl_operation_options_get_key_filter_list (options), key_compare); + equal = compare_lists (list_a, list_b, key_equal); + g_list_free (list_a); + g_list_free (list_b); + + if (!equal) + return FALSE; + + list_a = g_list_sort (grl_operation_options_get_key_range_filter_list (stmt->options), key_compare); + list_b = g_list_sort (grl_operation_options_get_key_range_filter_list (options), key_compare); + equal = compare_lists (list_a, list_b, key_equal); + g_list_free (list_a); + g_list_free (list_b); + + if (!equal) + return FALSE; + } + + return TRUE; +} + +GList * +find_cached_statement_link (GrlTrackerSource *source, + GrlTrackerQueryType type, + GrlOperationOptions *options, + GList *keys, + const gchar *extra_sparql) +{ + GList *l; + + for (l = source->priv->cached_statements; l; l = l->next) { + if (cached_statement_matches (l->data, type, options, keys, extra_sparql)) + return l; + } + + return NULL; +} + +static void +cached_statement_free (CachedStatement *cached) +{ + g_clear_object (&cached->stmt); + g_clear_object (&cached->options); + g_list_free (cached->keys); + g_free (cached->extra_sparql); + g_free (cached); +} + +static void +bind_gvalue (TrackerSparqlStatement *stmt, const gchar *name, GValue *value) +{ + if (G_VALUE_HOLDS_STRING (value)) + tracker_sparql_statement_bind_string (stmt, name, g_value_get_string (value)); + else if (G_VALUE_HOLDS_INT (value)) + tracker_sparql_statement_bind_int (stmt, name, g_value_get_int (value)); + else if (G_VALUE_HOLDS_DOUBLE (value)) + tracker_sparql_statement_bind_double (stmt, name, g_value_get_double (value)); + else if (G_VALUE_HOLDS_FLOAT (value)) + tracker_sparql_statement_bind_double (stmt, name, g_value_get_float (value)); + else if (G_VALUE_HOLDS_BOOLEAN (value)) + tracker_sparql_statement_bind_boolean (stmt, name, g_value_get_boolean (value)); + else if (G_VALUE_HOLDS (value, G_TYPE_DATE_TIME)) { + GDateTime *time; + gchar *time_str; + + time = g_value_get_boxed (value); + time_str = g_date_time_format_iso8601 (time); + tracker_sparql_statement_bind_string (stmt, name, time_str); + g_free (time_str); + } +} + +static void +bind_options (TrackerSparqlStatement *stmt, + GrlOperationOptions *options) +{ + GList *filters, *ranges, *l; + const gchar *name; + + if (!options) + { + tracker_sparql_statement_bind_int (stmt, "limit", G_MAXUINT); + tracker_sparql_statement_bind_int (stmt, "offset", 0); + return; + } + + tracker_sparql_statement_bind_int (stmt, "limit", + grl_operation_options_get_count (options)); + tracker_sparql_statement_bind_int (stmt, "offset", + grl_operation_options_get_skip (options)); + + filters = grl_operation_options_get_key_filter_list (options); + ranges = grl_operation_options_get_key_range_filter_list (options); + + for (l = filters; l; l = l->next) { + GValue *value; + + name = grl_tracker_key_get_variable_name (GRLPOINTER_TO_KEYID (l->data)); + value = grl_operation_options_get_key_filter (options, GRLPOINTER_TO_KEYID (l->data)); + bind_gvalue (stmt, name, value); + } + + for (l = ranges; l; l = l->next) { + GValue *min, *max; + gchar *prop; + + name = grl_tracker_key_get_variable_name (GRLPOINTER_TO_KEYID (l->data)); + grl_operation_options_get_key_range_filter (options, + GRLPOINTER_TO_KEYID (l->data), + &min, &max); + if (min) { + prop = g_strdup_printf ("min_%s", name); + bind_gvalue (stmt, prop, min); + g_free (prop); + } + + if (max) { + prop = g_strdup_printf ("max_%s", name); + bind_gvalue (stmt, prop, max); + g_free (prop); + } + } + + g_list_free (filters); + g_list_free (ranges); +} + +TrackerSparqlStatement * +grl_tracker_source_create_statement (GrlTrackerSource *source, + GrlTrackerQueryType type, + GrlOperationOptions *options, + GList *keys, + const gchar *extra_sparql, + GError **error) +{ + GrlTrackerSourcePrivate *priv = source->priv; + CachedStatement *cache; + GError *tracker_error = NULL; + GList *link, *keys_copy; + gchar *query_str; + + keys_copy = g_list_sort (g_list_copy (keys), key_compare); + link = find_cached_statement_link (source, type, options, keys_copy, extra_sparql); + + if (link) { + cache = link->data; + priv->cached_statements = g_list_remove_link (priv->cached_statements, link); + priv->cached_statements = g_list_concat (priv->cached_statements, link); + g_list_free (keys_copy); + } else { + cache = g_new0 (CachedStatement, 1); + cache->type = type; + cache->options = options ? grl_operation_options_copy (options) : NULL; + cache->keys = keys_copy; + cache->extra_sparql = g_strdup (extra_sparql); + + query_str = create_query_string (type, options, keys, extra_sparql); + cache->stmt = tracker_sparql_connection_query_statement (priv->tracker_connection, + query_str, + NULL, + &tracker_error); + g_free (query_str); + + if (!cache->stmt) { + g_propagate_error (error, tracker_error); + cached_statement_free (cache); + return NULL; + } + + priv->cached_statements = g_list_prepend (priv->cached_statements, cache); + + /* Limit the number of cached statements */ + if (g_list_length (priv->cached_statements) > MAX_N_CACHED_STATEMENTS) { + CachedStatement *deleted = priv->cached_statements->data; + + priv->cached_statements = g_list_remove (priv->cached_statements, deleted); + cached_statement_free (deleted); + } + } + + bind_options (cache->stmt, options); + + return g_object_ref (cache->stmt); +} diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-statements.h grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-statements.h --- grilo-plugins-0.3.11/src/tracker3/grl-tracker-source-statements.h 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker-source-statements.h 2020-09-03 05:36:44.381467800 +0000 @@ -0,0 +1,50 @@ +/* + * Copyright (C) 202011-2012 Igalia S.L. + * Copyright (C) 2011 Intel Corporation. + * Copyright (C) 2020 Red Hat Inc + * + * Contact: Carlos Garnacho + * + * Authors: Carlos Garnacho + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef _GRL_TRACKER_SOURCE_STATEMENTS_H_ +#define _GRL_TRACKER_SOURCE_STATEMENTS_H_ + +#include "grl-tracker-source.h" + +/**/ + +typedef enum { + GRL_TRACKER_QUERY_MEDIA_FROM_URI, /* Arguments: ~uri */ + GRL_TRACKER_QUERY_RESOLVE, /* Arguments: ~resource */ + GRL_TRACKER_QUERY_RESOLVE_URI, /* Arguments: ~uri */ + GRL_TRACKER_QUERY_ALL, /* No arguments */ + GRL_TRACKER_QUERY_FTS_SEARCH, /* Arguments: ~match */ + GRL_TRACKER_QUERY_N_QUERIES, +} GrlTrackerQueryType; + +TrackerSparqlStatement *grl_tracker_source_create_statement (GrlTrackerSource *source, + GrlTrackerQueryType type, + GrlOperationOptions *options, + GList *keys, + const gchar *extra_sparql, + GError **error); + +#endif /* _GRL_TRACKER_SOURCE_STATEMENTS_H_ */ diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker-utils.c grilo-plugins-0.3.12/src/tracker3/grl-tracker-utils.c --- grilo-plugins-0.3.11/src/tracker3/grl-tracker-utils.c 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker-utils.c 2020-09-03 05:36:44.381467800 +0000 @@ -0,0 +1,701 @@ +/* + * Copyright (C) 2011 Igalia S.L. + * Copyright (C) 2011 Intel Corporation. + * Copyright (C) 2020 Red Hat Inc. + * + * Contact: Carlos Garnacho + * + * Authors: Carlos Garnacho + * Lionel Landwerlin + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "grl-tracker-utils.h" +#include + +/**/ + +static GHashTable *grl_to_sparql_mapping = NULL; +static GHashTable *sparql_to_grl_mapping = NULL; + +GrlKeyID grl_metadata_key_tracker_urn; +GrlKeyID grl_metadata_key_gibest_hash; + + +/**/ + +static void +set_orientation (TrackerSparqlCursor *cursor, + gint column, + GrlMedia *media, + GrlKeyID key) +{ + const gchar *str = tracker_sparql_cursor_get_string (cursor, column, NULL); + + if (g_str_has_suffix (str, "nfo#orientation-top")) + grl_data_set_int (GRL_DATA (media), key, 0); + else if (g_str_has_suffix (str, "nfo#orientation-right")) + grl_data_set_int (GRL_DATA (media), key, 90); + else if (g_str_has_suffix (str, "nfo#orientation-bottom")) + grl_data_set_int (GRL_DATA (media), key, 180); + else if (g_str_has_suffix (str, "nfo#orientation-left")) + grl_data_set_int (GRL_DATA (media), key, 270); +} + +static void +set_date (TrackerSparqlCursor *cursor, + gint column, + GrlMedia *media, + GrlKeyID key) +{ + const gchar *str = tracker_sparql_cursor_get_string (cursor, column, NULL); + if (key == GRL_METADATA_KEY_CREATION_DATE + || key == GRL_METADATA_KEY_LAST_PLAYED + || key == GRL_METADATA_KEY_MODIFICATION_DATE + || key == GRL_METADATA_KEY_PUBLICATION_DATE) { + GDateTime *date = grl_date_time_from_iso8601 (str); + if (date) { + grl_data_set_boxed (GRL_DATA (media), key, date); + g_date_time_unref (date); + } + } +} + +static void +set_favourite (TrackerSparqlCursor *cursor, + gint column, + GrlMedia *media, + GrlKeyID key) +{ + const gchar *str = tracker_sparql_cursor_get_string (cursor, column, NULL); + gboolean is_favourite = FALSE; + + if (str != NULL && g_str_has_suffix (str, "predefined-tag-favorite")) + is_favourite = TRUE; + + grl_data_set_boolean (GRL_DATA (media), key, is_favourite); +} + +static void +set_title (TrackerSparqlCursor *cursor, + gint column, + GrlMedia *media, + GrlKeyID key) +{ + const gchar *str = tracker_sparql_cursor_get_string (cursor, column, NULL); + grl_data_set_boolean (GRL_DATA (media), GRL_METADATA_KEY_TITLE_FROM_FILENAME, FALSE); + grl_media_set_title (media, str); +} + +static void +set_string_metadata_keys (TrackerSparqlCursor *cursor, + gint column, + GrlMedia *media, + GrlKeyID key) +{ + const gchar *str = tracker_sparql_cursor_get_string (cursor, column, NULL); + grl_data_set_string (GRL_DATA (media), key, str); +} + +static void +set_int_metadata_keys (TrackerSparqlCursor *cursor, + gint column, + GrlMedia *media, + GrlKeyID key) +{ + const gint64 value = tracker_sparql_cursor_get_integer (cursor, column); + grl_data_set_int (GRL_DATA (media), key, value); +} + +static tracker_grl_sparql_t * +insert_key_mapping (GrlKeyID grl_key, + const gchar *sparql_var_name, + const gchar *sparql_key_attr_call, + GrlTypeFilter filter) +{ + tracker_grl_sparql_t *assoc; + GList *assoc_list; + gchar *canon_name; + + g_return_val_if_fail (grl_key != GRL_METADATA_KEY_INVALID, NULL); + + assoc = g_new0 (tracker_grl_sparql_t, 1); + assoc_list = g_hash_table_lookup (grl_to_sparql_mapping, + GRLKEYID_TO_POINTER (grl_key)); + canon_name = g_strdup (GRL_METADATA_KEY_GET_NAME (grl_key)); + + assoc->grl_key = grl_key; + assoc->sparql_var_name = sparql_var_name; + assoc->sparql_key_attr_call = sparql_key_attr_call; + assoc->filter = filter; + + assoc_list = g_list_append (assoc_list, assoc); + + g_hash_table_insert (grl_to_sparql_mapping, + GRLKEYID_TO_POINTER (grl_key), + assoc_list); + g_hash_table_insert (sparql_to_grl_mapping, + (gpointer) assoc->sparql_var_name, + assoc); + + g_free (canon_name); + + return assoc; +} + +static tracker_grl_sparql_t * +insert_key_mapping_with_setter (GrlKeyID grl_key, + const gchar *sparql_var_name, + const gchar *sparql_key_attr_call, + GrlTypeFilter filter, + tracker_grl_sparql_setter_cb_t setter) +{ + tracker_grl_sparql_t *assoc; + + assoc = insert_key_mapping (grl_key, + sparql_var_name, + sparql_key_attr_call, + filter); + + assoc->set_value = setter; + + return assoc; +} + +void +grl_tracker_setup_key_mappings (void) +{ + GrlRegistry *registry = grl_registry_get_default (); + GrlKeyID grl_metadata_key_chromaprint; + + grl_metadata_key_tracker_urn = + grl_registry_lookup_metadata_key (registry, "tracker-urn"); + + grl_metadata_key_gibest_hash = + grl_registry_lookup_metadata_key (registry, "gibest-hash"); + + grl_metadata_key_chromaprint = + grl_registry_lookup_metadata_key (registry, "chromaprint"); + + grl_to_sparql_mapping = g_hash_table_new (g_direct_hash, g_direct_equal); + sparql_to_grl_mapping = g_hash_table_new (g_str_hash, g_str_equal); + + insert_key_mapping (grl_metadata_key_tracker_urn, + "urn", + "?urn", + GRL_TYPE_FILTER_ALL); + + insert_key_mapping (GRL_METADATA_KEY_ALBUM, + "album", + "nie:title(nmm:musicAlbum(?urn))", + GRL_TYPE_FILTER_AUDIO); + + insert_key_mapping (GRL_METADATA_KEY_ALBUM_DISC_NUMBER, + "albumDiscNumber", + "nmm:setNumber(nmm:musicAlbumDisc(?urn))", + GRL_TYPE_FILTER_AUDIO); + + insert_key_mapping (GRL_METADATA_KEY_ARTIST, + "artist", + "nmm:artistName(nmm:artist(?urn))", + GRL_TYPE_FILTER_AUDIO); + + insert_key_mapping (GRL_METADATA_KEY_ALBUM_ARTIST, + "albumArtist", + "nmm:artistName(nmm:albumArtist(nmm:musicAlbum(?urn)))", + GRL_TYPE_FILTER_AUDIO); + + insert_key_mapping (GRL_METADATA_KEY_AUTHOR, + "author", + "nmm:artistName(nmm:artist(?urn))", + GRL_TYPE_FILTER_AUDIO); + + insert_key_mapping (GRL_METADATA_KEY_BITRATE, + "bitrate", + "nfo:averageBitrate(?urn)", + GRL_TYPE_FILTER_AUDIO | GRL_TYPE_FILTER_VIDEO); + + insert_key_mapping (GRL_METADATA_KEY_CHILDCOUNT, + "childCount", + "nfo:entryCounter(?urn)", + GRL_TYPE_FILTER_ALL); + + insert_key_mapping (GRL_METADATA_KEY_COMPOSER, + "composer", + "nmm:artistName(nmm:composer(?urn))", + GRL_TYPE_FILTER_AUDIO); + + insert_key_mapping (GRL_METADATA_KEY_SIZE, + "size", + "nie:byteSize(?urn)", + GRL_TYPE_FILTER_ALL); + + insert_key_mapping (grl_metadata_key_gibest_hash, + "gibestHash", + "(select nfo:hashValue(?h) { ?urn nie:isStoredAs/nfo:hasHash ?h . ?h nfo:hashAlgorithm \"gibest\" })", + GRL_TYPE_FILTER_VIDEO); + + insert_key_mapping_with_setter (GRL_METADATA_KEY_MODIFICATION_DATE, + "lastModified", + "COALESCE(nie:contentLastModified(?urn), (select ?lm { ?urn nie:isStoredAs/nfo:fileLastModified ?lm }))", + GRL_TYPE_FILTER_ALL, + set_date); + + insert_key_mapping (GRL_METADATA_KEY_DURATION, + "duration", + "nfo:duration(?urn)", + GRL_TYPE_FILTER_AUDIO | GRL_TYPE_FILTER_VIDEO); + + insert_key_mapping (GRL_METADATA_KEY_MB_TRACK_ID, + "mbTrack", + "(SELECT tracker:referenceIdentifier(?t) AS ?t_id { ?urn tracker:hasExternalReference ?t . ?t tracker:referenceSource \"https://musicbrainz.org/doc/Track\" })", + GRL_TYPE_FILTER_AUDIO); + + insert_key_mapping (GRL_METADATA_KEY_MB_ARTIST_ID, + "mbArtist", + "(SELECT tracker:referenceIdentifier(?a) AS ?a_id { ?urn nmm:artist ?artist . ?artist tracker:hasExternalReference ?a . ?a tracker:referenceSource \"https://musicbrainz.org/doc/Artist\" })", + GRL_TYPE_FILTER_AUDIO); + + insert_key_mapping (GRL_METADATA_KEY_MB_RECORDING_ID, + "mbRecording", + "(SELECT tracker:referenceIdentifier(?r) AS ?r_id { ?urn tracker:hasExternalReference ?r . ?r tracker:referenceSource \"https://musicbrainz.org/doc/Recording\" })", + GRL_TYPE_FILTER_AUDIO); + + insert_key_mapping (GRL_METADATA_KEY_MB_RELEASE_ID, + "mbRelease", + "(SELECT tracker:referenceIdentifier(?re) AS ?re_id { ?urn nmm:musicAlbum ?album . ?album tracker:hasExternalReference ?re . ?re tracker:referenceSource \"https://musicbrainz.org/doc/Release\" })", + GRL_TYPE_FILTER_AUDIO); + + insert_key_mapping (GRL_METADATA_KEY_MB_RELEASE_GROUP_ID, + "mbReleaseGroup", + "(SELECT tracker:referenceIdentifier(?rg) AS ?rg_id { ?urn nmm:musicAlbum ?album . ?album tracker:hasExternalReference ?rg . ?rg tracker:referenceSource \"https://musicbrainz.org/doc/Release_Group\" })", + GRL_TYPE_FILTER_AUDIO); + + if (grl_metadata_key_chromaprint != 0) { + insert_key_mapping_with_setter (grl_metadata_key_chromaprint, + "chromaprint", + "(select nfo:hashValue(?h) { ?urn nie:isStoredAs/nfo:hasHash ?h . ?h nfo:hashAlgorithm \"chromaprint\" })", + GRL_TYPE_FILTER_AUDIO, + set_string_metadata_keys); + }; + + insert_key_mapping (GRL_METADATA_KEY_FRAMERATE, + "frameRate", + "nfo:frameRate(?urn)", + GRL_TYPE_FILTER_VIDEO); + + insert_key_mapping (GRL_METADATA_KEY_HEIGHT, + "height", + "nfo:height(?urn)", + GRL_TYPE_FILTER_VIDEO | GRL_TYPE_FILTER_IMAGE); + + insert_key_mapping (GRL_METADATA_KEY_ID, + "id", + "?urn", + GRL_TYPE_FILTER_ALL); + + insert_key_mapping (GRL_METADATA_KEY_MIME, + "mimeType", + "nie:mimeType(?urn)", + GRL_TYPE_FILTER_ALL); + + insert_key_mapping (GRL_METADATA_KEY_SITE, + "siteUrl", + "nie:isStoredAs(?urn)", + GRL_TYPE_FILTER_ALL); + + insert_key_mapping_with_setter (GRL_METADATA_KEY_TITLE, + "title", + "nie:title(?urn)", + GRL_TYPE_FILTER_ALL, + set_title); + + insert_key_mapping (GRL_METADATA_KEY_URL, + "url", + "nie:isStoredAs(?urn)", + GRL_TYPE_FILTER_ALL); + + insert_key_mapping (GRL_METADATA_KEY_WIDTH, + "width", + "nfo:width(?urn)", + GRL_TYPE_FILTER_VIDEO | GRL_TYPE_FILTER_IMAGE); + + insert_key_mapping (GRL_METADATA_KEY_SEASON, + "season", + "nmm:seasonNumber(nmm:isPartOfSeason(?urn))", + GRL_TYPE_FILTER_VIDEO); + + insert_key_mapping (GRL_METADATA_KEY_EPISODE, + "episode", + "nmm:episodeNumber(?urn)", + GRL_TYPE_FILTER_VIDEO); + + insert_key_mapping_with_setter (GRL_METADATA_KEY_CREATION_DATE, + "creationDate", + "nie:contentCreated(?urn)", + GRL_TYPE_FILTER_ALL, + set_date); + + insert_key_mapping_with_setter (GRL_METADATA_KEY_PUBLICATION_DATE, + "creationDate", + "nie:contentCreated(?urn)", + GRL_TYPE_FILTER_ALL, + set_date); + + insert_key_mapping (GRL_METADATA_KEY_CAMERA_MODEL, + "cameraModel", + "nfo:model(nfo:equipment(?urn))", + GRL_TYPE_FILTER_IMAGE); + + insert_key_mapping (GRL_METADATA_KEY_FLASH_USED, + "flashUsed", + "nmm:flash(?urn)", + GRL_TYPE_FILTER_IMAGE); + + insert_key_mapping (GRL_METADATA_KEY_EXPOSURE_TIME, + "exposureTime", + "nmm:exposureTime(?urn)", + GRL_TYPE_FILTER_IMAGE); + + insert_key_mapping (GRL_METADATA_KEY_ISO_SPEED, + "isoSpeed", + "nmm:isoSpeed(?urn)", + GRL_TYPE_FILTER_IMAGE); + + insert_key_mapping_with_setter (GRL_METADATA_KEY_ORIENTATION, + "orientation", + "nfo:orientation(?urn)", + GRL_TYPE_FILTER_IMAGE, + set_orientation); + + insert_key_mapping (GRL_METADATA_KEY_PLAY_COUNT, + "playCount", + "nie:usageCounter(?urn)", + GRL_TYPE_FILTER_AUDIO | GRL_TYPE_FILTER_VIDEO); + + insert_key_mapping_with_setter (GRL_METADATA_KEY_LAST_PLAYED, + "lastPlayed", + "nie:contentAccessed(?urn)", + GRL_TYPE_FILTER_ALL, + set_date); + + insert_key_mapping (GRL_METADATA_KEY_LAST_POSITION, + "lastPlayPosition", + "nfo:lastPlayedPosition(?urn)", + GRL_TYPE_FILTER_AUDIO | GRL_TYPE_FILTER_VIDEO); + + insert_key_mapping (GRL_METADATA_KEY_START_TIME, + "startTime", + "nfo:audioOffset(?urn)", + GRL_TYPE_FILTER_AUDIO); + + insert_key_mapping_with_setter (GRL_METADATA_KEY_TRACK_NUMBER, + "trackNumber", + "nmm:trackNumber(?urn)", + GRL_TYPE_FILTER_AUDIO, + set_int_metadata_keys); + + insert_key_mapping_with_setter (GRL_METADATA_KEY_FAVOURITE, + "favorite", + "nao:hasTag(?urn)", + GRL_TYPE_FILTER_ALL, + set_favourite); +} + +tracker_grl_sparql_t * +grl_tracker_get_mapping_from_sparql (const gchar *key) +{ + return (tracker_grl_sparql_t *) g_hash_table_lookup (sparql_to_grl_mapping, + key); +} + +gboolean +grl_tracker_key_is_supported (const GrlKeyID key) +{ + return g_hash_table_lookup (grl_to_sparql_mapping, + GRLKEYID_TO_POINTER (key)) != NULL; +} + +/**/ + +/* Builds an appropriate GrlMedia based on tracker query results */ +GrlMedia * +grl_tracker_build_grilo_media (GrlMediaType type) +{ + GrlMedia *media = NULL; + + if (type == GRL_MEDIA_TYPE_AUDIO) { + media = grl_media_audio_new (); + } else if (type == GRL_MEDIA_TYPE_VIDEO) { + media = grl_media_video_new (); + } else if (type == GRL_MEDIA_TYPE_IMAGE) { + media = grl_media_image_new (); + } else if (type == GRL_MEDIA_TYPE_CONTAINER) { + media = grl_media_container_new (); + } + + if (!media) + media = grl_media_new (); + + return media; +} + +/**/ + +const GList * +grl_tracker_supported_keys (GrlSource *source) +{ + static GList *supported_keys = NULL; + + if (!supported_keys) { + supported_keys = g_hash_table_get_keys (grl_to_sparql_mapping); + } + + return supported_keys; +} + +const gchar * +grl_tracker_key_get_variable_name (const GrlKeyID key) +{ + tracker_grl_sparql_t *assoc; + GList *assoc_list; + + assoc_list = g_hash_table_lookup (grl_to_sparql_mapping, + GRLKEYID_TO_POINTER (key)); + if (!assoc_list) + return NULL; + assoc = assoc_list->data; + + return assoc->sparql_var_name; +} + +const gchar * +grl_tracker_key_get_sparql_statement (const GrlKeyID key, + GrlTypeFilter filter) +{ + tracker_grl_sparql_t *assoc; + GList *assoc_list; + + assoc_list = g_hash_table_lookup (grl_to_sparql_mapping, + GRLKEYID_TO_POINTER (key)); + if (!assoc_list) + return NULL; + + assoc = assoc_list->data; + if ((assoc->filter & filter) == 0) + return NULL; + + return assoc->sparql_key_attr_call; +} + +static TrackerResource * +ensure_resource_for_property (TrackerResource *resource, + const gchar *prop, + gboolean multivalued) +{ + TrackerResource *child = NULL; + + if (!multivalued) + child = tracker_resource_get_first_relation (resource, prop); + + if (!child) { + child = tracker_resource_new (NULL); + tracker_resource_add_take_relation (resource, prop, child); + } + + return child; +} + +static TrackerResource * +ensure_resource_for_musicbrainz_tag (TrackerResource *resource, + const gchar *source, + const gchar *identifier) +{ + TrackerResource *reference; + + reference = ensure_resource_for_property (resource, + "tracker:hasExternalReference", + TRUE); + tracker_resource_set_uri (reference, + "tracker:referenceSource", + source); + tracker_resource_set_string (reference, + "tracker:referenceIdentifier", + identifier); + return reference; +} + +TrackerResource * +grl_tracker_build_resource_from_media (GrlMedia *media, GList *keys) +{ + TrackerResource *resource; + GrlRegistry *registry; + GrlKeyID grl_metadata_key_chromaprint; + GrlMediaType type; + GList *l; + + registry = grl_registry_get_default (); + grl_metadata_key_chromaprint = grl_registry_lookup_metadata_key (registry, "chromaprint"); + + resource = tracker_resource_new (NULL); + tracker_resource_set_uri (resource, "nie:isStoredAs", + grl_media_get_url (media)); + + type = grl_media_get_media_type (media); + if (type & GRL_MEDIA_TYPE_IMAGE) + tracker_resource_add_uri (resource, "rdf:type", "nfo:Image"); + if (type & GRL_MEDIA_TYPE_AUDIO) + tracker_resource_add_uri (resource, "rdf:type", "nfo:Audio"); + if (type & GRL_MEDIA_TYPE_VIDEO) + tracker_resource_add_uri (resource, "rdf:type", "nfo:Video"); + + for (l = keys; l; l = l->next) { + if (l->data == GRLKEYID_TO_POINTER (GRL_METADATA_KEY_TITLE)) { + tracker_resource_set_string (resource, "nie:title", + grl_media_get_title (media)); + } else if (l->data == GRLKEYID_TO_POINTER (GRL_METADATA_KEY_TRACK_NUMBER)) { + tracker_resource_set_int (resource, "nmm:trackNumber", + grl_media_get_track_number (media)); + } else if (l->data == GRLKEYID_TO_POINTER (GRL_METADATA_KEY_EPISODE)) { + tracker_resource_set_int (resource, "nmm:episodeNumber", + grl_media_get_episode (media)); + } else if (l->data == GRLKEYID_TO_POINTER (GRL_METADATA_KEY_CREATION_DATE)) { + GDateTime *creation; + gchar *date; + + creation = grl_media_get_creation_date (media); + date = g_date_time_format_iso8601 (creation); + tracker_resource_set_string (resource, "nie:contentCreated", date); + g_free (date); + } else if (l->data == GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ALBUM)) { + TrackerResource *album; + album = ensure_resource_for_property (resource, "nmm:musicAlbum", FALSE); + tracker_resource_set_string (album, "nie:title", + grl_media_get_album (media)); + + /* Handle MB release/release group inline */ + if (g_list_find (keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_MB_RELEASE_ID))) { + const gchar *mb_release_id; + + mb_release_id = grl_media_get_mb_release_id (media); + if (mb_release_id) { + ensure_resource_for_musicbrainz_tag (resource, + "https://musicbrainz.org/doc/Release", + mb_release_id); + } + } + + if (g_list_find (keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_MB_RELEASE_GROUP_ID))) { + const gchar *mb_release_group_id; + + mb_release_group_id = grl_media_get_mb_release_group_id (media); + if (mb_release_group_id) { + ensure_resource_for_musicbrainz_tag (resource, + "https://musicbrainz.org/doc/Release_Group", + mb_release_group_id); + } + } + } else if (l->data == GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ALBUM_DISC_NUMBER)) { + TrackerResource *disc; + disc = ensure_resource_for_property (resource, "nmm:musicAlbumDisc", FALSE); + tracker_resource_set_int (disc, "nmm:setNumber", + grl_media_get_album_disc_number (media)); + } else if (l->data == GRLKEYID_TO_POINTER (GRL_METADATA_KEY_SEASON)) { + TrackerResource *season; + season = ensure_resource_for_property (resource, "nmm:isPartOfSeason", FALSE); + tracker_resource_set_int (season, "nmm:seasonNumber", + grl_media_get_season (media)); + } else if (l->data == GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ALBUM_ARTIST)) { + TrackerResource *album, *album_artist; + album = ensure_resource_for_property (resource, "nmm:musicAlbum", FALSE); + album_artist = ensure_resource_for_property (album, "nmm:albumArtist", FALSE); + tracker_resource_set_string (album_artist, "nmm:artistName", + grl_media_get_album_artist (media)); + } else if (l->data == GRLKEYID_TO_POINTER (GRL_METADATA_KEY_MB_RECORDING_ID)) { + const gchar *mb_recording_id; + mb_recording_id = grl_media_get_mb_recording_id (media); + if (mb_recording_id) { + ensure_resource_for_musicbrainz_tag (resource, + "https://musicbrainz.org/doc/Recording", + mb_recording_id); + } + } else if (l->data == GRLKEYID_TO_POINTER (GRL_METADATA_KEY_MB_TRACK_ID)) { + const gchar *mb_track_id; + mb_track_id = grl_media_get_mb_track_id (media); + if (mb_track_id) { + ensure_resource_for_musicbrainz_tag (resource, + "https://musicbrainz.org/doc/Track", + mb_track_id); + } + } else if (l->data == GRLKEYID_TO_POINTER (grl_metadata_key_chromaprint)) { + TrackerResource *hash; + hash = ensure_resource_for_property (resource, "nfo:hasHash", FALSE); + tracker_resource_set_string (hash, "nfo:hashAlgorithm", "chromaprint"); + tracker_resource_set_string (hash, "nfo:hashValue", + grl_data_get_string (GRL_DATA (media), grl_metadata_key_chromaprint)); + } else if (l->data == GRLKEYID_TO_POINTER (GRL_METADATA_KEY_ARTIST)) { + TrackerResource *artist; + const gchar *artist_name; + gint i; + + for (i = 0; artist_name != NULL; i++) { + artist_name = grl_media_get_artist_nth (media, i); + artist = ensure_resource_for_property (resource, "nmm:artist", TRUE); + tracker_resource_set_string (artist, "nmm:artistName", artist_name); + + /* Handle MB artist inline */ + if (g_list_find (keys, GRLKEYID_TO_POINTER (GRL_METADATA_KEY_MB_ARTIST_ID))) { + const gchar *mb_artist_id; + + mb_artist_id = grl_media_get_mb_artist_id_nth (media, i); + if (mb_artist_id) { + ensure_resource_for_musicbrainz_tag (resource, + "https://musicbrainz.org/doc/Artist", + mb_artist_id); + } + } + } + } else if (l->data == GRLKEYID_TO_POINTER (GRL_METADATA_KEY_AUTHOR)) { + TrackerResource *artist; + const gchar *artist_name; + gint i; + + for (i = 0; artist_name != NULL; i++) { + artist_name = grl_media_get_artist_nth (media, i); + artist = ensure_resource_for_property (resource, "nmm:artist", TRUE); + tracker_resource_set_string (artist, "nmm:artistName", artist_name); + } + } else if (l->data == GRLKEYID_TO_POINTER (GRL_METADATA_KEY_COMPOSER)) { + TrackerResource *composer; + const gchar *composer_name; + gint i; + + for (i = 0; composer_name != NULL; i++) { + composer_name = grl_media_get_composer_nth (media, i); + composer = ensure_resource_for_property (resource, "nmm:composer", TRUE); + tracker_resource_set_string (composer, "nmm:artistName", composer_name); + } + } + } + + return resource; +} diff -Nru grilo-plugins-0.3.11/src/tracker3/grl-tracker-utils.h grilo-plugins-0.3.12/src/tracker3/grl-tracker-utils.h --- grilo-plugins-0.3.11/src/tracker3/grl-tracker-utils.h 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/grl-tracker-utils.h 2020-09-03 05:36:44.381467800 +0000 @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2011 Igalia S.L. + * Copyright (C) 2011 Intel Corporation. + * Copyright (C) 2020 Red Hat Inc. + * + * Contact: Carlos Garnacho + * + * Authors: Carlos Garnacho + * Lionel Landwerlin + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#ifndef _GRL_TRACKER_UTILS_H_ +#define _GRL_TRACKER_UTILS_H_ + +#include "grl-tracker-source-priv.h" + +/**/ + +typedef void (*tracker_grl_sparql_setter_cb_t) (TrackerSparqlCursor *cursor, + gint column, + GrlMedia *media, + GrlKeyID key); + +typedef struct { + GrlKeyID grl_key; + const gchar *sparql_var_name; + const gchar *sparql_key_attr_call; + GrlTypeFilter filter; + + tracker_grl_sparql_setter_cb_t set_value; +} tracker_grl_sparql_t; + +extern GrlKeyID grl_metadata_key_tracker_urn; + +const GList *grl_tracker_supported_keys (GrlSource *source); + +gboolean grl_tracker_key_is_supported (const GrlKeyID key); + +const gchar * grl_tracker_key_get_variable_name (const GrlKeyID key); +const gchar * grl_tracker_key_get_sparql_statement (const GrlKeyID key, + GrlTypeFilter filter); + +void grl_tracker_setup_key_mappings (void); + +TrackerResource * grl_tracker_build_resource_from_media (GrlMedia *media, GList *keys); + +tracker_grl_sparql_t *grl_tracker_get_mapping_from_sparql (const gchar *key); + +GrlMedia *grl_tracker_build_grilo_media (GrlMediaType type); + +#endif /* _GRL_TRACKER_UTILS_H_ */ diff -Nru grilo-plugins-0.3.11/src/tracker3/meson.build grilo-plugins-0.3.12/src/tracker3/meson.build --- grilo-plugins-0.3.11/src/tracker3/meson.build 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/src/tracker3/meson.build 2020-09-03 05:36:44.381467800 +0000 @@ -0,0 +1,37 @@ +# +# meson.build +# +# Author: Juan A. Suarez Romero +# +# Copyright (C) 2016 Igalia S.L. All rights reserved. + +tracker_sources = [ + 'grl-tracker-source-api.c', + 'grl-tracker-source-api.h', + 'grl-tracker-source-cache.c', + 'grl-tracker-source-cache.h', + 'grl-tracker-source-notif.c', + 'grl-tracker-source-notif.h', + 'grl-tracker-source-priv.h', + 'grl-tracker-source-statements.c', + 'grl-tracker-source-statements.h', + 'grl-tracker-source.c', + 'grl-tracker-source.h', + 'grl-tracker-utils.c', + 'grl-tracker-utils.h', + 'grl-tracker.c', + 'grl-tracker.h', +] + +configure_file(output: 'config.h', + configuration: cdata) + +shared_library('grltracker3', + sources: tracker_sources, + install: true, + install_dir: pluginsdir, + dependencies: must_deps + plugins[tracker3_idx][REQ_DEPS] + plugins[tracker3_idx][OPT_DEPS], + c_args: [ + '-DG_LOG_DOMAIN="GrlTracker3"', + '-DHAVE_CONFIG_H', + ]) diff -Nru grilo-plugins-0.3.11/tests/lua-factory/data/config.ini grilo-plugins-0.3.12/tests/lua-factory/data/config.ini --- grilo-plugins-0.3.11/tests/lua-factory/data/config.ini 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/tests/lua-factory/data/config.ini 2020-09-03 05:36:44.385468000 +0000 @@ -4,10 +4,11 @@ # test_lua_factory_grl_media [http://grl.media.test/lua-factory/all-metadata.json] data = grl-media-test-all-metadata.json +[http://grl.media.test/lua-factory/related-keys.json] +data = grl-media-test-related-keys.json # test_lua_factory_xml_parser [http://xml.parser.test/lua-factory/simple.xml] data = xml-parser-test-simple.xml [http://xml.parser.test/lua-factory/simple-table.lua] data = xml-parser-test-simple-table.lua - diff -Nru grilo-plugins-0.3.11/tests/lua-factory/data/grl-media-test-related-keys.json grilo-plugins-0.3.12/tests/lua-factory/data/grl-media-test-related-keys.json --- grilo-plugins-0.3.11/tests/lua-factory/data/grl-media-test-related-keys.json 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/tests/lua-factory/data/grl-media-test-related-keys.json 2020-09-03 05:36:44.385468000 +0000 @@ -0,0 +1,18 @@ +{ + "title": "this is a song", + "related-keys": [ + { + "artist": "first artist", + "mb-artist-id": "bf24ca37-25f4-4e34-9aec-460b94364cfc" + }, + { + "artist": "second artist", + "mb-artist-id": "6b28ecf0-94e6-48bb-aa2a-5ede325b675b" + }, + { + "artist": "third artist", + "mb-artist-id": "84a87594-8c48-4865-9ac2-5d8aa29c800a" + } + ], + "mb-release-id": "f14638e1-fb36-358c-aba2-39b084864b13" +} diff -Nru grilo-plugins-0.3.11/tests/lua-factory/data/test-source-grl-media.lua grilo-plugins-0.3.12/tests/lua-factory/data/test-source-grl-media.lua --- grilo-plugins-0.3.11/tests/lua-factory/data/test-source-grl-media.lua 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/tests/lua-factory/data/test-source-grl-media.lua 2020-09-03 05:36:44.385468000 +0000 @@ -66,5 +66,14 @@ grl.callback() return end + + -- related keys need to have an index + if media["related-keys"] then + for _, rel_key in pairs(media["related-keys"]) do + media[#media + 1] = rel_key + end + media["related-keys"] = nil + end + grl.callback(media, 0) end diff -Nru grilo-plugins-0.3.11/tests/lua-factory/sources/test_lua_acoustid.c grilo-plugins-0.3.12/tests/lua-factory/sources/test_lua_acoustid.c --- grilo-plugins-0.3.11/tests/lua-factory/sources/test_lua_acoustid.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/tests/lua-factory/sources/test_lua_acoustid.c 2020-09-03 05:36:44.388467800 +0000 @@ -82,7 +82,7 @@ options, &error); g_assert_no_error (error); - g_assert_cmpint (g_list_length (results), ==, 12); + g_assert_cmpint (g_list_length (results), ==, 8); media = GRL_MEDIA (results->data); g_assert_cmpstr (grl_media_get_title (media), ==, "Primavera"); diff -Nru grilo-plugins-0.3.11/tests/lua-factory/test_lua_factory_grl_media.c grilo-plugins-0.3.12/tests/lua-factory/test_lua_factory_grl_media.c --- grilo-plugins-0.3.11/tests/lua-factory/test_lua_factory_grl_media.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/tests/lua-factory/test_lua_factory_grl_media.c 2020-09-03 05:36:44.388467800 +0000 @@ -76,7 +76,8 @@ static void check_metadata (GrlMedia *media, GrlKeyID key_id, - JsonReader *reader) + JsonReader *reader, + gint64 index) { GrlRegistry *registry = grl_registry_get_default (); GType type = grl_registry_lookup_metadata_key_type (registry, key_id); @@ -120,8 +121,14 @@ g_assert_null (list); } else { - const gchar *from_json = json_reader_get_string_value (reader); - const gchar *from_media = grl_data_get_string (GRL_DATA (media), key_id); + GrlRelatedKeys *relkeys; + const gchar *from_media; + const gchar *from_json; + + from_json = json_reader_get_string_value (reader); + relkeys = grl_data_get_related_keys (GRL_DATA (media), key_id, index); + g_assert (relkeys); + from_media = grl_related_keys_get_string (relkeys, key_id); g_assert_cmpstr (from_json, ==, from_media); } break; @@ -188,10 +195,31 @@ json_reader_read_element (reader, i); key_name = json_reader_get_member_name (reader); - if (g_strcmp0 (key_name, "type") != 0) { + if (g_strcmp0 (key_name, "related-keys") == 0) { + gint rel_key_index; + gint rel_keys_nr = json_reader_count_elements (reader); + + for (rel_key_index = 0; rel_key_index < rel_keys_nr; rel_key_index++) { + const gchar *rel_key_name; + guint key_index; + guint len_rel_key; + + json_reader_read_element (reader, rel_key_index); + len_rel_key = json_reader_count_members (reader); + for (key_index = 0; key_index < len_rel_key; key_index++) { + json_reader_read_element (reader, key_index); + rel_key_name = json_reader_get_member_name (reader); + key_id = grl_registry_lookup_metadata_key (registry, rel_key_name); + g_assert (key_id != GRL_METADATA_KEY_INVALID); + check_metadata (media, key_id, reader, rel_key_index); + json_reader_end_element (reader); + } + json_reader_end_element (reader); + } + } else if (g_strcmp0 (key_name, "type") != 0) { key_id = grl_registry_lookup_metadata_key (registry, key_name); g_assert (key_id != GRL_METADATA_KEY_INVALID); - check_metadata (media, key_id, reader); + check_metadata (media, key_id, reader, 0); } json_reader_end_element (reader); } @@ -268,6 +296,34 @@ } } +static void +test_related_keys (void) +{ + gint i; + + struct { + gchar *uri; + gchar *url; + } media_tests[] = { + /* This is a basic test to check that related keys are correctly set. */ + { GRESOURCE_PREFIX "grl-media-test-related-keys.json", + TEST_GRL_MEDIA_URL "related-keys.json" } + }; + + for (i = 0; i < G_N_ELEMENTS (media_tests); i++) { + GFile *file; + gchar *input; + GError *error = NULL; + + file = g_file_new_for_uri (media_tests[i].uri); + g_file_load_contents (file, NULL, &input, NULL, NULL, &error); + g_assert_no_error (error); + g_object_unref (file); + resolve_fake_src (input, media_tests[i].url); + g_free (input); + } +} + gint main (gint argc, gchar **argv) { @@ -285,9 +341,12 @@ /* Check if metadata-keys are created with value we expect with no errors */ g_test_add_func ("/lua-factory/lua-library/metadata-keys", test_build_media); + + /* test GrlRelatedKeys */ + g_test_add_func ("/lua-factory/lua-library/related-keys", test_related_keys); + /* TODO: - * 1-) keys with array of all provided by grl_data_add_* (binary, boxed, float,..) - * 2-) test for GrlRelatedKeys after: https://bugzilla.gnome.org/show_bug.cgi?id=756203 + * keys with array of all provided by grl_data_add_* (binary, boxed, float,..) */ gint result = g_test_run (); diff -Nru grilo-plugins-0.3.11/tests/lua-factory/test_lua_factory_tests.gresource.xml grilo-plugins-0.3.12/tests/lua-factory/test_lua_factory_tests.gresource.xml --- grilo-plugins-0.3.11/tests/lua-factory/test_lua_factory_tests.gresource.xml 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/tests/lua-factory/test_lua_factory_tests.gresource.xml 2020-09-03 05:36:44.389468000 +0000 @@ -2,5 +2,6 @@ data/grl-media-test-all-metadata.json + data/grl-media-test-related-keys.json diff -Nru grilo-plugins-0.3.11/tests/meson.build grilo-plugins-0.3.12/tests/meson.build --- grilo-plugins-0.3.11/tests/meson.build 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/tests/meson.build 2020-09-03 05:36:44.389468000 +0000 @@ -9,14 +9,13 @@ 'chromaprint', # 'dleyna', 'lua-factory', - # 'thetvdb', See: https://gitlab.gnome.org/GNOME/grilo-plugins/issues/64 + 'thetvdb', 'tmdb', 'vimeo', ] test_lua_sources = [ 'games', - 'spotify-cover', 'steam-store', ] @@ -40,3 +39,7 @@ if local_metadata_enabled and lua_factory_enabled subdir('local-metadata') endif + +if tracker3_dep.found() and tracker3_testutils_dep.found() + subdir('tracker3') +endif diff -Nru grilo-plugins-0.3.11/tests/spotify-cover/data/network-data.ini grilo-plugins-0.3.12/tests/spotify-cover/data/network-data.ini --- grilo-plugins-0.3.11/tests/spotify-cover/data/network-data.ini 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/tests/spotify-cover/data/network-data.ini 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ -[default] -version=1 - -[https://api.spotify.com/v1/search?q=album:ray%20of%20light+artist:madonna&type=album&limit=1] -data=resolve-good-found.data - -[https://api.spotify.com/v1/search?q=album:ray%20of%20darkness+artist:madonna&type=album&limit=1] -data=resolve-bad-found.data - diff -Nru grilo-plugins-0.3.11/tests/spotify-cover/data/resolve-bad-found.data grilo-plugins-0.3.12/tests/spotify-cover/data/resolve-bad-found.data --- grilo-plugins-0.3.11/tests/spotify-cover/data/resolve-bad-found.data 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/tests/spotify-cover/data/resolve-bad-found.data 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -{ - "albums" : { - "href" : "https://api.spotify.com/v1/search?query=album%3Aray+of+darkness+artist%3Amadonna&offset=0&limit=1&type=album", - "items" : [ ], - "limit" : 1, - "next" : null, - "offset" : 0, - "previous" : null, - "total" : 0 - } -} \ No newline at end of file diff -Nru grilo-plugins-0.3.11/tests/spotify-cover/data/resolve-good-found.data grilo-plugins-0.3.12/tests/spotify-cover/data/resolve-good-found.data --- grilo-plugins-0.3.11/tests/spotify-cover/data/resolve-good-found.data 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/tests/spotify-cover/data/resolve-good-found.data 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -{ - "albums" : { - "href" : "https://api.spotify.com/v1/search?query=album%3Aray+of+light+artist%3Amadonna&offset=0&limit=1&type=album", - "items" : [ { - "album_type" : "album", - "available_markets" : [ "AD", "AR", "AT", "AU", "BE", "BG", "BO", "BR", "CA", "CH", "CL", "CO", "CR", "CY", "CZ", "DE", "DK", "DO", "EC", "EE", "ES", "FI", "FR", "GB", "GR", "GT", "HK", "HN", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MC", "MT", "MX", "MY", "NI", "NL", "NO", "NZ", "PA", "PE", "PH", "PL", "PT", "PY", "RO", "SE", "SG", "SI", "SK", "SV", "TR", "TW", "US", "UY" ], - "external_urls" : { - "spotify" : "https://open.spotify.com/album/6cuNyrSmRjBeekioLdLkvI" - }, - "href" : "https://api.spotify.com/v1/albums/6cuNyrSmRjBeekioLdLkvI", - "id" : "6cuNyrSmRjBeekioLdLkvI", - "images" : [ { - "height" : 640, - "url" : "https://i.scdn.co/image/246565c45ea4085d5b3889619fa1112ec6d42eed", - "width" : 640 - }, { - "height" : 300, - "url" : "https://i.scdn.co/image/f89849d36862a9dd2807be1d6d07eb0159c26673", - "width" : 300 - }, { - "height" : 64, - "url" : "https://i.scdn.co/image/cfa2d86696ff7cd8ea862f50ed05d086f1d66521", - "width" : 64 - } ], - "name" : "Ray Of Light (U.S. Version)", - "type" : "album", - "uri" : "spotify:album:6cuNyrSmRjBeekioLdLkvI" - } ], - "limit" : 1, - "next" : null, - "offset" : 0, - "previous" : null, - "total" : 1 - } -} \ No newline at end of file diff -Nru grilo-plugins-0.3.11/tests/spotify-cover/meson.build grilo-plugins-0.3.12/tests/spotify-cover/meson.build --- grilo-plugins-0.3.11/tests/spotify-cover/meson.build 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/tests/spotify-cover/meson.build 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -# -# meson.build -# -# Author: Juan A. Suarez Romero -# -# Copyright (C) 2016 Igalia S.L. All rights reserved. - -source_tests = [ - 'test_spotify_cover', -] - -foreach t: source_tests - exe = executable(t, t + '.c', - install: false, - dependencies: must_deps, - c_args: [ - '-DLUA_FACTORY_PLUGIN_PATH="@0@/src/lua-factory/"'.format(meson.build_root()), - '-DLUA_SOURCES_PATH="@0@/src/lua-factory/sources/"'.format(meson.source_root()), - '-DSPOTIFY_COVER_DATA_PATH="@0@/data/"'.format(meson.current_source_dir()), - ]) - test(t, exe) -endforeach diff -Nru grilo-plugins-0.3.11/tests/spotify-cover/test_spotify_cover.c grilo-plugins-0.3.12/tests/spotify-cover/test_spotify_cover.c --- grilo-plugins-0.3.11/tests/spotify-cover/test_spotify_cover.c 2020-02-14 14:24:00.000000000 +0000 +++ grilo-plugins-0.3.12/tests/spotify-cover/test_spotify_cover.c 1970-01-01 00:00:00.000000000 +0000 @@ -1,291 +0,0 @@ -/* - * Copyright (C) 2014 Igalia S.L. - * - * Author: Juan A. Suarez Romero - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; version 2.1 of - * the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301 USA - * - */ - -#include -#include - -#define SPOTIFY_ALBUMART_ID "grl-spotify-cover" - -static GrlMedia * -build_media_audio (const gchar *artist, - const gchar *album) -{ - GrlMedia *media; - - media = grl_media_audio_new (); - grl_media_set_artist (media, artist); - grl_media_set_album (media, album); - - return media; -} - -static void -test_setup (void) -{ - GError *error = NULL; - GrlRegistry *registry; - - registry = grl_registry_get_default (); - grl_registry_load_all_plugins (registry, TRUE, &error); - g_assert_no_error (error); -} - -static void -test_may_resolve_good (void) -{ - GList *missing_keys = NULL; - GrlMedia *media; - GrlRegistry *registry; - GrlSource *source; - gboolean can_resolve; - - registry = grl_registry_get_default (); - source = grl_registry_lookup_source (registry, SPOTIFY_ALBUMART_ID); - g_assert (source); - - media = build_media_audio ("My Artist", "My Album"); - - can_resolve = grl_source_may_resolve (source, media, GRL_METADATA_KEY_THUMBNAIL, &missing_keys); - - g_assert (can_resolve); - g_assert (!missing_keys); - - g_object_unref (media); -} - -static void -test_may_resolve_wrong_key (void) -{ - GList *missing_keys = NULL; - GrlMedia *media; - GrlRegistry *registry; - GrlSource *source; - gboolean can_resolve; - - registry = grl_registry_get_default (); - source = grl_registry_lookup_source (registry, SPOTIFY_ALBUMART_ID); - g_assert (source); - - media = build_media_audio ("My Artist", "My Album"); - - can_resolve = grl_source_may_resolve (source, media, GRL_METADATA_KEY_TITLE, &missing_keys); - - g_assert (!can_resolve); - g_assert (!missing_keys); - - g_object_unref (media); -} - -static void -test_may_resolve_missing_key (void) -{ - GList *missing_keys = NULL; - GrlMedia *media; - GrlRegistry *registry; - GrlSource *source; - gboolean can_resolve; - - registry = grl_registry_get_default (); - source = grl_registry_lookup_source (registry, SPOTIFY_ALBUMART_ID); - g_assert (source); - - media = build_media_audio ("My Artist", NULL); - - can_resolve = grl_source_may_resolve (source, media, GRL_METADATA_KEY_THUMBNAIL, &missing_keys); - - g_assert (!can_resolve); - g_assert_cmpint (g_list_length (missing_keys), ==, 1); - g_assert (GRLPOINTER_TO_KEYID (missing_keys->data) == GRL_METADATA_KEY_ALBUM); - - g_object_unref (media); - g_list_free (missing_keys); -} - -static void -test_may_resolve_missing_media (void) -{ - GList *missing_keys = NULL; - GrlRegistry *registry; - GrlSource *source; - gboolean can_resolve; - - registry = grl_registry_get_default (); - source = grl_registry_lookup_source (registry, SPOTIFY_ALBUMART_ID); - g_assert (source); - - can_resolve = grl_source_may_resolve (source, NULL, GRL_METADATA_KEY_THUMBNAIL, &missing_keys); - - g_assert (!can_resolve); - g_assert_cmpint (g_list_length (missing_keys), ==, 2); - g_assert (GRLPOINTER_TO_KEYID (missing_keys->data) == GRL_METADATA_KEY_ARTIST || - GRLPOINTER_TO_KEYID (missing_keys->data) == GRL_METADATA_KEY_ALBUM); - g_assert (GRLPOINTER_TO_KEYID (missing_keys->next->data) == GRL_METADATA_KEY_ARTIST || - GRLPOINTER_TO_KEYID (missing_keys->next->data) == GRL_METADATA_KEY_ALBUM); - g_assert (GRLPOINTER_TO_KEYID (missing_keys->data) != GRLPOINTER_TO_KEYID (missing_keys->next->data)); - g_list_free (missing_keys); -} - -static void -test_resolve_good_found (void) -{ - GError *error = NULL; - GList *keys; - GrlMedia *media; - GrlOperationOptions *options; - GrlRegistry *registry; - GrlSource *source; - guint expected_n_thumbnails; - - registry = grl_registry_get_default (); - source = grl_registry_lookup_source (registry, SPOTIFY_ALBUMART_ID); - g_assert (source); - - media = build_media_audio ("madonna", "ray of light"); - - keys = grl_metadata_key_list_new (GRL_METADATA_KEY_THUMBNAIL, NULL); - - options = grl_operation_options_new (NULL); - grl_operation_options_set_resolution_flags (options, GRL_RESOLVE_FULL); - - grl_source_resolve_sync (source, media, keys, options, &error); - - g_assert_no_error (error); - - /* We should get 5 thumbnails */ - expected_n_thumbnails = grl_data_length (GRL_DATA (media), GRL_METADATA_KEY_THUMBNAIL); - g_assert_cmpuint (expected_n_thumbnails, ==, 3); - g_assert_cmpstr (grl_media_get_thumbnail_nth (media, 0), - ==, - "https://i.scdn.co/image/246565c45ea4085d5b3889619fa1112ec6d42eed"); - g_assert_cmpstr (grl_media_get_thumbnail_nth (media, 1), - ==, - "https://i.scdn.co/image/f89849d36862a9dd2807be1d6d07eb0159c26673"); - g_assert_cmpstr (grl_media_get_thumbnail_nth (media, 2), - ==, - "https://i.scdn.co/image/cfa2d86696ff7cd8ea862f50ed05d086f1d66521"); - - g_list_free (keys); - g_object_unref (options); - g_object_unref (media); -} - -static void -test_resolve_good_not_found (void) -{ - GError *error = NULL; - GList *keys; - GrlMedia *media; - GrlOperationOptions *options; - GrlRegistry *registry; - GrlSource *source; - guint expected_n_thumbnails; - - registry = grl_registry_get_default (); - source = grl_registry_lookup_source (registry, SPOTIFY_ALBUMART_ID); - g_assert (source); - - media = build_media_audio ("madonna", "ray of darkness"); - - keys = grl_metadata_key_list_new (GRL_METADATA_KEY_THUMBNAIL, NULL); - - options = grl_operation_options_new (NULL); - grl_operation_options_set_resolution_flags (options, GRL_RESOLVE_NORMAL); - - grl_source_resolve_sync (source, media, keys, options, &error); - - g_assert_no_error (error); - - /* We should get 0 thumbnails */ - expected_n_thumbnails = grl_data_length (GRL_DATA (media), GRL_METADATA_KEY_THUMBNAIL); - g_assert_cmpuint (expected_n_thumbnails, ==, 0); - g_assert (!grl_media_get_thumbnail (media)); - - g_list_free (keys); - g_object_unref (options); - g_object_unref (media); -} - -static void -test_resolve_missing_key (void) -{ - GError *error = NULL; - GList *keys; - GrlMedia *media; - GrlOperationOptions *options; - GrlRegistry *registry; - GrlSource *source; - guint expected_n_thumbnails; - - registry = grl_registry_get_default (); - source = grl_registry_lookup_source (registry, SPOTIFY_ALBUMART_ID); - g_assert (source); - - media = build_media_audio ("madonna", NULL); - - keys = grl_metadata_key_list_new (GRL_METADATA_KEY_THUMBNAIL, NULL); - - options = grl_operation_options_new (NULL); - grl_operation_options_set_resolution_flags (options, GRL_RESOLVE_NORMAL); - - grl_source_resolve_sync (source, media, keys, options, &error); - - g_assert_no_error (error); - - /* We should get 0 thumbnails */ - expected_n_thumbnails = grl_data_length (GRL_DATA (media), GRL_METADATA_KEY_THUMBNAIL); - g_assert_cmpuint (expected_n_thumbnails, ==, 0); - g_assert (!grl_media_get_thumbnail (media)); - - g_list_free (keys); - g_object_unref (options); - g_object_unref (media); -} - -int -main(int argc, char **argv) -{ - setlocale (LC_ALL, ""); - - g_setenv ("GRL_PLUGIN_PATH", LUA_FACTORY_PLUGIN_PATH, TRUE); - g_setenv ("GRL_LUA_SOURCES_PATH", LUA_SOURCES_PATH, TRUE); - g_setenv ("GRL_PLUGIN_LIST", "grl-lua-factory", TRUE); - g_setenv ("GRL_NET_MOCKED", SPOTIFY_COVER_DATA_PATH "network-data.ini", TRUE); - - grl_init (&argc, &argv); - g_test_init (&argc, &argv, NULL); - - test_setup (); - - g_test_add_func ("/spotify-cover/may-resolve/good", test_may_resolve_good); - g_test_add_func ("/spotify-cover/may-resolve/wrong-key", test_may_resolve_wrong_key); - g_test_add_func ("/spotify-cover/may-resolve/missing-key", test_may_resolve_missing_key); - g_test_add_func ("/spotify-cover/may-resolve/missing-media", test_may_resolve_missing_media); - g_test_add_func ("/spotify-cover/resolve/good-found", test_resolve_good_found); - g_test_add_func ("/spotify-cover/resolve/good-not-found", test_resolve_good_not_found); - g_test_add_func ("/spotify-cover/resolve/missing-key", test_resolve_missing_key); - - gint result = g_test_run (); - - grl_deinit (); - - return result; -} Binary files /tmp/tmph_qhikfi/u_QSh2GFmp/grilo-plugins-0.3.11/tests/tracker3/data/sample.flac and /tmp/tmph_qhikfi/AjAPM49l40/grilo-plugins-0.3.12/tests/tracker3/data/sample.flac differ Binary files /tmp/tmph_qhikfi/u_QSh2GFmp/grilo-plugins-0.3.11/tests/tracker3/data/sample.mp3 and /tmp/tmph_qhikfi/AjAPM49l40/grilo-plugins-0.3.12/tests/tracker3/data/sample.mp3 differ Binary files /tmp/tmph_qhikfi/u_QSh2GFmp/grilo-plugins-0.3.11/tests/tracker3/data/sample.ogg and /tmp/tmph_qhikfi/AjAPM49l40/grilo-plugins-0.3.12/tests/tracker3/data/sample.ogg differ Binary files /tmp/tmph_qhikfi/u_QSh2GFmp/grilo-plugins-0.3.11/tests/tracker3/data/sample.ogv and /tmp/tmph_qhikfi/AjAPM49l40/grilo-plugins-0.3.12/tests/tracker3/data/sample.ogv differ Binary files /tmp/tmph_qhikfi/u_QSh2GFmp/grilo-plugins-0.3.11/tests/tracker3/data/sample.png and /tmp/tmph_qhikfi/AjAPM49l40/grilo-plugins-0.3.12/tests/tracker3/data/sample.png differ diff -Nru grilo-plugins-0.3.11/tests/tracker3/meson.build grilo-plugins-0.3.12/tests/tracker3/meson.build --- grilo-plugins-0.3.11/tests/tracker3/meson.build 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/tests/tracker3/meson.build 2020-09-03 05:36:44.394467800 +0000 @@ -0,0 +1,22 @@ +source_tests = [ + 'test_tracker3', +] + +tracker_sandbox = find_program(tracker3_testutils_dep.get_pkgconfig_variable('command')) +datadir = join_paths(meson.current_source_dir(), 'data') + +foreach t: source_tests + exe = executable(t, t + '.c', + install: false, + dependencies: must_deps, + c_args: [ + '-DTRACKER3_PLUGIN_PATH="@0@/src/tracker3/"'.format(meson.build_root()), + '-DTRACKER3_DATA_PATH="@0@"'.format(datadir), + ]) + test(t, tracker_sandbox, + args: [ + '--index-recursive-directories', datadir, + '--store-tmpdir', + exe + ]) +endforeach diff -Nru grilo-plugins-0.3.11/tests/tracker3/test_tracker3.c grilo-plugins-0.3.12/tests/tracker3/test_tracker3.c --- grilo-plugins-0.3.11/tests/tracker3/test_tracker3.c 1970-01-01 00:00:00.000000000 +0000 +++ grilo-plugins-0.3.12/tests/tracker3/test_tracker3.c 2020-09-03 05:36:44.394467800 +0000 @@ -0,0 +1,543 @@ +/* + * Copyright (C) 2020 Red Hat Inc. + * + * Author: Carlos Garnacho + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; version 2.1 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include +#include + +#define TRACKER3_ID "grl-tracker3" +#define TRACKER3_SOURCE_ID "grl-tracker3-source" + +const gchar *test_files[] = { + "file://" TRACKER3_DATA_PATH "/sample.flac", + "file://" TRACKER3_DATA_PATH "/sample.mp3", + "file://" TRACKER3_DATA_PATH "/sample.ogv", + "file://" TRACKER3_DATA_PATH "/sample.ogg", + "file://" TRACKER3_DATA_PATH "/sample.png", +}; + +static void +content_changed_cb (GrlSource *source, + GPtrArray *medias, + GrlSourceChangeType type, + gboolean location_unknown, + GMainLoop *main_loop) +{ + static gint n_changes = 0; + guint i; + + for (i = 0; i < medias->len; i++) { + GrlMedia *media = g_ptr_array_index (medias, i); + + g_assert_true (g_strv_contains ((const gchar * const *) test_files, + grl_media_get_url (media))); + n_changes++; + } + + if (n_changes == G_N_ELEMENTS (test_files)) { + g_signal_handlers_disconnect_by_func (source, content_changed_cb, main_loop); + g_main_loop_quit (main_loop); + } +} + +static void +on_source_added (GrlRegistry *registry, + GrlSource *source, + GMainLoop *main_loop) +{ + GError *error = NULL; + + g_assert_cmpstr (grl_source_get_id (source), ==, TRACKER3_SOURCE_ID); + + grl_source_notify_change_start (source, &error); + g_signal_connect (source, "content-changed", G_CALLBACK (content_changed_cb), main_loop); + g_assert_no_error (error); + + /* Some silly query, we want to start the miner service */ + grl_source_test_media_from_uri (source, "file:///"); +} + +static void +test_setup (void) +{ + GError *error = NULL; + GrlRegistry *registry; + GMainLoop *main_loop; + + registry = grl_registry_get_default (); + grl_registry_load_all_plugins (registry, TRUE, &error); + g_assert_no_error (error); + + main_loop = g_main_loop_new (NULL, FALSE); + + g_signal_connect (registry, "source-added", + G_CALLBACK (on_source_added), main_loop); + + g_main_loop_run (main_loop); + + g_main_loop_unref (main_loop); +} + +static gint +compare_by_url (gconstpointer a, + gconstpointer b) +{ + return g_strcmp0 (grl_media_get_url (GRL_MEDIA (a)), + grl_media_get_url (GRL_MEDIA (b))); +} + +static void +test_browse (void) +{ + GrlRegistry *registry; + GrlSource *source; + GList *subelements, *elements, *l; + GError *error = NULL; + GrlOperationOptions *options; + GList *keys; + + registry = grl_registry_get_default (); + source = grl_registry_lookup_source (registry, TRACKER3_SOURCE_ID); + g_assert (source); + + keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL, + GRL_METADATA_KEY_TITLE, + GRL_METADATA_KEY_INVALID); + + options = grl_operation_options_new (NULL); + elements = grl_source_browse_sync (source, NULL, NULL, options, &error); + g_assert_no_error (error); + + g_assert_cmpint (g_list_length (elements), ==, 3); + + for (l = elements; l; l = l->next) { + GrlMedia *media = l->data; + + if (g_strcmp0 (grl_media_get_title (media), "Music") == 0) { + subelements = grl_source_browse_sync (source, media, keys, options, &error); + g_assert_cmpint (g_list_length (subelements), ==, 3); + subelements = g_list_sort (subelements, compare_by_url); + + g_assert_cmpstr (grl_media_get_url (g_list_nth_data (subelements, 0)), + ==, + "file://" TRACKER3_DATA_PATH "/sample.flac"); + g_assert_cmpstr (grl_media_get_url (g_list_nth_data (subelements, 1)), + ==, + "file://" TRACKER3_DATA_PATH "/sample.mp3"); + g_assert_cmpstr (grl_media_get_url (g_list_nth_data (subelements, 2)), + ==, + "file://" TRACKER3_DATA_PATH "/sample.ogg"); + g_list_free_full (subelements, g_object_unref); + } else if (g_strcmp0 (grl_media_get_title (media), "Videos") == 0) { + subelements = grl_source_browse_sync (source, media, keys, options, &error); + g_assert_cmpint (g_list_length (subelements), ==, 1); + g_assert_cmpstr (grl_media_get_url (g_list_nth_data (subelements, 0)), + ==, + "file://" TRACKER3_DATA_PATH "/sample.ogv"); + g_list_free_full (subelements, g_object_unref); + } else if (g_strcmp0 (grl_media_get_title (media), "Photos") == 0) { + subelements = grl_source_browse_sync (source, media, keys, options, &error); + g_assert_cmpint (g_list_length (subelements), ==, 1); + g_assert_cmpstr (grl_media_get_url (g_list_nth_data (subelements, 0)), + ==, + "file://" TRACKER3_DATA_PATH "/sample.png"); + g_list_free_full (subelements, g_object_unref); + } else { + g_assert_cmpstr (grl_media_get_title (media), ==, "b0rk"); + } + } + + g_list_free_full (elements, g_object_unref); + g_object_unref (options); + g_list_free (keys); +} + +static void +test_browse_type_filter (void) +{ + GrlRegistry *registry; + GrlSource *source; + GList *elements; + GError *error = NULL; + GrlOperationOptions *options; + GList *keys; + + registry = grl_registry_get_default (); + source = grl_registry_lookup_source (registry, TRACKER3_SOURCE_ID); + g_assert (source); + + keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL, + GRL_METADATA_KEY_TITLE, + GRL_METADATA_KEY_INVALID); + + options = grl_operation_options_new (NULL); + grl_operation_options_set_type_filter (options, GRL_TYPE_FILTER_VIDEO); + elements = grl_source_browse_sync (source, NULL, keys, options, &error); + g_assert_no_error (error); + + g_assert_cmpint (g_list_length (elements), ==, 1); + + elements = g_list_sort (elements, compare_by_url); + + g_assert_cmpstr (grl_media_get_url (g_list_nth_data (elements, 0)), + ==, + "file://" TRACKER3_DATA_PATH "/sample.ogv"); + + g_list_free_full (elements, g_object_unref); + g_object_unref (options); + g_list_free (keys); +} + +static void +test_media_from_uri (void) +{ + GrlRegistry *registry; + GrlSource *source; + GrlMedia *media; + GError *error = NULL; + GrlOperationOptions *options; + GList *keys; + + registry = grl_registry_get_default (); + source = grl_registry_lookup_source (registry, TRACKER3_SOURCE_ID); + g_assert (source); + + keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL, + GRL_METADATA_KEY_TITLE, + GRL_METADATA_KEY_INVALID); + + options = grl_operation_options_new (NULL); + media = grl_source_get_media_from_uri_sync (source, + "file://" TRACKER3_DATA_PATH "/sample.ogv", + keys, + options, &error); + g_assert_no_error (error); + + g_assert_cmpstr (grl_media_get_url (media), + ==, + "file://" TRACKER3_DATA_PATH "/sample.ogv"); + g_assert_cmpstr (grl_media_get_title (media), + ==, + "sample"); + + g_object_unref (options); + g_object_unref (media); + g_list_free (keys); +} + +static void +test_media_from_uri_nonexistent (void) +{ + GrlRegistry *registry; + GrlSource *source; + GrlMedia *media; + GError *error = NULL; + GrlOperationOptions *options; + GList *keys; + + registry = grl_registry_get_default (); + source = grl_registry_lookup_source (registry, TRACKER3_SOURCE_ID); + g_assert (source); + + keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL, + GRL_METADATA_KEY_TITLE, + GRL_METADATA_KEY_INVALID); + + options = grl_operation_options_new (NULL); + media = grl_source_get_media_from_uri_sync (source, + "file://" TRACKER3_DATA_PATH "/IDoNotExist", + keys, + options, &error); + g_assert_no_error (error); + g_assert_null (media); + + g_object_unref (options); + g_list_free (keys); +} + +static void +test_resolve (void) +{ + GrlRegistry *registry; + GrlSource *source; + GrlMedia *media, *resolved; + GError *error = NULL; + GrlOperationOptions *options; + GDateTime *datetime; + GList *keys; + + registry = grl_registry_get_default (); + source = grl_registry_lookup_source (registry, TRACKER3_SOURCE_ID); + g_assert (source); + + keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL, + GRL_METADATA_KEY_TITLE, + GRL_METADATA_KEY_MODIFICATION_DATE, + GRL_METADATA_KEY_INVALID); + + options = grl_operation_options_new (NULL); + media = grl_media_audio_new (); + grl_media_set_url (media, "file://" TRACKER3_DATA_PATH "/sample.mp3"); + + resolved = grl_source_resolve_sync (source, + media, + keys, + options, &error); + g_assert_no_error (error); + g_assert_nonnull (resolved); + g_assert_true (resolved == media); + + g_assert_cmpstr (grl_media_get_url (media), + ==, + "file://" TRACKER3_DATA_PATH "/sample.mp3"); + g_assert_cmpstr (grl_media_get_title (media), + ==, + "Simply Juvenile"); + + datetime = grl_media_get_modification_date (media); + g_assert_nonnull (datetime); + + g_object_unref (options); + g_object_unref (media); + g_list_free (keys); +} + +static void +test_resolve_non_existent (void) +{ + GrlRegistry *registry; + GrlSource *source; + GrlMedia *media, *resolved; + GError *error = NULL; + GrlOperationOptions *options; + GList *keys; + + registry = grl_registry_get_default (); + source = grl_registry_lookup_source (registry, TRACKER3_SOURCE_ID); + g_assert (source); + + keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL, + GRL_METADATA_KEY_TITLE, + GRL_METADATA_KEY_INVALID); + + options = grl_operation_options_new (NULL); + media = grl_media_audio_new (); + grl_media_set_url (media, "file://" TRACKER3_DATA_PATH "/IDoNotExist"); + + resolved = grl_source_resolve_sync (source, + media, + keys, + options, &error); + g_assert_no_error (error); + g_assert_nonnull (resolved); + + g_assert_cmpstr (grl_media_get_title (media), + ==, + NULL); + + g_object_unref (options); + g_object_unref (media); + g_list_free (keys); +} + +static void +test_search (void) +{ + GrlRegistry *registry; + GrlSource *source; + GError *error = NULL; + GList *elements; + GrlOperationOptions *options; + GList *keys; + + registry = grl_registry_get_default (); + source = grl_registry_lookup_source (registry, TRACKER3_SOURCE_ID); + g_assert (source); + + keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL, + GRL_METADATA_KEY_TITLE, + GRL_METADATA_KEY_INVALID); + + options = grl_operation_options_new (NULL); + + elements = grl_source_search_sync (source, + "Simply", + keys, + options, &error); + g_assert_no_error (error); + g_assert_cmpint (g_list_length (elements), ==, 1); + + g_assert_cmpstr (grl_media_get_url (g_list_nth_data (elements, 0)), + ==, + "file://" TRACKER3_DATA_PATH "/sample.mp3"); + g_assert_cmpstr (grl_media_get_title (g_list_nth_data (elements, 0)), + ==, + "Simply Juvenile"); + + g_object_unref (options); + g_list_free (keys); +} + +static void +test_search_non_existent (void) +{ + GrlRegistry *registry; + GrlSource *source; + GError *error = NULL; + GList *elements; + GrlOperationOptions *options; + GList *keys; + + registry = grl_registry_get_default (); + source = grl_registry_lookup_source (registry, TRACKER3_SOURCE_ID); + g_assert (source); + + keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL, + GRL_METADATA_KEY_TITLE, + GRL_METADATA_KEY_INVALID); + + options = grl_operation_options_new (NULL); + + elements = grl_source_search_sync (source, + "I do not exist", + keys, + options, &error); + g_assert_no_error (error); + g_assert_cmpint (g_list_length (elements), ==, 0); + + g_object_unref (options); + g_list_free (keys); +} + +static void +test_search_range_filter (void) +{ + GrlRegistry *registry; + GrlSource *source; + GError *error = NULL; + GList *elements; + GrlOperationOptions *options; + GList *keys; + + registry = grl_registry_get_default (); + source = grl_registry_lookup_source (registry, TRACKER3_SOURCE_ID); + g_assert (source); + + keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL, + GRL_METADATA_KEY_TITLE, + GRL_METADATA_KEY_INVALID); + + options = grl_operation_options_new (NULL); + grl_operation_options_set_key_range_filter (options, + GRL_METADATA_KEY_DURATION, + 5, 12, NULL); + + elements = grl_source_search_sync (source, + NULL, + keys, + options, &error); + g_assert_no_error (error); + g_assert_cmpint (g_list_length (elements), ==, 2); + + elements = g_list_sort (elements, compare_by_url); + + g_assert_cmpstr (grl_media_get_url (g_list_nth_data (elements, 0)), + ==, + "file://" TRACKER3_DATA_PATH "/sample.flac"); + + g_assert_cmpstr (grl_media_get_url (g_list_nth_data (elements, 1)), + ==, + "file://" TRACKER3_DATA_PATH "/sample.ogv"); + + g_object_unref (options); + g_list_free (keys); +} + +static void +test_query (void) +{ + GrlRegistry *registry; + GrlSource *source; + GError *error = NULL; + GList *elements; + GrlOperationOptions *options; + GList *keys; + + registry = grl_registry_get_default (); + source = grl_registry_lookup_source (registry, TRACKER3_SOURCE_ID); + g_assert (source); + + keys = grl_metadata_key_list_new (GRL_METADATA_KEY_URL, + GRL_METADATA_KEY_TITLE, + GRL_METADATA_KEY_INVALID); + + options = grl_operation_options_new (NULL); + + elements = grl_source_query_sync (source, + "SELECT ('a' AS ?urn) ('file:///a' AS ?url) ('title' AS ?title) {}", + keys, + options, &error); + g_assert_no_error (error); + g_assert_cmpint (g_list_length (elements), ==, 1); + + g_assert_cmpstr (grl_media_get_url (g_list_nth_data (elements, 0)), + ==, + "file:///a"); + g_assert_cmpstr (grl_media_get_title (g_list_nth_data (elements, 0)), + ==, + "title"); + + g_object_unref (options); + g_list_free (keys); +} + +int +main(int argc, char **argv) +{ + gint result; + + setlocale (LC_ALL, ""); + + g_setenv ("GRL_PLUGIN_PATH", TRACKER3_PLUGIN_PATH, TRUE); + g_setenv ("GRL_PLUGIN_LIST", TRACKER3_ID, TRUE); + + grl_init (&argc, &argv); + g_test_init (&argc, &argv, NULL); + + test_setup (); + + g_test_add_func ("/tracker3/browse", test_browse); + g_test_add_func ("/tracker3/browse/type-filter", test_browse_type_filter); + g_test_add_func ("/tracker3/media-from-uri", test_media_from_uri); + g_test_add_func ("/tracker3/media-from-uri/non-existent", test_media_from_uri_nonexistent); + g_test_add_func ("/tracker3/resolve", test_resolve); + g_test_add_func ("/tracker3/resolve/non-existent", test_resolve_non_existent); + g_test_add_func ("/tracker3/search", test_search); + g_test_add_func ("/tracker3/search/non-existent", test_search_non_existent); + g_test_add_func ("/tracker3/search/range-filter", test_search_range_filter); + g_test_add_func ("/tracker3/query", test_query); + + result = g_test_run (); + + grl_deinit (); + + return result; +}