<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Hasan Aga</title>
    <description>The latest articles on Forem by Hasan Aga (@hasanaga).</description>
    <link>https://forem.com/hasanaga</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F794568%2F1c218c5e-9a81-4efc-9690-338600bf0338.jpeg</url>
      <title>Forem: Hasan Aga</title>
      <link>https://forem.com/hasanaga</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hasanaga"/>
    <language>en</language>
    <item>
      <title>Display DICOM metadata on the terminal</title>
      <dc:creator>Hasan Aga</dc:creator>
      <pubDate>Sat, 29 Jun 2024 19:07:45 +0000</pubDate>
      <link>https://forem.com/hasanaga/display-dicom-metadata-on-the-terminal-3odh</link>
      <guid>https://forem.com/hasanaga/display-dicom-metadata-on-the-terminal-3odh</guid>
      <description>&lt;p&gt;Here is a quick guide on how to view the metadata of DICOM files without leaving the terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is DICOM
&lt;/h2&gt;

&lt;p&gt;DICOM is a file format used in the medical field. The file is similar to "PNG" but it usually has more metadata associated with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a terminal file-manager?
&lt;/h2&gt;

&lt;p&gt;A terminal file-manager is an app that makes navigating the terminal easier. Instead of writing multiple &lt;code&gt;cd&lt;/code&gt; commands we can use the arrow keys to move around. I found two file-managers, "Ranger" and "nnn" and in this post we will cover setting up Ranger to preview DICOM file metadata on the fly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuring Ranger
&lt;/h2&gt;

&lt;p&gt;After downloading the app, head over to &lt;code&gt;~/.config/ranger&lt;/code&gt; then open &lt;code&gt;rc.conf&lt;/code&gt; and paste these lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;set &lt;/span&gt;use_preview_script &lt;span class="nb"&gt;true
set &lt;/span&gt;preview_script ~/.config/ranger/scope.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and create a &lt;code&gt;scope.sh&lt;/code&gt; file then copy this sample scope.sh into it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; noclobber &lt;span class="nt"&gt;-o&lt;/span&gt; noglob &lt;span class="nt"&gt;-o&lt;/span&gt; nounset &lt;span class="nt"&gt;-o&lt;/span&gt; pipefail
&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;$'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;

&lt;span class="c"&gt;## If the option `use_preview_script` is set to `true`,&lt;/span&gt;

&lt;span class="c"&gt;## then this script will be called and its output will be displayed in ranger.&lt;/span&gt;

&lt;span class="c"&gt;## ANSI color codes are supported.&lt;/span&gt;

&lt;span class="c"&gt;## STDIN is disabled, so interactive scripts won't work properly&lt;/span&gt;

&lt;span class="c"&gt;## This script is considered a configuration file and must be updated manually.&lt;/span&gt;

&lt;span class="c"&gt;## It will be left untouched if you upgrade ranger.&lt;/span&gt;

&lt;span class="c"&gt;## Because of some automated testing we do on the script #'s for comments need&lt;/span&gt;

&lt;span class="c"&gt;## to be doubled up. Code that is commented out, because it's an alternative for&lt;/span&gt;

&lt;span class="c"&gt;## example, gets only one #.&lt;/span&gt;

&lt;span class="c"&gt;## Meanings of exit codes:&lt;/span&gt;

&lt;span class="c"&gt;## code | meaning | action of ranger&lt;/span&gt;

&lt;span class="c"&gt;## -----+------------+-------------------------------------------&lt;/span&gt;

&lt;span class="c"&gt;## 0 | success | Display stdout as preview&lt;/span&gt;

&lt;span class="c"&gt;## 1 | no preview | Display no preview at all&lt;/span&gt;

&lt;span class="c"&gt;## 2 | plain text | Display the plain content of the file&lt;/span&gt;

&lt;span class="c"&gt;## 3 | fix width | Don't reload when width changes&lt;/span&gt;

&lt;span class="c"&gt;## 4 | fix height | Don't reload when height changes&lt;/span&gt;

&lt;span class="c"&gt;## 5 | fix both | Don't ever reload&lt;/span&gt;

&lt;span class="c"&gt;## 6 | image | Display the image `$IMAGE_CACHE_PATH` points to as an image preview&lt;/span&gt;

&lt;span class="c"&gt;## 7 | image | Display the file directly as an image&lt;/span&gt;

&lt;span class="c"&gt;## Script arguments&lt;/span&gt;

&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;         &lt;span class="c"&gt;# Full path of the highlighted file&lt;/span&gt;
&lt;span class="nv"&gt;PV_WIDTH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="c"&gt;# Width of the preview pane (number of fitting characters)&lt;/span&gt;

&lt;span class="c"&gt;## shellcheck disable=SC2034 # PV_HEIGHT is provided for convenience and unused&lt;/span&gt;

&lt;span class="nv"&gt;PV_HEIGHT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;         &lt;span class="c"&gt;# Height of the preview pane (number of fitting characters)&lt;/span&gt;
&lt;span class="nv"&gt;IMAGE_CACHE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;4&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="c"&gt;# Full path that should be used to cache image preview&lt;/span&gt;
&lt;span class="nv"&gt;PV_IMAGE_ENABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;5&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="c"&gt;# 'True' if image previews are enabled, 'False' otherwise.&lt;/span&gt;

&lt;span class="nv"&gt;FILE_EXTENSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="p"&gt;##*.&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;FILE_EXTENSION_LOWER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"%s"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_EXTENSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;'[:upper:]'&lt;/span&gt; &lt;span class="s1"&gt;'[:lower:]'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;## Settings&lt;/span&gt;

&lt;span class="nv"&gt;HIGHLIGHT_SIZE_MAX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;262143 &lt;span class="c"&gt;# 256KiB&lt;/span&gt;
&lt;span class="nv"&gt;HIGHLIGHT_TABWIDTH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HIGHLIGHT_TABWIDTH&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;8&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;HIGHLIGHT_STYLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HIGHLIGHT_STYLE&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;pablo&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;HIGHLIGHT_OPTIONS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"--replace-tabs=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HIGHLIGHT_TABWIDTH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; --style=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HIGHLIGHT_STYLE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HIGHLIGHT_OPTIONS&lt;/span&gt;&lt;span class="k"&gt;:-}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;PYGMENTIZE_STYLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PYGMENTIZE_STYLE&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;autumn&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;BAT_STYLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BAT_STYLE&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;plain&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;OPENSCAD_IMGSIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RNGR_OPENSCAD_IMGSIZE&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,1000&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;OPENSCAD_COLORSCHEME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RNGR_OPENSCAD_COLORSCHEME&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;Tomorrow&lt;/span&gt;&lt;span class="p"&gt; Night&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;SQLITE_TABLE_LIMIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;20 &lt;span class="c"&gt;# Display only the top &amp;lt;limit&amp;gt; tables in database, set to 0 for no exhaustive preview (only the sqlite_master table is displayed).&lt;/span&gt;
&lt;span class="nv"&gt;SQLITE_ROW_LIMIT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5 &lt;span class="c"&gt;# Display only the first and the last (&amp;lt;limit&amp;gt; - 1) records in each table, set to 0 for no limits.&lt;/span&gt;

handle_dicom&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;filepath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
python3 - &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
import sys
import pydicom

filepath = "&lt;/span&gt;&lt;span class="nv"&gt;$filepath&lt;/span&gt;&lt;span class="sh"&gt;"
dataset = pydicom.dcmread(filepath)
print(dataset)
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;

handle_extension&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_EXTENSION_LOWER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
        &lt;span class="c"&gt;## Archive&lt;/span&gt;
        a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|&lt;span class="se"&gt;\&lt;/span&gt;
        rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip&lt;span class="p"&gt;)&lt;/span&gt;
            atool &lt;span class="nt"&gt;--list&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
bsdtar &lt;span class="nt"&gt;--list&lt;/span&gt; &lt;span class="nt"&gt;--file&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;
        rar&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;## Avoid password prompt by providing empty password&lt;/span&gt;
            unrar lt &lt;span class="nt"&gt;-p-&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
&lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;
7z&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;## Avoid password prompt by providing empty password&lt;/span&gt;
7z l &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
&lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## PDF&lt;/span&gt;
        pdf&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;## Preview as text conversion&lt;/span&gt;
            pdftotext &lt;span class="nt"&gt;-l&lt;/span&gt; 10 &lt;span class="nt"&gt;-nopgbrk&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; - | &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nb"&gt;fmt&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PV_WIDTH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            mutool draw &lt;span class="nt"&gt;-F&lt;/span&gt; txt &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 1-10 | &lt;span class="se"&gt;\&lt;/span&gt;
              &lt;span class="nb"&gt;fmt&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PV_WIDTH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            exiftool &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## BitTorrent&lt;/span&gt;
        torrent&lt;span class="p"&gt;)&lt;/span&gt;
            transmission-show &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## OpenDocument&lt;/span&gt;
        odt|sxw&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;## Preview as text conversion&lt;/span&gt;
            odt2txt &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="c"&gt;## Preview as markdown conversion&lt;/span&gt;
            pandoc &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; markdown &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;
        ods|odp&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;## Preview as text conversion (unsupported by pandoc for markdown)&lt;/span&gt;
            odt2txt &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## XLSX&lt;/span&gt;
        xlsx&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;## Preview as csv conversion&lt;/span&gt;
            &lt;span class="c"&gt;## Uses: https://github.com/dilshod/xlsx2csv&lt;/span&gt;
            xlsx2csv &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## HTML&lt;/span&gt;
        htm|html|xhtml&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;## Preview as text conversion&lt;/span&gt;
            w3m &lt;span class="nt"&gt;-dump&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            lynx &lt;span class="nt"&gt;-dump&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            elinks &lt;span class="nt"&gt;-dump&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            pandoc &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; markdown &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## JSON&lt;/span&gt;
        json&lt;span class="p"&gt;)&lt;/span&gt;
            jq &lt;span class="nt"&gt;--color-output&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            python &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## Jupyter Notebooks&lt;/span&gt;
        ipynb&lt;span class="p"&gt;)&lt;/span&gt;
            jupyter nbconvert &lt;span class="nt"&gt;--to&lt;/span&gt; markdown &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--stdout&lt;/span&gt; | &lt;span class="nb"&gt;env &lt;/span&gt;&lt;span class="nv"&gt;COLORTERM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8bit bat &lt;span class="nt"&gt;--color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;always &lt;span class="nt"&gt;--style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;plain &lt;span class="nt"&gt;--language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;markdown &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            jupyter nbconvert &lt;span class="nt"&gt;--to&lt;/span&gt; markdown &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--stdout&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            jq &lt;span class="nt"&gt;--color-output&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            python &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## Direct Stream Digital/Transfer (DSDIFF) and wavpack aren't detected&lt;/span&gt;
        &lt;span class="c"&gt;## by file(1).&lt;/span&gt;
        dff|dsf|wv|wvc&lt;span class="p"&gt;)&lt;/span&gt;
            mediainfo &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            exiftool &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="p"&gt;;;&lt;/span&gt; &lt;span class="c"&gt;# Continue with next handler on failure&lt;/span&gt;

        &lt;span class="c"&gt;## for dcm files&lt;/span&gt;
        dcm&lt;span class="p"&gt;)&lt;/span&gt;
            handle_dicom &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;esac&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;

handle_image&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="c"&gt;## Size of the preview if there are multiple options or it has to be ## rendered from vector graphics. If the conversion program allows ## specifying only one dimension while keeping the aspect ratio, the width ## will be used.&lt;/span&gt;
&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;DEFAULT_SIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"1920x1080"&lt;/span&gt;

    &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;mimetype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;mimetype&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
        &lt;span class="c"&gt;## SVG&lt;/span&gt;
        image/svg+xml|image/svg&lt;span class="p"&gt;)&lt;/span&gt;
            rsvg-convert &lt;span class="nt"&gt;--keep-aspect-ratio&lt;/span&gt; &lt;span class="nt"&gt;--width&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DEFAULT_SIZE&lt;/span&gt;&lt;span class="p"&gt;%x*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_CACHE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.png"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;mv&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_CACHE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.png"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_CACHE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;6
            &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## DjVu&lt;/span&gt;
        image/vnd.djvu&lt;span class="p"&gt;)&lt;/span&gt;
            ddjvu &lt;span class="nt"&gt;-format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tiff &lt;span class="nt"&gt;-quality&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;90 &lt;span class="nt"&gt;-page&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1 &lt;span class="nt"&gt;-size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DEFAULT_SIZE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                  - &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_CACHE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &amp;lt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                  &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;6 &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## Image&lt;/span&gt;
        image/&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nb"&gt;local &lt;/span&gt;orientation
            &lt;span class="nv"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt; identify &lt;span class="nt"&gt;-format&lt;/span&gt; &lt;span class="s1"&gt;'%[EXIF:Orientation]\n'&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
            &lt;span class="c"&gt;## If orientation data is present and the image actually&lt;/span&gt;
            &lt;span class="c"&gt;## needs rotating ("1" means no rotation)...&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$orientation&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$orientation&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; 1 &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
                &lt;span class="c"&gt;## ...auto-rotate the image according to the EXIF data.&lt;/span&gt;
                convert &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-auto-orient&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_CACHE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;6
            &lt;span class="k"&gt;fi&lt;/span&gt;

            &lt;span class="c"&gt;## `w3mimgdisplay` will be called for all images (unless overridden&lt;/span&gt;
            &lt;span class="c"&gt;## as above), but might fail for unsupported types.&lt;/span&gt;
            &lt;span class="nb"&gt;exit &lt;/span&gt;7&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## Video&lt;/span&gt;
        &lt;span class="c"&gt;# video/*)&lt;/span&gt;
        &lt;span class="c"&gt;#     # Get embedded thumbnail&lt;/span&gt;
        &lt;span class="c"&gt;#     ffmpeg -i "${FILE_PATH}" -map 0:v -map -0:V -c copy "${IMAGE_CACHE_PATH}" &amp;amp;&amp;amp; exit 6&lt;/span&gt;
        &lt;span class="c"&gt;#     # Get frame 10% into video&lt;/span&gt;
        &lt;span class="c"&gt;#     ffmpegthumbnailer -i "${FILE_PATH}" -o "${IMAGE_CACHE_PATH}" -s 0 &amp;amp;&amp;amp; exit 6&lt;/span&gt;
        &lt;span class="c"&gt;#     exit 1;;&lt;/span&gt;

        &lt;span class="c"&gt;## Audio&lt;/span&gt;
        &lt;span class="c"&gt;# audio/*)&lt;/span&gt;
        &lt;span class="c"&gt;#     # Get embedded thumbnail&lt;/span&gt;
        &lt;span class="c"&gt;#     ffmpeg -i "${FILE_PATH}" -map 0:v -map -0:V -c copy \&lt;/span&gt;
        &lt;span class="c"&gt;#       "${IMAGE_CACHE_PATH}" &amp;amp;&amp;amp; exit 6;;&lt;/span&gt;

        &lt;span class="c"&gt;## PDF&lt;/span&gt;
        &lt;span class="c"&gt;# application/pdf)&lt;/span&gt;
        &lt;span class="c"&gt;#     pdftoppm -f 1 -l 1 \&lt;/span&gt;
        &lt;span class="c"&gt;#              -scale-to-x "${DEFAULT_SIZE%x*}" \&lt;/span&gt;
        &lt;span class="c"&gt;#              -scale-to-y -1 \&lt;/span&gt;
        &lt;span class="c"&gt;#              -singlefile \&lt;/span&gt;
        &lt;span class="c"&gt;#              -jpeg -tiffcompression jpeg \&lt;/span&gt;
        &lt;span class="c"&gt;#              -- "${FILE_PATH}" "${IMAGE_CACHE_PATH%.*}" \&lt;/span&gt;
        &lt;span class="c"&gt;#         &amp;amp;&amp;amp; exit 6 || exit 1;;&lt;/span&gt;


        &lt;span class="c"&gt;## ePub, MOBI, FB2 (using Calibre)&lt;/span&gt;
        &lt;span class="c"&gt;# application/epub+zip|application/x-mobipocket-ebook|\&lt;/span&gt;
        &lt;span class="c"&gt;# application/x-fictionbook+xml)&lt;/span&gt;
        &lt;span class="c"&gt;#     # ePub (using https://github.com/marianosimone/epub-thumbnailer)&lt;/span&gt;
        &lt;span class="c"&gt;#     epub-thumbnailer "${FILE_PATH}" "${IMAGE_CACHE_PATH}" \&lt;/span&gt;
        &lt;span class="c"&gt;#         "${DEFAULT_SIZE%x*}" &amp;amp;&amp;amp; exit 6&lt;/span&gt;
        &lt;span class="c"&gt;#     ebook-meta --get-cover="${IMAGE_CACHE_PATH}" -- "${FILE_PATH}" \&lt;/span&gt;
        &lt;span class="c"&gt;#         &amp;gt;/dev/null &amp;amp;&amp;amp; exit 6&lt;/span&gt;
        &lt;span class="c"&gt;#     exit 1;;&lt;/span&gt;

        &lt;span class="c"&gt;## Font&lt;/span&gt;
        application/font&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;application/&lt;span class="k"&gt;*&lt;/span&gt;opentype&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nv"&gt;preview_png&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/tmp/&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_CACHE_PATH&lt;/span&gt;&lt;span class="p"&gt;%.*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;.png"&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;fontimage &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;preview_png&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                         &lt;span class="nt"&gt;--pixelsize&lt;/span&gt; &lt;span class="s2"&gt;"120"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                         &lt;span class="nt"&gt;--fontname&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                         &lt;span class="nt"&gt;--pixelsize&lt;/span&gt; &lt;span class="s2"&gt;"80"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                         &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;"  ABCDEFGHIJKLMNOPQRSTUVWXYZ  "&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                         &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;"  abcdefghijklmnopqrstuvwxyz  "&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                         &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;"  0123456789.:,;(*!?') ff fl fi ffi ffl  "&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                         &lt;span class="nt"&gt;--text&lt;/span&gt; &lt;span class="s2"&gt;"  The quick brown fox jumps over the lazy dog.  "&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                         &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;then
                &lt;/span&gt;convert &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;preview_png&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_CACHE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;preview_png&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                    &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;6
            &lt;span class="k"&gt;else
                &lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;1
            &lt;span class="k"&gt;fi&lt;/span&gt;
            &lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## Preview archives using the first image inside.&lt;/span&gt;
        &lt;span class="c"&gt;## (Very useful for comic book collections for example.)&lt;/span&gt;
        &lt;span class="c"&gt;# application/zip|application/x-rar|application/x-7z-compressed|\&lt;/span&gt;
        &lt;span class="c"&gt;#     application/x-xz|application/x-bzip2|application/x-gzip|application/x-tar)&lt;/span&gt;
        &lt;span class="c"&gt;#     local fn=""; local fe=""&lt;/span&gt;
        &lt;span class="c"&gt;#     local zip=""; local rar=""; local tar=""; local bsd=""&lt;/span&gt;
        &lt;span class="c"&gt;#     case "${mimetype}" in&lt;/span&gt;
        &lt;span class="c"&gt;#         application/zip) zip=1 ;;&lt;/span&gt;
        &lt;span class="c"&gt;#         application/x-rar) rar=1 ;;&lt;/span&gt;
        &lt;span class="c"&gt;#         application/x-7z-compressed) ;;&lt;/span&gt;
        &lt;span class="c"&gt;#         *) tar=1 ;;&lt;/span&gt;
        &lt;span class="c"&gt;#     esac&lt;/span&gt;
        &lt;span class="c"&gt;#     { [ "$tar" ] &amp;amp;&amp;amp; fn=$(tar --list --file "${FILE_PATH}"); } || \&lt;/span&gt;
        &lt;span class="c"&gt;#     { fn=$(bsdtar --list --file "${FILE_PATH}") &amp;amp;&amp;amp; bsd=1 &amp;amp;&amp;amp; tar=""; } || \&lt;/span&gt;
        &lt;span class="c"&gt;#     { [ "$rar" ] &amp;amp;&amp;amp; fn=$(unrar lb -p- -- "${FILE_PATH}"); } || \&lt;/span&gt;
        &lt;span class="c"&gt;#     { [ "$zip" ] &amp;amp;&amp;amp; fn=$(zipinfo -1 -- "${FILE_PATH}"); } || return&lt;/span&gt;
        &lt;span class="c"&gt;#&lt;/span&gt;
        &lt;span class="c"&gt;#     fn=$(echo "$fn" | python -c "from __future__ import print_function; \&lt;/span&gt;
        &lt;span class="c"&gt;#             import sys; import mimetypes as m; \&lt;/span&gt;
        &lt;span class="c"&gt;#             [ print(l, end='') for l in sys.stdin if \&lt;/span&gt;
        &lt;span class="c"&gt;#               (m.guess_type(l[:-1])[0] or '').startswith('image/') ]" |\&lt;/span&gt;
        &lt;span class="c"&gt;#         sort -V | head -n 1)&lt;/span&gt;
        &lt;span class="c"&gt;#     [ "$fn" = "" ] &amp;amp;&amp;amp; return&lt;/span&gt;
        &lt;span class="c"&gt;#     [ "$bsd" ] &amp;amp;&amp;amp; fn=$(printf '%b' "$fn")&lt;/span&gt;
        &lt;span class="c"&gt;#&lt;/span&gt;
        &lt;span class="c"&gt;#     [ "$tar" ] &amp;amp;&amp;amp; tar --extract --to-stdout \&lt;/span&gt;
        &lt;span class="c"&gt;#         --file "${FILE_PATH}" -- "$fn" &amp;gt; "${IMAGE_CACHE_PATH}" &amp;amp;&amp;amp; exit 6&lt;/span&gt;
        &lt;span class="c"&gt;#     fe=$(echo -n "$fn" | sed 's/[][*?\]/\\\0/g')&lt;/span&gt;
        &lt;span class="c"&gt;#     [ "$bsd" ] &amp;amp;&amp;amp; bsdtar --extract --to-stdout \&lt;/span&gt;
        &lt;span class="c"&gt;#         --file "${FILE_PATH}" -- "$fe" &amp;gt; "${IMAGE_CACHE_PATH}" &amp;amp;&amp;amp; exit 6&lt;/span&gt;
        &lt;span class="c"&gt;#     [ "$bsd" ] || [ "$tar" ] &amp;amp;&amp;amp; rm -- "${IMAGE_CACHE_PATH}"&lt;/span&gt;
        &lt;span class="c"&gt;#     [ "$rar" ] &amp;amp;&amp;amp; unrar p -p- -inul -- "${FILE_PATH}" "$fn" &amp;gt; \&lt;/span&gt;
        &lt;span class="c"&gt;#         "${IMAGE_CACHE_PATH}" &amp;amp;&amp;amp; exit 6&lt;/span&gt;
        &lt;span class="c"&gt;#     [ "$zip" ] &amp;amp;&amp;amp; unzip -pP "" -- "${FILE_PATH}" "$fe" &amp;gt; \&lt;/span&gt;
        &lt;span class="c"&gt;#         "${IMAGE_CACHE_PATH}" &amp;amp;&amp;amp; exit 6&lt;/span&gt;
        &lt;span class="c"&gt;#     [ "$rar" ] || [ "$zip" ] &amp;amp;&amp;amp; rm -- "${IMAGE_CACHE_PATH}"&lt;/span&gt;
        &lt;span class="c"&gt;#     ;;&lt;/span&gt;
    &lt;span class="k"&gt;esac&lt;/span&gt;

    &lt;span class="c"&gt;# openscad_image() {&lt;/span&gt;
    &lt;span class="c"&gt;#     TMPPNG="$(mktemp -t XXXXXX.png)"&lt;/span&gt;
    &lt;span class="c"&gt;#     openscad --colorscheme="${OPENSCAD_COLORSCHEME}" \&lt;/span&gt;
    &lt;span class="c"&gt;#         --imgsize="${OPENSCAD_IMGSIZE/x/,}" \&lt;/span&gt;
    &lt;span class="c"&gt;#         -o "${TMPPNG}" "${1}"&lt;/span&gt;
    &lt;span class="c"&gt;#     mv "${TMPPNG}" "${IMAGE_CACHE_PATH}"&lt;/span&gt;
    &lt;span class="c"&gt;# }&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_EXTENSION_LOWER&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
       &lt;span class="c"&gt;## 3D models&lt;/span&gt;
       &lt;span class="c"&gt;## OpenSCAD only supports png image output, and ${IMAGE_CACHE_PATH}&lt;/span&gt;
       &lt;span class="c"&gt;## is hardcoded as jpeg. So we make a tempfile.png and just&lt;/span&gt;
       &lt;span class="c"&gt;## move/rename it to jpg. This works because image libraries are&lt;/span&gt;
       &lt;span class="c"&gt;## smart enough to handle it.&lt;/span&gt;
       &lt;span class="c"&gt;# csg|scad)&lt;/span&gt;
       &lt;span class="c"&gt;#     openscad_image "${FILE_PATH}" &amp;amp;&amp;amp; exit 6&lt;/span&gt;
       &lt;span class="c"&gt;#     ;;&lt;/span&gt;
       &lt;span class="c"&gt;# 3mf|amf|dxf|off|stl)&lt;/span&gt;
       &lt;span class="c"&gt;#     openscad_image &amp;lt;(echo "import(\"${FILE_PATH}\");") &amp;amp;&amp;amp; exit 6&lt;/span&gt;
       &lt;span class="c"&gt;#     ;;&lt;/span&gt;
       drawio&lt;span class="p"&gt;)&lt;/span&gt;
           draw.io &lt;span class="nt"&gt;-x&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMAGE_CACHE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
               &lt;span class="nt"&gt;--width&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DEFAULT_SIZE&lt;/span&gt;&lt;span class="p"&gt;%x*&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;6
           &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;esac&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;

handle_mime&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;mimetype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;mimetype&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="c"&gt;## RTF and DOC&lt;/span&gt;
text/rtf|&lt;span class="se"&gt;\*&lt;/span&gt;msword&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;## Preview as text conversion ## note: catdoc does not always work for .doc files ## catdoc: http://www.wagner.pp.ru/~vitus/software/catdoc/&lt;/span&gt;
catdoc &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
&lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## DOCX, ePub, FB2 (using markdown)&lt;/span&gt;
        &lt;span class="c"&gt;## You might want to remove "|epub" and/or "|fb2" below if you have&lt;/span&gt;
        &lt;span class="c"&gt;## uncommented other methods to preview those formats&lt;/span&gt;
        &lt;span class="k"&gt;*&lt;/span&gt;wordprocessingml.document|&lt;span class="k"&gt;*&lt;/span&gt;/epub+zip|&lt;span class="k"&gt;*&lt;/span&gt;/x-fictionbook+xml&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;## Preview as markdown conversion&lt;/span&gt;
            pandoc &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; markdown &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## E-mails&lt;/span&gt;
        message/rfc822&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;## Parsing performed by mu: https://github.com/djcb/mu&lt;/span&gt;
            mu view &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## XLS&lt;/span&gt;
        &lt;span class="k"&gt;*&lt;/span&gt;ms-excel&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;## Preview as csv conversion&lt;/span&gt;
            &lt;span class="c"&gt;## xls2csv comes with catdoc:&lt;/span&gt;
            &lt;span class="c"&gt;##   http://www.wagner.pp.ru/~vitus/software/catdoc/&lt;/span&gt;
            xls2csv &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## SQLite&lt;/span&gt;
        &lt;span class="k"&gt;*&lt;/span&gt;sqlite3&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;## Preview as text conversion&lt;/span&gt;
            &lt;span class="nv"&gt;sqlite_tables&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt; sqlite3 &lt;span class="s2"&gt;"file:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?mode=ro"&lt;/span&gt; &lt;span class="s1"&gt;'.tables'&lt;/span&gt; &lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1
            &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-z&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlite_tables&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
                &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Empty SQLite database."&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
            sqlite_show_query&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                sqlite-utils query &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--table&lt;/span&gt; &lt;span class="nt"&gt;--fmt&lt;/span&gt; fancy_grid &lt;span class="se"&gt;\&lt;/span&gt;
                &lt;span class="o"&gt;||&lt;/span&gt; sqlite3 &lt;span class="s2"&gt;"file:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?mode=ro"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-header&lt;/span&gt; &lt;span class="nt"&gt;-column&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="c"&gt;## Display basic table information&lt;/span&gt;
            &lt;span class="nv"&gt;sqlite_rowcount_query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;
                sqlite3 &lt;span class="s2"&gt;"file:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?mode=ro"&lt;/span&gt; &lt;span class="nt"&gt;-noheader&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                    &lt;span class="s1"&gt;'SELECT group_concat(
                        "SELECT """ || name || """ AS tblname,
                                          count(*) AS rowcount
                         FROM " || name,
                        " UNION ALL "
                    )
                    FROM sqlite_master
                    WHERE type="table" AND name NOT LIKE "sqlite_%";'&lt;/span&gt;
            &lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
            sqlite_show_query &lt;span class="se"&gt;\&lt;/span&gt;
                &lt;span class="s2"&gt;"SELECT tblname AS 'table', rowcount AS 'count',
                (
                    SELECT '(' || group_concat(name, ', ') || ')'
                    FROM pragma_table_info(tblname)
                ) AS 'columns',
                (
                    SELECT '(' || group_concat(
                        upper(type) || (
                            CASE WHEN pk &amp;gt; 0 THEN ' PRIMARY KEY' ELSE '' END
                        ),
                        ', '
                    ) || ')'
                    FROM pragma_table_info(tblname)
                ) AS 'types'
                FROM (&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlite_rowcount_query&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;);"&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SQLITE_TABLE_LIMIT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-gt&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
               &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SQLITE_ROW_LIMIT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-ge&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
                &lt;span class="c"&gt;## Do exhaustive preview&lt;/span&gt;
                &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'&amp;gt;%.0s'&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt; &lt;span class="nb"&gt;seq&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PV_WIDTH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo
                &lt;/span&gt;sqlite3 &lt;span class="s2"&gt;"file:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?mode=ro"&lt;/span&gt; &lt;span class="nt"&gt;-noheader&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                    &lt;span class="s2"&gt;"SELECT name FROM sqlite_master
                    WHERE type='table' AND name NOT LIKE 'sqlite_%'
                    LIMIT &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SQLITE_TABLE_LIMIT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;;"&lt;/span&gt; |
                    &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; sqlite_table&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
                        &lt;/span&gt;&lt;span class="nv"&gt;sqlite_rowcount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;
                            sqlite3 &lt;span class="s2"&gt;"file:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?mode=ro"&lt;/span&gt; &lt;span class="nt"&gt;-noheader&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                                &lt;span class="s2"&gt;"SELECT count(*) FROM &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlite_table&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
                        &lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
                        &lt;span class="nb"&gt;echo
                        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SQLITE_ROW_LIMIT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-gt&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
                           &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SQLITE_ROW_LIMIT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                             &lt;span class="nt"&gt;-lt&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlite_rowcount&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlite_table&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; [&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SQLITE_ROW_LIMIT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; of &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlite_rowcount&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;]:"&lt;/span&gt;
                            &lt;span class="nv"&gt;sqlite_ellipsis_query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;
                                sqlite3 &lt;span class="s2"&gt;"file:&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?mode=ro"&lt;/span&gt; &lt;span class="nt"&gt;-noheader&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                                    &lt;span class="s2"&gt;"SELECT 'SELECT ' || group_concat(
                                        '''...''', ', '
                                    )
                                    FROM pragma_table_info(
                                        '&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlite_table&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;'
                                    );"&lt;/span&gt;
                            &lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
                            sqlite_show_query &lt;span class="se"&gt;\&lt;/span&gt;
                                &lt;span class="s2"&gt;"SELECT * FROM (
                                    SELECT * FROM &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlite_table&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; LIMIT 1
                                )
                                UNION ALL &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlite_ellipsis_query&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; UNION ALL
                                SELECT * FROM (
                                    SELECT * FROM &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlite_table&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;
                                    LIMIT (&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SQLITE_ROW_LIMIT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; - 1)
                                    OFFSET (
                                        &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlite_rowcount&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;
                                        - (&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SQLITE_ROW_LIMIT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; - 1)
                                    )
                                );"&lt;/span&gt;
                        &lt;span class="k"&gt;else
                            &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlite_table&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; [&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlite_rowcount&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;]:"&lt;/span&gt;
                            sqlite_show_query &lt;span class="s2"&gt;"SELECT * FROM &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;sqlite_table&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;;"&lt;/span&gt;
                        &lt;span class="k"&gt;fi
                    done
            fi
            &lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;5&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## Text&lt;/span&gt;
        text/&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;/xml&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;## Syntax highlight&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt; &lt;span class="nb"&gt;stat&lt;/span&gt; &lt;span class="nt"&gt;--printf&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'%s'&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-gt&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HIGHLIGHT_SIZE_MAX&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                &lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;2
            &lt;span class="k"&gt;fi
            if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt; tput colors &lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-ge&lt;/span&gt; 256 &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
                &lt;/span&gt;&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;pygmentize_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'terminal256'&lt;/span&gt;
                &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;highlight_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'xterm256'&lt;/span&gt;
            &lt;span class="k"&gt;else
                &lt;/span&gt;&lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;pygmentize_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'terminal'&lt;/span&gt;
                &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;highlight_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'ansi'&lt;/span&gt;
            &lt;span class="k"&gt;fi
            &lt;/span&gt;&lt;span class="nb"&gt;env &lt;/span&gt;&lt;span class="nv"&gt;HIGHLIGHT_OPTIONS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HIGHLIGHT_OPTIONS&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; highlight &lt;span class="se"&gt;\&lt;/span&gt;
                &lt;span class="nt"&gt;--out-format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;highlight_format&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;env &lt;/span&gt;&lt;span class="nv"&gt;COLORTERM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8bit bat &lt;span class="nt"&gt;--color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;always &lt;span class="nt"&gt;--style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BAT_STYLE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            pygmentize &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;pygmentize_format&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; &lt;span class="s2"&gt;"style=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PYGMENTIZE_STYLE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
                &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;exit &lt;/span&gt;2&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## DjVu&lt;/span&gt;
        image/vnd.djvu&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;## Preview as text conversion (requires djvulibre)&lt;/span&gt;
            djvutxt &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;fmt&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PV_WIDTH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            exiftool &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## Image&lt;/span&gt;
        image/&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c"&gt;## Preview as text conversion&lt;/span&gt;
            &lt;span class="c"&gt;# img2txt --gamma=0.6 --width="${PV_WIDTH}" -- "${FILE_PATH}" &amp;amp;&amp;amp; exit 4&lt;/span&gt;
            exiftool &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## Video and audio&lt;/span&gt;
        video/&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; audio/&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            mediainfo &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            exiftool &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;

        &lt;span class="c"&gt;## ELF files (executables and shared objects)&lt;/span&gt;
        application/x-executable &lt;span class="p"&gt;|&lt;/span&gt; application/x-pie-executable &lt;span class="p"&gt;|&lt;/span&gt; application/x-sharedlib&lt;span class="p"&gt;)&lt;/span&gt;
            readelf &lt;span class="nt"&gt;-WCa&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
            &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;;&lt;/span&gt;
    &lt;span class="k"&gt;esac&lt;/span&gt;

&lt;span class="o"&gt;}&lt;/span&gt;

handle_fallback&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'----- File Type Classification -----'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; file &lt;span class="nt"&gt;--dereference&lt;/span&gt; &lt;span class="nt"&gt;--brief&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;5
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;MIMETYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt; file &lt;span class="nt"&gt;--dereference&lt;/span&gt; &lt;span class="nt"&gt;--brief&lt;/span&gt; &lt;span class="nt"&gt;--mime-type&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILE_PATH&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PV_IMAGE_ENABLED&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'True'&lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
&lt;/span&gt;handle_image &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MIMETYPE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi
&lt;/span&gt;handle_extension
handle_mime &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MIMETYPE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
handle_fallback

&lt;span class="nb"&gt;exit &lt;/span&gt;1

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above file is the default &lt;code&gt;scope.sh&lt;/code&gt; with the following parts added to enable previewing DICOM metadata:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;handle_dicom&lt;/code&gt; function which uses the &lt;code&gt;Pydicom&lt;/code&gt; Python library to open the file and read its metadata.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;dcm&lt;/code&gt; case inside &lt;code&gt;handle_extension&lt;/code&gt; function&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Needless to say that you will need to install Pydicom on your system for this to work, you can do that using PIP or Conda.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>dicom</category>
      <category>filemanager</category>
      <category>terminal</category>
      <category>bash</category>
    </item>
  </channel>
</rss>
