#!/usr/bin/python # -*- coding: UTF-8 -*- """ * Copyright 2018 Albert Vaca Cintora * Copyright 2018 Andy Holmes * * 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 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * 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 . """ __author__ = "Albert Vaca Cintora " __version__ = "1.0" __appname__ = "kdeconnect-share" __app_disp_name__ = "Share files to your phone via KDE Connect" __website__ = "https://community.kde.org/KDEConnect" import gettext import locale from gi.repository import Nautilus, Gio, GLib, GObject _ = gettext.gettext class KdeConnectShareExtension(GObject.GObject, Nautilus.MenuProvider): """A context menu for sending files via KDE Connect.""" def __init__(self): GObject.GObject.__init__(self) try: locale.setlocale(locale.LC_ALL, '') gettext.bindtextdomain('kdeconnect-nautilus-extension') except Exception as e: print(e) pass self.dbus = Gio.DBusProxy.new_for_bus_sync( Gio.BusType.SESSION, Gio.DBusProxyFlags.NONE, None, 'org.kde.kdeconnect', '/modules/kdeconnect', 'org.kde.kdeconnect.daemon', None) def send_files(self, menu, files, deviceId): device_proxy = Gio.DBusProxy.new_for_bus_sync( Gio.BusType.SESSION, Gio.DBusProxyFlags.NONE, None, 'org.kde.kdeconnect', '/modules/kdeconnect/devices/'+deviceId+'/share', 'org.kde.kdeconnect.device.share', None) for file in files: variant = GLib.Variant('(s)', (file.get_uri(),)) device_proxy.call_sync('shareUrl', variant, 0, -1, None) def get_file_items(self, window, files): #We can only send regular files for uri in files: if uri.get_uri_scheme() != 'file' or uri.is_directory(): return try: onlyReachable = True onlyPaired = True variant = GLib.Variant('(bb)', (onlyReachable, onlyPaired)) devices = self.dbus.call_sync('deviceNames', variant, 0, -1, None) devices = devices.unpack()[0] except Exception as e: raise Exception('Error while getting reachable devices') if len(devices) == 0: return if len(devices) == 1: deviceId, deviceName = devices.items()[0] item = Nautilus.MenuItem( name='KdeConnectShareExtension::Devices::' + deviceId, label=_("Send to %s via KDE Connect") % deviceName, ) item.connect('activate', self.send_files, files, deviceId) return item, else: menu = Nautilus.MenuItem( name='KdeConnectShareExtension::Devices', label=_('Send via KDE Connect'), ) submenu = Nautilus.Menu() menu.set_submenu(submenu) for deviceId, deviceName in devices.items(): item = Nautilus.MenuItem( name='KdeConnectShareExtension::Devices::' + deviceId, label=deviceName, ) item.connect('activate', self.send_files, files, deviceId) submenu.append_item(item) return menu,