Rewired settings, improved plugin structural coupling, cleanedup session file generation n load
This commit is contained in:
@@ -25,7 +25,7 @@ requests: {} = {
|
||||
'pass_fm_events': "true", # If empty or not present will be ignored.
|
||||
"pass_ui_objects": [""], # Request reference to a UI component. Will be passed back as array to plugin.
|
||||
'bind_keys': [f"{name}||send_message:<Control>f"],
|
||||
f"{name}||do_save:<Control>s"] # Bind keys with method and key pare using list. Must pass "name" like shown with delimiter to its right.
|
||||
f"{name}||do_save:<Control>s"] # Bind keys with method and key pare using list. Must pass "name" like shown with delimiter to its right.
|
||||
|
||||
}
|
||||
```
|
||||
@@ -40,25 +40,3 @@ UI Targets:
|
||||
<li>context_menu</li>
|
||||
<li>other</li>
|
||||
</ul>
|
||||
|
||||
### Methods
|
||||
```
|
||||
# Must define and return a widget if "ui_target" is defined.
|
||||
def get_ui_element(self):
|
||||
button = Gtk.Button(label=self.name)
|
||||
button.connect("button-release-event", self._do_download)
|
||||
return button
|
||||
|
||||
# Must define in plugin if "pass_fm_events" is set to "true" string.
|
||||
def set_fm_event_system(self, fm_event_system):
|
||||
self._fm_event_system = fm_event_system
|
||||
|
||||
# Must define regardless if needed. Can just pass if plugin does stuff in its __init__
|
||||
def run(self):
|
||||
self._module_event_observer()
|
||||
|
||||
# Must define in plugin if "pass_ui_objects" is set and an array of valid glade UI IDs.
|
||||
def set_ui_object_collection(self, ui_objects):
|
||||
self._ui_objects = ui_objects
|
||||
|
||||
```
|
||||
|
@@ -41,11 +41,6 @@ class Plugin(PluginBase):
|
||||
self._selected = None
|
||||
|
||||
|
||||
def get_ui_element(self):
|
||||
button = Gtk.Button(label=self.name)
|
||||
button.connect("button-release-event", self._show_favorites_menu)
|
||||
return button
|
||||
|
||||
def run(self):
|
||||
self._builder = Gtk.Builder()
|
||||
self._builder.add_from_file(self._GLADE_FILE)
|
||||
@@ -76,9 +71,14 @@ class Plugin(PluginBase):
|
||||
f.write('[]')
|
||||
|
||||
|
||||
def generate_reference_ui_element(self):
|
||||
button = Gtk.Button(label=self.name)
|
||||
button.connect("button-release-event", self._show_favorites_menu)
|
||||
return button
|
||||
|
||||
@threaded
|
||||
def _get_state(self, widget=None, eve=None):
|
||||
self._event_system.emit("get_current_state
|
||||
self._event_system.emit("get_current_state")
|
||||
|
||||
|
||||
@threaded
|
||||
|
@@ -83,11 +83,6 @@ class Plugin(PluginBase):
|
||||
}
|
||||
|
||||
|
||||
def get_ui_element(self):
|
||||
button = Gtk.Button(label=self.name)
|
||||
button.connect("button-release-event", self._show_properties_page)
|
||||
return button
|
||||
|
||||
def run(self):
|
||||
self._builder = Gtk.Builder()
|
||||
self._builder.add_from_file(self._GLADE_FILE)
|
||||
@@ -103,11 +98,15 @@ class Plugin(PluginBase):
|
||||
self._file_owner = self._builder.get_object("file_owner")
|
||||
self._file_group = self._builder.get_object("file_group")
|
||||
|
||||
def generate_reference_ui_element(self):
|
||||
button = Gtk.Button(label=self.name)
|
||||
button.connect("button-release-event", self._show_properties_page)
|
||||
return button
|
||||
|
||||
|
||||
@threaded
|
||||
def _show_properties_page(self, widget=None, eve=None):
|
||||
event_system.emit("get_current_state
|
||||
event_system.emit("get_current_state")
|
||||
|
||||
state = self._fm_state
|
||||
self._event_message = None
|
||||
|
@@ -45,12 +45,6 @@ class Plugin(PluginBase):
|
||||
self._trailer_link = None
|
||||
|
||||
|
||||
|
||||
def get_ui_element(self):
|
||||
button = Gtk.Button(label=self.name)
|
||||
button.connect("button-release-event", self._show_info_page)
|
||||
return button
|
||||
|
||||
def run(self):
|
||||
self._builder = Gtk.Builder()
|
||||
self._builder.add_from_file(self._GLADE_FILE)
|
||||
@@ -75,6 +69,11 @@ class Plugin(PluginBase):
|
||||
self._file_hash = self._builder.get_object("file_hash")
|
||||
self._trailer_link = self._builder.get_object("trailer_link")
|
||||
|
||||
def generate_reference_ui_element(self):
|
||||
button = Gtk.Button(label=self.name)
|
||||
button.connect("button-release-event", self._show_info_page)
|
||||
return button
|
||||
|
||||
@threaded
|
||||
def _show_info_page(self, widget=None, eve=None):
|
||||
self._event_system.emit("get_current_state")
|
||||
|
3
plugins/movie_tv_info/tmdbscraper/__init__.py
Normal file
3
plugins/movie_tv_info/tmdbscraper/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
"""
|
||||
Pligin Module
|
||||
"""
|
@@ -1,8 +1,10 @@
|
||||
# Python imports
|
||||
import threading, subprocess, signal, time, json, shlex
|
||||
import threading, subprocess, signal, json, shlex
|
||||
|
||||
# Lib imports
|
||||
from gi.repository import GLib
|
||||
import gi
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk, GLib
|
||||
|
||||
# Application imports
|
||||
from ..widgets.file_preview_widget import FilePreviewWidget
|
||||
@@ -61,6 +63,8 @@ class FileSearchMixin:
|
||||
self._list_proc = subprocess.Popen(command, cwd=self.path, stdin=None, stdout=None, stderr=None)
|
||||
|
||||
def _load_file_ui(self, data):
|
||||
Gtk.main_iteration()
|
||||
|
||||
if not data in ("", None):
|
||||
jdata = json.loads( data )
|
||||
target = jdata[0]
|
||||
|
@@ -1,8 +1,10 @@
|
||||
# Python imports
|
||||
import threading, subprocess, signal, time, json, shlex
|
||||
import threading, subprocess, signal, json, shlex
|
||||
|
||||
# Lib imports
|
||||
from gi.repository import GLib
|
||||
import gi
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk, GLib
|
||||
|
||||
# Application imports
|
||||
from ..widgets.grep_preview_widget import GrepPreviewWidget
|
||||
@@ -53,7 +55,7 @@ class GrepSearchMixin:
|
||||
|
||||
def _exec_grep_query(self, widget=None, eve=None):
|
||||
query = widget.get_text()
|
||||
if not query in ("", None):
|
||||
if not query.strip() in ("", None):
|
||||
self.grep_query = query
|
||||
|
||||
target_dir = shlex.quote( self._fm_state.tab.get_current_directory() )
|
||||
@@ -61,6 +63,8 @@ class GrepSearchMixin:
|
||||
self._grep_proc = subprocess.Popen(command, cwd=self.path, stdin=None, stdout=None, stderr=None)
|
||||
|
||||
def _load_grep_ui(self, data):
|
||||
Gtk.main_iteration()
|
||||
|
||||
if not data in ("", None):
|
||||
jdata = json.loads( data )
|
||||
jkeys = jdata.keys()
|
||||
|
@@ -52,11 +52,6 @@ class Plugin(IPCServer, FileSearchMixin, GrepSearchMixin, PluginBase):
|
||||
self.search_query = ""
|
||||
|
||||
|
||||
def get_ui_element(self):
|
||||
button = Gtk.Button(label=self.name)
|
||||
button.connect("button-release-event", self._show_page)
|
||||
return button
|
||||
|
||||
def run(self):
|
||||
self._builder = Gtk.Builder()
|
||||
self._builder.add_from_file(self._GLADE_FILE)
|
||||
@@ -84,6 +79,11 @@ class Plugin(IPCServer, FileSearchMixin, GrepSearchMixin, PluginBase):
|
||||
|
||||
self.create_ipc_listener()
|
||||
|
||||
def generate_reference_ui_element(self):
|
||||
button = Gtk.Button(label=self.name)
|
||||
button.connect("button-release-event", self._show_page)
|
||||
return button
|
||||
|
||||
|
||||
def _show_page(self, widget=None, eve=None):
|
||||
self._event_system.emit("get_current_state")
|
||||
@@ -109,6 +109,8 @@ class Plugin(IPCServer, FileSearchMixin, GrepSearchMixin, PluginBase):
|
||||
self.grep_list_parent.add(self._grep_list)
|
||||
self.grep_list_parent.show_all()
|
||||
|
||||
Gtk.main_iteration()
|
||||
|
||||
def reset_file_list_box(self) -> None:
|
||||
try:
|
||||
child = self.file_list_parent.get_children()[0]
|
||||
@@ -121,3 +123,5 @@ class Plugin(IPCServer, FileSearchMixin, GrepSearchMixin, PluginBase):
|
||||
self._file_list.set_orientation(Gtk.Orientation.VERTICAL)
|
||||
self.file_list_parent.add(self._file_list)
|
||||
self.file_list_parent.show_all()
|
||||
|
||||
Gtk.main_iteration()
|
||||
|
@@ -1,11 +1,9 @@
|
||||
# Python imports
|
||||
import os, threading, time, pickle
|
||||
import os, threading, pickle
|
||||
from multiprocessing.connection import Listener, Client
|
||||
|
||||
# Lib imports
|
||||
import gi
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk, GLib
|
||||
from gi.repository import GLib
|
||||
|
||||
# Application imports
|
||||
|
||||
@@ -64,12 +62,12 @@ class IPCServer:
|
||||
if "SEARCH|" in msg:
|
||||
file = msg.split("SEARCH|")[1].strip()
|
||||
if file:
|
||||
GLib.idle_add(self._load_file_ui, file)
|
||||
GLib.idle_add(self._load_file_ui, file, priority=GLib.PRIORITY_LOW)
|
||||
|
||||
if "GREP|" in msg:
|
||||
data = msg.split("GREP|")[1].strip()
|
||||
if data:
|
||||
GLib.idle_add(self._load_grep_ui, data)
|
||||
GLib.idle_add(self._load_grep_ui, data, priority=GLib.PRIORITY_LOW)
|
||||
|
||||
|
||||
conn.close()
|
||||
|
@@ -16,8 +16,9 @@ from multiprocessing.connection import Client
|
||||
_ipc_address = f'/tmp/solarfm-search_grep-ipc.sock'
|
||||
_ipc_authkey = b'' + bytes(f'solarfm-search_grep-ipc', 'utf-8')
|
||||
|
||||
filter = (".cpp", ".css", ".c", ".go", ".html", ".htm", ".java", ".js", ".json", ".lua", ".md", ".py", ".rs", ".toml", ".xml", ".pom") + \
|
||||
(".txt", ".text", ".sh", ".cfg", ".conf", ".log")
|
||||
filter = (".mkv", ".mp4", ".webm", ".avi", ".mov", ".m4v", ".mpg", ".mpeg", ".wmv", ".flv") + \
|
||||
(".png", ".jpg", ".jpeg", ".gif", ".ico", ".tga", ".webp") + \
|
||||
(".psf", ".mp3", ".ogg", ".flac", ".m4a")
|
||||
|
||||
# NOTE: Threads WILL NOT die with parent's destruction.
|
||||
def threaded(fn):
|
||||
@@ -33,12 +34,12 @@ def daemon_threaded(fn):
|
||||
|
||||
|
||||
def send_ipc_message(message) -> None:
|
||||
with Client(address=_ipc_address, family="AF_UNIX", authkey=_ipc_authkey) as conn:
|
||||
conn.send(message)
|
||||
conn.close()
|
||||
conn = Client(address=_ipc_address, family="AF_UNIX", authkey=_ipc_authkey)
|
||||
conn.send(message)
|
||||
conn.close()
|
||||
|
||||
# NOTE: Kinda important as this prevents overloading the UI thread
|
||||
time.sleep(0.04)
|
||||
time.sleep(0.05)
|
||||
|
||||
|
||||
def file_search(path, query):
|
||||
@@ -57,35 +58,44 @@ def _search_for_string(file, query):
|
||||
b64_file = base64.urlsafe_b64encode(file.encode('utf-8')).decode('utf-8')
|
||||
grep_result_set = {}
|
||||
padding = 15
|
||||
|
||||
with open(file, 'r') as fp:
|
||||
# NOTE: I know there's an issue if there's a very large file with content
|
||||
# all on one line will lower and dupe it. And, yes, it will only
|
||||
# return one instance from the file.
|
||||
for i, raw in enumerate(fp):
|
||||
line = None
|
||||
llower = raw.lower()
|
||||
if not query in llower:
|
||||
continue
|
||||
try:
|
||||
for i, raw in enumerate(fp):
|
||||
line = None
|
||||
llower = raw.lower()
|
||||
if not query in llower:
|
||||
continue
|
||||
|
||||
if len(raw) > 72:
|
||||
start = 0
|
||||
end = len(raw) - 1
|
||||
index = llower.index(query)
|
||||
sindex = llower.index(query) - 15 if index >= 15 else abs(start - index) - index
|
||||
eindex = sindex + 15 if end > (index + 15) else abs(index - end) + index
|
||||
line = raw[sindex:eindex]
|
||||
else:
|
||||
line = raw
|
||||
if len(raw) > 72:
|
||||
start = 0
|
||||
end = len(raw) - 1
|
||||
index = llower.index(query)
|
||||
sindex = llower.index(query) - 15 if index >= 15 else abs(start - index) - index
|
||||
eindex = sindex + 15 if end > (index + 15) else abs(index - end) + index
|
||||
line = raw[sindex:eindex]
|
||||
else:
|
||||
line = raw
|
||||
|
||||
b64_line = base64.urlsafe_b64encode(line.encode('utf-8')).decode('utf-8')
|
||||
if f"{b64_file}" in grep_result_set.keys():
|
||||
grep_result_set[f"{b64_file}"][f"{i+1}"] = b64_line
|
||||
else:
|
||||
grep_result_set[f"{b64_file}"] = {}
|
||||
grep_result_set[f"{b64_file}"] = {f"{i+1}": b64_line}
|
||||
b64_line = base64.urlsafe_b64encode(line.encode('utf-8')).decode('utf-8')
|
||||
if f"{b64_file}" in grep_result_set.keys():
|
||||
grep_result_set[f"{b64_file}"][f"{i+1}"] = b64_line
|
||||
else:
|
||||
grep_result_set[f"{b64_file}"] = {}
|
||||
grep_result_set[f"{b64_file}"] = {f"{i+1}": b64_line}
|
||||
|
||||
except Exception as e:
|
||||
...
|
||||
|
||||
try:
|
||||
data = f"GREP|{json.dumps(grep_result_set)}"
|
||||
send_ipc_message(data)
|
||||
except Exception as e:
|
||||
...
|
||||
|
||||
data = f"GREP|{json.dumps(grep_result_set)}"
|
||||
send_ipc_message(data)
|
||||
|
||||
|
||||
@daemon_threaded
|
||||
@@ -99,7 +109,7 @@ def grep_search(path, query):
|
||||
if os.path.isdir(target):
|
||||
grep_search(target, query)
|
||||
else:
|
||||
if target.lower().endswith(filter):
|
||||
if not target.lower().endswith(filter):
|
||||
size = os.path.getsize(target)
|
||||
if not size > 5000:
|
||||
_search_for_string(target, query)
|
||||
|
@@ -33,7 +33,7 @@ class Plugin(PluginBase):
|
||||
# where self.name should not be needed for message comms
|
||||
|
||||
|
||||
def get_ui_element(self):
|
||||
def generate_reference_ui_element(self):
|
||||
button = Gtk.Button(label=self.name)
|
||||
button.connect("button-release-event", self.send_message)
|
||||
return button
|
||||
|
@@ -39,7 +39,14 @@ class Plugin(PluginBase):
|
||||
|
||||
self.trashman.regenerate()
|
||||
|
||||
def get_ui_element(self):
|
||||
|
||||
def run(self):
|
||||
self._event_system.subscribe("show_trash_buttons", self._show_trash_buttons)
|
||||
self._event_system.subscribe("hide_trash_buttons", self._hide_trash_buttons)
|
||||
self._event_system.subscribe("delete_files", self.delete_files)
|
||||
self._event_system.subscribe("trash_files", self.trash_files)
|
||||
|
||||
def generate_reference_ui_element(self):
|
||||
self._builder = Gtk.Builder()
|
||||
self._builder.add_from_file(self._GLADE_FILE)
|
||||
|
||||
@@ -61,10 +68,6 @@ class Plugin(PluginBase):
|
||||
return trasher
|
||||
|
||||
|
||||
def run(self):
|
||||
self._event_system.subscribe("show_trash_buttons", self._show_trash_buttons)
|
||||
self._event_system.subscribe("hide_trash_buttons", self._hide_trash_buttons)
|
||||
|
||||
def _show_trash_buttons(self):
|
||||
self._builder.get_object("restore_from_trash").show()
|
||||
self._builder.get_object("empty_trash").show()
|
||||
@@ -74,6 +77,7 @@ class Plugin(PluginBase):
|
||||
self._builder.get_object("empty_trash").hide()
|
||||
|
||||
def delete_files(self, widget = None, eve = None):
|
||||
self._event_system.emit("do_hide_context_menu")
|
||||
self._event_system.emit("get_current_state")
|
||||
state = self._fm_state
|
||||
uris = state.selected_files
|
||||
@@ -97,19 +101,23 @@ class Plugin(PluginBase):
|
||||
break
|
||||
|
||||
def trash_files(self, widget = None, eve = None, verbocity = False):
|
||||
self._event_system.emit("do_hide_context_menu")
|
||||
self._event_system.emit("get_current_state")
|
||||
state = self._fm_state
|
||||
for uri in state.selected_files:
|
||||
self.trashman.trash(uri, verbocity)
|
||||
|
||||
def restore_trash_files(self, widget = None, eve = None, verbocity = False):
|
||||
self._event_system.emit("do_hide_context_menu")
|
||||
self._event_system.emit("get_current_state")
|
||||
state = self._fm_state
|
||||
for uri in state.selected_files:
|
||||
self.trashman.restore(filename=uri.split("/")[-1], verbose = verbocity)
|
||||
|
||||
def empty_trash(self, widget = None, eve = None, verbocity = False):
|
||||
self._event_system.emit("do_hide_context_menu")
|
||||
self.trashman.empty(verbose = verbocity)
|
||||
|
||||
def go_to_trash(self, widget = None, eve = None, verbocity = False):
|
||||
self._event_system.emit("do_hide_context_menu")
|
||||
self._event_system.emit("go_to_path", self.trash_files_path)
|
||||
|
@@ -44,11 +44,6 @@ class Plugin(PluginBase):
|
||||
self._file_hash = None
|
||||
|
||||
|
||||
def get_ui_element(self):
|
||||
button = Gtk.Button(label=self.name)
|
||||
button.connect("button-release-event", self._show_thumbnailer_page)
|
||||
return button
|
||||
|
||||
def run(self):
|
||||
self._builder = Gtk.Builder()
|
||||
self._builder.add_from_file(self._GLADE_FILE)
|
||||
@@ -72,10 +67,15 @@ class Plugin(PluginBase):
|
||||
self._thumbnail_preview_img = self._builder.get_object("thumbnail_preview_img")
|
||||
self._file_hash = self._builder.get_object("file_hash")
|
||||
|
||||
def generate_reference_ui_element(self):
|
||||
button = Gtk.Button(label=self.name)
|
||||
button.connect("button-release-event", self._show_thumbnailer_page)
|
||||
return button
|
||||
|
||||
|
||||
@threaded
|
||||
def _show_thumbnailer_page(self, widget=None, eve=None):
|
||||
self._event_system.emit("get_current_state
|
||||
self._event_system.emit("get_current_state")
|
||||
|
||||
state = self._fm_state
|
||||
self._event_message = None
|
||||
|
@@ -33,8 +33,7 @@ class Plugin(PluginBase):
|
||||
self.name = "Youtube Download" # NOTE: Need to remove after establishing private bidirectional 1-1 message bus
|
||||
# where self.name should not be needed for message comms
|
||||
|
||||
|
||||
def get_ui_element(self):
|
||||
def generate_reference_ui_element(self):
|
||||
button = Gtk.Button(label=self.name)
|
||||
button.connect("button-release-event", self._do_download)
|
||||
return button
|
||||
@@ -44,7 +43,7 @@ class Plugin(PluginBase):
|
||||
|
||||
|
||||
def _do_download(self, widget=None, eve=None):
|
||||
self._event_system.emit("get_current_state
|
||||
self._event_system.emit("get_current_state")
|
||||
|
||||
dir = self._fm_state.tab.get_current_directory()
|
||||
self._download(dir)
|
||||
|
Reference in New Issue
Block a user