From 92c6aaf73a71106e72d01f062b865cedb433d571 Mon Sep 17 00:00:00 2001 From: MSVSphere Packaging Team Date: Wed, 15 Mar 2023 16:40:24 +0300 Subject: [PATCH] import gnome-photos-40.0-4.el9 --- .gitignore | 1 + .gnome-photos.metadata | 1 + ...e-Facebook-Flickr-and-Google-support.patch | 1987 +++++++++++++++++ SPECS/gnome-photos.spec | 596 +++++ 4 files changed, 2585 insertions(+) create mode 100644 .gitignore create mode 100644 .gnome-photos.metadata create mode 100644 SOURCES/0001-Remove-Facebook-Flickr-and-Google-support.patch create mode 100644 SPECS/gnome-photos.spec diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a2adb26 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/gnome-photos-40.0.tar.xz diff --git a/.gnome-photos.metadata b/.gnome-photos.metadata new file mode 100644 index 0000000..a04cfd2 --- /dev/null +++ b/.gnome-photos.metadata @@ -0,0 +1 @@ +4f14ee6d7dcb55c1c07c9e043a56d2d5cb5cd311 SOURCES/gnome-photos-40.0.tar.xz diff --git a/SOURCES/0001-Remove-Facebook-Flickr-and-Google-support.patch b/SOURCES/0001-Remove-Facebook-Flickr-and-Google-support.patch new file mode 100644 index 0000000..8c6f104 --- /dev/null +++ b/SOURCES/0001-Remove-Facebook-Flickr-and-Google-support.patch @@ -0,0 +1,1987 @@ +From ec6ed17f9e55b73e7bf42cf9e119d6c2504e58ba Mon Sep 17 00:00:00 2001 +From: Debarshi Ray +Date: Fri, 23 Apr 2021 02:54:59 +0200 +Subject: [PATCH] Remove Facebook, Flickr and Google support + +In theory, support for Facebook, Flickr and Google is still desired. +However, right now Facebook and Google are completely broken, and the +Grilo code used for Flickr support has code quality issues. + +https://bugzilla.redhat.com/show_bug.cgi?id=1913641 +--- + meson.build | 3 - + src/meson.build | 7 - + src/photos-application.c | 24 -- + src/photos-facebook-item.c | 339 --------------------- + src/photos-facebook-item.h | 36 --- + src/photos-flickr-item.c | 407 ------------------------- + src/photos-flickr-item.h | 35 --- + src/photos-google-item.c | 349 --------------------- + src/photos-google-item.h | 36 --- + src/photos-share-point-google.c | 516 -------------------------------- + src/photos-share-point-google.h | 35 --- + src/photos-utils.c | 8 - + 12 files changed, 1795 deletions(-) + delete mode 100644 src/photos-facebook-item.c + delete mode 100644 src/photos-facebook-item.h + delete mode 100644 src/photos-flickr-item.c + delete mode 100644 src/photos-flickr-item.h + delete mode 100644 src/photos-google-item.c + delete mode 100644 src/photos-google-item.h + delete mode 100644 src/photos-share-point-google.c + delete mode 100644 src/photos-share-point-google.h + +diff --git a/meson.build b/meson.build +index ee1ca0dd3080..0d8ca768da1d 100644 +--- a/meson.build ++++ b/meson.build +@@ -166,13 +166,10 @@ goa_dep = dependency('goa-1.0', version: '>= 3.8.0') + config_h.set('GOA_API_IS_SUBJECT_TO_CHANGE', true) + + gobject_dep = dependency('gobject-2.0') +-grilo_dep = dependency('grilo-0.3', version: '>= 0.3.5') + gsettings_desktop_schemas_dep = dependency('gsettings-desktop-schemas') + gtk_dep = dependency('gtk+-3.0', version: '>= 3.22.16') + gtk_unix_print_dep = dependency('gtk+-unix-print-3.0') + libdazzle_dep = dependency('libdazzle-1.0', version: '>= 3.26.0') +-libgdata_dep = dependency('libgdata', version: '>= 0.17.13') +-libgfgraph_dep = dependency('libgfbgraph-0.2', version: '>= 0.2.1') + libhandy_dep = dependency ('libhandy-1', version: '>= 1.1.90') + libjpeg_dep = dependency('libjpeg') + libpng_dep = dependency('libpng16') +diff --git a/src/meson.build b/src/meson.build +index 154f7d528814..becaa9cb480f 100644 +--- a/src/meson.build ++++ b/src/meson.build +@@ -130,15 +130,12 @@ sources = common_sources + files( + 'photos-embed.c', + 'photos-empty-results-box.c', + 'photos-error-box.c', +- 'photos-facebook-item.c', + 'photos-fetch-collection-state-job.c', + 'photos-fetch-collections-job.c', + 'photos-fetch-ids-job.c', + 'photos-fetch-metas-job.c', + 'photos-filterable.c', +- 'photos-flickr-item.c', + 'photos-gesture-zoom.c', +- 'photos-google-item.c', + 'photos-image-view.c', + 'photos-image-view-helper.c', + 'photos-import-dialog.c', +@@ -188,7 +185,6 @@ sources = common_sources + files( + 'photos-share-notification.c', + 'photos-share-point.c', + 'photos-share-point-email.c', +- 'photos-share-point-google.c', + 'photos-share-point-manager.c', + 'photos-share-point-online.c', + 'photos-single-item-job.c', +@@ -387,13 +383,10 @@ deps = common_deps + [ + geocode_glib_dep, + gexiv_dep, + goa_dep, +- grilo_dep, + gsettings_desktop_schemas_dep, + gtk_dep, + gtk_unix_print_dep, + libgd_dep, +- libgdata_dep, +- libgfgraph_dep, + libhandy_dep, + m_dep, + tracker_sparql_dep, +diff --git a/src/photos-application.c b/src/photos-application.c +index 9017fd3ef621..83ec1ad65916 100644 +--- a/src/photos-application.c ++++ b/src/photos-application.c +@@ -35,7 +35,6 @@ + #include + #include + #include +-#include + #include + #include + +@@ -2586,11 +2585,9 @@ static void + photos_application_startup (GApplication *application) + { + PhotosApplication *self = PHOTOS_APPLICATION (application); +- GrlRegistry *registry; + GtkIconTheme *icon_theme; + GtkSettings *settings; + GVariant *state; +- gboolean grl_plugins_loaded; + const gchar *delete_accels[3] = {"Delete", "KP_Delete", NULL}; + const gchar *edit_accels[2] = {"e", NULL}; + const gchar *fullscreen_accels[2] = {"F11", NULL}; +@@ -2613,27 +2610,6 @@ photos_application_startup (GApplication *application) + + photos_gegl_init (); + +- grl_init (NULL, NULL); +- registry = grl_registry_get_default (); +- +- { +- g_autoptr (GError) error = NULL; +- +- grl_plugins_loaded = grl_registry_load_all_plugins (registry, FALSE, &error); +- if (error != NULL) +- g_warning ("Unable to load Grilo plugins: %s", error->message); +- } +- +- if (grl_plugins_loaded) +- { +- { +- g_autoptr (GError) error = NULL; +- +- if (!grl_registry_activate_plugin_by_id (registry, "grl-flickr", &error)) +- g_warning ("Unable to activate Grilo's Flickr plugin: %s", error->message); +- } +- } +- + self->create_window_cancellable = g_cancellable_new (); + self->refresh_miner_ids = g_hash_table_new (g_direct_hash, g_direct_equal); + +diff --git a/src/photos-facebook-item.c b/src/photos-facebook-item.c +deleted file mode 100644 +index 9053550a0409..000000000000 +--- a/src/photos-facebook-item.c ++++ /dev/null +@@ -1,339 +0,0 @@ +-/* +- * Photos - access, organize and share your photos on GNOME +- * Copyright © 2013 Álvaro Peña +- * Copyright © 2014 – 2019 Red Hat, Inc. +- * +- * This program is free software: you can redistribute it and/or modify +- * it under the terms of the GNU General Public License as published by +- * the Free Software Foundation, either version 3 of the License, or +- * (at your option) any later version. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program. If not, see . +- */ +- +-/* Based on code from: +- * + Documents +- */ +- +- +-#include "config.h" +- +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include "photos-base-manager.h" +-#include "photos-debug.h" +-#include "photos-error.h" +-#include "photos-facebook-item.h" +-#include "photos-search-context.h" +-#include "photos-source.h" +-#include "photos-utils.h" +- +- +-struct _PhotosFacebookItem +-{ +- PhotosBaseItem parent_instance; +- PhotosBaseManager *src_mngr; +-}; +- +- +-G_DEFINE_TYPE_WITH_CODE (PhotosFacebookItem, photos_facebook_item, PHOTOS_TYPE_BASE_ITEM, +- photos_utils_ensure_extension_points (); +- g_io_extension_point_implement (PHOTOS_BASE_ITEM_EXTENSION_POINT_NAME, +- g_define_type_id, +- "facebook", +- 0)); +- +- +-static gchar * +-photos_facebook_item_create_filename_fallback (PhotosBaseItem *item) +-{ +- const gchar *const facebook_prefix = "facebook:"; +- const gchar *identifier; +- const gchar *mime_type; +- g_autofree gchar *extension = NULL; +- gchar *ret_val; +- gsize prefix_len; +- +- prefix_len = strlen (facebook_prefix); +- identifier = photos_base_item_get_identifier (item) + prefix_len; +- mime_type = photos_base_item_get_mime_type (item); +- extension = photos_utils_get_extension_from_mime_type (mime_type); +- if (extension == NULL) +- extension = g_strdup ("tmp"); +- +- ret_val = g_strdup_printf ("%s.%s", identifier, extension); +- +- return ret_val; +-} +- +- +-static gchar * +-photos_facebook_item_create_name_fallback (PhotosBaseItem *item) +-{ +- PhotosFacebookItem *self = PHOTOS_FACEBOOK_ITEM (item); +- g_autoptr (GDateTime) date_modified = NULL; +- const gchar *provider_name; +- g_autofree gchar *date_modified_str = NULL; +- gchar *ret_val; +- gint64 mtime; +- +- provider_name = photos_utils_get_provider_name (self->src_mngr, item); +- +- mtime = photos_base_item_get_mtime (item); +- date_modified = g_date_time_new_from_unix_local (mtime); +- date_modified_str = g_date_time_format (date_modified, "%x"); +- +- /* Translators: this is the fallback title in the form +- * "Facebook — 2nd January 2013". +- */ +- ret_val = g_strdup_printf (_("%s — %s"), provider_name, date_modified_str); +- +- return ret_val; +-} +- +- +-static GFBGraphPhoto * +-photos_facebook_get_gfbgraph_photo (PhotosBaseItem *item, GCancellable *cancellable, GError **error) +-{ +- PhotosFacebookItem *self = PHOTOS_FACEBOOK_ITEM (item); +- GFBGraphGoaAuthorizer *authorizer = NULL; /* TODO: use g_autoptr */ +- GFBGraphPhoto *photo = NULL; +- GoaObject *object; +- PhotosSource *source; +- const gchar *const facebook_prefix = "facebook:"; +- const gchar *identifier; +- const gchar *resource_urn; +- gsize prefix_len; +- +- resource_urn = photos_base_item_get_resource_urn (item); +- source = PHOTOS_SOURCE (photos_base_manager_get_object_by_id (self->src_mngr, resource_urn)); +- object = photos_source_get_goa_object (source); +- authorizer = gfbgraph_goa_authorizer_new (object); +- +- if (!gfbgraph_authorizer_refresh_authorization (GFBGRAPH_AUTHORIZER (authorizer), cancellable, error)) +- goto out; +- +- prefix_len = strlen (facebook_prefix); +- identifier = photos_base_item_get_identifier (item) + prefix_len; +- photo = gfbgraph_photo_new_from_id (GFBGRAPH_AUTHORIZER (authorizer), identifier, error); +- +- out: +- g_clear_object (&authorizer); +- return photo; +-} +- +- +-static gboolean +-photos_facebook_item_create_thumbnail (PhotosBaseItem *item, GCancellable *cancellable, GError **error) +-{ +- g_autoptr (GFile) local_file = NULL; +- g_autoptr (GFile) remote_file = NULL; +- GFBGraphPhoto *photo = NULL; /* TODO: use g_autoptr */ +- const GFBGraphPhotoImage *thumbnail_image; +- gboolean ret_val = FALSE; +- const gchar *uri; +- g_autofree gchar *local_dir = NULL; +- g_autofree gchar *local_path = NULL; +- gint64 height; +- gint64 width; +- guint size; +- +- photo = photos_facebook_get_gfbgraph_photo (item, cancellable, error); +- if (photo == NULL) +- goto out; +- +- size = (guint) photos_utils_get_icon_size (); +- thumbnail_image = gfbgraph_photo_get_image_near_width (photo, size); +- if (thumbnail_image == NULL) +- { +- g_set_error (error, PHOTOS_ERROR, 0, "Failed to find an image for the thumbnail"); +- goto out; +- } +- +- remote_file = g_file_new_for_uri (thumbnail_image->source); +- +- local_path = photos_base_item_create_thumbnail_path (item); +- local_file = g_file_new_for_path (local_path); +- local_dir = g_path_get_dirname (local_path); +- g_mkdir_with_parents (local_dir, 0700); +- +- uri = photos_base_item_get_uri (item); +- +- height = photos_base_item_get_height (item); +- width = photos_base_item_get_width (item); +- +- photos_debug (PHOTOS_DEBUG_NETWORK, "Downloading %s from Facebook to %s", thumbnail_image->source, local_path); +- if (!photos_utils_file_copy_as_thumbnail (remote_file, +- local_file, +- uri, +- height, +- width, +- cancellable, +- error)) +- goto out; +- +- ret_val = TRUE; +- +- out: +- g_clear_object (&photo); +- return ret_val; +-} +- +- +-static GFile * +-photos_facebook_item_download (PhotosBaseItem *item, GCancellable *cancellable, GError **error) +-{ +- GFile *ret_val = NULL; +- g_autoptr (GFile) local_file = NULL; +- g_autoptr (GFile) remote_file = NULL; +- GFBGraphPhoto *photo = NULL; /* TODO: use g_autoptr */ +- const GFBGraphPhotoImage *higher_image; +- const gchar *cache_dir; +- const gchar *local_filename; +- g_autofree gchar *local_dir = NULL; +- g_autofree gchar *local_path = NULL; +- +- cache_dir = g_get_user_cache_dir (); +- local_dir = g_build_filename (cache_dir, PACKAGE_TARNAME, "facebook", NULL); +- g_mkdir_with_parents (local_dir, 0700); +- +- local_filename = photos_base_item_get_filename (item); +- local_path = g_build_filename (local_dir, local_filename, NULL); +- local_file = g_file_new_for_path (local_path); +- if (g_file_test (local_path, G_FILE_TEST_EXISTS)) +- goto end; +- +- photo = photos_facebook_get_gfbgraph_photo (item, cancellable, error); +- if (photo == NULL) +- goto out; +- +- higher_image = gfbgraph_photo_get_image_hires (photo); +- if (higher_image == NULL) +- { +- g_set_error (error, PHOTOS_ERROR, 0, "Failed to find a high resolution image"); +- goto out; +- } +- +- remote_file = g_file_new_for_uri (higher_image->source); +- +- photos_debug (PHOTOS_DEBUG_NETWORK, "Downloading %s from Facebook to %s", higher_image->source, local_path); +- if (!g_file_copy (remote_file, +- local_file, +- G_FILE_COPY_ALL_METADATA | G_FILE_COPY_OVERWRITE, +- cancellable, +- NULL, +- NULL, +- error)) +- { +- g_file_delete (local_file, NULL, NULL); +- goto out; +- } +- +- end: +- ret_val = g_object_ref (local_file); +- +- out: +- g_clear_object (&photo); +- return ret_val; +-} +- +- +-static GtkWidget * +-photos_facebook_item_get_source_widget (PhotosBaseItem *item) +-{ +- PhotosFacebookItem *self = PHOTOS_FACEBOOK_ITEM (item); +- GtkWidget *source_widget; +- const gchar *name; +- +- name = photos_utils_get_provider_name (self->src_mngr, item); +- source_widget = gtk_link_button_new_with_label ("https://www.facebook.com/", name); +- gtk_widget_set_halign (source_widget, GTK_ALIGN_START); +- +- return source_widget; +-} +- +- +-/* TODO */ +-static void +-photos_facebook_item_open (PhotosBaseItem *item, GtkWindow *parent, guint32 timestamp) +-{ +- const gchar *facebook_uri; +- +- facebook_uri = photos_base_item_get_uri (item); +- +- { +- g_autoptr (GError) error = NULL; +- +- gtk_show_uri_on_window (parent, facebook_uri, timestamp, &error); +- if (error != NULL) +- g_warning ("Unable to show URI %s: %s", facebook_uri, error->message); +- } +-} +- +- +-static void +-photos_facebook_item_constructed (GObject *object) +-{ +- PhotosFacebookItem *self = PHOTOS_FACEBOOK_ITEM (object); +- const gchar *name; +- +- G_OBJECT_CLASS (photos_facebook_item_parent_class)->constructed (object); +- +- name = photos_utils_get_provider_name (self->src_mngr, PHOTOS_BASE_ITEM (self)); +- photos_base_item_set_default_app_name (PHOTOS_BASE_ITEM (self), name); +-} +- +- +-static void +-photos_facebook_item_dispose (GObject *object) +-{ +- PhotosFacebookItem *self = PHOTOS_FACEBOOK_ITEM (object); +- +- g_clear_object (&self->src_mngr); +- +- G_OBJECT_CLASS (photos_facebook_item_parent_class)->dispose (object); +-} +- +- +-static void +-photos_facebook_item_init (PhotosFacebookItem *self) +-{ +- GApplication *app; +- PhotosSearchContextState *state; +- +- app = g_application_get_default (); +- state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app)); +- +- self->src_mngr = g_object_ref (state->src_mngr); +-} +- +- +-static void +-photos_facebook_item_class_init (PhotosFacebookItemClass *class) +-{ +- GObjectClass *object_class = G_OBJECT_CLASS (class); +- PhotosBaseItemClass *base_item_class = PHOTOS_BASE_ITEM_CLASS (class); +- +- base_item_class->miner_name = "org.gnome.OnlineMiners.Facebook"; +- base_item_class->miner_object_path = "/org/gnome/OnlineMiners/Facebook"; +- +- object_class->constructed = photos_facebook_item_constructed; +- object_class->dispose = photos_facebook_item_dispose; +- base_item_class->create_filename_fallback = photos_facebook_item_create_filename_fallback; +- base_item_class->create_name_fallback = photos_facebook_item_create_name_fallback; +- base_item_class->create_thumbnail = photos_facebook_item_create_thumbnail; +- base_item_class->download = photos_facebook_item_download; +- base_item_class->get_source_widget = photos_facebook_item_get_source_widget; +- base_item_class->open = photos_facebook_item_open; +-} +diff --git a/src/photos-facebook-item.h b/src/photos-facebook-item.h +deleted file mode 100644 +index 7d4a4924769b..000000000000 +--- a/src/photos-facebook-item.h ++++ /dev/null +@@ -1,36 +0,0 @@ +-/* +- * Photos - access, organize and share your photos on GNOME +- * Copyright © 2013 Álvaro Peña +- * Copyright © 2016 – 2019 Red Hat, Inc. +- * +- * This program is free software: you can redistribute it and/or modify +- * it under the terms of the GNU General Public License as published by +- * the Free Software Foundation, either version 3 of the License, or +- * (at your option) any later version. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program. If not, see . +- */ +- +-/* Based on code from: +- * + Documents +- */ +- +-#ifndef PHOTOS_FACEBOOK_ITEM_H +-#define PHOTOS_FACEBOOK_ITEM_H +- +-#include "photos-base-item.h" +- +-G_BEGIN_DECLS +- +-#define PHOTOS_TYPE_FACEBOOK_ITEM (photos_facebook_item_get_type ()) +-G_DECLARE_FINAL_TYPE (PhotosFacebookItem, photos_facebook_item, PHOTOS, FACEBOOK_ITEM, PhotosBaseItem); +- +-G_END_DECLS +- +-#endif /* PHOTOS_FACEBOOK_ITEM_H */ +diff --git a/src/photos-flickr-item.c b/src/photos-flickr-item.c +deleted file mode 100644 +index b9f81d7c04c5..000000000000 +--- a/src/photos-flickr-item.c ++++ /dev/null +@@ -1,407 +0,0 @@ +-/* +- * Photos - access, organize and share your photos on GNOME +- * Copyright © 2013 – 2019 Red Hat, Inc. +- * +- * This program is free software: you can redistribute it and/or modify +- * it under the terms of the GNU General Public License as published by +- * the Free Software Foundation, either version 3 of the License, or +- * (at your option) any later version. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program. If not, see . +- */ +- +-/* Based on code from: +- * + Documents +- */ +- +- +-#include "config.h" +- +-#include +- +-#include +-#include +-#include +-#include +-#include +- +-#include "photos-base-manager.h" +-#include "photos-debug.h" +-#include "photos-error.h" +-#include "photos-flickr-item.h" +-#include "photos-search-context.h" +-#include "photos-source.h" +-#include "photos-utils.h" +- +- +-struct _PhotosFlickrItem +-{ +- PhotosBaseItem parent_instance; +- PhotosBaseManager *src_mngr; +-}; +- +- +-G_DEFINE_TYPE_WITH_CODE (PhotosFlickrItem, photos_flickr_item, PHOTOS_TYPE_BASE_ITEM, +- photos_utils_ensure_extension_points (); +- g_io_extension_point_implement (PHOTOS_BASE_ITEM_EXTENSION_POINT_NAME, +- g_define_type_id, +- "flickr", +- 0)); +- +- +-typedef struct _PhotosFlickrItemSyncData PhotosFlickrItemSyncData; +- +-struct _PhotosFlickrItemSyncData +-{ +- GError **error; +- GMainLoop *loop; +- gboolean op_res; +-}; +- +- +-static gchar * +-photos_flickr_item_create_filename_fallback (PhotosBaseItem *item) +-{ +- g_autoptr (GFile) file = NULL; +- const gchar *uri; +- gchar *ret_val; +- +- uri = photos_base_item_get_uri (item); +- file = g_file_new_for_uri (uri); +- ret_val = g_file_get_basename (file); +- +- return ret_val; +-} +- +- +-static gchar * +-photos_flickr_item_create_name_fallback (PhotosBaseItem *item) +-{ +- PhotosFlickrItem *self = PHOTOS_FLICKR_ITEM (item); +- g_autoptr (GDateTime) date_modified = NULL; +- const gchar *provider_name; +- g_autofree gchar *date_modified_str = NULL; +- gchar *ret_val; +- gint64 mtime; +- +- provider_name = photos_utils_get_provider_name (self->src_mngr, item); +- +- mtime = photos_base_item_get_mtime (item); +- date_modified = g_date_time_new_from_unix_local (mtime); +- date_modified_str = g_date_time_format (date_modified, "%x"); +- +- /* Translators: this is the fallback title in the form +- * "Facebook — 2nd January 2013". +- */ +- ret_val = g_strdup_printf (_("%s — %s"), provider_name, date_modified_str); +- +- return ret_val; +-} +- +- +-static GrlOperationOptions * +-photos_flickr_item_get_grl_options (GrlSource *source) +-{ +- GrlCaps *caps; +- GrlOperationOptions *options; +- +- caps = grl_source_get_caps (source, GRL_OP_RESOLVE); +- options = grl_operation_options_new (caps); +- return options; +-} +- +- +-static void +-photos_flickr_item_source_resolve (GrlSource *source, +- guint operation_id, +- GrlMedia *media, +- gpointer user_data, +- const GError *error) +-{ +- PhotosFlickrItemSyncData *data = (PhotosFlickrItemSyncData *) user_data; +- +- if (error != NULL) +- { +- if (data->error != NULL) +- *(data->error) = g_error_copy (error); +- data->op_res = FALSE; +- } +- else +- data->op_res = TRUE; +- +- g_main_loop_quit (data->loop); +-} +- +- +-static gboolean +-photos_flickr_item_create_thumbnail (PhotosBaseItem *item, GCancellable *cancellable, GError **error) +-{ +- PhotosFlickrItemSyncData data; +- g_autoptr (GFile) local_file = NULL; +- g_autoptr (GFile) remote_file = NULL; +- g_autoptr (GList) keys = NULL; +- g_autoptr (GMainContext) context = NULL; +- g_autoptr (GrlMedia) media = NULL; +- g_autoptr (GrlOperationOptions) options = NULL; +- GrlRegistry *registry; +- GrlSource *source; +- gboolean ret_val = FALSE; +- const gchar *const flickr_prefix = "flickr:"; +- const gchar *const resource_prefix = "gd:goa-account:"; +- const gchar *flickr_id; +- const gchar *goa_id; +- const gchar *identifier; +- const gchar *resource_urn; +- const gchar *thumbnail_uri; +- const gchar *uri; +- g_autofree gchar *grilo_id = NULL; +- g_autofree gchar *local_dir = NULL; +- g_autofree gchar *local_path = NULL; +- gint64 height; +- gint64 width; +- gsize prefix_len; +- +- data.error = error; +- data.loop = NULL; +- +- prefix_len = strlen (flickr_prefix); +- identifier = photos_base_item_get_identifier (item); +- if (strlen (identifier) <= prefix_len || !g_str_has_prefix (identifier, flickr_prefix)) +- { +- g_set_error (error, +- PHOTOS_ERROR, +- 0, +- "Invalid nao:identifier for Flickr item %s", +- identifier); +- goto out; +- } +- flickr_id = identifier + prefix_len; +- +- prefix_len = strlen (resource_prefix); +- resource_urn = photos_base_item_get_resource_urn (item); +- if (strlen (resource_urn) <= prefix_len || !g_str_has_prefix (resource_urn, resource_prefix)) +- { +- g_set_error (error, +- PHOTOS_ERROR, +- 0, +- "Invalid nie:dataSource for Flickr item %s", +- resource_urn); +- goto out; +- } +- goa_id = resource_urn + prefix_len; +- +- grilo_id = g_strdup_printf ("grl-flickr-%s", goa_id); +- registry = grl_registry_get_default (); +- source = grl_registry_lookup_source (registry, grilo_id); +- if (source == NULL) +- { +- g_set_error (error, +- PHOTOS_ERROR, +- 0, +- "Failed to find a GrlSource for %s", +- grilo_id); +- goto out; +- } +- +- media = grl_media_new (); +- grl_media_set_id (media, flickr_id); +- +- keys = grl_metadata_key_list_new (GRL_METADATA_KEY_THUMBNAIL, GRL_METADATA_KEY_INVALID); +- options = photos_flickr_item_get_grl_options (source); +- +- context = g_main_context_new (); +- g_main_context_push_thread_default (context); +- data.loop = g_main_loop_new (context, FALSE); +- +- grl_source_resolve (source, media, keys, options, photos_flickr_item_source_resolve, &data); +- g_main_loop_run (data.loop); +- g_main_context_pop_thread_default (context); +- +- if (!data.op_res) +- goto out; +- +- thumbnail_uri = grl_media_get_thumbnail (media); +- remote_file = g_file_new_for_uri (thumbnail_uri); +- +- local_path = photos_base_item_create_thumbnail_path (item); +- local_file = g_file_new_for_path (local_path); +- local_dir = g_path_get_dirname (local_path); +- g_mkdir_with_parents (local_dir, 0700); +- +- uri = photos_base_item_get_uri (item); +- +- height = photos_base_item_get_height (item); +- width = photos_base_item_get_width (item); +- +- photos_debug (PHOTOS_DEBUG_NETWORK, "Downloading %s from Flickr to %s", thumbnail_uri, local_path); +- if (!photos_utils_file_copy_as_thumbnail (remote_file, +- local_file, +- uri, +- height, +- width, +- cancellable, +- error)) +- goto out; +- +- ret_val = TRUE; +- +- out: +- if (data.loop != NULL) +- g_main_loop_unref (data.loop); +- return ret_val; +-} +- +- +-static GFile * +-photos_flickr_item_download (PhotosBaseItem *item, GCancellable *cancellable, GError **error) +-{ +- GFile *ret_val = NULL; +- g_autoptr (GFile) local_file = NULL; +- g_autoptr (GFile) remote_file = NULL; +- const gchar *cache_dir; +- const gchar *local_filename; +- const gchar *uri; +- g_autofree gchar *local_dir = NULL; +- g_autofree gchar *local_path = NULL; +- +- uri = photos_base_item_get_uri (item); +- remote_file = g_file_new_for_uri (uri); +- cache_dir = g_get_user_cache_dir (); +- +- local_dir = g_build_filename (cache_dir, PACKAGE_TARNAME, "flickr", NULL); +- g_mkdir_with_parents (local_dir, 0700); +- +- local_filename = photos_base_item_get_filename (item); +- local_path = g_build_filename (local_dir, local_filename, NULL); +- local_file = g_file_new_for_path (local_path); +- +- if (!g_file_test (local_path, G_FILE_TEST_EXISTS)) +- { +- photos_debug (PHOTOS_DEBUG_NETWORK, "Downloading %s from Flickr to %s", uri, local_path); +- if (!g_file_copy (remote_file, +- local_file, +- G_FILE_COPY_ALL_METADATA | G_FILE_COPY_OVERWRITE, +- cancellable, +- NULL, +- NULL, +- error)) +- { +- g_file_delete (local_file, NULL, NULL); +- goto out; +- } +- } +- +- ret_val = g_object_ref (local_file); +- +- out: +- return ret_val; +-} +- +- +-static GtkWidget * +-photos_flickr_item_get_source_widget (PhotosBaseItem *item) +-{ +- PhotosFlickrItem *self = PHOTOS_FLICKR_ITEM (item); +- GtkWidget *source_widget; +- const gchar *name; +- +- name = photos_utils_get_provider_name (self->src_mngr, item); +- source_widget = gtk_link_button_new_with_label ("https://www.flickr.com/", name); +- gtk_widget_set_halign (source_widget, GTK_ALIGN_START); +- +- return source_widget; +-} +- +- +-static void +-photos_flickr_item_open (PhotosBaseItem *item, GtkWindow *parent, guint32 timestamp) +-{ +- PhotosFlickrItem *self = PHOTOS_FLICKR_ITEM (item); +- GoaAccount *account; +- GoaObject *object; +- PhotosSource *source; +- const gchar *identifier; +- const gchar *identity; +- const gchar *resource_urn; +- g_autofree gchar *flickr_uri = NULL; +- +- identifier = photos_base_item_get_identifier (item) + strlen ("flickr:"); +- +- resource_urn = photos_base_item_get_resource_urn (item); +- source = PHOTOS_SOURCE (photos_base_manager_get_object_by_id (self->src_mngr, resource_urn)); +- object = photos_source_get_goa_object (source); +- account = goa_object_peek_account (object); +- identity = goa_account_get_identity (account); +- +- flickr_uri = g_strdup_printf ("https://www.flickr.com/photos/%s/%s", identity, identifier); +- +- { +- g_autoptr (GError) error = NULL; +- +- if (!gtk_show_uri_on_window (parent, flickr_uri, timestamp, &error)) +- g_warning ("Unable to show URI %s: %s", flickr_uri, error->message); +- } +-} +- +- +-static void +-photos_flickr_item_constructed (GObject *object) +-{ +- PhotosFlickrItem *self = PHOTOS_FLICKR_ITEM (object); +- const gchar *name; +- +- G_OBJECT_CLASS (photos_flickr_item_parent_class)->constructed (object); +- +- name = photos_utils_get_provider_name (self->src_mngr, PHOTOS_BASE_ITEM (self)); +- photos_base_item_set_default_app_name (PHOTOS_BASE_ITEM (self), name); +-} +- +- +-static void +-photos_flickr_item_dispose (GObject *object) +-{ +- PhotosFlickrItem *self = PHOTOS_FLICKR_ITEM (object); +- +- g_clear_object (&self->src_mngr); +- +- G_OBJECT_CLASS (photos_flickr_item_parent_class)->dispose (object); +-} +- +- +-static void +-photos_flickr_item_init (PhotosFlickrItem *self) +-{ +- GApplication *app; +- PhotosSearchContextState *state; +- +- app = g_application_get_default (); +- state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app)); +- +- self->src_mngr = g_object_ref (state->src_mngr); +-} +- +- +-static void +-photos_flickr_item_class_init (PhotosFlickrItemClass *class) +-{ +- GObjectClass *object_class = G_OBJECT_CLASS (class); +- PhotosBaseItemClass *base_item_class = PHOTOS_BASE_ITEM_CLASS (class); +- +- base_item_class->miner_name = "org.gnome.OnlineMiners.Flickr"; +- base_item_class->miner_object_path = "/org/gnome/OnlineMiners/Flickr"; +- +- object_class->constructed = photos_flickr_item_constructed; +- object_class->dispose = photos_flickr_item_dispose; +- base_item_class->create_filename_fallback = photos_flickr_item_create_filename_fallback; +- base_item_class->create_name_fallback = photos_flickr_item_create_name_fallback; +- base_item_class->create_thumbnail = photos_flickr_item_create_thumbnail; +- base_item_class->download = photos_flickr_item_download; +- base_item_class->get_source_widget = photos_flickr_item_get_source_widget; +- base_item_class->open = photos_flickr_item_open; +-} +diff --git a/src/photos-flickr-item.h b/src/photos-flickr-item.h +deleted file mode 100644 +index cd130844bce2..000000000000 +--- a/src/photos-flickr-item.h ++++ /dev/null +@@ -1,35 +0,0 @@ +-/* +- * Photos - access, organize and share your photos on GNOME +- * Copyright © 2012 – 2019 Red Hat, Inc. +- * +- * This program is free software: you can redistribute it and/or modify +- * it under the terms of the GNU General Public License as published by +- * the Free Software Foundation, either version 3 of the License, or +- * (at your option) any later version. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program. If not, see . +- */ +- +-/* Based on code from: +- * + Documents +- */ +- +-#ifndef PHOTOS_FLICKR_ITEM_H +-#define PHOTOS_FLICKR_ITEM_H +- +-#include "photos-base-item.h" +- +-G_BEGIN_DECLS +- +-#define PHOTOS_TYPE_FLICKR_ITEM (photos_flickr_item_get_type ()) +-G_DECLARE_FINAL_TYPE (PhotosFlickrItem, photos_flickr_item, PHOTOS, FLICKR_ITEM, PhotosBaseItem); +- +-G_END_DECLS +- +-#endif /* PHOTOS_LOCAL_ITEM_H */ +diff --git a/src/photos-google-item.c b/src/photos-google-item.c +deleted file mode 100644 +index 5737f958b7a5..000000000000 +--- a/src/photos-google-item.c ++++ /dev/null +@@ -1,349 +0,0 @@ +-/* +- * Photos - access, organize and share your photos on GNOME +- * Copyright © 2014 – 2019 Red Hat, Inc. +- * Copyright © 2014 Saurav Agarwalla +- * +- * This program is free software: you can redistribute it and/or modify +- * it under the terms of the GNU General Public License as published by +- * the Free Software Foundation, either version 3 of the License, or +- * (at your option) any later version. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program. If not, see . +- */ +- +-/* Based on code from: +- * + Documents +- */ +- +- +-#include "config.h" +- +-#include +-#include +-#include +-#include +- +-#include "photos-base-manager.h" +-#include "photos-debug.h" +-#include "photos-error.h" +-#include "photos-google-item.h" +-#include "photos-search-context.h" +-#include "photos-source.h" +-#include "photos-utils.h" +- +- +-struct _PhotosGoogleItem +-{ +- PhotosBaseItem parent_instance; +- PhotosBaseManager *src_mngr; +-}; +- +- +-G_DEFINE_TYPE_WITH_CODE (PhotosGoogleItem, photos_google_item, PHOTOS_TYPE_BASE_ITEM, +- photos_utils_ensure_extension_points (); +- g_io_extension_point_implement (PHOTOS_BASE_ITEM_EXTENSION_POINT_NAME, +- g_define_type_id, +- "google", +- 0)); +- +- +-static gchar * +-photos_google_item_create_filename_fallback (PhotosBaseItem *item) +-{ +- const gchar *identifier; +- const gchar *mime_type; +- gchar *ret_val; +- g_autofree gchar *extension = NULL; +- g_autofree gchar *identifier_hash = NULL; +- +- identifier = photos_base_item_get_identifier (item); +- identifier_hash = g_compute_checksum_for_string (G_CHECKSUM_SHA1, identifier, -1); +- +- mime_type = photos_base_item_get_mime_type (item); +- extension = photos_utils_get_extension_from_mime_type (mime_type); +- if (extension == NULL) +- extension = g_strdup ("tmp"); +- +- ret_val = g_strdup_printf ("%s.%s", identifier_hash, extension); +- +- return ret_val; +-} +- +- +-static gchar * +-photos_google_item_create_name_fallback (PhotosBaseItem *item) +-{ +- PhotosGoogleItem *self = PHOTOS_GOOGLE_ITEM (item); +- g_autoptr (GDateTime) date_modified = NULL; +- const gchar *provider_name; +- gchar *ret_val; +- g_autofree gchar *date_modified_str = NULL; +- gint64 mtime; +- +- provider_name = photos_utils_get_provider_name (self->src_mngr, item); +- +- mtime = photos_base_item_get_mtime (item); +- date_modified = g_date_time_new_from_unix_local (mtime); +- date_modified_str = g_date_time_format (date_modified, "%x"); +- +- /* Translators: this is the fallback title in the form +- * "Facebook — 2nd January 2013". +- */ +- ret_val = g_strdup_printf (_("%s — %s"), provider_name, date_modified_str); +- +- return ret_val; +-} +- +- +-static GDataEntry * +-photos_google_get_picasaweb_file (PhotosBaseItem *item, GCancellable *cancellable, GError **error) +-{ +- PhotosGoogleItem *self = PHOTOS_GOOGLE_ITEM (item); +- PhotosSource *source; +- GDataAuthorizationDomain *authorization_domain; +- GDataEntry *entry; +- g_autoptr (GDataGoaAuthorizer) authorizer = NULL; +- g_autoptr (GDataPicasaWebQuery) query = NULL; +- g_autoptr (GDataPicasaWebService) service = NULL; +- const gchar *identifier; +- const gchar *resource_urn; +- +- resource_urn = photos_base_item_get_resource_urn (item); +- source = PHOTOS_SOURCE (photos_base_manager_get_object_by_id (self->src_mngr, resource_urn)); +- authorizer = gdata_goa_authorizer_new (photos_source_get_goa_object (source)); +- identifier = photos_base_item_get_identifier (item) + strlen ("google:picasaweb:"); +- service = gdata_picasaweb_service_new (GDATA_AUTHORIZER (authorizer)); +- authorization_domain = gdata_picasaweb_service_get_primary_authorization_domain (); +- +- query = gdata_picasaweb_query_new (NULL); +- gdata_picasaweb_query_set_image_size (query, "d"); +- +- entry = gdata_service_query_single_entry (GDATA_SERVICE (service), +- authorization_domain, +- identifier, +- GDATA_QUERY (query), +- GDATA_TYPE_PICASAWEB_FILE, +- cancellable, +- error); +- +- return entry; +-} +- +- +-static gboolean +-photos_google_item_create_thumbnail (PhotosBaseItem *item, GCancellable *cancellable, GError **error) +-{ +- g_autoptr (GFile) local_file = NULL; +- g_autoptr (GFile) remote_file = NULL; +- GList *l; +- GList *thumbnails; +- g_autoptr (GDataEntry) entry = NULL; +- GDataMediaThumbnail *thumbnail = NULL; +- gboolean ret_val = FALSE; +- const gchar *thumbnail_uri; +- const gchar *uri; +- g_autofree gchar *local_dir = NULL; +- g_autofree gchar *local_path = NULL; +- gint64 height; +- gint64 width; +- guint max_width = 0; +- guint current_width; +- +- entry = photos_google_get_picasaweb_file (item, cancellable, error); +- if (entry == NULL) +- goto out; +- +- thumbnails = gdata_picasaweb_file_get_thumbnails (GDATA_PICASAWEB_FILE (entry)); +- if (thumbnails == NULL) +- { +- g_set_error (error, PHOTOS_ERROR, 0, "Failed to find an image for the thumbnail"); +- goto out; +- } +- +- for (l = thumbnails; l != NULL; l = l->next) +- { +- current_width = gdata_media_thumbnail_get_width (GDATA_MEDIA_THUMBNAIL (l->data)); +- if (current_width > max_width) +- { +- max_width = current_width; +- thumbnail = GDATA_MEDIA_THUMBNAIL (l->data); +- } +- } +- +- thumbnail_uri = gdata_media_thumbnail_get_uri (thumbnail); +- remote_file = g_file_new_for_uri (thumbnail_uri); +- +- local_path = photos_base_item_create_thumbnail_path (item); +- local_file = g_file_new_for_path (local_path); +- local_dir = g_path_get_dirname (local_path); +- g_mkdir_with_parents (local_dir, 0700); +- +- uri = photos_base_item_get_uri (item); +- +- height = photos_base_item_get_height (item); +- width = photos_base_item_get_width (item); +- +- photos_debug (PHOTOS_DEBUG_NETWORK, "Downloading %s from Google to %s", thumbnail_uri, local_path); +- if (!photos_utils_file_copy_as_thumbnail (remote_file, +- local_file, +- uri, +- height, +- width, +- cancellable, +- error)) +- goto out; +- +- ret_val = TRUE; +- +- out: +- return ret_val; +-} +- +- +-static GFile * +-photos_google_item_download (PhotosBaseItem *item, GCancellable *cancellable, GError **error) +-{ +- GFile *ret_val = NULL; +- g_autoptr (GFile) local_file = NULL; +- g_autoptr (GFile) remote_file = NULL; +- g_autoptr (GDataEntry) entry = NULL; +- const gchar *cache_dir; +- const gchar *local_filename; +- const gchar *uri; +- g_autofree gchar *local_dir = NULL; +- g_autofree gchar *local_path = NULL; +- +- cache_dir = g_get_user_cache_dir (); +- local_dir = g_build_filename (cache_dir, PACKAGE_TARNAME, "google", NULL); +- g_mkdir_with_parents (local_dir, 0700); +- +- local_filename = photos_base_item_get_filename (item); +- local_path = g_build_filename (local_dir, local_filename, NULL); +- local_file = g_file_new_for_path (local_path); +- if (g_file_test (local_path, G_FILE_TEST_EXISTS)) +- goto end; +- +- entry = photos_google_get_picasaweb_file (item, cancellable, error); +- if (entry == NULL) +- goto out; +- +- uri = gdata_entry_get_content_uri (entry); +- remote_file = g_file_new_for_uri (uri); +- +- photos_debug (PHOTOS_DEBUG_NETWORK, "Downloading %s from Google to %s", uri, local_path); +- if (!g_file_copy (remote_file, +- local_file, +- G_FILE_COPY_ALL_METADATA | G_FILE_COPY_OVERWRITE, +- cancellable, +- NULL, +- NULL, +- error)) +- { +- g_file_delete (local_file, NULL, NULL); +- goto out; +- } +- +- end: +- ret_val = g_object_ref (local_file); +- +- out: +- return ret_val; +-} +- +- +-static GtkWidget * +-photos_google_item_get_source_widget (PhotosBaseItem *item) +-{ +- PhotosGoogleItem *self = PHOTOS_GOOGLE_ITEM (item); +- GtkWidget *source_widget; +- const gchar *name; +- +- name = photos_utils_get_provider_name (self->src_mngr, item); +- source_widget = gtk_link_button_new_with_label ("https://photos.google.com/", name); +- gtk_widget_set_halign (source_widget, GTK_ALIGN_START); +- +- return source_widget; +-} +- +- +-/* NOTE: For private photos, opening the URI in a browser results in a +- * 'Sorry, that page was not found.' if the user is not logged in with the respective account +- */ +-static void +-photos_google_item_open (PhotosBaseItem *item, GtkWindow *parent, guint32 timestamp) +-{ +- const gchar *google_uri; +- +- google_uri = photos_base_item_get_uri (item); +- +- { +- g_autoptr (GError) error = NULL; +- +- gtk_show_uri_on_window (parent, google_uri, timestamp, &error); +- if (error != NULL) +- g_warning ("Unable to show URI %s: %s", google_uri, error->message); +- } +-} +- +- +-static void +-photos_google_item_constructed (GObject *object) +-{ +- PhotosGoogleItem *self = PHOTOS_GOOGLE_ITEM (object); +- const gchar *name; +- +- G_OBJECT_CLASS (photos_google_item_parent_class)->constructed (object); +- +- name = photos_utils_get_provider_name (self->src_mngr, PHOTOS_BASE_ITEM (self)); +- photos_base_item_set_default_app_name (PHOTOS_BASE_ITEM (self), name); +-} +- +- +-static void +-photos_google_item_dispose (GObject *object) +-{ +- PhotosGoogleItem *self = PHOTOS_GOOGLE_ITEM (object); +- +- g_clear_object (&self->src_mngr); +- +- G_OBJECT_CLASS (photos_google_item_parent_class)->dispose (object); +-} +- +- +-static void +-photos_google_item_init (PhotosGoogleItem *self) +-{ +- GApplication *app; +- PhotosSearchContextState *state; +- +- app = g_application_get_default (); +- state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app)); +- +- self->src_mngr = g_object_ref (state->src_mngr); +-} +- +- +-static void +-photos_google_item_class_init (PhotosGoogleItemClass *class) +-{ +- GObjectClass *object_class = G_OBJECT_CLASS (class); +- PhotosBaseItemClass *base_item_class = PHOTOS_BASE_ITEM_CLASS (class); +- +- base_item_class->miner_name = "org.gnome.OnlineMiners.GData"; +- base_item_class->miner_object_path = "/org/gnome/OnlineMiners/GData"; +- +- object_class->constructed = photos_google_item_constructed; +- object_class->dispose = photos_google_item_dispose; +- base_item_class->create_filename_fallback = photos_google_item_create_filename_fallback; +- base_item_class->create_name_fallback = photos_google_item_create_name_fallback; +- base_item_class->create_thumbnail = photos_google_item_create_thumbnail; +- base_item_class->download = photos_google_item_download; +- base_item_class->get_source_widget = photos_google_item_get_source_widget; +- base_item_class->open = photos_google_item_open; +-} +diff --git a/src/photos-google-item.h b/src/photos-google-item.h +deleted file mode 100644 +index 644098e3c095..000000000000 +--- a/src/photos-google-item.h ++++ /dev/null +@@ -1,36 +0,0 @@ +-/* +- * Photos - access, organize and share your photos on GNOME +- * Copyright © 2016 – 2019 Red Hat, Inc. +- * Copyright © 2014 Saurav Agarwalla +- * +- * This program is free software: you can redistribute it and/or modify +- * it under the terms of the GNU General Public License as published by +- * the Free Software Foundation, either version 3 of the License, or +- * (at your option) any later version. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program. If not, see . +- */ +- +-/* Based on code from: +- * + Documents +- */ +- +-#ifndef PHOTOS_GOOGLE_ITEM_H +-#define PHOTOS_GOOGLE_ITEM_H +- +-#include "photos-base-item.h" +- +-G_BEGIN_DECLS +- +-#define PHOTOS_TYPE_GOOGLE_ITEM (photos_google_item_get_type ()) +-G_DECLARE_FINAL_TYPE (PhotosGoogleItem, photos_google_item, PHOTOS, GOOGLE_ITEM, PhotosBaseItem); +- +-G_END_DECLS +- +-#endif /* PHOTOS_GOOGLE_ITEM_H */ +diff --git a/src/photos-share-point-google.c b/src/photos-share-point-google.c +deleted file mode 100644 +index 6cc6d55d882e..000000000000 +--- a/src/photos-share-point-google.c ++++ /dev/null +@@ -1,516 +0,0 @@ +-/* +- * Photos - access, organize and share your photos on GNOME +- * Copyright © 2016 – 2020 Red Hat, Inc. +- * Copyright © 2016 Umang Jain +- * +- * This program is free software: you can redistribute it and/or modify +- * it under the terms of the GNU General Public License as published by +- * the Free Software Foundation, either version 3 of the License, or +- * (at your option) any later version. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program. If not, see . +- */ +- +- +-#include "config.h" +- +-#include +-#include +-#include +- +-#include "photos-application.h" +-#include "photos-base-item.h" +-#include "photos-error.h" +-#include "photos-filterable.h" +-#include "photos-item-manager.h" +-#include "photos-search-context.h" +-#include "photos-share-point-google.h" +-#include "photos-source.h" +-#include "photos-utils.h" +- +- +-struct _PhotosSharePointGoogle +-{ +- PhotosSharePointOnline parent_instance; +- GDataGoaAuthorizer *authorizer; +- GDataPicasaWebService *service; +- PhotosBaseManager *item_mngr; +-}; +- +- +-G_DEFINE_TYPE_WITH_CODE (PhotosSharePointGoogle, photos_share_point_google, PHOTOS_TYPE_SHARE_POINT_ONLINE, +- photos_utils_ensure_extension_points (); +- g_io_extension_point_implement (PHOTOS_SHARE_POINT_ONLINE_EXTENSION_POINT_NAME, +- g_define_type_id, +- "google", +- 0)); +- +- +-typedef struct _PhotosSharePointGoogleShareData PhotosSharePointGoogleShareData; +- +-struct _PhotosSharePointGoogleShareData +-{ +- GDataPicasaWebFile *file_entry; +- GDataUploadStream *stream; +- PhotosBaseItem *item; +- gchar *item_id_after_changes; +- guint pending_async_calls; +-}; +- +- +-static PhotosSharePointGoogleShareData * +-photos_share_point_google_share_data_new (PhotosBaseItem *item) +-{ +- PhotosSharePointGoogleShareData *data; +- +- data = g_slice_new0 (PhotosSharePointGoogleShareData); +- data->item = g_object_ref (item); +- +- return data; +-} +- +- +-static void +-photos_share_point_google_share_data_free (PhotosSharePointGoogleShareData *data) +-{ +- g_clear_object (&data->file_entry); +- g_clear_object (&data->stream); +- g_clear_object (&data->item); +- g_free (data->item_id_after_changes); +- g_slice_free (PhotosSharePointGoogleShareData, data); +-} +- +- +-static gboolean +-photos_share_point_google_needs_notification (PhotosSharePoint *share_point) +-{ +- return TRUE; +-} +- +- +-static gchar * +-photos_share_point_google_parse_error (PhotosSharePoint *self, GError *error) +-{ +- gchar *msg; +- +- if (g_error_matches (error, GDATA_SERVICE_ERROR, GDATA_SERVICE_ERROR_AUTHENTICATION_REQUIRED)) +- msg = g_strdup (_("Failed to upload photo: Service not authorized")); +- else +- msg = g_strdup (_("Failed to upload photo")); +- +- return msg; +-} +- +- +-static void +-photos_share_point_google_share_insert_shared_content (GObject *source_object, GAsyncResult *res, gpointer user_data) +-{ +- GError *error; +- g_autoptr (GTask) task = G_TASK (user_data); +- GomMiner *miner = GOM_MINER (source_object); +- +- error = NULL; +- if (!gom_miner_call_insert_shared_content_finish (miner, res, &error)) +- { +- g_task_return_error (task, error); +- goto out; +- } +- +- g_task_return_boolean (task, TRUE); +- +- out: +- return; +-} +- +- +-static void +-photos_share_point_google_share_metadata_add_shared_second (PhotosSharePointGoogle *self, GTask *task) +-{ +- GApplication *app; +- GCancellable *cancellable; +- GoaAccount *account; +- GoaObject *object; +- GomMiner *miner; +- PhotosSource *source; +- PhotosSharePointGoogleShareData *data; +- const gchar *account_id; +- const gchar *file_entry_id; +- +- cancellable = g_task_get_cancellable (task); +- data = (PhotosSharePointGoogleShareData *) g_task_get_task_data (task); +- +- app = g_application_get_default (); +- miner = photos_application_get_miner (PHOTOS_APPLICATION (app), "google"); +- if (miner == NULL) +- { +- g_task_return_new_error (task, PHOTOS_ERROR, 0, "Unable to find the google miner"); +- goto out; +- } +- +- source = photos_share_point_online_get_source (PHOTOS_SHARE_POINT_ONLINE (self)); +- object = photos_source_get_goa_object (source); +- account = goa_object_peek_account (object); +- account_id = goa_account_get_id (account); +- +- file_entry_id = gdata_entry_get_id (GDATA_ENTRY (data->file_entry)); +- +- gom_miner_call_insert_shared_content (miner, +- account_id, +- file_entry_id, +- "photos", +- data->item_id_after_changes, +- cancellable, +- photos_share_point_google_share_insert_shared_content, +- g_object_ref (task)); +- +- out: +- g_object_unref (task); +-} +- +- +-static void +-photos_share_point_google_share_metadata_add_shared (GObject *source_object, GAsyncResult *res, gpointer user_data) +-{ +- PhotosSharePointGoogle *self; +- g_autoptr (GTask) task = G_TASK (user_data); +- PhotosBaseItem *item = PHOTOS_BASE_ITEM (source_object); +- PhotosSharePointGoogleShareData *data; +- +- self = PHOTOS_SHARE_POINT_GOOGLE (g_task_get_source_object (task)); +- data = (PhotosSharePointGoogleShareData *) g_task_get_task_data (task); +- +- { +- g_autoptr (GError) error = NULL; +- +- if (!photos_base_item_metadata_add_shared_finish (item, res, &error)) +- { +- if (g_task_get_completed (task)) +- g_warning ("Unable to add shared metadata: %s", error->message); +- else +- g_task_return_error (task, g_steal_pointer (&error)); +- +- goto out; +- } +- } +- +- data->pending_async_calls--; +- if (data->pending_async_calls == 0) +- photos_share_point_google_share_metadata_add_shared_second (self, g_object_ref (task)); +- +- out: +- return; +-} +- +- +-static void +-photos_share_point_google_share_wait_for_changes (GObject *source_object, GAsyncResult *res, gpointer user_data) +-{ +- PhotosSharePointGoogle *self; +- g_autoptr (GTask) task = G_TASK (user_data); +- PhotosItemManager *item_mngr = PHOTOS_ITEM_MANAGER (source_object); +- PhotosSharePointGoogleShareData *data; +- g_autofree gchar *item_id_after_changes = NULL; +- +- self = PHOTOS_SHARE_POINT_GOOGLE (g_task_get_source_object (task)); +- data = (PhotosSharePointGoogleShareData *) g_task_get_task_data (task); +- +- { +- g_autoptr (GError) error = NULL; +- +- item_id_after_changes = photos_item_manager_wait_for_changes_finish (item_mngr, res, &error); +- if (error != NULL) +- { +- if (g_task_get_completed (task)) +- g_warning ("Unable to detect changes: %s", error->message); +- else +- g_task_return_error (task, g_steal_pointer (&error)); +- +- goto out; +- } +- } +- +- g_assert_null (data->item_id_after_changes); +- data->item_id_after_changes = g_steal_pointer (&item_id_after_changes); +- +- data->pending_async_calls--; +- if (data->pending_async_calls == 0) +- photos_share_point_google_share_metadata_add_shared_second (self, g_object_ref (task)); +- +- out: +- return; +-} +- +- +-static void +-photos_share_point_google_share_save_to_stream (GObject *source_object, GAsyncResult *res, gpointer user_data) +-{ +- PhotosSharePointGoogle *self; +- GCancellable *cancellable; +- GError *error; +- g_autoptr (GTask) task = G_TASK (user_data); +- g_autoptr (GDataPicasaWebFile) file_entry = NULL; +- GoaAccount *account; +- GoaObject *object; +- PhotosBaseItem *item = PHOTOS_BASE_ITEM (source_object); +- PhotosSource *source; +- PhotosSharePointGoogleShareData *data; +- const gchar *account_identity; +- const gchar *file_entry_id; +- const gchar *provider_type; +- g_autofree gchar *shared_identifier = NULL; +- +- self = PHOTOS_SHARE_POINT_GOOGLE (g_task_get_source_object (task)); +- cancellable = g_task_get_cancellable (task); +- data = (PhotosSharePointGoogleShareData *) g_task_get_task_data (task); +- +- error = NULL; +- if (!photos_base_item_save_to_stream_finish (item, res, &error)) +- { +- g_task_return_error (task, error); +- goto out; +- } +- +- error = NULL; +- file_entry = gdata_picasaweb_service_finish_file_upload (GDATA_PICASAWEB_SERVICE (self->service), +- data->stream, +- &error); +- if (error != NULL) +- { +- g_task_return_error (task, error); +- goto out; +- } +- +- g_assert_null (data->file_entry); +- data->file_entry = g_object_ref (file_entry); +- +- g_assert_true (PHOTOS_IS_ITEM_MANAGER (self->item_mngr)); +- +- /* Tracker might detect the atomic update done by GExiv2 as a 'delete' +- * followed by 'create'. If that happens the URN will change. We +- * have to deal with that by waiting for TrackerChangeMonitor to +- * emit changes-pending for the BaseItem that we are interested in, +- * and using the new URN, if any. +- * +- * See https://bugzilla.gnome.org/show_bug.cgi?id=771042 +- */ +- photos_item_manager_wait_for_changes_async (PHOTOS_ITEM_MANAGER (self->item_mngr), +- data->item, +- cancellable, +- photos_share_point_google_share_wait_for_changes, +- g_object_ref (task)); +- data->pending_async_calls++; +- +- source = photos_share_point_online_get_source (PHOTOS_SHARE_POINT_ONLINE (self)); +- object = photos_source_get_goa_object (source); +- account = goa_object_peek_account (object); +- account_identity = goa_account_get_identity (account); +- provider_type = goa_account_get_provider_type (account); +- +- file_entry_id = gdata_entry_get_id (GDATA_ENTRY (file_entry)); +- shared_identifier = g_strconcat ("google:picasaweb:", file_entry_id, NULL); +- +- photos_base_item_metadata_add_shared_async (data->item, +- provider_type, +- account_identity, +- shared_identifier, +- cancellable, +- photos_share_point_google_share_metadata_add_shared, +- g_object_ref (task)); +- data->pending_async_calls++; +- +- out: +- return; +-} +- +- +-static void +-photos_share_point_google_share_refresh_authorization (GObject *source_object, +- GAsyncResult *res, +- gpointer user_data) +-{ +- PhotosSharePointGoogle *self; +- GCancellable *cancellable; +- GError *error; +- g_autoptr (GTask) task = G_TASK (user_data); +- GDataAuthorizer *authorizer = GDATA_AUTHORIZER (source_object); +- g_autoptr (GDataPicasaWebFile) file_entry = NULL; +- g_autoptr (GDataUploadStream) stream = NULL; +- PhotosSharePointGoogleShareData *data; +- const gchar *filename; +- const gchar *mime_type; +- const gchar *name; +- +- self = PHOTOS_SHARE_POINT_GOOGLE (g_task_get_source_object (task)); +- cancellable = g_task_get_cancellable (task); +- data = (PhotosSharePointGoogleShareData *) g_task_get_task_data (task); +- +- error = NULL; +- if (!gdata_authorizer_refresh_authorization_finish (authorizer, res, &error)) +- { +- g_task_return_error (task, error); +- goto out; +- } +- +- file_entry = gdata_picasaweb_file_new (NULL); +- name = photos_base_item_get_name_with_fallback (data->item); +- gdata_entry_set_title (GDATA_ENTRY (file_entry), name); +- +- filename = photos_base_item_get_filename (data->item); +- mime_type = photos_base_item_get_mime_type (data->item); +- +- error = NULL; +- stream = gdata_picasaweb_service_upload_file (self->service, +- NULL, +- file_entry, +- filename, +- mime_type, +- cancellable, +- &error); +- if (error != NULL) +- { +- g_task_return_error (task, error); +- goto out; +- } +- +- g_assert_null (data->stream); +- data->stream = g_object_ref (stream); +- +- photos_base_item_save_to_stream_async (data->item, +- G_OUTPUT_STREAM (stream), +- 1.0, +- cancellable, +- photos_share_point_google_share_save_to_stream, +- g_object_ref (task)); +- +- out: +- return; +-} +- +- +-static void +-photos_share_point_google_share_async (PhotosSharePoint *share_point, +- PhotosBaseItem *item, +- GCancellable *cancellable, +- GAsyncReadyCallback callback, +- gpointer user_data) +-{ +- PhotosSharePointGoogle *self = PHOTOS_SHARE_POINT_GOOGLE (share_point); +- g_autoptr (GTask) task = NULL; +- PhotosSharePointGoogleShareData *data; +- +- data = photos_share_point_google_share_data_new (item); +- +- task = g_task_new (self, cancellable, callback, user_data); +- g_task_set_source_tag (task, photos_share_point_google_share_async); +- g_task_set_task_data (task, data, (GDestroyNotify) photos_share_point_google_share_data_free); +- +- gdata_authorizer_refresh_authorization_async (GDATA_AUTHORIZER (self->authorizer), +- cancellable, +- photos_share_point_google_share_refresh_authorization, +- g_object_ref (task)); +-} +- +- +-static gboolean +-photos_share_point_google_share_finish (PhotosSharePoint *share_point, +- GAsyncResult *res, +- gchar **out_uri, +- GError **error) +-{ +- PhotosSharePointGoogle *self = PHOTOS_SHARE_POINT_GOOGLE (share_point); +- GTask *task; +- gboolean ret_val = FALSE; +- +- g_return_val_if_fail (g_task_is_valid (res, self), FALSE); +- task = G_TASK (res); +- +- g_return_val_if_fail (g_task_get_source_tag (task) == photos_share_point_google_share_async, FALSE); +- g_return_val_if_fail (error == NULL || *error == NULL, FALSE); +- +- if (!g_task_propagate_boolean (task, error)) +- goto out; +- +- ret_val = TRUE; +- +- if (out_uri != NULL) +- *out_uri = g_strdup ("https://photos.google.com/"); +- +- out: +- return ret_val; +-} +- +- +-static void +-photos_share_point_google_constructed (GObject *object) +-{ +- PhotosSharePointGoogle *self = PHOTOS_SHARE_POINT_GOOGLE (object); +- PhotosSource *source; +- GoaObject *goa_object; +- +- G_OBJECT_CLASS (photos_share_point_google_parent_class)->constructed (object); +- +- source = photos_share_point_online_get_source (PHOTOS_SHARE_POINT_ONLINE (self)); +- goa_object = photos_source_get_goa_object (source); +- self->authorizer = gdata_goa_authorizer_new (goa_object); +- self->service = gdata_picasaweb_service_new (GDATA_AUTHORIZER (self->authorizer)); +-} +- +- +-static void +-photos_share_point_google_dispose (GObject *object) +-{ +- PhotosSharePointGoogle *self = PHOTOS_SHARE_POINT_GOOGLE (object); +- +- g_clear_object (&self->authorizer); +- g_clear_object (&self->service); +- +- G_OBJECT_CLASS (photos_share_point_google_parent_class)->dispose (object); +-} +- +- +-static void +-photos_share_point_google_finalize (GObject *object) +-{ +- PhotosSharePointGoogle *self = PHOTOS_SHARE_POINT_GOOGLE (object); +- +- if (self->item_mngr != NULL) +- g_object_remove_weak_pointer (G_OBJECT (self->item_mngr), (gpointer *) &self->item_mngr); +- +- G_OBJECT_CLASS (photos_share_point_google_parent_class)->finalize (object); +-} +- +- +-static void +-photos_share_point_google_init (PhotosSharePointGoogle *self) +-{ +- GApplication *app; +- PhotosSearchContextState *state; +- +- app = g_application_get_default (); +- state = photos_search_context_get_state (PHOTOS_SEARCH_CONTEXT (app)); +- +- self->item_mngr = state->item_mngr; +- g_object_add_weak_pointer (G_OBJECT (self->item_mngr), (gpointer *) &self->item_mngr); +-} +- +- +-static void +-photos_share_point_google_class_init (PhotosSharePointGoogleClass *class) +-{ +- GObjectClass *object_class = G_OBJECT_CLASS (class); +- PhotosSharePointClass *share_point_class = PHOTOS_SHARE_POINT_CLASS (class); +- +- object_class->constructed = photos_share_point_google_constructed; +- object_class->dispose = photos_share_point_google_dispose; +- object_class->finalize = photos_share_point_google_finalize; +- share_point_class->needs_notification = photos_share_point_google_needs_notification; +- share_point_class->parse_error = photos_share_point_google_parse_error; +- share_point_class->share_async = photos_share_point_google_share_async; +- share_point_class->share_finish = photos_share_point_google_share_finish; +-} +diff --git a/src/photos-share-point-google.h b/src/photos-share-point-google.h +deleted file mode 100644 +index f229f7ed05a6..000000000000 +--- a/src/photos-share-point-google.h ++++ /dev/null +@@ -1,35 +0,0 @@ +-/* +- * Photos - access, organize and share your photos on GNOME +- * Copyright © 2016 Umang Jain +- * +- * This program is free software: you can redistribute it and/or modify +- * it under the terms of the GNU General Public License as published by +- * the Free Software Foundation, either version 3 of the License, or +- * (at your option) any later version. +- * +- * This program is distributed in the hope that it will be useful, +- * but WITHOUT ANY WARRANTY; without even the implied warranty of +- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +- * GNU General Public License for more details. +- * +- * You should have received a copy of the GNU General Public License +- * along with this program. If not, see . +- */ +- +-#ifndef PHOTOS_SHARE_POINT_GOOGLE_H +-#define PHOTOS_SHARE_POINT_GOOGLE_H +- +-#include "photos-share-point-online.h" +- +-G_BEGIN_DECLS +- +-#define PHOTOS_TYPE_SHARE_POINT_GOOGLE (photos_share_point_google_get_type ()) +-G_DECLARE_FINAL_TYPE (PhotosSharePointGoogle, +- photos_share_point_google, +- PHOTOS, +- SHARE_POINT_GOOGLE, +- PhotosSharePointOnline); +- +-G_END_DECLS +- +-#endif /* PHOTOS_SHARE_POINT_GOOGLE_H */ +diff --git a/src/photos-utils.c b/src/photos-utils.c +index 5cfddaa5f845..b9e3f4131985 100644 +--- a/src/photos-utils.c ++++ b/src/photos-utils.c +@@ -37,10 +37,7 @@ + #include "photos-device-item.h" + #include "photos-enums.h" + #include "photos-error.h" +-#include "photos-facebook-item.h" +-#include "photos-flickr-item.h" + #include "photos-gegl.h" +-#include "photos-google-item.h" + #include "photos-local-item.h" + #include "photos-media-server-item.h" + #include "photos-offset-collection-view-controller.h" +@@ -52,7 +49,6 @@ + #include "photos-query.h" + #include "photos-share-point.h" + #include "photos-share-point-email.h" +-#include "photos-share-point-google.h" + #include "photos-share-point-online.h" + #include "photos-source.h" + #include "photos-thumbnail-factory.h" +@@ -719,14 +715,10 @@ photos_utils_ensure_builtins (void) + if (g_once_init_enter (&once_init_value)) + { + g_type_ensure (PHOTOS_TYPE_DEVICE_ITEM); +- g_type_ensure (PHOTOS_TYPE_FACEBOOK_ITEM); +- g_type_ensure (PHOTOS_TYPE_FLICKR_ITEM); +- g_type_ensure (PHOTOS_TYPE_GOOGLE_ITEM); + g_type_ensure (PHOTOS_TYPE_LOCAL_ITEM); + g_type_ensure (PHOTOS_TYPE_MEDIA_SERVER_ITEM); + + g_type_ensure (PHOTOS_TYPE_SHARE_POINT_EMAIL); +- g_type_ensure (PHOTOS_TYPE_SHARE_POINT_GOOGLE); + + g_type_ensure (PHOTOS_TYPE_TOOL_COLORS); + g_type_ensure (PHOTOS_TYPE_TOOL_CROP); +-- +2.30.2 + diff --git a/SPECS/gnome-photos.spec b/SPECS/gnome-photos.spec new file mode 100644 index 0000000..fd50341 --- /dev/null +++ b/SPECS/gnome-photos.spec @@ -0,0 +1,596 @@ +%global tarball_version %%(echo %{version} | tr '~' '.') +%global major_version %%(echo %%{tarball_version} | cut -d. -f1) + +%global cairo_version 1.14.0 +%global dazzle_version 3.26.0 +%global gdk_pixbuf_version 2.36.8 +%global gegl_version 0.4.0 +%global gettext_version 0.19.8 +%global gexiv2_version 0.10.8 +%global glib2_version 2.62.0 +%global goa_version 3.8.0 +%global gtk3_version 3.22.16 +%global handy_version 1.1.90 +%global tracker_miners_version 3.0.0 + +Name: gnome-photos +Version: 40.0 +Release: 4%{?dist} +Summary: Access, organize and share your photos on GNOME + +# GNOME Photos itself is GPLv3+, but the bundled libgd is LGPLv2+ +License: GPLv3+ and LGPLv2+ +URL: https://wiki.gnome.org/Apps/Photos +Source0: http://download.gnome.org/sources/%{name}/%{major_version}/%{name}-%{tarball_version}.tar.xz + +# https://bugzilla.redhat.com/show_bug.cgi?id=1913641 +Patch0: 0001-Remove-Facebook-Flickr-and-Google-support.patch + +BuildRequires: desktop-file-utils +BuildRequires: docbook-style-xsl +BuildRequires: gcc +BuildRequires: gettext >= %{gettext_version} +BuildRequires: itstool +BuildRequires: libxslt +BuildRequires: meson +BuildRequires: pkgconfig(babl) +BuildRequires: pkgconfig(cairo) >= %{cairo_version} +BuildRequires: pkgconfig(cairo-gobject) >= %{cairo_version} +BuildRequires: pkgconfig(gdk-pixbuf-2.0) >= %{gdk_pixbuf_version} +BuildRequires: pkgconfig(gegl-0.4) >= %{gegl_version} +BuildRequires: pkgconfig(geocode-glib-1.0) +BuildRequires: pkgconfig(gexiv2) >= %{gexiv2_version} +BuildRequires: pkgconfig(gio-2.0) >= %{glib2_version} +BuildRequires: pkgconfig(glib-2.0) >= %{glib2_version} +BuildRequires: pkgconfig(gobject-2.0) >= %{glib2_version} +BuildRequires: pkgconfig(goa-1.0) >= %{goa_version} +BuildRequires: pkgconfig(gsettings-desktop-schemas) +BuildRequires: pkgconfig(gtk+-3.0) >= %{gtk3_version} +BuildRequires: pkgconfig(libdazzle-1.0) >= %{dazzle_version} +BuildRequires: pkgconfig(libhandy-1) >= %{handy_version} +BuildRequires: pkgconfig(libjpeg) +BuildRequires: pkgconfig(tracker-sparql-3.0) + +Requires: baobab +Requires: gdk-pixbuf2%{?isa} >= %{gdk_pixbuf_version} +Requires: gegl04%{?_isa} >= %{gegl_version} +Requires: glib2%{?isa} >= %{glib2_version} +Requires: gnome-settings-daemon +Requires: gtk3%{?_isa} >= %{gtk3_version} +Requires: libdazzle%{?isa} >= %{dazzle_version} +Requires: libgexiv2%{?_isa} >= %{gexiv2_version} +Requires: libhandy1%{?_isa} >= %{handy_version} +Requires: tracker3-miners >= %{tracker_miners_version} + +# libgd is not meant to be installed as a system-wide shared library. +# It is just a way for GNOME applications to share widgets and other common +# code on an ad-hoc basis. +Provides: bundled(libgd) + + +%description +Access, organize and share your photos on GNOME. A simple and elegant +replacement for using a file manager to deal with photos. Enhance, crop +and edit in a snap. Seamless cloud integration is offered through GNOME +Online Accounts. + + +%package tests +Summary: Tests for %{name} + +%description tests +This package contains the installable tests for %{name}. + + +%prep +%autosetup -p1 -n %{name}-%{tarball_version} + + +%build +%meson \ + --buildtype=plain \ + -Ddogtail=false \ +%if 0%{?flatpak} + -Dflatpak=true \ +%else + -Dflatpak=false \ +%endif + -Dinstalled_tests=true \ + -Dmanuals=true \ + +%meson_build + + +%install +%meson_install + +# Upstream doesn't install with desktop-file-install, so let's check +desktop-file-validate %{buildroot}%{_datadir}/applications/org.gnome.Photos.desktop + +%find_lang %{name} --with-gnome + + +%files -f %{name}.lang +%license COPYING +%{_bindir}/%{name} +%{_datadir}/metainfo/org.gnome.Photos.appdata.xml +%{_datadir}/applications/org.gnome.Photos.desktop +%{_datadir}/dbus-1/services/org.gnome.Photos.service + +%if 0%{?flatpak} +%{_datadir}/dbus-1/services/org.gnome.Photos.Tracker3.Miner.Extract.service +%{_datadir}/dbus-1/services/org.gnome.Photos.Tracker3.Miner.Files.service +%endif + +%{_datadir}/glib-2.0/schemas/org.gnome.photos.gschema.xml +%{_datadir}/gnome-shell/ +%{_datadir}/icons/hicolor/scalable/apps/org.gnome.Photos.svg +%{_datadir}/icons/hicolor/symbolic/apps/org.gnome.Photos-symbolic.svg +%{_datadir}/man/man1/%{name}.1* + +%if 0%{?flatpak} +%{_datadir}/tracker3-miners/domain-ontologies/org.gnome.Photos.rule +%endif + +%{_docdir}/%{name} + +%dir %{_libdir}/%{name} +%{_libdir}/%{name}/libgnome-photos.so + +%{_libexecdir}/%{name}-thumbnailer + +%files tests +%{_libexecdir}/installed-tests/%{name} +%{_datadir}/installed-tests + + +%changelog +* Wed Mar 15 2023 MSVSphere Packaging Team - 40.0-4 +- Rebuilt for MSVSphere 9.1. + +* Mon Aug 09 2021 Mohan Boddu - 40.0-4 +- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags + Related: rhbz#1991688 + +* Fri Apr 23 2021 Debarshi Ray - 40.0-3 +- Add gcc to BuildRequires +- Remove Facebook, Flickr and Google support +Resolves: #1913641 + +* Thu Apr 15 2021 Mohan Boddu - 40.0-2 +- Rebuilt for RHEL 9 BETA on Apr 15th 2021. Related: rhbz#1947937 + +* Thu Mar 25 2021 Kalev Lember - 40.0-1 +- Update to 40.0 + +* Mon Mar 22 2021 Debarshi Ray - 40~rc-3 +- The gnome-online-miners package won't be part of RHEL 9 + +* Fri Mar 19 2021 Debarshi Ray - 40~rc-2 +- Update to 40.rc + +* Fri Mar 12 2021 Debarshi Ray - 40~beta-2 +- Unbreak Flatpak builds on hosts without Tracker 3 + +* Fri Mar 12 2021 Debarshi Ray - 40~beta-1 +- Update to 40.beta + +* Tue Feb 16 2021 Debarshi Ray - 3.38.1-1 +- Update to 3.38.1 + +* Tue Jan 26 2021 Fedora Release Engineering - 3.38.0-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild + +* Mon Dec 14 2020 Debarshi Ray - 3.38.0-2 +- Remove python3-dogtail from Requires on RHEL 9 + +* Wed Sep 23 2020 Debarshi Ray - 3.38.0-1 +- Update to 3.38.0 + +* Mon Aug 24 2020 Debarshi Ray - 3.37.91.1-1 +- Update to 3.37.91.1 + +* Mon Aug 24 2020 Debarshi Ray - 3.37.91-1 +- Update to 3.37.91 + +* Tue Aug 11 2020 Debarshi Ray - 3.37.2-4 +- The dLeyna stack won't be part of RHEL 9 + +* Sat Aug 01 2020 Fedora Release Engineering - 3.37.2-3 +- Second attempt - Rebuilt for + https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Mon Jul 27 2020 Fedora Release Engineering - 3.37.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild + +* Fri May 22 2020 Debarshi Ray - 3.37.2-1 +- Update to 3.37.2 + +* Wed May 20 2020 Debarshi Ray - 3.34.2-1 +- Update to 3.34.2 + +* Thu Feb 13 2020 Kalev Lember - 3.34.1-1 +- Update to 3.34.1 + +* Tue Jan 28 2020 Fedora Release Engineering - 3.34.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild + +* Wed Sep 11 2019 Kalev Lember - 3.34.0-1 +- Update to 3.34.0 + +* Tue Aug 20 2019 Debarshi Ray - 3.33.91-1 +- Update to 3.33.91 + +* Thu Jul 25 2019 Fedora Release Engineering - 3.32.0-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild + +* Mon Mar 18 2019 Kalev Lember - 3.32.0-1 +- Update to 3.32.0 + +* Thu Feb 21 2019 Debarshi Ray - 3.31.91-1 +- Update to 3.31.91 + +* Thu Jan 31 2019 Fedora Release Engineering - 3.31.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild + +* Mon Dec 17 2018 Debarshi Ray - 3.31.3-2 +- Update dependencies + +* Sun Dec 16 2018 Phil Wyett - 3.31.3-1 +- Update to 3.31.3 + +* Thu Nov 15 2018 Debarshi Ray - 3.31.2-1 +- Update to 3.31.2 + +* Sat Oct 13 2018 Debarshi Ray - 3.31.1-2 +- Build without git-core + +* Sat Oct 13 2018 Debarshi Ray - 3.31.1-1 +- Update to 3.31.1 +- Switch to the Meson build system +- Add %%license +- Switch to %%autosetup +- Update dependencies + +* Thu Sep 27 2018 Debarshi Ray - 3.30.1-1 +- Update to 3.30.1 + +* Thu Sep 06 2018 Kalev Lember - 3.30.0-1 +- Update to 3.30.0 + +* Mon Sep 03 2018 Debarshi Ray - 3.29.92-1 +- Update to 3.29.92 + +* Tue Aug 14 2018 Debarshi Ray - 3.29.91-1 +- Update to 3.29.91 + +* Thu Aug 09 2018 Debarshi Ray - 3.29.4-2 +- Remove Requires: gettext-libs - it is extraneous + +* Wed Jul 18 2018 Debarshi Ray - 3.29.4-1 +- Update to 3.29.4 + +* Fri Jul 13 2018 Fedora Release Engineering - 3.29.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild + +* Fri Jun 22 2018 Debarshi Ray - 3.29.3-1 +- Update to 3.29.3 +- Drop the run-time requirement on ImageMagick + +* Thu Mar 15 2018 Kalev Lember - 3.28.0-1 +- Update to 3.28.0 + +* Wed Mar 07 2018 Debarshi Ray - 3.27.92-1 +- Update to 3.27.92 + +* Mon Feb 19 2018 Debarshi Ray - 3.27.90-1 +- Update to 3.27.90 + +* Wed Feb 07 2018 Fedora Release Engineering - 3.27.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild + +* Fri Jan 12 2018 Debarshi Ray - 3.27.4-1 +- Update to 3.27.4 + +* Thu Jan 11 2018 Igor Gnatenko - 3.27.3-2 +- Remove obsolete scriptlets + +* Wed Dec 13 2017 Debarshi Ray - 3.27.3-1 +- Update to 3.27.3 + +* Tue Oct 24 2017 Debarshi Ray - 3.27.1-1 +- Update to 3.27.1 + +* Sun Oct 08 2017 Kalev Lember - 3.26.1-1 +- Update to 3.26.1 + +* Tue Sep 19 2017 Debarshi Ray - 3.26.0-2 +- Add run-time dependency on tracker-miners + +* Wed Sep 13 2017 Kalev Lember - 3.26.0-1 +- Update to 3.26.0 + +* Tue Sep 05 2017 Debarshi Ray - 3.25.92-1 +- Update to 3.25.92 + +* Wed Aug 23 2017 Debarshi Ray - 3.25.91-1 +- Update to 3.25.91 + +* Wed Aug 02 2017 Fedora Release Engineering - 3.25.4-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 3.25.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Wed Jul 19 2017 Debarshi Ray - 3.25.4-1 +- Update to 3.25.4 + +* Wed Jun 21 2017 Debarshi Ray - 3.25.3-1 +- Update to 3.25.3 + +* Wed May 10 2017 Debarshi Ray - 3.25.1-1 +- Update to 3.25.1 + +* Tue Apr 11 2017 Kalev Lember - 3.24.1-1 +- Update to 3.24.1 + +* Tue Mar 21 2017 Kalev Lember - 3.24.0-1 +- Update to 3.24.0 + +* Tue Mar 14 2017 Debarshi Ray - 3.23.92-1 +- Update to 3.23.92 + +* Fri Mar 03 2017 Debarshi Ray - 3.23.91-1 +- Update to 3.23.91 + +* Mon Feb 20 2017 Debarshi Ray - 3.23.90-1 +- Update to 3.23.90 + +* Mon Feb 13 2017 Richard Hughes - 3.23.4-1 +- Update to 3.23.4 + +* Fri Feb 10 2017 Fedora Release Engineering - 3.23.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild + +* Thu Dec 01 2016 Kalev Lember - 3.23.2-1 +- Update to 3.23.2 + +* Wed Nov 23 2016 Kalev Lember - 3.22.2-1 +- Update to 3.22.2 + +* Thu Oct 06 2016 Debarshi Ray - 3.22.1-1 +- Update to 3.22.1 +- Use --disable-silent-rules + +* Mon Sep 19 2016 Kalev Lember - 3.22.0-1 +- Update to 3.22.0 + +* Mon Sep 12 2016 Debarshi Ray - 3.21.92-1 +- Update to 3.21.92 +- Use make_build macro +- Update minimum required versions; use pkgconfig(...) for BRs + +* Sat Sep 03 2016 Kalev Lember - 3.21.91-1 +- Update to 3.21.91 + +* Mon Aug 22 2016 Kalev Lember - 3.21.90-1 +- Update to 3.21.90 + +* Wed Jul 20 2016 Richard Hughes - 3.21.4-1 +- Update to 3.21.4 + +* Wed Jun 22 2016 Richard Hughes - 3.21.3-1 +- Update to 3.21.3 + +* Tue May 03 2016 Kalev Lember - 3.21.1-1 +- Update to 3.21.1 + +* Wed Apr 13 2016 Kalev Lember - 3.20.1-1 +- Update to 3.20.1 + +* Tue Mar 22 2016 Kalev Lember - 3.20.0-1 +- Update to 3.20.0 + +* Wed Mar 16 2016 Kalev Lember - 3.19.92-1 +- Update to 3.19.92 + +* Fri Mar 04 2016 Richard Hughes - 3.19.91-1 +- Update to 3.19.91 + +* Thu Feb 18 2016 Richard Hughes - 3.19.90-1 +- Update to 3.19.90 + +* Wed Feb 03 2016 Fedora Release Engineering - 3.19.4-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild + +* Fri Jan 29 2016 Debarshi Ray - 3.19.4-2 +- Use upstreamed screenshots + +* Wed Jan 20 2016 Kalev Lember - 3.19.4-1 +- Update to 3.19.4 + +* Fri Dec 18 2015 Kalev Lember - 3.19.3-2 +- Build with grilo 0.3 + +* Wed Dec 16 2015 Kalev Lember - 3.19.3-1 +- Update to 3.19.3 +- Build with grilo 0.2 +- Define minimum gegl version +- Use make_install macro + +* Tue Dec 08 2015 Debarshi Ray - 3.19.2-1 +- Update to 3.19.2 + +* Tue Nov 10 2015 Kalev Lember - 3.18.2-1 +- Update to 3.18.2 + +* Mon Oct 12 2015 Kalev Lember - 3.18.1-1 +- Update to 3.18.1 + +* Tue Sep 22 2015 Kalev Lember - 3.18.0-1 +- Update to 3.18.0 + +* Wed Jul 22 2015 David King - 3.17.2-3 +- Bump for new gnome-desktop3 + +* Wed Jun 17 2015 Fedora Release Engineering - 3.17.2-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild + +* Fri May 29 2015 Debarshi Ray - 3.17.2-1 +- Update to 3.17.2 + +* Wed May 13 2015 Debarshi Ray - 3.16.2-1 +- Update to 3.16.2 + +* Mon Apr 27 2015 David King - 3.16.0-3 +- Rebuild for libgdata soname bump + +* Mon Mar 30 2015 Richard Hughes - 3.16.0-2 +- Use better AppData screenshots + +* Mon Mar 23 2015 Kalev Lember - 3.16.0-1 +- Update to 3.16.0 + +* Fri Mar 13 2015 Kalev Lember - 3.15.91-1 +- Update to 3.15.91 + +* Wed Feb 25 2015 Richard Hughes - 3.15.90-1 +- Update to 3.15.90 + +* Thu Jan 22 2015 Richard Hughes - 3.15.4-1 +- Update to 3.15.4 + +* Fri Dec 19 2014 Richard Hughes - 3.15.3-1 +- Update to 3.15.3 + +* Sat Nov 29 2014 Kalev Lember - 3.15.2-1 +- Update to 3.15.2 + +* Wed Nov 12 2014 Vadim Rutkovsky - 3.14.2-2 +- Build installed tests + +* Mon Nov 10 2014 Kalev Lember - 3.14.2-1 +- Update to 3.14.2 + +* Wed Sep 24 2014 Kalev Lember - 3.14.0-1 +- Update to 3.14.0 +- Set minimum required versions for libgdata and gtk3 + +* Wed Sep 17 2014 Kalev Lember - 3.13.92-1 +- Update to 3.13.92 + +* Fri Sep 05 2014 Kalev Lember - 3.13.91-1 +- Update to 3.13.91 +- Include HighContrast icons + +* Sat Aug 16 2014 Fedora Release Engineering - 3.13.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild + +* Thu Jul 24 2014 Kalev Lember - 3.13.4-1 +- Update to 3.13.4 + +* Sat Jun 07 2014 Fedora Release Engineering - 3.12.1-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild + +* Wed Apr 16 2014 Kalev Lember - 3.12.1-1 +- Update to 3.12.1 +- Include help files + +* Mon Mar 24 2014 Richard Hughes - 3.12.0-1 +- Update to 3.12.0 + +* Tue Mar 18 2014 Richard Hughes - 3.11.92-1 +- Update to 3.11.92 + +* Sat Mar 08 2014 Richard Hughes - 3.11.91-1 +- Update to 3.11.91 + +* Thu Feb 20 2014 Kalev Lember - 3.11.90-1 +- Update to 3.11.90 + +* Wed Feb 19 2014 Richard Hughes - 3.11.5-2 +- Rebuilt for gnome-desktop soname bump + +* Thu Feb 06 2014 Kalev Lember - 3.11.5-1 +- Update to 3.11.5 + +* Wed Jan 15 2014 Richard Hughes - 3.11.4-1 +- Update to 3.11.4 + +* Tue Dec 17 2013 Richard Hughes - 3.11.3-1 +- Update to 3.11.3 + +* Mon Nov 25 2013 Richard Hughes - 3.11.2-1 +- Update to 3.11.2 + +* Thu Nov 14 2013 Richard Hughes - 3.10.2-1 +- Update to 3.10.2 + +* Tue Oct 29 2013 Richard Hughes - 3.10.1-1 +- Update to 3.10.1 + +* Wed Sep 25 2013 Richard Hughes - 3.10.0-1 +- Update to 3.10.0 + +* Wed Sep 18 2013 Kalev Lember - 3.9.92-1 +- Update to 3.9.92 +- Include the appdata file + +* Wed Sep 04 2013 Kalev Lember - 3.9.91-1 +- Update to 3.9.91 + +* Thu Aug 22 2013 Kalev Lember - 3.9.90-1 +- Update to 3.9.90 + +* Sun Aug 04 2013 Debarshi Ray - 3.9.5.1-1 +- Update to 3.9.5.1 + +* Sat Aug 03 2013 Fedora Release Engineering - 3.9.4-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild + +* Tue Jul 16 2013 Debarshi Ray - 3.9.4-1 +- Update to 3.9.4 + +* Tue May 14 2013 Richard Hughes - 3.8.2-1 +- Update to 3.8.2 + +* Mon Apr 15 2013 Richard Hughes - 3.8.0-1 +- Update to 3.8.0 +- Drop upstreamed packages +- Fix BRs + +* Thu Feb 21 2013 Kalev Lember - 3.7.3-6 +- Rebuilt for cogl soname bump + +* Wed Feb 20 2013 Kalev Lember - 3.7.3-5 +- Rebuilt for libgnome-desktop soname bump + +* Mon Jan 28 2013 Matthias Clasen - 3.7.3-4 +- Rebuild for new tracker + +* Fri Jan 25 2013 Peter Robinson 3.7.3-3 +- Rebuild for new cogl + +* Fri Dec 21 2012 Kalev Lember - 3.7.3-2 +- Rebuilt for libgnome-desktop-3 3.7.3 soname bump + +* Wed Dec 19 2012 Debarshi Ray - 3.7.3-1 +- Update to 3.7.3 + +* Sat Dec 01 2012 Mathieu Bridon - 3.7.2-4 +* Fix based on Ivan's review feedback: + - Add a comment on the multi-licensing situation + +* Thu Nov 29 2012 Mathieu Bridon - 3.7.2-3 +* Fixes based on Ivan's review feedback: + - Fix the upstream URL + - Fix the License tag + - Preserve timestamps when installing + +* Sun Nov 25 2012 Mathieu Bridon - 3.7.2-2 +* Fixes based on Debarshi's review feedback: + - Fix build requirement on gdk-pixbuf2-devel + - Add missing Provides on the bundled libgd + +* Sun Nov 18 2012 Mathieu Bridon - 3.7.2-1 +- Initial package for Fedora.