Codebase list grilo / 9447b01
New upstream version 0.3.15 Alberto Garcia 1 year, 8 months ago
21 changed file(s) with 1334 addition(s) and 393 deletion(s). Raw diff Collapse all Expand all
00 image: fedora:latest
11
22 variables:
3 DEPENDENCIES: chrpath vala gtk-doc
4 gobject-introspection-devel libxml2-devel
5 libsoup-devel glib2-devel gtk3-devel
6 liboauth-devel totem-pl-parser-devel
7 meson redhat-rpm-config gcc gcc-c++ glibc-devel
3 DEPENDENCIES: chrpath
4 vala
5 gtk-doc
6 gobject-introspection-devel
7 libxml2-devel
8 glib2-devel
9 gtk3-devel
10 liboauth-devel
11 totem-pl-parser-devel
12 meson
13 redhat-rpm-config
14 gcc
15 gcc-c++
16 glibc-devel
17 libabigail
18 SOUP2_DEPS: libsoup-devel
19 SOUP3_DEPS: libsoup3-devel
20 LAST_ABI_BREAK: 60d135ef64f16671bb0ab4079ecbc59bdc32cbc7
821
922 build_stable:
1023 before_script:
1124 - dnf update -y --nogpgcheck
12 - dnf install -y --nogpgcheck $DEPENDENCIES
25 - dnf install -y --nogpgcheck $DEPENDENCIES $SOUP3_DEPS
1326 script:
1427 - meson . _build --prefix=/usr
1528 - ninja -C _build
1932 build_no_optional_libs:
2033 before_script:
2134 - dnf update -y --nogpgcheck
22 - dnf install -y --nogpgcheck $DEPENDENCIES
35 - dnf install -y --nogpgcheck $DEPENDENCIES $SOUP2_DEPS
2336 script:
24 - meson . _build --prefix=/usr -Denable-grl-net=false -Denable-grl-pls=false
37 - meson . _build --prefix=/usr -Denable-grl-net=true -Denable-grl-pls=true -Dsoup3=false
2538 - ninja -C _build
2639 - ninja -C _build install
2740 - ninja -C _build test
41 - curl https://gitlab.freedesktop.org/hadess/check-abi/-/raw/main/contrib/check-abi-fedora.sh | bash
42 - check-abi --old-parameters="-Denable-grl-net=true -Denable-grl-pls=true" --new-parameters="-Denable-grl-net=true -Denable-grl-pls=true -Dsoup3=false" ${LAST_ABI_BREAK} $(git rev-parse HEAD)
43
44 build_no_optional_libs_soup3:
45 before_script:
46 - dnf update -y --nogpgcheck
47 - dnf install -y --nogpgcheck $DEPENDENCIES $SOUP3_DEPS
48 script:
49 - meson . _build --prefix=/usr -Denable-grl-net=true -Denable-grl-pls=true -Dsoup3=true
50 - ninja -C _build
51 - ninja -C _build install
52 - ninja -C _build test
53 - curl https://gitlab.freedesktop.org/hadess/check-abi/-/raw/main/contrib/check-abi-fedora.sh | bash
54 # For the soup2 build
55 - dnf install -y --nogpgcheck $SOUP2_DEPS
56 - check-abi --old-parameters="-Denable-grl-net=true -Denable-grl-pls=true" --new-parameters="-Denable-grl-net=true -Denable-grl-pls=true -Dsoup3=true" ${LAST_ABI_BREAK} $(git rev-parse HEAD)
22 1PunMan
33 Adrião Morão
44 Adrien Plazas
5 Ahmad Haghighi
56 Alban Browaeys
67 Alberto Garcia
78 Alexander Shopov
108109 Milo Casagrande
109110 Muhammet Kara
110111 Murray Cumming
112 Naala Nanba
111113 Nathan Follens
112114 Nilamdyuti Goswami
113115 Nishio Futoshi
148150 Xavier Claessens
149151 Xavi Ivars
150152 Yaakov Selkowitz
153 Yaron Shahrabani
151154 Yi-Jyun Pan
152155 Yi-Soo An
153156 Yosef Or Boczko
154157 Yuri Myasoedov
158 Zurab Kargareteli
155159 Źmicier Turok
156160 Марко Костић
157161 Милош Поповић
0 NEW in 0.3.15
1 =============
2 * !88 Increase glib requirement to 2.66 so we can use GUri
3 * !91 !90 net: add libsoup3 support with compile-time option
4 * !92 net: Add documentation on throttling property in libsoup3
5 * !86 Build fixes and cleanups
6
7 * New translations
8 * Abkhazian
9 * Georgian
10 * Persian
11
12 * Updated translations
13 * Hebrew
14 * Bulgarian
15 * Nepali
16
17 * Contributors to this release:
18 Ahmad Haghighi <haghighi.ahmad@gmail.com>
19 Alexander Shopov <ash@kambanaria.org>
20 Bastien Nocera <hadess@hadess.net>
21 Naala Nanba <naala-nanba@rambler.ru>
22 Pawan Chitrakar <chautari@gmail.com>
23 Victor Toso <victortoso@gnome.org>
24 Yaron Shahrabani <sh.yaron@gmail.com>
25 Zurab Kargareteli <zuraxt@gmail.com>
26
027 NEW in 0.3.14
128 =============
229 * !78 CVE-2016-20011: Fix TLS cert validation not being done for any network call
2727 #include <glib/gi18n-lib.h>
2828 #include <glib/gstdio.h>
2929 #include <gio/gio.h>
30 #include <libsoup/soup.h>
3130 #include <string.h>
3231
3332 #define _GRILO_H_INSIDE_
6059 char *new_url;
6160
6261 if (ignored_parameters) {
63 SoupURI *uri = soup_uri_new (url);
64 const char *query = soup_uri_get_query (uri);
62 g_autoptr(GUri) uri = g_uri_parse (url, G_URI_FLAGS_PARSE_RELAXED, NULL);
63 const char *query = g_uri_get_query (uri);
6564 if (query) {
65 g_autoptr(GUri) nuri = NULL;
6666 char *new_query = g_regex_replace (ignored_parameters,
6767 query, -1, 0,
6868 "", 0, NULL);
69 soup_uri_set_query (uri, *new_query ? new_query : NULL);
70 new_url = soup_uri_to_string (uri, FALSE);
71 soup_uri_free (uri);
69 nuri = g_uri_build (G_URI_FLAGS_NONE,
70 g_uri_get_scheme (uri),
71 NULL,
72 g_uri_get_host (uri),
73 g_uri_get_port (uri),
74 g_uri_get_path (uri),
75 *new_query ? new_query : NULL,
76 g_uri_get_fragment (uri));
77 new_url = g_uri_to_string_partial (nuri, G_URI_FLAGS_NONE);
7278 g_free (new_query);
7379 } else {
7480 new_url = g_strdup (url);
0 /*
1 * Copyright (C) 2010, 2011 Igalia S.L.
2 * Copyright (C) 2012 Canonical Ltd.
3 *
4 * Contact: Iago Toral Quiroga <itoral@igalia.com>
5 *
6 * Authors: Víctor M. Jáquez L. <vjaquez@igalia.com>
7 * Juan A. Suarez Romero <jasuarez@igalia.com>
8 * Jens Georg <jensg@openismus.com>
9 * Mathias Hasselmann <mathias@openismus.com>
10 *
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; version 2.1 of
14 * the License, or (at your option) any later version.
15 *
16 * This library is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
24 * 02110-1301 USA
25 *
26 */
27
28 #include <libsoup/soup.h>
29
30 struct _GrlNetWc {
31 GObject parent;
32
33 SoupSession *session;
34 char *user_agent;
35 SoupLoggerLogLevel log_level;
36 /* throttling in secs */
37 guint throttling;
38 /* last request time, timestamp in seconds */
39 gint64 last_request;
40 /* closure queue for delayed requests */
41 GQueue *pending;
42 /* cache size in Mb */
43 gboolean use_cache;
44 guint cache_size;
45 gchar *previous_data;
46 };
3838 #include "config.h"
3939 #endif
4040
41 #define LIBSOUP_USE_UNSTABLE_REQUEST_API
42
4341 #include <errno.h>
4442 #include <glib/gi18n-lib.h>
4543 #include <glib/gstdio.h>
4644 #include <libsoup/soup-cache.h>
45 #if ! SOUP_CHECK_VERSION (2, 99, 2)
46 #define LIBSOUP_USE_UNSTABLE_REQUEST_API
4747 #include <libsoup/soup-request-http.h>
48 #endif
4849 #include <libsoup/soup.h>
4950 #include <string.h>
5051
5152 #include <grilo.h>
5253 #include "grl-net-wc.h"
54 #include "grl-net-wc-private.h"
5355 #include "grl-net-mock-private.h"
5456
5557 #define GRL_LOG_DOMAIN_DEFAULT wc_log_domain
6769 };
6870
6971 struct request_res {
72 #if SOUP_CHECK_VERSION (2, 99, 2)
73 SoupMessage *message;
74 #else
7075 SoupRequest *request;
76 #endif
7177 gchar *buffer;
7278 gsize length;
7379 gsize offset;
7480 };
7581
76 struct _GrlNetWcPrivate {
77 SoupSession *session;
78 SoupLoggerLogLevel log_level;
79 /* throttling in secs */
80 guint throttling;
81 /* last request time, timestamp in seconds */
82 gint64 last_request;
83 /* closure queue for delayed requests */
84 GQueue *pending;
85 /* cache size in Mb */
86 guint cache_size;
87 gchar *previous_data;
88 };
89
9082 static const char *capture_dir = NULL;
9183
9284 GQuark
9587 return g_quark_from_static_string ("grl-wc-error-quark");
9688 }
9789
98 G_DEFINE_TYPE_WITH_PRIVATE (GrlNetWc, grl_net_wc, G_TYPE_OBJECT);
90 G_DEFINE_TYPE (GrlNetWc, grl_net_wc, G_TYPE_OBJECT);
9991
10092 static void grl_net_wc_finalize (GObject *object);
10193 static void grl_net_wc_set_property (GObject *object,
136128 *
137129 * The timeout in seconds between connections. All the connections will be
138130 * queued and each one will be dispatched after waiting this value.
131 *
132 * Note that if the grl-net library was compiled against libsoup3, changing
133 * the throttling configuration will show a warning if done after the first
134 * request.
139135 */
140136 g_object_class_install_property (g_klass,
141137 PROP_THROTTLING,
194190 {
195191 struct request_res *rr = op;
196192
193 #if SOUP_CHECK_VERSION (2, 99, 2)
194 g_object_unref (rr->message);
195 #else
197196 g_object_unref (rr->request);
197 #endif
198198 g_slice_free (struct request_res, rr);
199199 }
200200
201 #if ! SOUP_CHECK_VERSION (2, 99, 2)
201202 /*
202203 * use-thread-context is available for libsoup-2.4 >= 2.39.0
203204 * We check in run-time if it's available
205206 static void
206207 set_thread_context (GrlNetWc *self)
207208 {
208 GrlNetWcPrivate *priv = self->priv;
209 GObjectClass *klass = G_OBJECT_GET_CLASS (priv->session);
209 GObjectClass *klass = G_OBJECT_GET_CLASS (self->session);
210210 GParamSpec *spec = g_object_class_find_property (klass,
211211 "use-thread-context");
212212 if (spec)
213 g_object_set (priv->session, "use-thread-context", TRUE, NULL);
214 }
213 g_object_set (self->session, "use-thread-context", TRUE, NULL);
214 }
215 #endif
216
217 #if SOUP_CHECK_VERSION (2, 99, 2)
218 static void
219 ensure_session (GrlNetWc *self)
220 {
221 guint max_conns_per_host = self->throttling > 0 ? 1 : 2;
222
223 if (self->session)
224 return;
225
226 self->session = soup_session_new_with_options ("max-conns-per-host", max_conns_per_host,
227 "user-agent", self->user_agent,
228 NULL);
229 grl_net_wc_set_log_level (self, self->log_level);
230 grl_net_wc_set_cache (self, self->use_cache);
231 grl_net_wc_set_cache_size (self, self->cache_size);
232 }
233 #endif
215234
216235 static void
217236 init_dump_directory (void)
236255 cache_down (GrlNetWc *self)
237256 {
238257 GFile *cache_dir_file;
239 GrlNetWcPrivate *priv = self->priv;
240 SoupSessionFeature *cache = soup_session_get_feature (priv->session, SOUP_TYPE_CACHE);
258 SoupSessionFeature *cache;
241259 gchar *cache_dir;
242260
243261 GRL_DEBUG ("cache down");
244262
263 if (!self->session)
264 return;
265
266 cache = soup_session_get_feature (self->session, SOUP_TYPE_CACHE);
245267 if (!cache) {
246268 return;
247269 }
255277 g_file_delete (cache_dir_file, NULL, NULL);
256278 g_object_unref (G_OBJECT (cache_dir_file));
257279
258 soup_session_remove_feature (priv->session, cache);
280 soup_session_remove_feature (self->session, cache);
259281 }
260282
261283 static void
262284 cache_up (GrlNetWc *self)
263285 {
264286 SoupCache *cache;
265 GrlNetWcPrivate *priv = self->priv;
266287 gchar *dir;
267288
268289 GRL_DEBUG ("cache up");
274295 cache = soup_cache_new (dir, SOUP_CACHE_SINGLE_USER);
275296 g_free (dir);
276297
277 soup_session_add_feature (priv->session,
298 soup_session_add_feature (self->session,
278299 SOUP_SESSION_FEATURE (cache));
279300
280 if (priv->cache_size) {
281 soup_cache_set_max_size (cache, priv->cache_size * 1024 * 1024);
301 if (self->cache_size) {
302 soup_cache_set_max_size (cache, self->cache_size * 1024 * 1024);
282303 }
283304
284305 g_object_unref (cache);
287308 static gboolean
288309 cache_is_available (GrlNetWc *self)
289310 {
290 return soup_session_get_feature (self->priv->session, SOUP_TYPE_CACHE) != NULL;
311 return soup_session_get_feature (self->session, SOUP_TYPE_CACHE) != NULL;
291312 }
292313
293314 static void
299320 static void
300321 finalize_requester (GrlNetWc *self)
301322 {
302 GrlNetWcPrivate *priv = self->priv;
303
304323 cache_down (self);
305 g_free (priv->previous_data);
324 g_free (self->previous_data);
306325 }
307326
308327 static void
310329 {
311330 GRL_LOG_DOMAIN_INIT (wc_log_domain, "wc");
312331
313 wc->priv = grl_net_wc_get_instance_private (wc);
314
315 wc->priv->session = soup_session_async_new ();
316 g_object_set (G_OBJECT (wc->priv->session), "ssl-use-system-ca-file", TRUE, NULL);
317 wc->priv->pending = g_queue_new ();
318
332 #if ! SOUP_CHECK_VERSION (2, 99, 2)
333 wc->session = soup_session_async_new ();
334 g_object_set (G_OBJECT (wc->session), "ssl-use-system-ca-file", TRUE, NULL);
319335 set_thread_context (wc);
336 #endif
337
338 wc->pending = g_queue_new ();
339
320340 init_mock_requester (wc);
321341 init_requester (wc);
322342 }
333353 finalize_requester (wc);
334354 finalize_mock_requester (wc);
335355
336 g_queue_free (wc->priv->pending);
337 g_object_unref (wc->priv->session);
356 g_clear_pointer (&wc->user_agent, g_free);
357 g_queue_free (wc->pending);
358 g_clear_object (&wc->session);
338359
339360 G_OBJECT_CLASS (grl_net_wc_parent_class)->finalize (object);
340361 }
363384 grl_net_wc_set_cache_size (wc, g_value_get_uint (value));
364385 break;
365386 case PROP_USER_AGENT:
366 g_object_set (G_OBJECT (wc->priv->session),
367 "user-agent", g_value_get_string (value),
368 NULL);
387 g_clear_pointer (&wc->user_agent, g_free);
388 wc->user_agent = g_value_dup_string (value);
389 if (wc->session) {
390 g_object_set (G_OBJECT (wc->session),
391 "user-agent", wc->user_agent,
392 NULL);
393 }
369394 break;
370395 default:
371396 G_OBJECT_WARN_INVALID_PROPERTY_ID (wc, propid, pspec);
384409
385410 switch (propid) {
386411 case PROP_LOG_LEVEL:
387 g_value_set_uint (value, wc->priv->log_level);
412 g_value_set_uint (value, wc->log_level);
388413 break;
389414 case PROP_THROTTLING:
390 g_value_set_uint (value, wc->priv->throttling);
415 g_value_set_uint (value, wc->throttling);
391416 break;
392417 case PROP_CACHE:
393 g_value_set_boolean(value, cache_is_available (wc));
418 g_value_set_boolean(value, wc->use_cache);
394419 break;
395420 case PROP_CACHE_SIZE:
396 g_value_set_uint (value, wc->priv->cache_size);
421 g_value_set_uint (value, wc->cache_size);
397422 break;
398423 case PROP_USER_AGENT:
399 g_object_get_property (G_OBJECT (wc->priv->session), "user_agent", value);
424 g_value_set_string (value, wc->user_agent);
400425 break;
401426 default:
402427 G_OBJECT_WARN_INVALID_PROPERTY_ID (wc, propid, pspec);
426451 static void
427452 parse_error (guint status,
428453 const gchar *reason,
429 const gchar *response,
430454 GSimpleAsyncResult *result)
431455 {
432 if (!response || *response == '\0')
433 response = reason;
434
435456 switch (status) {
457 #if ! SOUP_CHECK_VERSION (2, 99, 2)
436458 case SOUP_STATUS_CANT_RESOLVE:
437459 case SOUP_STATUS_CANT_CONNECT:
438460 case SOUP_STATUS_SSL_FAILED:
447469 G_IO_ERROR_PROXY_FAILED,
448470 _("Cannot connect to the proxy server"));
449471 return;
472 #endif
450473 case SOUP_STATUS_INTERNAL_SERVER_ERROR: /* 500 */
474 #if ! SOUP_CHECK_VERSION (2, 99, 2)
451475 case SOUP_STATUS_MALFORMED:
476 #endif
452477 case SOUP_STATUS_BAD_REQUEST: /* 400 */
453478 g_simple_async_result_set_error (result, GRL_NET_WC_ERROR,
454479 GRL_NET_WC_ERROR_PROTOCOL_ERROR,
455480 _("Invalid request URI or header: %s"),
456 response);
481 reason);
457482 return;
458483 case SOUP_STATUS_UNAUTHORIZED: /* 401 */
459484 case SOUP_STATUS_FORBIDDEN: /* 403 */
460485 g_simple_async_result_set_error (result, GRL_NET_WC_ERROR,
461486 GRL_NET_WC_ERROR_AUTHENTICATION_REQUIRED,
462 _("Authentication required: %s"), response);
487 _("Authentication required: %s"), reason);
463488 return;
464489 case SOUP_STATUS_NOT_FOUND: /* 404 */
465490 g_simple_async_result_set_error (result, GRL_NET_WC_ERROR,
466491 GRL_NET_WC_ERROR_NOT_FOUND,
467492 _("The requested resource was not found: %s"),
468 response);
493 reason);
469494 return;
470495 case SOUP_STATUS_CONFLICT: /* 409 */
471496 case SOUP_STATUS_PRECONDITION_FAILED: /* 412 */
472497 g_simple_async_result_set_error (result, GRL_NET_WC_ERROR,
473498 GRL_NET_WC_ERROR_CONFLICT,
474499 _("The entry has been modified since it was downloaded: %s"),
475 response);
476 return;
500 reason);
501 return;
502 #if ! SOUP_CHECK_VERSION (2, 99, 2)
477503 case SOUP_STATUS_CANCELLED:
478504 g_simple_async_result_set_error (result, G_IO_ERROR,
479505 G_IO_ERROR_CANCELLED,
480506 _("Operation was cancelled"));
481507 return;
508 #endif
482509 default:
483510 GRL_DEBUG ("Unhandled status: %s", soup_status_get_phrase (status));
484511 g_simple_async_result_set_error (result, G_IO_ERROR,
500527 }
501528
502529 static void
503 dump_data (SoupURI *uri,
530 dump_data (const char *uri_string,
504531 const char *buffer,
505532 const gsize length)
506533 {
507534 if (!capture_dir)
508535 return;
509
510 char *uri_string = soup_uri_to_string (uri, FALSE);
511536
512537 /* Write request content to file in capture directory. */
513538 char *request_filename = build_request_filename (uri_string);
541566 }
542567
543568 g_free (request_filename);
544 g_free (uri_string);
545569 }
546570
547571 static void
604628 }
605629
606630 {
607 SoupMessage *msg =
608 soup_request_http_get_message (SOUP_REQUEST_HTTP (rr->request));
609
610 if (msg && msg->status_code != SOUP_STATUS_OK) {
611 parse_error (msg->status_code,
612 msg->reason_phrase,
613 msg->response_body->data,
631 g_autoptr(SoupMessage) msg = NULL;
632 guint status_code;
633 const char *reason_phrase;
634
635 #if SOUP_CHECK_VERSION (2, 99, 2)
636 msg = g_object_ref (rr->message);
637 status_code = soup_message_get_status (msg);
638 reason_phrase = soup_message_get_reason_phrase (msg);
639 #else
640 msg = soup_request_http_get_message (SOUP_REQUEST_HTTP (rr->request));
641 status_code = msg->status_code;
642 reason_phrase = msg->reason_phrase;
643 #endif
644
645 if (status_code != SOUP_STATUS_OK) {
646 parse_error (status_code,
647 reason_phrase,
614648 G_SIMPLE_ASYNC_RESULT (user_data));
615 g_object_unref (msg);
616649 }
617650 }
618651
625658 GAsyncResult *res,
626659 gpointer user_data)
627660 {
661 #if SOUP_CHECK_VERSION (2, 99, 2)
662 SoupSession *session = SOUP_SESSION (source);
663 SoupMessage *message = soup_session_get_async_result_message (session, res);
664 SoupMessageHeaders *response_hdrs = soup_message_get_response_headers (message);
665 #endif
628666 GSimpleAsyncResult *result = G_SIMPLE_ASYNC_RESULT (user_data);
629667 struct request_res *rr = g_simple_async_result_get_op_res_gpointer (result);
630668
631669 GError *error = NULL;
670 #if SOUP_CHECK_VERSION (2, 99, 2)
671 GInputStream *in = soup_session_send_finish (session, res, &error);
672 #else
632673 GInputStream *in = soup_request_send_finish (rr->request, res, &error);
674 #endif
633675
634676 if (error) {
635677 if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
646688 return;
647689 }
648690
691 #if SOUP_CHECK_VERSION (2, 99, 2)
692 rr->length = soup_message_headers_get_content_length (response_hdrs) + 1;
693 #else
649694 rr->length = soup_request_get_content_length (rr->request) + 1;
695 #endif
650696 if (rr->length == 1)
651697 rr->length = 50 * 1024;
652698
668714 GAsyncResult *result,
669715 GCancellable *cancellable)
670716 {
671 GrlNetWcPrivate *priv = self->priv;
672 SoupURI *uri;
673717 struct request_res *rr = g_slice_new0 (struct request_res);
674718
675719 g_simple_async_result_set_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result),
676720 rr,
677721 NULL);
678722
679 uri = soup_uri_new (url);
680 if (uri) {
681 rr->request = soup_session_request_uri (priv->session, uri, NULL);
682 soup_uri_free (uri);
683 } else {
684 rr->request = NULL;
685 }
686
723 #if SOUP_CHECK_VERSION (2, 99, 2)
724 {
725 g_autoptr(GUri) uri = NULL;
726
727 uri = g_uri_parse (url, SOUP_HTTP_URI_FLAGS, NULL);
728 rr->message = soup_message_new_from_uri (SOUP_METHOD_GET, uri);
729 }
730 #else
731 rr->request = soup_session_request (self->session, url, NULL);
732 #endif
733
734 #if SOUP_CHECK_VERSION (2, 99, 2)
735 if (!rr->message) {
736 #else
687737 if (!rr->request) {
738 #endif
688739 g_simple_async_result_set_error (G_SIMPLE_ASYNC_RESULT (result),
689740 G_IO_ERROR,
690741 G_IO_ERROR_INVALID_ARGUMENT,
696747 }
697748
698749 if (headers != NULL) {
699 SoupMessage *message;
750 g_autoptr(SoupMessage) message = NULL;
700751 GHashTableIter iter;
701752 const char *key, *value;
702753
754 #if SOUP_CHECK_VERSION (2, 99, 2)
755 message = g_object_ref (rr->message);
756 #else
703757 message = soup_request_http_get_message (SOUP_REQUEST_HTTP (rr->request));
758 #endif
704759
705760 if (message) {
706761 g_hash_table_iter_init (&iter, headers);
707762 while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *)&value)) {
763 #if SOUP_CHECK_VERSION (2, 99, 2)
764 soup_message_headers_append (soup_message_get_request_headers (message), key, value);
765 #else
708766 soup_message_headers_append (message->request_headers, key, value);
767 #endif
709768 }
710 g_object_unref (message);
711769 }
712770 }
713771
772 #if SOUP_CHECK_VERSION (2, 99, 2)
773 soup_session_send_async (self->session, rr->message, G_PRIORITY_DEFAULT,
774 cancellable, reply_cb, result);
775 #else
714776 soup_request_send_async (rr->request, cancellable, reply_cb, result);
777 #endif
715778 }
716779
717780 static gboolean
721784
722785 /* validation */
723786 {
724 GrlNetWcPrivate *priv = c->self->priv;
725 struct request_clos *d = g_queue_pop_tail (priv->pending);
787 struct request_clos *d = g_queue_pop_tail (c->self->pending);
726788 g_assert (c == d);
727789 }
728790
744806 guint id;
745807 gint64 now;
746808 struct request_clos *c;
747 GrlNetWcPrivate *priv = self->priv;
748809
749810 /* closure */
750811 c = g_new (struct request_clos, 1);
759820 /* If grl-net-wc is not mocked, we need to check if throttling is set
760821 * otherwise the throttling delay check would always be true */
761822 if (is_mocked ()
762 || priv->throttling == 0
763 || (now - priv->last_request) > priv->throttling) {
764 priv->last_request = now;
823 || self->throttling == 0
824 || (now - self->last_request) > self->throttling) {
825 self->last_request = now;
765826 id = g_idle_add_full (G_PRIORITY_HIGH_IDLE,
766827 get_url_cb, c, request_clos_destroy);
767828 } else {
768 priv->last_request += priv->throttling;
829 self->last_request += self->throttling;
769830
770831 GRL_DEBUG ("delaying web request by %" G_GINT64_FORMAT " seconds",
771 priv->last_request - now);
832 self->last_request - now);
772833 id = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT,
773 priv->last_request - now,
834 self->last_request - now,
774835 get_url_cb, c, request_clos_destroy);
775836 }
776837 g_source_set_name_by_id (id, "[grl-net] get_url_cb");
777838
778839 c->source_id = id;
779 g_queue_push_head (self->priv->pending, c);
840 g_queue_push_head (self->pending, c);
780841 }
781842
782843 static void
785846 gchar **content,
786847 gsize *length)
787848 {
788 GrlNetWcPrivate *priv = self->priv;
789849 struct request_res *rr = op;
790850
791 g_clear_pointer (&priv->previous_data, g_free);
851 g_clear_pointer (&self->previous_data, g_free);
792852
793853 if (is_mocked ()) {
794 get_content_mocked (self, op, &(priv->previous_data), length);
854 get_content_mocked (self, op, &(self->previous_data), length);
795855 } else {
796 dump_data (soup_request_get_uri (rr->request),
856 g_autofree char *uri = NULL;
857 #if SOUP_CHECK_VERSION (2, 99, 2)
858 uri = g_uri_to_string (soup_message_get_uri (rr->message));
859 #else
860 uri = soup_uri_to_string (soup_request_get_uri (rr->request), FALSE);
861 #endif
862 dump_data (uri,
797863 rr->buffer,
798864 rr->offset);
799 priv->previous_data = rr->buffer;
865 self->previous_data = rr->buffer;
800866 if (length) {
801867 *length = rr->offset;
802868 }
803869 }
804870
805871 if (content)
806 *content = self->priv->previous_data;
872 *content = self->previous_data;
807873 else {
808874 if (length) {
809875 *length = 0;
933999 {
9341000 GSimpleAsyncResult *result;
9351001
1002 #if SOUP_CHECK_VERSION (2, 99, 2)
1003 ensure_session (self);
1004 #endif
9361005 result = g_simple_async_result_new (G_OBJECT (self),
9371006 callback,
9381007 user_data,
10091078 g_return_if_fail (log_level <= 3);
10101079 g_return_if_fail (GRL_IS_NET_WC (self));
10111080
1012 if (self->priv->log_level == log_level)
1013 return;
1014
1015 soup_session_remove_feature_by_type (self->priv->session, SOUP_TYPE_LOGGER);
1016
1081 self->log_level = log_level;
1082 if (!self->session)
1083 return;
1084
1085 soup_session_remove_feature_by_type (self->session, SOUP_TYPE_LOGGER);
1086
1087 #if SOUP_CHECK_VERSION (2, 99, 2)
1088 logger = soup_logger_new ((SoupLoggerLogLevel) log_level);
1089 #else
10171090 logger = soup_logger_new ((SoupLoggerLogLevel) log_level, -1);
1018 soup_session_add_feature (self->priv->session, SOUP_SESSION_FEATURE (logger));
1091 #endif
1092 soup_session_add_feature (self->session, SOUP_SESSION_FEATURE (logger));
10191093 g_object_unref (logger);
10201094
1021 self->priv->log_level = (SoupLoggerLogLevel) log_level;
1095 self->log_level = (SoupLoggerLogLevel) log_level;
10221096 }
10231097
10241098 /**
10281102 *
10291103 * Setting this property, the #GrlNetWc will queue all the requests and
10301104 * will dispatch them with a pause between them of this value.
1105 *
1106 * Note that if the grl-net library was compiled against libsoup3, changing
1107 * the throttling configuration will show a warning if done after the first
1108 * request.
10311109 */
10321110 void
10331111 grl_net_wc_set_throttling (GrlNetWc *self,
10351113 {
10361114 g_return_if_fail (GRL_IS_NET_WC (self));
10371115
1116 self->throttling = throttling;
1117 if (!self->session)
1118 return;
1119
1120 #if SOUP_CHECK_VERSION (2, 99, 2)
1121 if (self->session) {
1122 g_warning ("\"throttling\" can only be set before the first request is made.");
1123 return;
1124 }
1125 #endif
1126
10381127 if (throttling > 0) {
10391128 /* max conns per host = 1 */
1040 g_object_set (self->priv->session,
1041 SOUP_SESSION_MAX_CONNS_PER_HOST, 1, NULL);
1129 g_object_set (self->session,
1130 "max-conns-per-host", 1, NULL);
10421131 } else {
10431132 /* default value */
1044 g_object_set (self->priv->session,
1045 SOUP_SESSION_MAX_CONNS_PER_HOST, 2, NULL);
1046 }
1047
1048 self->priv->throttling = throttling;
1133 g_object_set (self->session,
1134 "max-conns-per-host", 2, NULL);
1135 }
10491136 }
10501137
10511138 /**
10651152 {
10661153 g_return_if_fail (GRL_IS_NET_WC (self));
10671154
1155 self->use_cache = use_cache;
1156 if (!self->session)
1157 return;
1158
10681159 if (use_cache && !cache_is_available (self))
10691160 cache_up (self);
10701161 else if (!use_cache && cache_is_available (self))
10871178 {
10881179 g_return_if_fail (GRL_IS_NET_WC (self));
10891180
1090 if (self->priv->cache_size == size)
1091 return;
1092
1093 self->priv->cache_size = size;
1094
1095 SoupSessionFeature *cache = soup_session_get_feature (self->priv->session, SOUP_TYPE_CACHE);
1181 self->cache_size = size;
1182 if (!self->session)
1183 return;
1184
1185 SoupSessionFeature *cache = soup_session_get_feature (self->session, SOUP_TYPE_CACHE);
10961186 if (!cache)
10971187 return;
10981188
11081198 void
11091199 grl_net_wc_flush_delayed_requests (GrlNetWc *self)
11101200 {
1111 GrlNetWcPrivate *priv = self->priv;
11121201 struct request_clos *c;
11131202
11141203 g_return_if_fail (GRL_IS_NET_WC (self));
11151204
1116 while ((c = g_queue_pop_head (priv->pending))) {
1205 while ((c = g_queue_pop_head (self->pending))) {
11171206 if (c->cancellable)
11181207 g_cancellable_cancel (c->cancellable);
11191208 /* This will call the destroy notify, request_clos_destroy() */
11201209 g_source_remove (c->source_id);
11211210 }
11221211
1123 priv->last_request = g_get_real_time() / G_USEC_PER_SEC;
1124 }
1212 self->last_request = g_get_real_time() / G_USEC_PER_SEC;
1213 }
8888 G_DEFINE_AUTOPTR_CLEANUP_FUNC (GrlNetWc, g_object_unref)
8989
9090 /**
91 * GrlNetWc:
92 * @parent: the parent object struct
93 */
94 struct _GrlNetWc
95 {
96 GObject parent;
97
98 /*< private >*/
99 GrlNetWcPrivate *priv;
100 };
101
102 /**
10391 * GrlNetWcClass:
10492 * @parent_class: the parent class structure
10593 *
5555 'datadir=${datarootdir}',
5656 'girdir=' + girdir_for_pc_file,
5757 'typelibdir=' + typelibdir_for_pc_file,
58 'soupapiversion=' + soup_api_version,
5859 ],
5960 )
6061
6667 identifier_prefix: 'GrlNet',
6768 symbol_prefix: 'grl_net',
6869 dependencies: [ gobject_dep, gio_dep, libsoup_dep ],
69 includes: [ 'GObject-2.0', 'Gio-2.0', 'Soup-2.4' ],
70 includes: [ 'GObject-2.0', 'Gio-2.0', 'Soup-' + soup_api_version ],
7071 include_directories: libs_inc,
7172 install: true,
7273 extra_args: [ '--c-include=net/grl-net.h' ])
55 # Copyright (C) 2016 Igalia S.L. All rights reserved.
66
77 project('grilo', 'c',
8 version: '0.3.14',
8 version: '0.3.15',
99 default_options: [
1010 'buildtype=debugoptimized',
1111 'c_std=gnu99',
1212 'warning_level=1'
1313 ],
1414 license: 'LGPL-2.1-or-later',
15 meson_version: '>= 0.46.0')
15 meson_version: '>= 0.47.0')
1616
1717 grilo_version = meson.project_version()
1818 grlnet_version = meson.project_version()
3636 grl_majorminor = '@0@.@1@'.format(version_array[0], version_array[1])
3737 grl_name = '@0@-@1@'.format(meson.project_name(), grl_majorminor)
3838
39 glib2_required = '2.58'
39 glib2_required = '2.66'
4040 glib2_required_info = '>= @0@'.format(glib2_required)
4141
4242 gio_dep = dependency('gio-2.0', version: glib2_required_info, required: true)
4747
4848 enable_grlnet = get_option('enable-grl-net')
4949 if enable_grlnet
50 libsoup_dep = dependency('libsoup-2.4', version: '>= 2.41.3', required: true)
50 if get_option('soup3')
51 libsoup_dep = dependency('libsoup-3.0', version: '>= 2.99.2', required: true)
52 soup_api_version = '3.0'
53 else
54 libsoup_dep = dependency('libsoup-2.4', version: '>= 2.41.3', required: true)
55 soup_api_version = '2.4'
56 endif
5157 endif
5258
5359 enable_grlpls = get_option('enable-grl-pls')
33 option('enable-introspection', type: 'boolean', value: true, description: 'Enable GObject Introspection')
44 option('enable-test-ui', type: 'boolean', value: true, description: 'Build Test UI')
55 option('enable-vala', type: 'boolean', value: true, description: 'Enable Vala (enables GObject Introspection)')
6 option('soup3', type: 'boolean', value: true, description: 'Whether to use libsoup3')
0 ab
01 as
12 be
23 bg
1112 eo
1213 es
1314 eu
15 fa
1416 fi
1517 fr
1618 fur
2123 id
2224 it
2325 ja
26 ka
2427 ko
2528 lt
2629 lv
0 # Abkhazian translation for grilo.
1 # Copyright (C) 2022 grilo's COPYRIGHT HOLDER
2 # This file is distributed under the same license as the grilo package.
3 # Нанба Наала <naala-nanba@rambler.ru>, 2022.
4 #
5 msgid ""
6 msgstr ""
7 "Project-Id-Version: grilo master\n"
8 "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo/issues\n"
9 "POT-Creation-Date: 2021-11-16 23:26+0000\n"
10 "PO-Revision-Date: 2021-11-16 23:26+0000\n"
11 "Last-Translator: Нанба Наала <naala-nanba@rambler.ru>\n"
12 "Language-Team: Abkhazian <ab@li.org>\n"
13 "Language: ab\n"
14 "MIME-Version: 1.0\n"
15 "Content-Type: text/plain; charset=UTF-8\n"
16 "Content-Transfer-Encoding: 8bit\n"
17
18 #: libs/net/grl-net-mock.c:86
19 msgid "No mock definition found"
20 msgstr "Арыԥҵә ахҳәаа ԥшааӡам"
21
22 #: libs/net/grl-net-mock.c:98
23 #, c-format
24 msgid "Could not find mock content %s"
25 msgstr "Арыԥҵә %s аҵакы аԥшаара залымшахеит"
26
27 #: libs/net/grl-net-mock.c:116
28 #, c-format
29 msgid "Could not access mock content: %s"
30 msgstr "Арыԥҵә аҵакы ахь анеира залыршахом: %s "
31
32 #: libs/net/grl-net-wc.c:443
33 msgid "Cannot connect to the server"
34 msgstr "Асервер аҿакра залыршахом"
35
36 #: libs/net/grl-net-wc.c:449
37 msgid "Cannot connect to the proxy server"
38 msgstr "Апрокси-сервер аҿакра залыршахом"
39
40 #: libs/net/grl-net-wc.c:456
41 #, c-format
42 msgid "Invalid request URI or header: %s"
43 msgstr "Ииашам URI, мамзар адҵаалара ахы : %s"
44
45 #: libs/net/grl-net-wc.c:463
46 #, c-format
47 msgid "Authentication required: %s"
48 msgstr "Иаҭахуп ахаҭара шьақәыргылара: %s"
49
50 #: libs/net/grl-net-wc.c:468
51 #, c-format
52 msgid "The requested resource was not found: %s"
53 msgstr "Адҵаалара ззыҟаҵоу алшарақәа ԥшааӡам: %s"
54
55 #: libs/net/grl-net-wc.c:475
56 #, c-format
57 msgid "The entry has been modified since it was downloaded: %s"
58 msgstr "Анҵамҭа ԥсахын ианҭагалаз нахыс : %s"
59
60 #: libs/net/grl-net-wc.c:481 libs/net/grl-net-wc.c:593 libs/pls/grl-pls.c:493
61 #: src/grl-source.c:1821 src/grl-source.c:1921 src/grl-source.c:2068
62 #: src/grl-source.c:2325 src/grl-source.c:2446
63 #, c-format
64 msgid "Operation was cancelled"
65 msgstr "Аоперациа аԥыхоуп"
66
67 #: libs/net/grl-net-wc.c:597 libs/net/grl-net-wc.c:641
68 msgid "Data not available"
69 msgstr "Адыррқәа рахь анеира залыршахом"
70
71 #: libs/net/grl-net-wc.c:692
72 #, c-format
73 msgid "Invalid URL %s"
74 msgstr "Ииашам URL %s"
75
76 #: src/grilo.c:218
77 msgid "Semicolon-separated paths containing Grilo plugins"
78 msgstr "Амҩақәа, Grilo амодульқәа змоу, иеиҟәшоу акәаԥи аҿарҵәи рыла "
79
80 #: src/grilo.c:220
81 msgid "Colon-separated paths containing Grilo plugins"
82 msgstr "Амҩақәа, Grilo амодульқәа змоу, ҩ-кәаԥк рыла иеиҟәшоу"
83
84 #: src/grilo.c:223
85 msgid "Colon-separated list of Grilo plugins to use"
86 msgstr "Ахархәара зызу амодульқәа Grilo рыхьӡынҵа, ҩ-кәаԥк иеиҟәшагас измоу"
87
88 #: src/grilo.c:228
89 msgid "Grilo Options"
90 msgstr "Grilo ахышәарақәа"
91
92 #: src/grilo.c:229
93 msgid "Show Grilo Options"
94 msgstr "Grilo ахышәарақәа рырбара"
95
96 #: src/grl-multiple.c:134
97 #, c-format
98 msgid "No searchable sources available"
99 msgstr "Аԥшааразы анеиразин змоу ахыҵхырҭақәа ыҟаӡам"
100
101 #: src/grl-multiple.c:511
102 #, c-format
103 msgid "Could not resolve media for URI “%s”"
104 msgstr " URI \"%s\" азы аныҟәгага аилкаара залыршахом"
105
106 #: src/grl-registry.c:499 src/grl-registry.c:1538
107 #, c-format
108 msgid "Plugin “%s” is already loaded"
109 msgstr " Амодуль «%s» шьҭа иҭагалоуп"
110
111 #: src/grl-registry.c:523
112 #, c-format
113 msgid "Failed to initialize plugin from %s"
114 msgstr "%s аҟынтә амодуль аҭагылазаашьа арбара залымшахеит"
115
116 #: src/grl-registry.c:565
117 #, c-format
118 msgid "Metadata key “%s” already registered in different format"
119 msgstr "Аметадыррақәа рцыԥха «%s» даҽа форматк аманы иҭагалоуп"
120
121 #: src/grl-registry.c:578
122 #, c-format
123 msgid "Metadata key “%s” cannot be registered"
124 msgstr "Аметадыррақәа рцыԥха «%s» аҭагалара залыршахом"
125
126 #: src/grl-registry.c:1144
127 #, c-format
128 msgid "Source with id “%s” was not found"
129 msgstr "Ахыҵхырҭа аиԥшрагәаҭара «%s» змоу ԥшааӡам"
130
131 #: src/grl-registry.c:1218
132 #, c-format
133 msgid "Failed to load plugin from %s"
134 msgstr "Амодуль %s аҟынтә аҭагалараан иҟалеит агха"
135
136 #: src/grl-registry.c:1227
137 #, c-format
138 msgid "Invalid plugin file %s"
139 msgstr "амодуль «%s» афаил иашам "
140
141 #: src/grl-registry.c:1238
142 #, c-format
143 msgid "“%s” is not a valid plugin file"
144 msgstr "«%s» ииашоу афаил амодуль акәӡам"
145
146 #: src/grl-registry.c:1257
147 #, c-format
148 msgid "Plugin “%s” already exists"
149 msgstr "Амодуль «%s» шьҭа иҟоуп"
150
151 #: src/grl-registry.c:1420
152 #, c-format
153 msgid "Invalid path %s"
154 msgstr "Иақәнагам амҩа %s"
155
156 #: src/grl-registry.c:1487
157 #, c-format
158 msgid "All configured plugin paths are invalid"
159 msgstr "Амодульқәа рконфигурациатәра амҩақәа зегьы иашаӡам"
160
161 #: src/grl-registry.c:1527
162 #, c-format
163 msgid "Plugin “%s” not available"
164 msgstr " Амодуль : «%s» ахь анеира залыршахом"
165
166 #: src/grl-registry.c:1755
167 #, c-format
168 msgid "Plugin not found: “%s”"
169 msgstr "Амодуль ԥшааӡам :«%s»"
170
171 #: src/grl-registry.c:2066
172 #, c-format
173 msgid "Plugin configuration does not contain “plugin-id” reference"
174 msgstr "Амодульқәа рконфигурациатәра иамаӡам ахцәажәара «plugin-id»"
175
176 #: src/grl-source.c:2775
177 #, c-format
178 msgid "Some keys could not be written"
179 msgstr "Цыԥхақәак рынҵара залыршахом"
180
181 #: src/grl-source.c:2848
182 #, c-format
183 msgid "None of the specified keys are writable"
184 msgstr "Иарбоу ацаԥхақәа рыбжьара иҟаӡам ианҵатәқәоу"
185
186 #: src/grl-source.c:4191
187 #, c-format
188 msgid "Media has no “id”, cannot remove"
189 msgstr "Аныҟәгага иамаӡам «id», уи аныхра залыршахаӡом"
00 # Bulgarian translation of grilo po-file.
11 # Copyright (C) 2016 Free Software Foundation, Inc.
2 # Copyright (C) 2022 Alexander Shopov.
23 # This file is distributed under the same license as the grilo package.
3 # Alexander Shopov <ash@kambanaria.org>, 2016.
4 # Alexander Shopov <ash@kambanaria.org>, 2016, 2022.
45 #
56 msgid ""
67 msgstr ""
78 "Project-Id-Version: grilo master\n"
8 "Report-Msgid-Bugs-To: \n"
9 "POT-Creation-Date: 2016-09-25 16:09+0300\n"
10 "PO-Revision-Date: 2016-09-25 15:41+0300\n"
9 "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo/issues\n"
10 "POT-Creation-Date: 2022-02-17 20:10+0000\n"
11 "PO-Revision-Date: 2022-03-22 18:20+0100\n"
1112 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
1213 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
1314 "Language: bg\n"
1617 "Content-Transfer-Encoding: 8bit\n"
1718 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
1819
19 #: ../libs/net/grl-net-mock.c:86
20 #: libs/net/grl-net-mock.c:86
2021 msgid "No mock definition found"
2122 msgstr "Няма дефиниция на имитиращ обект"
2223
23 #: ../libs/net/grl-net-mock.c:98
24 #: libs/net/grl-net-mock.c:98
2425 #, c-format
2526 msgid "Could not find mock content %s"
2627 msgstr "Имитиращият обект е без съдържание: %s"
2728
28 #: ../libs/net/grl-net-mock.c:116
29 #: libs/net/grl-net-mock.c:116
2930 #, c-format
3031 msgid "Could not access mock content: %s"
3132 msgstr "Имитиращото съдържание е недостъпно: %s"
3233
33 #: ../libs/net/grl-net-wc.c:449
34 #: libs/net/grl-net-wc.c:443
3435 msgid "Cannot connect to the server"
3536 msgstr "Неуспешна връзка към сървъра"
3637
37 #: ../libs/net/grl-net-wc.c:455
38 #: libs/net/grl-net-wc.c:449
3839 msgid "Cannot connect to the proxy server"
3940 msgstr "Неуспешна връзка към сървъра-посредник"
4041
41 #: ../libs/net/grl-net-wc.c:462
42 #: libs/net/grl-net-wc.c:456
4243 #, c-format
4344 msgid "Invalid request URI or header: %s"
4445 msgstr "Неправилен адрес или заглавна част на заявката: %s"
4546
46 #: ../libs/net/grl-net-wc.c:469
47 #: libs/net/grl-net-wc.c:463
4748 #, c-format
4849 msgid "Authentication required: %s"
4950 msgstr "Задължително е да се идентифицирате: %s"
5051
51 #: ../libs/net/grl-net-wc.c:474
52 #: libs/net/grl-net-wc.c:468
5253 #, c-format
5354 msgid "The requested resource was not found: %s"
5455 msgstr "Заявеният ресурс не е открит: %s"
5556
56 #: ../libs/net/grl-net-wc.c:481
57 #: libs/net/grl-net-wc.c:475
5758 #, c-format
5859 msgid "The entry has been modified since it was downloaded: %s"
5960 msgstr "Обектът е променен след изтеглянето му: %s"
6061
61 #: ../libs/net/grl-net-wc.c:487 ../libs/net/grl-net-wc.c:596
62 #: ../libs/pls/grl-pls.c:490 ../src/grl-source.c:1828 ../src/grl-source.c:1928
63 #: ../src/grl-source.c:2075 ../src/grl-source.c:2332 ../src/grl-source.c:2453
62 #: libs/net/grl-net-wc.c:481 libs/net/grl-net-wc.c:593 libs/pls/grl-pls.c:493
63 #: src/grl-source.c:1821 src/grl-source.c:1921 src/grl-source.c:2068
64 #: src/grl-source.c:2325 src/grl-source.c:2446
6465 #, c-format
6566 msgid "Operation was cancelled"
6667 msgstr "Действието е отменено"
6768
68 #: ../libs/net/grl-net-wc.c:490
69 #, c-format
70 msgid "Unhandled status: %s"
71 msgstr "Необработено състояние: %s"
72
73 #: ../libs/net/grl-net-wc.c:600 ../libs/net/grl-net-wc.c:644
69 #: libs/net/grl-net-wc.c:597 libs/net/grl-net-wc.c:641
7470 msgid "Data not available"
7571 msgstr "Няма данни"
7672
77 #: ../libs/net/grl-net-wc.c:695
73 #: libs/net/grl-net-wc.c:692
7874 #, c-format
7975 msgid "Invalid URL %s"
8076 msgstr "Неправилен адрес: %s"
8177
82 #: ../src/grilo.c:218
78 #: src/grilo.c:218
8379 msgid "Semicolon-separated paths containing Grilo plugins"
8480 msgstr "Пътища, разделени с „;“, с приставки на Grilo"
8581
86 #: ../src/grilo.c:220
82 #: src/grilo.c:220
8783 msgid "Colon-separated paths containing Grilo plugins"
8884 msgstr "Пътища, разделени с „:“, с приставки на Grilo"
8985
90 #: ../src/grilo.c:223
86 #: src/grilo.c:223
9187 msgid "Colon-separated list of Grilo plugins to use"
9288 msgstr "Пътища, разделени с „:“, с приставки на Grilo за ползване"
9389
94 #: ../src/grilo.c:228
90 #: src/grilo.c:228
9591 msgid "Grilo Options"
9692 msgstr "Опции на Grilo"
9793
98 #: ../src/grilo.c:229
94 #: src/grilo.c:229
9995 msgid "Show Grilo Options"
10096 msgstr "Извеждане на опциите на Grilo"
10197
102 #: ../src/grl-multiple.c:134
98 #: src/grl-multiple.c:134
10399 #, c-format
104100 msgid "No searchable sources available"
105101 msgstr "Няма източници, поддържащи търсене"
106102
107 #: ../src/grl-multiple.c:511
103 #: src/grl-multiple.c:511
108104 #, c-format
109 msgid "Could not resolve media for URI '%s'"
105 msgid "Could not resolve media for URI “%s”"
110106 msgstr "На адреса „%s“ не може да бъде открита медия"
111107
112 #: ../src/grl-registry.c:464 ../src/grl-registry.c:1377
108 #: src/grl-registry.c:499 src/grl-registry.c:1538
113109 #, c-format
114 msgid "Plugin '%s' is already loaded"
110 msgid "Plugin “%s” is already loaded"
115111 msgstr "Приставката „%s“ вече е заредена"
116112
117 #: ../src/grl-registry.c:488
113 #: src/grl-registry.c:523
118114 #, c-format
119115 msgid "Failed to initialize plugin from %s"
120116 msgstr "Приставката в „%s“ не може да се инициализира"
121117
122 #: ../src/grl-registry.c:530
118 #: src/grl-registry.c:565
123119 #, c-format
124 msgid "Metadata key '%s' already registered in different format"
120 msgid "Metadata key “%s” already registered in different format"
125121 msgstr "Ключът за метаданни „%s“ вече е регистриран с различен формат"
126122
127 #: ../src/grl-registry.c:543
123 #: src/grl-registry.c:578
128124 #, c-format
129 msgid "Metadata key '%s' cannot be registered"
125 msgid "Metadata key “%s” cannot be registered"
130126 msgstr "Ключът за метаданни „%s“ не може да бъде регистриран"
131127
132 #: ../src/grl-registry.c:983
128 #: src/grl-registry.c:1144
133129 #, c-format
134 msgid "Source with id '%s' was not found"
130 msgid "Source with id “%s” was not found"
135131 msgstr "Източник с идентификатор „%s“ липсва"
136132
137 #: ../src/grl-registry.c:1057
133 #: src/grl-registry.c:1218
138134 #, c-format
139135 msgid "Failed to load plugin from %s"
140136 msgstr "Приставката в „%s“ не може да се зареди"
141137
142 #: ../src/grl-registry.c:1066
138 #: src/grl-registry.c:1227
143139 #, c-format
144140 msgid "Invalid plugin file %s"
145141 msgstr "Неправилен файл за приставка „%s“"
146142
147 #: ../src/grl-registry.c:1077
143 #: src/grl-registry.c:1238
148144 #, c-format
149 msgid "'%s' is not a valid plugin file"
145 msgid "“%s” is not a valid plugin file"
150146 msgstr "„%s“ не е файл за приставка"
151147
152 #: ../src/grl-registry.c:1096
148 #: src/grl-registry.c:1257
153149 #, c-format
154 msgid "Plugin '%s' already exists"
155 msgstr "Приставката в „%s“ вече съществува"
150 msgid "Plugin “%s” already exists"
151 msgstr "Приставката „%s“ вече съществува"
156152
157 #: ../src/grl-registry.c:1259
153 #: src/grl-registry.c:1420
158154 #, c-format
159155 msgid "Invalid path %s"
160156 msgstr "Неправилен път: „%s“"
161157
162 #: ../src/grl-registry.c:1326
158 #: src/grl-registry.c:1487
163159 #, c-format
164160 msgid "All configured plugin paths are invalid"
165161 msgstr "Всички настроени пътища за приставки са грешни"
166162
167 #: ../src/grl-registry.c:1366
163 #: src/grl-registry.c:1527
168164 #, c-format
169 msgid "Plugin '%s' not available"
165 msgid "Plugin “%s” not available"
170166 msgstr "Приставката „%s“ липсва"
171167
172 #: ../src/grl-registry.c:1594
168 #: src/grl-registry.c:1755
173169 #, c-format
174 msgid "Plugin not found: '%s'"
170 msgid "Plugin not found: “%s”"
175171 msgstr "Приставката „%s“ липсва"
176172
177 #: ../src/grl-registry.c:1905
173 #: src/grl-registry.c:2066
178174 #, c-format
179 msgid "Plugin configuration does not contain 'plugin-id' reference"
175 msgid "Plugin configuration does not contain “plugin-id” reference"
180176 msgstr "Настройките за приставка не съдържат указател към „plugin-id“"
181177
182 #: ../src/grl-source.c:2782
178 #: src/grl-source.c:2775
183179 #, c-format
184180 msgid "Some keys could not be written"
185 msgstr "Някои ключове не могат да се запишат"
181 msgstr "Някои ключове не може да се запишат"
186182
187 #: ../src/grl-source.c:2855
183 #: src/grl-source.c:2848
188184 #, c-format
189185 msgid "None of the specified keys are writable"
190186 msgstr "В никой от посочените ключове не може да се пише"
191187
192 #: ../src/grl-source.c:4198
188 #: src/grl-source.c:4191
193189 #, c-format
194 msgid "Media has no 'id', cannot remove"
190 msgid "Media has no “id”, cannot remove"
195191 msgstr "Медията е без идентификатор и не може да бъде премахната"
0 # Persian translation for grilo.
1 # Copyright (C) 2022 grilo's COPYRIGHT HOLDER
2 # This file is distributed under the same license as the grilo package.
3 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
4 # Ahmad Haghighi <haghighi.ahmad@gmail.com>, 2022.
5 #
6 msgid ""
7 msgstr ""
8 "Project-Id-Version: grilo master\n"
9 "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo/issues\n"
10 "POT-Creation-Date: 2022-07-05 17:33+0000\n"
11 "PO-Revision-Date: 2022-08-09 13:36+0430\n"
12 "Last-Translator: Ahmad Haghighi <haghighi.ahmad@gmail.com>\n"
13 "Language-Team: Persian <haghighi.ahmad@gmail.com>\n"
14 "Language: fa\n"
15 "MIME-Version: 1.0\n"
16 "Content-Type: text/plain; charset=UTF-8\n"
17 "Content-Transfer-Encoding: 8bit\n"
18 "X-DL-Team: fa\n"
19 "X-DL-Module: grilo\n"
20 "X-DL-Branch: master\n"
21 "X-DL-Domain: po\n"
22 "X-DL-State: Translating\n"
23 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
24 "X-Generator: Gtranslator 40.0\n"
25
26 #: libs/net/grl-net-mock.c:92
27 msgid "No mock definition found"
28 msgstr "هیچ تعریف ساختگی یافت نشد"
29
30 #: libs/net/grl-net-mock.c:104
31 #, c-format
32 msgid "Could not find mock content %s"
33 msgstr "محتوای ساختگی %s یافت نشد"
34
35 #: libs/net/grl-net-mock.c:122
36 #, c-format
37 msgid "Could not access mock content: %s"
38 msgstr "دسترسی به محتوای ساختگی مقدور نیست: %s"
39
40 #: libs/net/grl-net-wc.c:461
41 msgid "Cannot connect to the server"
42 msgstr "نمی‌توان به کارساز وصل شد"
43
44 #: libs/net/grl-net-wc.c:467
45 msgid "Cannot connect to the proxy server"
46 msgstr "نمی‌توان به کارساز پیشکار وصل شد"
47
48 #: libs/net/grl-net-wc.c:477
49 #, c-format
50 msgid "Invalid request URI or header: %s"
51 msgstr "نشانی اینترنتی یا سرایند درخواست شدهٔ نامعتبر: %s"
52
53 #: libs/net/grl-net-wc.c:484
54 #, c-format
55 msgid "Authentication required: %s"
56 msgstr "احراز هویت نیاز است: %s"
57
58 #: libs/net/grl-net-wc.c:489
59 #, c-format
60 msgid "The requested resource was not found: %s"
61 msgstr "منبع درخواست شده یافت نشد: %s"
62
63 #: libs/net/grl-net-wc.c:496
64 #, c-format
65 msgid "The entry has been modified since it was downloaded: %s"
66 msgstr "مدخل از زمانی که بارگیری شده تغییر یافته است: %s"
67
68 #: libs/net/grl-net-wc.c:503 libs/net/grl-net-wc.c:613 libs/pls/grl-pls.c:493
69 #: src/grl-source.c:1821 src/grl-source.c:1921 src/grl-source.c:2068
70 #: src/grl-source.c:2325 src/grl-source.c:2446
71 #, c-format
72 msgid "Operation was cancelled"
73 msgstr "عملیات لغو شد"
74
75 #: libs/net/grl-net-wc.c:617 libs/net/grl-net-wc.c:679
76 msgid "Data not available"
77 msgstr "داده در دسترس نیست"
78
79 #: libs/net/grl-net-wc.c:739
80 #, c-format
81 msgid "Invalid URL %s"
82 msgstr "نشانی اینترنتی نامعتبر %s"
83
84 #: src/grilo.c:218
85 msgid "Semicolon-separated paths containing Grilo plugins"
86 msgstr "مسیرهای جداشده توسط نقطه‌ویرگول حاوی متصل‌شونده‌های گریلو"
87
88 #: src/grilo.c:220
89 msgid "Colon-separated paths containing Grilo plugins"
90 msgstr "مسیرهای جداشده توسط ویرگول حاوی متصل‌شونده‌های گریلو"
91
92 #: src/grilo.c:223
93 msgid "Colon-separated list of Grilo plugins to use"
94 msgstr "لیست جداشده توسط ویرگول حاوی متصل‌شونده‌های گریلو به منظور استفاده"
95
96 #: src/grilo.c:228
97 msgid "Grilo Options"
98 msgstr "گزینه‌های گریلو"
99
100 #: src/grilo.c:229
101 msgid "Show Grilo Options"
102 msgstr "نمایش گزینه‌های گریلو"
103
104 #: src/grl-multiple.c:134
105 #, c-format
106 msgid "No searchable sources available"
107 msgstr "منبع قابل جستجویی یافت نشد"
108
109 #: src/grl-multiple.c:511
110 #, c-format
111 msgid "Could not resolve media for URI “%s”"
112 msgstr "نمی‌توان رسانه‌ای برای نشانی اینترنی “%s” یافت"
113
114 #: src/grl-registry.c:499 src/grl-registry.c:1538
115 #, c-format
116 msgid "Plugin “%s” is already loaded"
117 msgstr "متصل‌شوندهٔ “%s” قبلا باز شده است"
118
119 #: src/grl-registry.c:523
120 #, c-format
121 msgid "Failed to initialize plugin from %s"
122 msgstr "نمی‌توان متصل‌شونده را از %s مقداردهی اولیه کرد"
123
124 #: src/grl-registry.c:565
125 #, c-format
126 msgid "Metadata key “%s” already registered in different format"
127 msgstr "کلید فرادادهٔ “%s” قبلاً در یک قالب دیگر ثبت شده است"
128
129 #: src/grl-registry.c:578
130 #, c-format
131 msgid "Metadata key “%s” cannot be registered"
132 msgstr "کلید فرادادهٔ “%s” قابل ثبت نیست"
133
134 #: src/grl-registry.c:1144
135 #, c-format
136 msgid "Source with id “%s” was not found"
137 msgstr "منبع با شناسهٔ “%s” یافت نشد"
138
139 #: src/grl-registry.c:1218
140 #, c-format
141 msgid "Failed to load plugin from %s"
142 msgstr "خطا در بارکردن متصل‌شونده از “%s”"
143
144 #: src/grl-registry.c:1227
145 #, c-format
146 msgid "Invalid plugin file %s"
147 msgstr "پروندهٔ متصل‌شوندهٔ نامعتبر “%s”"
148
149 #: src/grl-registry.c:1238
150 #, c-format
151 msgid "“%s” is not a valid plugin file"
152 msgstr "“%s” یک پروندهٔ متصل‌شوندهٔ معتبر نیست"
153
154 #: src/grl-registry.c:1257
155 #, c-format
156 msgid "Plugin “%s” already exists"
157 msgstr "متصل‌شوندهٔ “%s” از قبل وجود دارد"
158
159 #: src/grl-registry.c:1420
160 #, c-format
161 msgid "Invalid path %s"
162 msgstr "مسیر نامعتبر “%s”"
163
164 #: src/grl-registry.c:1487
165 #, c-format
166 msgid "All configured plugin paths are invalid"
167 msgstr "تمام مسیر‌های پیکربندی شدهٔ متصل‌شونده نامعتبر هستند"
168
169 #: src/grl-registry.c:1527
170 #, c-format
171 msgid "Plugin “%s” not available"
172 msgstr "متصل‌شوندهٔ “%s” در دسترس نیست"
173
174 #: src/grl-registry.c:1755
175 #, c-format
176 msgid "Plugin not found: “%s”"
177 msgstr "متصل‌شونده یافت نشد: “%s”"
178
179 #: src/grl-registry.c:2066
180 #, c-format
181 msgid "Plugin configuration does not contain “plugin-id” reference"
182 msgstr "پیکربندی متصل‌شونده فاقد مرجع “شناسهٔ متصل‌شونده” است"
183
184 #: src/grl-source.c:2775
185 #, c-format
186 msgid "Some keys could not be written"
187 msgstr "برخی کلید‌ها قابل نگارش نیستند"
188
189 #: src/grl-source.c:2848
190 #, c-format
191 msgid "None of the specified keys are writable"
192 msgstr "هیچ‌یک از کلید‌های مشخص‌شده قابل نگارش نیستند"
193
194 #: src/grl-source.c:4191
195 #, c-format
196 msgid "Media has no “id”, cannot remove"
197 msgstr "رسانه فاقد “شناسه” است، نمی‌توان حذفش کرد"
66 msgid ""
77 msgstr ""
88 "Project-Id-Version: grilo master\n"
9 "Report-Msgid-Bugs-To: \n"
10 "POT-Creation-Date: 2015-12-31 17:28+0200\n"
11 "PO-Revision-Date: 2015-12-31 17:28+0200\n"
12 "Last-Translator: Yosef Or Boczko <yoseforb@gmail.com>\n"
9 "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo/issues\n"
10 "POT-Creation-Date: 2020-07-22 17:10+0000\n"
11 "PO-Revision-Date: 2021-11-17 01:26+0200\n"
12 "Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
1313 "Language-Team: עברית <>\n"
1414 "Language: he\n"
1515 "MIME-Version: 1.0\n"
1616 "Content-Type: text/plain; charset=UTF-8\n"
1717 "Content-Transfer-Encoding: 8bit\n"
18 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
19 "X-Generator: Gtranslator 2.91.6\n"
18 "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? 2 : 3);\n"
19 "X-Generator: Poedit 3.0\n"
2020
21 #: ../libs/net/grl-net-mock.c:86
21 #: libs/net/grl-net-mock.c:86
2222 msgid "No mock definition found"
23 msgstr "No mock definition found"
23 msgstr "לא נמצאה הגדרת הדמיה"
2424
25 #: ../libs/net/grl-net-mock.c:98
25 #: libs/net/grl-net-mock.c:98
2626 #, c-format
2727 msgid "Could not find mock content %s"
28 msgstr "Could not find mock content %s"
28 msgstr "לא ניתן למצוא את התוכן המדומה %s"
2929
30 #: ../libs/net/grl-net-mock.c:116
30 #: libs/net/grl-net-mock.c:116
3131 #, c-format
3232 msgid "Could not access mock content: %s"
33 msgstr "Could not access mock content: %s"
33 msgstr "לא ניתן לגשת לתוכן המדומה: %s"
3434
35 #: ../libs/net/grl-net-wc.c:449
35 #: libs/net/grl-net-wc.c:442
3636 msgid "Cannot connect to the server"
37 msgstr "Cannot connect to the server"
37 msgstr "לא ניתן להתחבר לשרת"
3838
39 #: ../libs/net/grl-net-wc.c:455
39 #: libs/net/grl-net-wc.c:448
4040 msgid "Cannot connect to the proxy server"
41 msgstr "Cannot connect to the proxy server"
41 msgstr "לא ניתן להתחבר לשרת המתווך"
4242
43 #: ../libs/net/grl-net-wc.c:462
43 #: libs/net/grl-net-wc.c:455
4444 #, c-format
4545 msgid "Invalid request URI or header: %s"
46 msgstr "Invalid request URI or header: %s"
46 msgstr "כתובת בקשה מלאה או כותרת שגויים: %s"
4747
48 #: ../libs/net/grl-net-wc.c:469
48 #: libs/net/grl-net-wc.c:462
4949 #, c-format
5050 msgid "Authentication required: %s"
51 msgstr "Authentication required: %s"
51 msgstr "נדרש אימות: %s"
5252
53 #: ../libs/net/grl-net-wc.c:474
53 #: libs/net/grl-net-wc.c:467
5454 #, c-format
5555 msgid "The requested resource was not found: %s"
56 msgstr "The requested resource was not found: %s"
56 msgstr "המשאב המבוקש לא נמצא: %s"
5757
58 #: ../libs/net/grl-net-wc.c:481
58 #: libs/net/grl-net-wc.c:474
5959 #, c-format
6060 msgid "The entry has been modified since it was downloaded: %s"
61 msgstr "The entry has been modified since it was downloaded: %s"
61 msgstr "הרשומה נערכה מאז התקבלה: %s"
6262
63 #: ../libs/net/grl-net-wc.c:487 ../libs/net/grl-net-wc.c:596
64 #: ../libs/pls/grl-pls.c:490 ../src/grl-source.c:1828 ../src/grl-source.c:1928
65 #: ../src/grl-source.c:2075 ../src/grl-source.c:2332 ../src/grl-source.c:2453
63 #: libs/net/grl-net-wc.c:480 libs/net/grl-net-wc.c:592 libs/pls/grl-pls.c:493
64 #: src/grl-source.c:1821 src/grl-source.c:1921 src/grl-source.c:2068
65 #: src/grl-source.c:2325 src/grl-source.c:2446
6666 #, c-format
6767 msgid "Operation was cancelled"
68 msgstr "Operation was cancelled"
68 msgstr "הפעולה בוטלה"
6969
70 #: ../libs/net/grl-net-wc.c:490
71 #, c-format
72 msgid "Unhandled status: %s"
73 msgstr "Unhandled status: %s"
70 #: libs/net/grl-net-wc.c:596 libs/net/grl-net-wc.c:640
71 msgid "Data not available"
72 msgstr "הנתונים אינם זמינים"
7473
75 #: ../libs/net/grl-net-wc.c:600 ../libs/net/grl-net-wc.c:641
76 msgid "Data not available"
77 msgstr "Data not available"
78
79 #: ../libs/net/grl-net-wc.c:691
74 #: libs/net/grl-net-wc.c:691
8075 #, c-format
8176 msgid "Invalid URL %s"
82 msgstr "Invalid URL %s"
77 msgstr "הכתובת %s שגויה"
8378
84 #: ../src/grilo.c:218
79 #: src/grilo.c:218
8580 msgid "Semicolon-separated paths containing Grilo plugins"
86 msgstr "Semicolon-separated paths containing Grilo plugins"
81 msgstr "רשימה מופרדת בנקודה פסיק של נתיבים שמכילים תוספים של Grilo"
8782
88 #: ../src/grilo.c:220
83 #: src/grilo.c:220
8984 msgid "Colon-separated paths containing Grilo plugins"
90 msgstr "Colon-separated paths containing Grilo plugins"
85 msgstr "רשימה מופרדת בנקודתיים של נתיבים שמכילים תוספים של Grilo"
9186
92 #: ../src/grilo.c:223
87 #: src/grilo.c:223
9388 msgid "Colon-separated list of Grilo plugins to use"
94 msgstr "Colon-separated list of Grilo plugins to use"
89 msgstr "רשימה מופרדת בנקודתיים של תוספי Grilo לשימוש"
9590
96 #: ../src/grilo.c:228
91 #: src/grilo.c:228
9792 msgid "Grilo Options"
98 msgstr "Grilo Options"
93 msgstr "אפשרויות Grilo"
9994
100 #: ../src/grilo.c:229
95 #: src/grilo.c:229
10196 msgid "Show Grilo Options"
102 msgstr "Show Grilo Options"
97 msgstr "הצגת אפשרויות Grilo"
10398
104 #: ../src/grl-multiple.c:134
99 #: src/grl-multiple.c:134
105100 #, c-format
106101 msgid "No searchable sources available"
107 msgstr "No searchable sources available"
102 msgstr "אין משאבים שניתן לחפש בהם"
108103
109 #: ../src/grl-multiple.c:511
104 #: src/grl-multiple.c:511
110105 #, c-format
111 msgid "Could not resolve media for URI '%s'"
112 msgstr "Could not resolve media for URI '%s'"
106 msgid "Could not resolve media for URI “%s”"
107 msgstr "לא ניתן לפתור את המדיה עבור הכתובת המלאה ‚%s’"
113108
114 #: ../src/grl-registry.c:464 ../src/grl-registry.c:1376
109 #: src/grl-registry.c:495 src/grl-registry.c:1476
115110 #, c-format
116 msgid "Plugin '%s' is already loaded"
117 msgstr "Plugin '%s' is already loaded"
111 msgid "Plugin “%s” is already loaded"
112 msgstr "התוסף „%s” כבר נטען"
118113
119 #: ../src/grl-registry.c:488
114 #: src/grl-registry.c:519
120115 #, c-format
121116 msgid "Failed to initialize plugin from %s"
122 msgstr "Failed to initialize plugin from %s"
117 msgstr "אתחול התוסף מתוך %s נכשל"
123118
124 #: ../src/grl-registry.c:530
119 #: src/grl-registry.c:561
125120 #, c-format
126 msgid "Metadata key '%s' already registered in different format"
127 msgstr "Metadata key '%s' already registered in different format"
121 msgid "Metadata key “%s” already registered in different format"
122 msgstr "מפתח נתוני העל „%s” כבר נרשם בתצורה אחרת"
128123
129 #: ../src/grl-registry.c:543
124 #: src/grl-registry.c:574
130125 #, c-format
131 msgid "Metadata key '%s' cannot be registered"
132 msgstr "Metadata key '%s' cannot be registered"
126 msgid "Metadata key “%s” cannot be registered"
127 msgstr "את מפתח נתוני העל „%s” לא ניתן לרשום"
133128
134 #: ../src/grl-registry.c:983
129 #: src/grl-registry.c:1082
135130 #, c-format
136 msgid "Source with id '%s' was not found"
137 msgstr "Source with id '%s' was not found"
131 msgid "Source with id “%s” was not found"
132 msgstr "לא נמצא מקור עם המזהה „%s”"
138133
139 #: ../src/grl-registry.c:1057
134 #: src/grl-registry.c:1156
140135 #, c-format
141136 msgid "Failed to load plugin from %s"
142 msgstr "Failed to load plugin from %s"
137 msgstr "טעינת התוסף מתוך %s נכשלה"
143138
144 #: ../src/grl-registry.c:1066
139 #: src/grl-registry.c:1165
145140 #, c-format
146141 msgid "Invalid plugin file %s"
147 msgstr "Invalid plugin file %s"
142 msgstr "קובץ התוסף %s שגוי"
148143
149 #: ../src/grl-registry.c:1077
144 #: src/grl-registry.c:1176
150145 #, c-format
151 msgid "'%s' is not a valid plugin file"
152 msgstr "'%s' is not a valid plugin file"
146 msgid "“%s” is not a valid plugin file"
147 msgstr "‫„%s” אינו קובץ תוסף תקף"
153148
154 #: ../src/grl-registry.c:1096
149 #: src/grl-registry.c:1195
155150 #, c-format
156 msgid "Plugin '%s' already exists"
157 msgstr "Plugin '%s' already exists"
151 msgid "Plugin “%s” already exists"
152 msgstr "התוסף „%s” כבר קיים"
158153
159 #: ../src/grl-registry.c:1259
154 #: src/grl-registry.c:1358
160155 #, c-format
161156 msgid "Invalid path %s"
162 msgstr "Invalid path %s"
157 msgstr "הנתיב %s שגוי"
163158
164 #: ../src/grl-registry.c:1325
159 #: src/grl-registry.c:1425
165160 #, c-format
166161 msgid "All configured plugin paths are invalid"
167 msgstr "All configured plugin paths are invalid"
162 msgstr "כל נתיבי התוסף המוגדרים שגויים"
168163
169 #: ../src/grl-registry.c:1365
164 #: src/grl-registry.c:1465
170165 #, c-format
171 msgid "Plugin '%s' not available"
172 msgstr "Plugin '%s' not available"
166 msgid "Plugin “%s” not available"
167 msgstr "התוסף „%s” אינו זמין"
173168
174 #: ../src/grl-registry.c:1593
169 #: src/grl-registry.c:1693
175170 #, c-format
176 msgid "Plugin not found: '%s'"
177 msgstr "Plugin not found: '%s'"
171 msgid "Plugin not found: “%s”"
172 msgstr "התוסף לא נמצא: „%s”"
178173
179 #: ../src/grl-registry.c:1904
174 #: src/grl-registry.c:2004
180175 #, c-format
181 msgid "Plugin configuration does not contain 'plugin-id' reference"
182 msgstr "Plugin configuration does not contain 'plugin-id' reference"
176 msgid "Plugin configuration does not contain “plugin-id” reference"
177 msgstr "תצורת התוסף אינה מכילה הפניית „plugin-id”"
183178
184 #: ../src/grl-source.c:2782
179 #: src/grl-source.c:2775
185180 #, c-format
186181 msgid "Some keys could not be written"
187 msgstr "Some keys could not be written"
182 msgstr "לא ניתן לכתוב חלק מהמפתחות"
188183
189 #: ../src/grl-source.c:2855
184 #: src/grl-source.c:2848
190185 #, c-format
191186 msgid "None of the specified keys are writable"
192 msgstr "None of the specified keys are writable"
187 msgstr "אף אחד מהמפתחות שצוינו זמינים לכתיבה"
193188
194 #: ../src/grl-source.c:4198
189 #: src/grl-source.c:4191
195190 #, c-format
196 msgid "Media has no 'id', cannot remove"
197 msgstr "Media has no 'id', cannot remove"
191 msgid "Media has no “id”, cannot remove"
192 msgstr "למדיה אין „id”, אי אפשר להסיר"
193
194 #~ msgid "Unhandled status: %s"
195 #~ msgstr "Unhandled status: %s"
198196
199197 #~ msgid "Unable to load plugin '%s'"
200198 #~ msgstr "Unable to load plugin '%s'"
0 # SOME DESCRIPTIVE TITLE.
1 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
2 # This file is distributed under the same license as the PACKAGE package.
3 # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
4 #
5 msgid ""
6 msgstr ""
7 "Project-Id-Version: \n"
8 "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo/issues\n"
9 "POT-Creation-Date: 2022-07-01 16:34+0000\n"
10 "PO-Revision-Date: 2022-07-03 06:16+0200\n"
11 "Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
12 "Language-Team: \n"
13 "Language: ka\n"
14 "MIME-Version: 1.0\n"
15 "Content-Type: text/plain; charset=UTF-8\n"
16 "Content-Transfer-Encoding: 8bit\n"
17 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
18 "X-Generator: Poedit 3.1\n"
19
20 #: libs/net/grl-net-mock.c:86
21 msgid "No mock definition found"
22 msgstr ""
23
24 #: libs/net/grl-net-mock.c:98
25 #, c-format
26 msgid "Could not find mock content %s"
27 msgstr ""
28
29 #: libs/net/grl-net-mock.c:116
30 #, c-format
31 msgid "Could not access mock content: %s"
32 msgstr ""
33
34 #: libs/net/grl-net-wc.c:443
35 msgid "Cannot connect to the server"
36 msgstr "სერვერთან დაკავშირების შეცდომა"
37
38 #: libs/net/grl-net-wc.c:449
39 msgid "Cannot connect to the proxy server"
40 msgstr "პროქსი სერვერთან დაკავშირების შეცდომა"
41
42 #: libs/net/grl-net-wc.c:456
43 #, c-format
44 msgid "Invalid request URI or header: %s"
45 msgstr "მოთხოვნის არასწორი URI ან თავსართი: %s"
46
47 #: libs/net/grl-net-wc.c:463
48 #, c-format
49 msgid "Authentication required: %s"
50 msgstr "საჭიროა ავთენტიკაცია: %s"
51
52 #: libs/net/grl-net-wc.c:468
53 #, c-format
54 msgid "The requested resource was not found: %s"
55 msgstr "მოთხოვნილი რესურსი არ არსებობს: %s"
56
57 #: libs/net/grl-net-wc.c:475
58 #, c-format
59 msgid "The entry has been modified since it was downloaded: %s"
60 msgstr "გადმოწერის შემდეგ ეს ჩანაწერი შეიცვალა: %s"
61
62 #: libs/net/grl-net-wc.c:481 libs/net/grl-net-wc.c:593 libs/pls/grl-pls.c:493
63 #: src/grl-source.c:1821 src/grl-source.c:1921 src/grl-source.c:2068
64 #: src/grl-source.c:2325 src/grl-source.c:2446
65 #, c-format
66 msgid "Operation was cancelled"
67 msgstr "ოპერაცია გაუქმდა"
68
69 #: libs/net/grl-net-wc.c:597 libs/net/grl-net-wc.c:641
70 msgid "Data not available"
71 msgstr "მონაცემები მიუწვდომელია"
72
73 #: libs/net/grl-net-wc.c:692
74 #, c-format
75 msgid "Invalid URL %s"
76 msgstr "არასწორი URL: %s"
77
78 #: src/grilo.c:218
79 msgid "Semicolon-separated paths containing Grilo plugins"
80 msgstr "Grilo-ის დამატებების შემცველი ორწერტილით გამოყოფილი ბილიკები"
81
82 #: src/grilo.c:220
83 msgid "Colon-separated paths containing Grilo plugins"
84 msgstr "Grilo-ის ორწერტილით გამოყოფილი დამატებები"
85
86 #: src/grilo.c:223
87 msgid "Colon-separated list of Grilo plugins to use"
88 msgstr "Gilo-ის ორწერტილით გამოყოფილი დამატებების სია"
89
90 #: src/grilo.c:228
91 msgid "Grilo Options"
92 msgstr "Grilo-ის პარამეტრები"
93
94 #: src/grilo.c:229
95 msgid "Show Grilo Options"
96 msgstr "Grilo-ის პარამეტრების ჩვენება"
97
98 #: src/grl-multiple.c:134
99 #, c-format
100 msgid "No searchable sources available"
101 msgstr "ძებნადი წყაროების გარეშე"
102
103 #: src/grl-multiple.c:511
104 #, c-format
105 msgid "Could not resolve media for URI “%s”"
106 msgstr "მედიის ამოსნის შეცდომა URI-სთვის \"%s\""
107
108 #: src/grl-registry.c:499 src/grl-registry.c:1538
109 #, c-format
110 msgid "Plugin “%s” is already loaded"
111 msgstr "დამატება არ ჩაიტვირთულია: \"%s\""
112
113 #: src/grl-registry.c:523
114 #, c-format
115 msgid "Failed to initialize plugin from %s"
116 msgstr "%s-დან დამატების ინიციალიზაციის სეცდომა"
117
118 #: src/grl-registry.c:565
119 #, c-format
120 msgid "Metadata key “%s” already registered in different format"
121 msgstr ""
122
123 #: src/grl-registry.c:578
124 #, c-format
125 msgid "Metadata key “%s” cannot be registered"
126 msgstr "მეტამოანცემების გასაღების (\"%s\") რეგისტრაციის შეცდომა"
127
128 #: src/grl-registry.c:1144
129 #, c-format
130 msgid "Source with id “%s” was not found"
131 msgstr "წყარო ID-ით \"%s\" არ არსებობს"
132
133 #: src/grl-registry.c:1218
134 #, c-format
135 msgid "Failed to load plugin from %s"
136 msgstr "%s-დან დამატების ჩატვრთვა შეუძლებელია"
137
138 #: src/grl-registry.c:1227
139 #, c-format
140 msgid "Invalid plugin file %s"
141 msgstr "დამატების არასწორი ფაილი: %s"
142
143 #: src/grl-registry.c:1238
144 #, c-format
145 msgid "“%s” is not a valid plugin file"
146 msgstr "\"%s\" დამატების სწორ ფაილს არ წარმოადგენს"
147
148 #: src/grl-registry.c:1257
149 #, c-format
150 msgid "Plugin “%s” already exists"
151 msgstr "დამატება %s უკვე არსებობს"
152
153 #: src/grl-registry.c:1420
154 #, c-format
155 msgid "Invalid path %s"
156 msgstr "ბილიკი არასწორია: \"%s\""
157
158 #: src/grl-registry.c:1487
159 #, c-format
160 msgid "All configured plugin paths are invalid"
161 msgstr ""
162
163 #: src/grl-registry.c:1527
164 #, c-format
165 msgid "Plugin “%s” not available"
166 msgstr "დამატება \"%s\" ხელმიუწვდომელია"
167
168 #: src/grl-registry.c:1755
169 #, c-format
170 msgid "Plugin not found: “%s”"
171 msgstr "დამატება არ არსებობს: \"%s\""
172
173 #: src/grl-registry.c:2066
174 #, c-format
175 msgid "Plugin configuration does not contain “plugin-id” reference"
176 msgstr ""
177
178 #: src/grl-source.c:2775
179 #, c-format
180 msgid "Some keys could not be written"
181 msgstr "ზოგიერთი გასაღების ჩაწერა შეუძლებელია"
182
183 #: src/grl-source.c:2848
184 #, c-format
185 msgid "None of the specified keys are writable"
186 msgstr "მითითებული გასაღებები ჩაწერადი არაა"
187
188 #: src/grl-source.c:4191
189 #, c-format
190 msgid "Media has no “id”, cannot remove"
191 msgstr ""
55 msgid ""
66 msgstr ""
77 "Project-Id-Version: Gnome Nepali Translation Project\n"
8 "Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
9 "product=grilo&keywords=I18N+L10N&component=general\n"
10 "POT-Creation-Date: 2017-06-29 15:20+0000\n"
11 "PO-Revision-Date: 2017-08-16 14:21+0545\n"
8 "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/grilo/issues\n"
9 "POT-Creation-Date: 2020-07-22 17:10+0000\n"
10 "PO-Revision-Date: 2022-05-10 15:08+0545\n"
11 "Last-Translator: Pawan Chitrakar <chautari@gmail.com>\n"
1212 "Language-Team: Nepali Translation Team <chautari@gmail.com>\n"
13 "Language: ne\n"
1314 "MIME-Version: 1.0\n"
1415 "Content-Type: text/plain; charset=UTF-8\n"
1516 "Content-Transfer-Encoding: 8bit\n"
16 "X-Generator: Poedit 2.0.3\n"
17 "Last-Translator: Pawan Chitrakar <chautari@gmail.com>\n"
1817 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
19 "Language: ne\n"
18 "X-Generator: Poedit 3.0.1\n"
2019
21 #: ../libs/net/grl-net-mock.c:86
20 #: libs/net/grl-net-mock.c:86
2221 msgid "No mock definition found"
2322 msgstr "कुनै नक्कली परिभाषा फेला परेन"
2423
25 #: ../libs/net/grl-net-mock.c:98
24 #: libs/net/grl-net-mock.c:98
2625 #, c-format
2726 msgid "Could not find mock content %s"
2827 msgstr "नक्कली सामग्री %s फेला पार्न सकेन"
2928
30 #: ../libs/net/grl-net-mock.c:116
29 #: libs/net/grl-net-mock.c:116
3130 #, c-format
3231 msgid "Could not access mock content: %s"
3332 msgstr "नक्कली सामग्री पहुँच गर्न सकेन:%s"
3433
35 #: ../libs/net/grl-net-wc.c:449
34 #: libs/net/grl-net-wc.c:442
3635 msgid "Cannot connect to the server"
3736 msgstr "सर्भरमा जडान गर्न सकिँदैन"
3837
39 #: ../libs/net/grl-net-wc.c:455
38 #: libs/net/grl-net-wc.c:448
4039 msgid "Cannot connect to the proxy server"
4140 msgstr "प्रोक्सी सर्भर जडान गर्न सक्दैन"
4241
43 #: ../libs/net/grl-net-wc.c:462
42 #: libs/net/grl-net-wc.c:455
4443 #, c-format
4544 msgid "Invalid request URI or header: %s"
4645 msgstr "URI वा हेडरको अवैध अनुरोध URI वा हेडर: %s"
4746
48 #: ../libs/net/grl-net-wc.c:469
47 #: libs/net/grl-net-wc.c:462
4948 #, c-format
5049 msgid "Authentication required: %s"
51 msgstr "%s प्रमाणिकरण आवश्यक छ ।"
50 msgstr "प्रमाणिकरण आवश्यक छ : %s "
5251
53 #: ../libs/net/grl-net-wc.c:474
54 #, fuzzy, c-format
52 #: libs/net/grl-net-wc.c:467
53 #, c-format
5554 msgid "The requested resource was not found: %s"
56 msgstr "%s फेला परेन"
55 msgstr "अनुरोध गरिएको संसाधन फेला परेन: %s"
5756
58 #: ../libs/net/grl-net-wc.c:481
57 #: libs/net/grl-net-wc.c:474
5958 #, c-format
6059 msgid "The entry has been modified since it was downloaded: %s"
61 msgstr ""
60 msgstr "यो डाउनलोड भएदेखि प्रविष्टि परिमार्जन गरिएको छ: %s"
6261
63 #: ../libs/net/grl-net-wc.c:487 ../libs/net/grl-net-wc.c:599
64 #: ../libs/pls/grl-pls.c:490 ../src/grl-source.c:1828 ../src/grl-source.c:1928
65 #: ../src/grl-source.c:2075 ../src/grl-source.c:2332 ../src/grl-source.c:2453
62 #: libs/net/grl-net-wc.c:480 libs/net/grl-net-wc.c:592 libs/pls/grl-pls.c:493
63 #: src/grl-source.c:1821 src/grl-source.c:1921 src/grl-source.c:2068
64 #: src/grl-source.c:2325 src/grl-source.c:2446
6665 #, c-format
6766 msgid "Operation was cancelled"
6867 msgstr "सञ्चालन रद्द भएको छ"
6968
70 #: ../libs/net/grl-net-wc.c:603 ../libs/net/grl-net-wc.c:647
69 #: libs/net/grl-net-wc.c:596 libs/net/grl-net-wc.c:640
7170 msgid "Data not available"
7271 msgstr "डाटा उपलब्ध छैन"
7372
74 #: ../libs/net/grl-net-wc.c:698
73 #: libs/net/grl-net-wc.c:691
7574 #, c-format
7675 msgid "Invalid URL %s"
7776 msgstr "अवैध यूआरएल %s"
7877
79 #: ../src/grilo.c:218
78 #: src/grilo.c:218
8079 msgid "Semicolon-separated paths containing Grilo plugins"
81 msgstr ""
80 msgstr "ग्रीलो प्लगइन समाविष्ट सेमीकोलोन-विभाजित मार्ग"
8281
83 #: ../src/grilo.c:220
82 #: src/grilo.c:220
8483 msgid "Colon-separated paths containing Grilo plugins"
85 msgstr ""
84 msgstr "ग्रीलो प्लगइन समावेश गर्ने कोलोन-विभाजित मार्ग"
8685
87 #: ../src/grilo.c:223
86 #: src/grilo.c:223
8887 msgid "Colon-separated list of Grilo plugins to use"
89 msgstr ""
88 msgstr "प्रयोग गर्नका लागि ग्रिलो प्लगइनको Colon-separated सूची"
9089
91 #: ../src/grilo.c:228
90 #: src/grilo.c:228
9291 msgid "Grilo Options"
9392 msgstr "ग्रिलो विकल्प"
9493
95 #: ../src/grilo.c:229
94 #: src/grilo.c:229
9695 msgid "Show Grilo Options"
9796 msgstr "ग्रिलो विकल्प देखाउनुहोस्"
9897
99 #: ../src/grl-multiple.c:134
100 #, fuzzy, c-format
98 #: src/grl-multiple.c:134
99 #, c-format
101100 msgid "No searchable sources available"
102 msgstr "स्रोत"
101 msgstr "कुनै खोजीयोग्य स्रोतहरू उपलब्ध छैन"
103102
104 #: ../src/grl-multiple.c:511
103 #: src/grl-multiple.c:511
105104 #, c-format
106 msgid "Could not resolve media for URI '%s'"
105 msgid "Could not resolve media for URI “%s”"
107106 msgstr "URI '%s' को लागि मिडिया समाधान गर्न सकेन"
108107
109 #: ../src/grl-registry.c:464 ../src/grl-registry.c:1377
110 #, fuzzy, c-format
111 msgid "Plugin '%s' is already loaded"
112 msgstr "अनुप्रयोग सुची पहिले नै लोड भइसकेको छ"
108 #: src/grl-registry.c:495 src/grl-registry.c:1476
109 #, c-format
110 msgid "Plugin “%s” is already loaded"
111 msgstr "प्लगइन \"%s\" पहिले नै लोड भइसकेको छ"
113112
114 #: ../src/grl-registry.c:488
115 #, fuzzy, c-format
113 #: src/grl-registry.c:519
114 #, c-format
116115 msgid "Failed to initialize plugin from %s"
117 msgstr "\"%s\" प्लगइनबाट यो सन्देश हो।"
116 msgstr "%s बाट प्लगइन सुरुआत गर्न असफल"
118117
119 #: ../src/grl-registry.c:530
118 #: src/grl-registry.c:561
120119 #, c-format
121 msgid "Metadata key '%s' already registered in different format"
122 msgstr ""
120 msgid "Metadata key “%s” already registered in different format"
121 msgstr "मेटाडाटा कुञ्जी \"%s\" पहिले नै विभिन्न ढाँचामा दर्ता भएको छ"
123122
124 #: ../src/grl-registry.c:543
125 #, fuzzy, c-format
126 msgid "Metadata key '%s' cannot be registered"
127 msgstr "डाइरेक्टरी फेला पार्न सक्दैन %s"
123 #: src/grl-registry.c:574
124 #, c-format
125 msgid "Metadata key “%s” cannot be registered"
126 msgstr "मेटाडेटा कुञ्जी \"%s\" दर्ता गर्न सकिँदैन"
128127
129 #: ../src/grl-registry.c:983
128 #: src/grl-registry.c:1082
130129 #, c-format
131 msgid "Source with id '%s' was not found"
132 msgstr "स्रोत %s पाइएन"
130 msgid "Source with id “%s” was not found"
131 msgstr "\"%s\" आईडी भएको स्रोत फेला परेन"
133132
134 #: ../src/grl-registry.c:1057
133 #: src/grl-registry.c:1156
135134 #, c-format
136135 msgid "Failed to load plugin from %s"
137136 msgstr "प्लगइन लोड गर्न असफल: %s"
138137
139 #: ../src/grl-registry.c:1066
138 #: src/grl-registry.c:1165
140139 #, c-format
141140 msgid "Invalid plugin file %s"
142141 msgstr "अवैध प्लगइन फाइल %s"
143142
144 #: ../src/grl-registry.c:1077
143 #: src/grl-registry.c:1176
145144 #, c-format
146 msgid "'%s' is not a valid plugin file"
145 msgid "“%s” is not a valid plugin file"
147146 msgstr "'%s' अवैध प्लगिन फाइल"
148147
149 #: ../src/grl-registry.c:1096
148 #: src/grl-registry.c:1195
150149 #, c-format
151 msgid "Plugin '%s' already exists"
152 msgstr "प्लगिन '%s' पहिले नै अवस्थित छ"
150 msgid "Plugin “%s” already exists"
151 msgstr "प्लगइन \"%s\" पहिले नै अवस्थित छ"
153152
154 #: ../src/grl-registry.c:1259
153 #: src/grl-registry.c:1358
155154 #, c-format
156155 msgid "Invalid path %s"
157156 msgstr "अवैध मार्ग %s"
158157
159 #: ../src/grl-registry.c:1326
158 #: src/grl-registry.c:1425
160159 #, c-format
161160 msgid "All configured plugin paths are invalid"
162 msgstr ""
161 msgstr "सबै कन्फिगर गरिएका प्लगइन मार्ग अवैध छन्"
163162
164 #: ../src/grl-registry.c:1366
163 #: src/grl-registry.c:1465
165164 #, c-format
166 msgid "Plugin '%s' not available"
167 msgstr "प्लगइन %s उपलब्ध छैन"
165 msgid "Plugin “%s” not available"
166 msgstr "प्लगइन \"%s\" उपलब्ध छैन"
168167
169 #: ../src/grl-registry.c:1594
168 #: src/grl-registry.c:1693
170169 #, c-format
171 msgid "Plugin not found: '%s'"
172 msgstr "प्लगिन फेला परेन : '%s'"
170 msgid "Plugin not found: “%s”"
171 msgstr "प्लगइन फेला परेन: \"%s\""
173172
174 #: ../src/grl-registry.c:1905
173 #: src/grl-registry.c:2004
175174 #, c-format
176 msgid "Plugin configuration does not contain 'plugin-id' reference"
177 msgstr ""
175 msgid "Plugin configuration does not contain “plugin-id” reference"
176 msgstr "प्लगइन कन्फिगरेसनमा \"plugin-id\" सन्दर्भ समावेश छैन"
178177
179 #: ../src/grl-source.c:2782
180 #, fuzzy, c-format
178 #: src/grl-source.c:2775
179 #, c-format
181180 msgid "Some keys could not be written"
182 msgstr "यो ठेगाना पुस्तिकामा ठेगाना लेख्न सकेन।"
181 msgstr "केही कुञ्जीहरू लेख्न सकिएन"
183182
184 #: ../src/grl-source.c:2855
185 #, fuzzy, c-format
183 #: src/grl-source.c:2848
184 #, c-format
186185 msgid "None of the specified keys are writable"
187 msgstr "कुनै पनि निर्दिष्ट गरिएको फाँटले समावेश गर्दछ:"
186 msgstr "कुनै पनि निर्दिष्ट कुञ्जीहरू लेख्न योग्य छैनन्"
188187
189 #: ../src/grl-source.c:4198
188 #: src/grl-source.c:4191
190189 #, c-format
191 msgid "Media has no 'id', cannot remove"
192 msgstr ""
190 msgid "Media has no “id”, cannot remove"
191 msgstr "मिडियासँग \"id\" छैन, हटाउन सकिँदैन"
22882288 return FALSE;
22892289 }
22902290
2291 /* @max and @min are expected to be initialized with G_VALUE_INIT (non null)
2292 * Returns TRUE if @value has changed
2293 */
22912294 G_GNUC_INTERNAL gboolean
22922295 grl_registry_metadata_key_clamp(GrlRegistry *registry,
22932296 GrlKeyID key,
22962299 GValue *max)
22972300 {
22982301 const gchar *key_name;
2302
2303 g_return_val_if_fail (min != NULL, FALSE);
2304 g_return_val_if_fail (max != NULL, FALSE);
2305
2306 if (value == NULL) {
2307 return FALSE;
2308 }
22992309
23002310 key_name = key_id_handler_get_name (&registry->priv->key_id_handler, key);
23012311 if (key_name) {
2222 #include <net/grl-net.h>
2323 #include <libsoup/soup.h>
2424
25 #include "net/grl-net-wc-private.h"
26
2527 typedef struct {
2628 GrlRegistry *registry;
2729 GMainLoop *loop;
7981 return G_SOURCE_REMOVE;
8082 }
8183
84 #if SOUP_CHECK_VERSION (2, 99, 2)
85 static void
86 soup_server_throttling_cb (SoupServer *server,
87 SoupServerMessage *message,
88 const char *path,
89 GHashTable *query,
90 gpointer user_data)
91 {
92 gchar *response = g_strdup_printf ("%" G_GINT64_FORMAT, g_get_monotonic_time());
93
94 soup_server_message_set_response (message, "text/plain", SOUP_MEMORY_TAKE, response, strlen(response));
95 soup_server_message_set_status (message, SOUP_STATUS_OK, NULL);
96 }
97 #else
8298 static void
8399 soup_server_throttling_cb (SoupServer *server,
84100 SoupMessage *message,
92108 soup_message_set_response (message, "text/plain", SOUP_MEMORY_TAKE, response, strlen(response));
93109 soup_message_set_status (message, SOUP_STATUS_OK);
94110 }
111 #endif
95112
96113 static void
97114 test_net_wc_throttling_cb (GObject *source_object,
162179
163180 uris = soup_server_get_uris (f->server);
164181 g_assert_nonnull (uris);
182 #if SOUP_CHECK_VERSION (2, 99, 2)
183 request = g_uri_to_string_partial (uris->data, G_URI_HIDE_PASSWORD);
184 g_slist_free_full (uris, (GDestroyNotify) g_uri_unref);
185 #else
165186 request = soup_uri_to_string (uris->data, FALSE);
166187 g_slist_free_full (uris, (GDestroyNotify) soup_uri_free);
188 #endif
167189 g_assert_nonnull (request);
168190
169191 wc = grl_net_wc_new ();
202224
203225 uris = soup_server_get_uris (f->server);
204226 g_assert_nonnull (uris);
227 #if SOUP_CHECK_VERSION (2, 99, 2)
228 request = g_uri_to_string_partial (uris->data, G_URI_HIDE_PASSWORD);
229 g_slist_free_full (uris, (GDestroyNotify) g_uri_unref);
230 #else
205231 request = soup_uri_to_string (uris->data, FALSE);
206232 g_slist_free_full (uris, (GDestroyNotify) soup_uri_free);
233 #endif
207234 g_assert_nonnull (request);
208235
209236 wc = grl_net_wc_new ();
244271
245272 uris = soup_server_get_uris (f->server);
246273 g_assert_nonnull (uris);
274 #if SOUP_CHECK_VERSION (2, 99, 2)
275 request = g_uri_to_string_partial (uris->data, G_URI_HIDE_PASSWORD);
276 g_slist_free_full (uris, (GDestroyNotify) g_uri_unref);
277 #else
247278 request = soup_uri_to_string (uris->data, FALSE);
248279 g_slist_free_full (uris, (GDestroyNotify) soup_uri_free);
280 #endif
249281 g_assert_nonnull (request);
250282
251283 /* Under the same grl-net-wc, create NUM_STRESS_TEST async operations to our
265297 g_main_loop_run (f->loop);
266298 }
267299
300 static void
301 test_net_properties (Fixture *f,
302 gconstpointer data)
303 {
304 GSList *uris;
305 gchar *request;
306 GrlNetWc *wc;
307 ThrottlingOperation *op;
308
309 g_test_bug ("769331");
310
311 GError *error = NULL;
312 soup_server_add_handler (f->server, NULL, soup_server_throttling_cb, NULL, NULL);
313 soup_server_listen_local (f->server, 0, SOUP_SERVER_LISTEN_IPV4_ONLY, &error);
314 g_assert_no_error (error);
315
316 uris = soup_server_get_uris (f->server);
317 g_assert_nonnull (uris);
318 #if SOUP_CHECK_VERSION (2, 99, 2)
319 request = g_uri_to_string_partial (uris->data, G_URI_HIDE_PASSWORD);
320 g_slist_free_full (uris, (GDestroyNotify) g_uri_unref);
321 #else
322 request = soup_uri_to_string (uris->data, FALSE);
323 g_slist_free_full (uris, (GDestroyNotify) soup_uri_free);
324 #endif
325 g_assert_nonnull (request);
326
327 wc = grl_net_wc_new ();
328 g_object_set (G_OBJECT (wc),
329 "throttling", 0,
330 "cache", TRUE,
331 "cache-size", 5,
332 "user-agent", "grl net test 0.1",
333 NULL);
334
335 op = throttling_operation_new(f, NO_DELAY);
336 grl_net_wc_request_async (wc, request, f->cancellable, test_net_wc_throttling_cb, op);
337
338 f->timeout_is_expected = FALSE;
339 g_main_loop_run (f->loop);
340
341 guint max_conns_per_host;
342 g_autofree char *user_agent = NULL;
343
344 g_assert_nonnull (wc->session);
345 g_object_get (G_OBJECT (wc->session),
346 "max-conns-per-host", &max_conns_per_host,
347 "user-agent", &user_agent,
348 NULL);
349 g_assert_cmpuint (max_conns_per_host, ==, 2);
350 g_assert_cmpstr (user_agent, ==, "grl net test 0.1");
351
352 SoupSessionFeature *cache;
353 g_autofree char *cache_dir = NULL;
354 cache = soup_session_get_feature (wc->session, SOUP_TYPE_CACHE);
355 g_assert_nonnull (cache);
356 g_assert_cmpuint (soup_cache_get_max_size (SOUP_CACHE (cache)), ==, 5 * 1024 * 1024);
357 g_object_get (G_OBJECT (cache), "cache-dir", &cache_dir, NULL);
358 g_assert_nonnull (strstr (cache_dir, "grilo-plugin-cache"));
359
360 g_object_unref (wc);
361 g_free (request);
362 }
363
268364 int
269365 main (int argc, char **argv)
270366 {
292388 test_net_wc_no_throttling_stress,
293389 fixture_teardown);
294390
391 g_test_add ("/net/properties",
392 Fixture, NULL,
393 fixture_setup,
394 test_net_properties,
395 fixture_teardown);
396
295397 return g_test_run ();
296398 }
7171 }
7272 }
7373
74 static void
75 range_filters_max_min_null(void)
76 {
77 GrlOperationOptions *options = grl_operation_options_new (NULL);
78 gboolean ret;
79 GValue value = G_VALUE_INIT;
80 GValue *max, *min;
81
82 g_test_bug ("148");
83
84 /* Before */
85 grl_operation_options_get_key_range_filter (options,
86 GRL_METADATA_KEY_ORIENTATION,
87 &min,
88 &max);
89 /* TODO: this is actually a bug. Should get default min/max for this metadata-key 0/359.
90 * Seems that grilo stores the range in GParamSpec but does not set it in the HashTable
91 * GrlOperationsOptions look at. */
92 g_assert_null(min);
93 g_assert_null(max);
94
95 /* Test MIN */
96 g_value_init (&value, G_TYPE_INT);
97 g_value_set_int (&value, 90);
98 ret = grl_operation_options_set_key_range_filter_value (options,
99 GRL_METADATA_KEY_ORIENTATION,
100 &value,
101 NULL);
102 g_assert_true(ret);
103
104 grl_operation_options_get_key_range_filter (options, GRL_METADATA_KEY_ORIENTATION, &min, &max);
105 g_assert_cmpint(g_value_get_int (min), ==, 90);
106 // TODO: Same bug, as max was not set we receive NULL instead
107 g_assert_null(max);
108 g_value_unset(min);
109
110 /* Test MAX */
111 g_value_set_int (&value, 180);
112 ret = grl_operation_options_set_key_range_filter_value (options,
113 GRL_METADATA_KEY_ORIENTATION,
114 NULL,
115 &value);
116 g_assert_true(ret);
117
118 grl_operation_options_get_key_range_filter (options, GRL_METADATA_KEY_ORIENTATION, &min, &max);
119 /* TODO: This is another bug. When we set max above, the min should not be changed.
120 * g_assert_cmpint(g_value_get_int (min), ==, 90);
121 */
122 g_assert_null(min);
123 g_assert_cmpint(g_value_get_int (max), ==, 180);
124 g_value_unset(max);
125 }
126
74127 int
75128 main (int argc, char **argv)
76129 {
84137
85138 /* registry tests */
86139 g_test_add_func ("/operation/range-filters/max-min/int", range_filters_max_min_int);
140 g_test_add_func ("/operation/range-filters/max-min/null", range_filters_max_min_null);
87141
88142 return g_test_run ();
89143 }
1414 run_command(python,
1515 '@0@/generate_core_keys.py'.format(meson.current_source_dir()),
1616 '@0@/src/grl-metadata-key.h'.format(source_root),
17 '@0@/grl-core-keys.h'.format(meson.current_build_dir()))
17 '@0@/grl-core-keys.h'.format(meson.current_build_dir()),
18 check: true)
1819
1920 configure_file(output: 'config.h',
2021 configuration: cdata)