/ services / Thumbnailer.qml
Thumbnailer.qml
 1  pragma Singleton
 2  pragma ComponentBehavior: Bound
 3  
 4  import "root:/utils"
 5  import Quickshell
 6  import Quickshell.Io
 7  import QtQuick
 8  
 9  Singleton {
10      id: root
11  
12      readonly property string thumbDir: `${Paths.cache}/thumbnails`.slice(7)
13  
14      function go(obj: var): var {
15          return thumbComp.createObject(obj, {
16              originalPath: obj.path,
17              width: obj.width,
18              height: obj.height,
19              loadOriginal: obj.loadOriginal
20          });
21      }
22  
23      component Thumbnail: QtObject {
24          id: obj
25  
26          required property string originalPath
27          required property int width
28          required property int height
29          required property bool loadOriginal
30  
31          property string path
32  
33          readonly property Process proc: Process {
34              running: true
35              command: ["fish", "-c", `
36  set -l path "${root.thumbDir}/$(sha1sum ${obj.originalPath} | cut -d ' ' -f 1)@${obj.width}x${obj.height}-exact.png"
37  if test -f $path
38      echo $path
39  else
40      echo 'start'
41      set -l size (identify -ping -format '%w\n%h' ${obj.originalPath})
42      if test $size[1] -gt ${obj.width} -o $size[2] -gt ${obj.height}
43          magick ${obj.originalPath} -${obj.width > 1024 || obj.height > 1024 ? "resize" : "thumbnail"} ${obj.width}x${obj.height}^ -background none -gravity center -extent ${obj.width}x${obj.height} -unsharp 0x.5 $path
44      else
45          cp ${obj.originalPath} $path
46      end
47      echo $path
48  end`]
49              stdout: SplitParser {
50                  onRead: data => {
51                      if (data === "start") {
52                          if (obj.loadOriginal)
53                              obj.path = obj.originalPath;
54                      } else {
55                          obj.path = data;
56                      }
57                  }
58              }
59          }
60  
61          function reload(): void {
62              proc.signal(9);
63              proc.running = true;
64          }
65      }
66  
67      Component {
68          id: thumbComp
69  
70          Thumbnail {}
71      }
72  }