moved thumbnail generation to plugin; extended plugin loading for pre and post window loading
This commit is contained in:
76
plugins/thumbnailer/icons/mixins/desktopiconmixin.py
Normal file
76
plugins/thumbnailer/icons/mixins/desktopiconmixin.py
Normal file
@@ -0,0 +1,76 @@
|
||||
# Python imports
|
||||
import os
|
||||
from os.path import isfile
|
||||
import subprocess
|
||||
import hashlib
|
||||
|
||||
# Lib imports
|
||||
import gi
|
||||
gi.require_version('Gtk', '3.0')
|
||||
from gi.repository import Gtk
|
||||
from gi.repository import Gio
|
||||
|
||||
# Application imports
|
||||
from .xdg.DesktopEntry import DesktopEntry
|
||||
|
||||
|
||||
|
||||
|
||||
class DesktopIconMixin:
|
||||
def find_thumbnail_from_desktop_file(self, full_path):
|
||||
try:
|
||||
xdgObj = DesktopEntry(full_path)
|
||||
icon = xdgObj.getIcon()
|
||||
alt_icon_path = ""
|
||||
|
||||
if "steam" in icon:
|
||||
return self.get_steam_img(xdgObj)
|
||||
elif os.path.exists(icon):
|
||||
return self.create_scaled_image(icon, self.sys_icon_wh)
|
||||
else:
|
||||
pixbuf, alt_icon_path = self.get_icon_from_traversal(icon)
|
||||
if pixbuf:
|
||||
return pixbuf
|
||||
|
||||
return self.create_scaled_image(alt_icon_path, self.sys_icon_wh)
|
||||
except Exception as e:
|
||||
print(".desktop icon generation issue:")
|
||||
print( repr(e) )
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def get_steam_img(self, xdgObj):
|
||||
name = xdgObj.getName()
|
||||
file_hash = hashlib.sha256(str.encode(name)).hexdigest()
|
||||
hash_img_pth = f"{self.STEAM_ICONS_PTH}/{file_hash}.jpg"
|
||||
|
||||
if not isfile(hash_img_pth):
|
||||
exec_str = xdgObj.getExec()
|
||||
parts = exec_str.split("steam://rungameid/")
|
||||
id = parts[len(parts) - 1]
|
||||
imageLink = f"{self.STEAM_CDN_URL}{id}/header.jpg"
|
||||
proc = subprocess.Popen(["wget", "-O", hash_img_pth, imageLink])
|
||||
proc.wait()
|
||||
|
||||
return self.create_scaled_image(hash_img_pth, self.video_icon_wh)
|
||||
|
||||
def get_icon_from_traversal(self, icon):
|
||||
gio_icon = Gio.Icon.new_for_string(icon)
|
||||
gicon = Gtk.Image.new_from_gicon(gio_icon, 32)
|
||||
pixbuf = gicon.get_pixbuf()
|
||||
|
||||
alt_icon_path = ""
|
||||
for dir in self.ICON_DIRS:
|
||||
alt_icon_path = self.traverse_icons_folder(dir, icon)
|
||||
if alt_icon_path != "":
|
||||
break
|
||||
|
||||
return pixbuf, alt_icon_path
|
||||
|
||||
def traverse_icons_folder(self, path, icon):
|
||||
for (dirpath, dirnames, filenames) in os.walk(path):
|
||||
for file in filenames:
|
||||
appNM = "application-x-" + icon
|
||||
if icon in file or appNM in file:
|
||||
return f"{dirpath}/{file}"
|
Reference in New Issue
Block a user