+# ignores all errros
+# todo: cache thumbs?
+sub _create_thumbnail {
+ my ($file, $size) = @_;
+
+ $size //= 64;
+
+ my $filename;
+ if (!eval { $filename = $file->get_file(); 1; }) {
+ $::lxdebug->message(LXDebug::WARN(), "SL::File::_create_thumbnail get_file failed: " . $EVAL_ERROR);
+ return;
+ }
+
+ # Workaround for pfds which are not handled by file_probe_type.
+ # Maybe use mime info stored in db?
+ my $mime_type = File::MimeInfo::Magic::magic($filename);
+ if ($mime_type =~ m{pdf}) {
+ $filename = _convert_pdf_to_png($filename, size => $size);
+ }
+ return if !$filename;
+
+ my $content;
+ if (!eval { $content = slurp $filename; 1; }) {
+ $::lxdebug->message(LXDebug::WARN(), "SL::File::_create_thumbnail slurp failed: " . $EVAL_ERROR);
+ return;
+ }
+
+ my $ret;
+ if (!eval { $ret = file_probe_type($content, size => $size); 1; }) {
+ $::lxdebug->message(LXDebug::WARN(), "SL::File::_create_thumbnail file_probe_type failed: " . $EVAL_ERROR);
+ return;
+ }
+
+ # file_probe_type returns a hash ref with thumbnail info and content
+ # or an error message
+ if ('HASH' ne ref $ret) {
+ $::lxdebug->message(LXDebug::WARN(), "SL::File::_create_thumbnail file_probe_type returned an error: " . $ret);
+ return;
+ }
+
+ return $ret;
+}
+
+sub _convert_pdf_to_png {
+ my ($filename, %params) = @_;
+
+ my $size = $params{size} // 64;
+ my $sfile = SL::SessionFile::Random->new();
+ unless (-f $filename) {
+ $::lxdebug->message(LXDebug::WARN(), "_convert_pdf_to_png failed, no file found: $filename");
+ return;
+ }
+ # quotemeta for storno case "storno\ zu\ 1020" *nix only
+ my $command = 'pdftoppm -singlefile -scale-to ' . $size . ' -png' . ' ' . quotemeta($filename) . ' ' . $sfile->file_name;
+
+ if (system($command) == -1) {
+ $::lxdebug->message(LXDebug::WARN(), "SL::File::_convert_pdf_to_png: system call failed: " . $ERRNO);
+ return;
+ }
+ if ($CHILD_ERROR) {
+ $::lxdebug->message(LXDebug::WARN(), "SL::File::_convert_pdf_to_png: pdftoppm failed with error code: " . ($CHILD_ERROR >> 8));
+ $::lxdebug->message(LXDebug::WARN(), "SL::File::_convert_pdf_to_png: File: $filename");
+ return;
+ }
+
+ return $sfile->file_name . '.png';
+}
+