Skip to content

Commit bc05b45

Browse files
committed
nemo-media-columns: Make the timeout configurable.
1 parent 8fe6a2d commit bc05b45

File tree

4 files changed

+129
-3
lines changed

4 files changed

+129
-3
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
#!/usr/bin/python3
2+
3+
import gi
4+
gi.require_version('Gtk', '3.0')
5+
gi.require_version('XApp', '1.0')
6+
import sys
7+
8+
import gettext
9+
from gi.repository import Gtk, Gio, XApp, Gdk
10+
11+
# i18n
12+
import gettext
13+
gettext.bindtextdomain('nemo-extensions')
14+
gettext.textdomain('nemo-extensions')
15+
_ = gettext.gettext
16+
17+
class LabeledItem(Gtk.Box):
18+
def __init__(self, label, item):
19+
super(LabeledItem, self).__init__(orientation=Gtk.Orientation.HORIZONTAL)
20+
21+
self.label_widget = Gtk.Label(label=label)
22+
23+
self.pack_start(self.label_widget, False, False, 6)
24+
self.pack_end(item, False, False, 6)
25+
26+
self.show_all()
27+
28+
class Page(Gtk.Box):
29+
def __init__(self):
30+
super(Page, self).__init__(orientation=Gtk.Orientation.VERTICAL)
31+
32+
self.set_spacing(15)
33+
self.set_margin_start(15)
34+
self.set_margin_end(15)
35+
self.set_margin_top(15)
36+
self.set_margin_bottom(15)
37+
38+
class NemoMediaColumnsPreferencesWindow(XApp.PreferencesWindow):
39+
def __init__(self):
40+
super(NemoMediaColumnsPreferencesWindow, self).__init__()
41+
42+
self.set_icon_name("preferences-system")
43+
self.set_title(_("Nemo Media Columns Preferences"))
44+
self.set_skip_taskbar_hint(False)
45+
self.set_type_hint(Gdk.WindowTypeHint.NORMAL)
46+
self.set_default_size(-1, -1)
47+
48+
self.connect("destroy", Gtk.main_quit)
49+
50+
self.settings = Gio.Settings(schema_id="org.nemo.extensions.nemo-media-columns")
51+
52+
page = Page()
53+
54+
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
55+
page.add(box)
56+
57+
switch = Gtk.Switch()
58+
self.settings.bind("use-timeout",
59+
switch, "active",
60+
Gio.SettingsBindFlags.DEFAULT)
61+
62+
widget = LabeledItem(_("Limit processing time for each file"), switch)
63+
box.pack_start(widget, False, False, 6)
64+
65+
spinner = Gtk.SpinButton.new_with_range(0.1, 10.0, 0.1)
66+
spinner.set_digits(1)
67+
self.settings.bind("timeout",
68+
spinner, "value",
69+
Gio.SettingsBindFlags.DEFAULT)
70+
71+
widget = LabeledItem(_("Timeout (in seconds)"), spinner)
72+
box.pack_start(widget, False, False, 6)
73+
74+
self.settings.bind("use-timeout",
75+
widget, "sensitive",
76+
Gio.SettingsBindFlags.DEFAULT)
77+
78+
self.add_page(page, "main", _("Timeout"))
79+
80+
self.show_all()
81+
82+
def quit(self, *args):
83+
self.destroy()
84+
Gtk.main_quit()
85+
86+
if __name__ == "__main__":
87+
import signal
88+
signal.signal(signal.SIGINT, signal.SIG_DFL)
89+
90+
window = NemoMediaColumnsPreferencesWindow()
91+
92+
Gtk.main()

nemo-media-columns/nemo-media-columns.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,25 @@ def __init__(self):
6565
self.exif_rating = None
6666
self.pixeldimensions = None
6767

68+
69+
6870
class ColumnExtension(GObject.GObject, Nemo.ColumnProvider, Nemo.InfoProvider, Nemo.NameAndDescProvider):
6971
def __init__(self):
7072
self.ids_by_handle = {}
7173

74+
self.settings = Gio.Settings(schema_id="org.nemo.extensions.nemo-media-columns")
75+
self.load_settings(self.settings)
76+
self.settings.connect("changed", self.load_settings)
77+
78+
def load_settings(self, settings, pspec=None, data=None):
79+
use_timeout = self.settings.get_boolean("use-timeout")
80+
81+
# I don't think we should ever allow it to run forever, regardless
82+
# of preference.
83+
self.timeout = self.settings.get_double("timeout") if use_timeout else 30.0
84+
85+
print("nemo-media-columns: using a timeout of %.2f second(s) for file processing" % self.timeout)
86+
7287
def get_columns(self):
7388
return (
7489
Nemo.Column(name="NemoPython::title_column",attribute="title",label=_("Title"),description=""),
@@ -127,7 +142,7 @@ def update_cb(self, provider, handle, closure, file):
127142

128143
if uri.startswith("file"):
129144
try:
130-
with stopit.ThreadingTimeout(.1):
145+
with stopit.ThreadingTimeout(self.timeout):
131146
info = self.get_media_info(uri, mimetype)
132147
except stopit.utils.TimeoutException:
133148
print("nemo-media-columns failed to process '%s' within a reasonable amount of time" % (gfile.get_uri(), e))
@@ -332,4 +347,4 @@ def file_is_one_of_these(mimetype_list):
332347
return FileExtensionInfo()
333348

334349
def get_name_and_desc(self):
335-
return [("Nemo Media Columns:::Provides additional columns for the list view")]
350+
return [("Nemo Media Columns:::Provides additional columns for the list view:::nemo-media-columns-prefs")]
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<schemalist>
3+
<schema path="/org/nemo/extensions/nemo-media-columns/"
4+
id="org.nemo.extensions.nemo-media-columns">
5+
6+
<key name="use-timeout" type="b">
7+
<default>true</default>
8+
<summary>How long to allow the plugin to run for each file before aborting.</summary>
9+
</key>
10+
<key name="timeout" type="d">
11+
<default>0.2</default>
12+
<range min="0.1" max="30.0"/>
13+
<summary>Time to allow the plugin to process a single file.</summary>
14+
<description>The plugin will abort and move to the next file if it takes more than this long (seconds).</description>
15+
</key>
16+
</schema>
17+
</schemalist>

nemo-media-columns/setup.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
# 'pil',
2828
# 'pymediainfo'],
2929
data_files = [
30-
('/usr/share/nemo-python/extensions', ['nemo-media-columns.py'])
30+
('/usr/share/nemo-python/extensions', ['nemo-media-columns.py']),
31+
('/usr/bin', ['nemo-media-columns-prefs']),
32+
('/usr/share/glib-2.0/schemas', ['org.nemo.extensions.nemo-media-columns.gschema.xml'])
3133
]
3234
)

0 commit comments

Comments
 (0)