Adds a nautilus-python extension to share files

Reviewed by Aleix Pol
This commit is contained in:
Albert Vaca 2018-03-24 17:32:32 +01:00
parent b009c5fd0b
commit 2008490ad9
4 changed files with 126 additions and 0 deletions

View file

@ -58,6 +58,7 @@ add_subdirectory(cli)
add_subdirectory(indicator)
add_subdirectory(fileitemactionplugin)
add_subdirectory(urlhandler)
add_subdirectory(nautilus-extension)
if(KF5DocTools_FOUND)
add_subdirectory(doc)
endif()

View file

@ -0,0 +1,4 @@
set(NAUTILUS_PYTHON_EXTENSIONS_INSTALL_DIR "share/nautilus-python/extensions" CACHE PATH "Path for python-nautilus extensions")
install(FILES kdeconnect-share.py DESTINATION ${NAUTILUS_PYTHON_EXTENSIONS_INSTALL_DIR})

View file

@ -0,0 +1,3 @@
#!/usr/bin/env bash
$XGETTEXT `find . -name '*.py'` -o $podir/kdeconnect-nautilus-extension.pot

View file

@ -0,0 +1,118 @@
#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
* Copyright 2018 Albert Vaca Cintora <albertvaka@gmail.com>
* Copyright 2018 Andy Holmes <andrew.g.r.holmes@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
"""
__author__ = "Albert Vaca Cintora <albertvaka@gmail.com>"
__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,