|
|
|
@ -1,13 +1,13 @@
|
|
|
|
<!doctype html>
|
|
|
|
<!doctype html>
|
|
|
|
<html class="no-js">
|
|
|
|
<html class="no-js" lang="en">
|
|
|
|
<head><meta charset="utf-8"/>
|
|
|
|
<head><meta charset="utf-8"/>
|
|
|
|
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
|
|
|
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
|
|
|
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html" /><link rel="search" title="Search" href="../../search.html" />
|
|
|
|
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html" /><link rel="search" title="Search" href="../../search.html" />
|
|
|
|
|
|
|
|
|
|
|
|
<meta name="generator" content="sphinx-4.4.0, furo 2022.04.07"/>
|
|
|
|
<meta name="generator" content="sphinx-5.3.0, furo 2022.09.29"/>
|
|
|
|
<title>osxphotos.exiftool - osxphotos 0.50.13 documentation</title>
|
|
|
|
<title>osxphotos.exiftool - osxphotos 0.55.6 documentation</title>
|
|
|
|
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
|
|
|
|
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css" />
|
|
|
|
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?digest=68f4518137b9aefe99b631505a2064c3c42c9852" />
|
|
|
|
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?digest=d81277517bee4d6b0349d71bb2661d4890b5617c" />
|
|
|
|
<link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
|
|
|
|
<link rel="stylesheet" type="text/css" href="../../_static/copybutton.css" />
|
|
|
|
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
|
|
|
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?digest=30d1aed668e5c3a91c3e3bf6a60b675221979f0e" />
|
|
|
|
|
|
|
|
|
|
|
|
@ -123,7 +123,7 @@
|
|
|
|
</label>
|
|
|
|
</label>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="header-center">
|
|
|
|
<div class="header-center">
|
|
|
|
<a href="../../index.html"><div class="brand">osxphotos 0.50.13 documentation</div></a>
|
|
|
|
<a href="../../index.html"><div class="brand">osxphotos 0.55.6 documentation</div></a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="header-right">
|
|
|
|
<div class="header-right">
|
|
|
|
<div class="theme-toggle-container theme-toggle-header">
|
|
|
|
<div class="theme-toggle-container theme-toggle-header">
|
|
|
|
@ -146,7 +146,7 @@
|
|
|
|
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
|
|
|
|
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="sidebar-brand-text">osxphotos 0.50.13 documentation</span>
|
|
|
|
<span class="sidebar-brand-text">osxphotos 0.55.6 documentation</span>
|
|
|
|
|
|
|
|
|
|
|
|
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
|
|
|
|
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
|
|
|
|
<input class="sidebar-search" placeholder=Search name="q" aria-label="Search">
|
|
|
|
<input class="sidebar-search" placeholder=Search name="q" aria-label="Search">
|
|
|
|
@ -179,7 +179,8 @@
|
|
|
|
</svg>
|
|
|
|
</svg>
|
|
|
|
<span>Back to top</span>
|
|
|
|
<span>Back to top</span>
|
|
|
|
</a>
|
|
|
|
</a>
|
|
|
|
<div class="content-icon-container"><div class="theme-toggle-container theme-toggle-content">
|
|
|
|
<div class="content-icon-container">
|
|
|
|
|
|
|
|
<div class="theme-toggle-container theme-toggle-content">
|
|
|
|
<button class="theme-toggle">
|
|
|
|
<button class="theme-toggle">
|
|
|
|
<div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
|
|
|
|
<div class="visually-hidden">Toggle Light / Dark / Auto color theme</div>
|
|
|
|
<svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
|
|
|
|
<svg class="theme-icon-when-auto"><use href="#svg-sun-half"></use></svg>
|
|
|
|
@ -194,13 +195,13 @@
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<article role="main">
|
|
|
|
<article role="main">
|
|
|
|
<h1>Source code for osxphotos.exiftool</h1><div class="highlight"><pre>
|
|
|
|
<h1>Source code for osxphotos.exiftool</h1><div class="highlight"><pre>
|
|
|
|
<span></span><span class="sd">""" Yet another simple exiftool wrapper </span>
|
|
|
|
<span></span><span class="sd">""" Yet another simple exiftool wrapper </span>
|
|
|
|
<span class="sd"> I rolled my own for following reasons: </span>
|
|
|
|
<span class="sd"> I rolled my own for following reasons: </span>
|
|
|
|
<span class="sd"> 1. I wanted something under MIT license (best alternative was licensed under GPL/BSD)</span>
|
|
|
|
<span class="sd"> 1. I wanted something under MIT license (best alternative was licensed under GPL/BSD)</span>
|
|
|
|
<span class="sd"> 2. I wanted singleton behavior so only a single exiftool process was ever running</span>
|
|
|
|
<span class="sd"> 2. I wanted singleton behavior so only a single exiftool process was ever running</span>
|
|
|
|
<span class="sd"> 3. When used as a context manager, I wanted the operations to batch until exiting the context (improved performance)</span>
|
|
|
|
<span class="sd"> 3. When used as a context manager, I wanted the operations to batch until exiting the context (improved performance)</span>
|
|
|
|
<span class="sd"> If these aren't important to you, I highly recommend you use Sven Marnach's excellent </span>
|
|
|
|
<span class="sd"> If these aren't important to you, I highly recommend you use Sven Marnach's excellent </span>
|
|
|
|
<span class="sd"> pyexiftool: https://github.com/smarnach/pyexiftool which provides more functionality """</span>
|
|
|
|
<span class="sd"> pyexiftool: https://github.com/smarnach/pyexiftool which provides more functionality """</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="kn">import</span> <span class="nn">atexit</span>
|
|
|
|
<span class="kn">import</span> <span class="nn">atexit</span>
|
|
|
|
@ -217,153 +218,154 @@
|
|
|
|
<span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">lru_cache</span> <span class="c1"># pylint: disable=syntax-error</span>
|
|
|
|
<span class="kn">from</span> <span class="nn">functools</span> <span class="kn">import</span> <span class="n">lru_cache</span> <span class="c1"># pylint: disable=syntax-error</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span>
|
|
|
|
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span>
|
|
|
|
<span class="s2">"escape_str"</span><span class="p">,</span>
|
|
|
|
<span class="s2">"escape_str"</span><span class="p">,</span>
|
|
|
|
<span class="s2">"exiftool_can_write"</span><span class="p">,</span>
|
|
|
|
<span class="s2">"exiftool_can_write"</span><span class="p">,</span>
|
|
|
|
<span class="s2">"ExifTool"</span><span class="p">,</span>
|
|
|
|
<span class="s2">"ExifTool"</span><span class="p">,</span>
|
|
|
|
<span class="s2">"ExifToolCaching"</span><span class="p">,</span>
|
|
|
|
<span class="s2">"ExifToolCaching"</span><span class="p">,</span>
|
|
|
|
<span class="s2">"get_exiftool_path"</span><span class="p">,</span>
|
|
|
|
<span class="s2">"get_exiftool_path"</span><span class="p">,</span>
|
|
|
|
<span class="s2">"terminate_exiftool"</span><span class="p">,</span>
|
|
|
|
<span class="s2">"terminate_exiftool"</span><span class="p">,</span>
|
|
|
|
<span class="s2">"unescape_str"</span><span class="p">,</span>
|
|
|
|
<span class="s2">"unescape_str"</span><span class="p">,</span>
|
|
|
|
<span class="p">]</span>
|
|
|
|
<span class="p">]</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="c1"># exiftool -stay_open commands outputs this EOF marker after command is run</span>
|
|
|
|
<span class="c1"># exiftool -stay_open commands outputs this EOF marker after command is run</span>
|
|
|
|
<span class="n">EXIFTOOL_STAYOPEN_EOF</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{ready}</span><span class="s2">"</span>
|
|
|
|
<span class="n">EXIFTOOL_STAYOPEN_EOF</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{ready}</span><span class="s2">"</span>
|
|
|
|
<span class="n">EXIFTOOL_STAYOPEN_EOF_LEN</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">EXIFTOOL_STAYOPEN_EOF</span><span class="p">)</span>
|
|
|
|
<span class="n">EXIFTOOL_STAYOPEN_EOF_LEN</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">EXIFTOOL_STAYOPEN_EOF</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="c1"># list of exiftool processes to cleanup when exiting or when terminate is called</span>
|
|
|
|
<span class="c1"># list of exiftool processes to cleanup when exiting or when terminate is called</span>
|
|
|
|
<span class="n">EXIFTOOL_PROCESSES</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<span class="n">EXIFTOOL_PROCESSES</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="c1"># exiftool supported file types, created by utils/exiftool_supported_types.py</span>
|
|
|
|
<span class="c1"># exiftool supported file types, created by utils/exiftool_supported_types.py</span>
|
|
|
|
<span class="n">EXIFTOOL_FILETYPES_JSON</span> <span class="o">=</span> <span class="s2">"exiftool_filetypes.json"</span>
|
|
|
|
<span class="n">EXIFTOOL_FILETYPES_JSON</span> <span class="o">=</span> <span class="s2">"exiftool_filetypes.json"</span>
|
|
|
|
<span class="k">with</span> <span class="p">(</span><span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="n">EXIFTOOL_FILETYPES_JSON</span><span class="p">)</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">"r"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
|
|
|
<span class="k">with</span> <span class="p">(</span><span class="n">pathlib</span><span class="o">.</span><span class="n">Path</span><span class="p">(</span><span class="vm">__file__</span><span class="p">)</span><span class="o">.</span><span class="n">parent</span> <span class="o">/</span> <span class="n">EXIFTOOL_FILETYPES_JSON</span><span class="p">)</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">"r"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
|
|
|
<span class="n">EXIFTOOL_SUPPORTED_FILETYPES</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
|
|
|
<span class="n">EXIFTOOL_SUPPORTED_FILETYPES</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">exiftool_can_write</span><span class="p">(</span><span class="n">suffix</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
|
|
|
<span class="k">def</span> <span class="nf">exiftool_can_write</span><span class="p">(</span><span class="n">suffix</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
|
|
|
<span class="sd">"""Return True if exiftool supports writing to a file with the given suffix, otherwise False"""</span>
|
|
|
|
<span class="sd">"""Return True if exiftool supports writing to a file with the given suffix, otherwise False"""</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">suffix</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">suffix</span><span class="p">:</span>
|
|
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
<span class="n">suffix</span> <span class="o">=</span> <span class="n">suffix</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
|
|
|
|
<span class="n">suffix</span> <span class="o">=</span> <span class="n">suffix</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
|
|
|
|
<span class="k">if</span> <span class="n">suffix</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"."</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="n">suffix</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"."</span><span class="p">:</span>
|
|
|
|
<span class="n">suffix</span> <span class="o">=</span> <span class="n">suffix</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
|
|
|
|
<span class="n">suffix</span> <span class="o">=</span> <span class="n">suffix</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
|
|
|
|
<span class="k">return</span> <span class="p">(</span>
|
|
|
|
<span class="k">return</span> <span class="p">(</span>
|
|
|
|
<span class="n">suffix</span> <span class="ow">in</span> <span class="n">EXIFTOOL_SUPPORTED_FILETYPES</span>
|
|
|
|
<span class="n">suffix</span> <span class="ow">in</span> <span class="n">EXIFTOOL_SUPPORTED_FILETYPES</span>
|
|
|
|
<span class="ow">and</span> <span class="n">EXIFTOOL_SUPPORTED_FILETYPES</span><span class="p">[</span><span class="n">suffix</span><span class="p">][</span><span class="s2">"write"</span><span class="p">]</span>
|
|
|
|
<span class="ow">and</span> <span class="n">EXIFTOOL_SUPPORTED_FILETYPES</span><span class="p">[</span><span class="n">suffix</span><span class="p">][</span><span class="s2">"write"</span><span class="p">]</span>
|
|
|
|
<span class="p">)</span>
|
|
|
|
<span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">escape_str</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">escape_str</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""escape string for use with exiftool -E"""</span>
|
|
|
|
<span class="sd">"""escape string for use with exiftool -E"""</span>
|
|
|
|
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">str</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">str</span><span class="p">:</span>
|
|
|
|
<span class="k">return</span> <span class="n">s</span>
|
|
|
|
<span class="k">return</span> <span class="n">s</span>
|
|
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">escape</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
|
|
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">html</span><span class="o">.</span><span class="n">escape</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
|
|
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">,</span> <span class="s2">"&#xa;"</span><span class="p">)</span>
|
|
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">,</span> <span class="s2">"&#xa;"</span><span class="p">)</span>
|
|
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"</span><span class="se">\t</span><span class="s2">"</span><span class="p">,</span> <span class="s2">"&#x9;"</span><span class="p">)</span>
|
|
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"</span><span class="se">\t</span><span class="s2">"</span><span class="p">,</span> <span class="s2">"&#x9;"</span><span class="p">)</span>
|
|
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"</span><span class="se">\r</span><span class="s2">"</span><span class="p">,</span> <span class="s2">"&#xd;"</span><span class="p">)</span>
|
|
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"</span><span class="se">\r</span><span class="s2">"</span><span class="p">,</span> <span class="s2">"&#xd;"</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">s</span>
|
|
|
|
<span class="k">return</span> <span class="n">s</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">unescape_str</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">unescape_str</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""unescape an HTML string returned by exiftool -E"""</span>
|
|
|
|
<span class="sd">"""unescape an HTML string returned by exiftool -E"""</span>
|
|
|
|
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">str</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">str</span><span class="p">:</span>
|
|
|
|
<span class="k">return</span> <span class="n">s</span>
|
|
|
|
<span class="k">return</span> <span class="n">s</span>
|
|
|
|
<span class="c1"># avoid " in values which result in json.loads() throwing an exception, #636</span>
|
|
|
|
<span class="c1"># avoid " in values which result in json.loads() throwing an exception, #636</span>
|
|
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"&quot;"</span><span class="p">,</span> <span class="s1">'</span><span class="se">\\</span><span class="s1">"'</span><span class="p">)</span>
|
|
|
|
<span class="n">s</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">"&quot;"</span><span class="p">,</span> <span class="s1">'</span><span class="se">\\</span><span class="s1">"'</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">html</span><span class="o">.</span><span class="n">unescape</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">html</span><span class="o">.</span><span class="n">unescape</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="nd">@atexit</span><span class="o">.</span><span class="n">register</span>
|
|
|
|
<span class="nd">@atexit</span><span class="o">.</span><span class="n">register</span>
|
|
|
|
<span class="k">def</span> <span class="nf">terminate_exiftool</span><span class="p">():</span>
|
|
|
|
<span class="k">def</span> <span class="nf">terminate_exiftool</span><span class="p">():</span>
|
|
|
|
<span class="sd">"""Terminate any running ExifTool subprocesses; call this to cleanup when done using ExifTool"""</span>
|
|
|
|
<span class="sd">"""Terminate any running ExifTool subprocesses; call this to cleanup when done using ExifTool"""</span>
|
|
|
|
<span class="k">for</span> <span class="n">proc</span> <span class="ow">in</span> <span class="n">EXIFTOOL_PROCESSES</span><span class="p">:</span>
|
|
|
|
<span class="k">for</span> <span class="n">proc</span> <span class="ow">in</span> <span class="n">EXIFTOOL_PROCESSES</span><span class="p">:</span>
|
|
|
|
<span class="n">proc</span><span class="o">.</span><span class="n">_stop_proc</span><span class="p">()</span>
|
|
|
|
<span class="n">proc</span><span class="o">.</span><span class="n">_stop_proc</span><span class="p">()</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="nd">@lru_cache</span><span class="p">(</span><span class="n">maxsize</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
|
|
|
|
<span class="nd">@lru_cache</span><span class="p">(</span><span class="n">maxsize</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span> <span class="nf">get_exiftool_path</span><span class="p">():</span>
|
|
|
|
<span class="k">def</span> <span class="nf">get_exiftool_path</span><span class="p">():</span>
|
|
|
|
<span class="sd">"""return path of exiftool, cache result"""</span>
|
|
|
|
<span class="sd">"""return path of exiftool, cache result"""</span>
|
|
|
|
<span class="k">if</span> <span class="n">exiftool_path</span> <span class="o">:=</span> <span class="n">shutil</span><span class="o">.</span><span class="n">which</span><span class="p">(</span><span class="s2">"exiftool"</span><span class="p">):</span>
|
|
|
|
<span class="k">if</span> <span class="n">exiftool_path</span> <span class="o">:=</span> <span class="n">shutil</span><span class="o">.</span><span class="n">which</span><span class="p">(</span><span class="s2">"exiftool"</span><span class="p">):</span>
|
|
|
|
<span class="k">return</span> <span class="n">exiftool_path</span><span class="o">.</span><span class="n">rstrip</span><span class="p">()</span>
|
|
|
|
<span class="k">return</span> <span class="n">exiftool_path</span><span class="o">.</span><span class="n">rstrip</span><span class="p">()</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">FileNotFoundError</span><span class="p">(</span>
|
|
|
|
<span class="s2">"Could not find exiftool. Please download and install from "</span>
|
|
|
|
<span class="s2">"Could not find exiftool. Please download and install from "</span>
|
|
|
|
<span class="s2">"https://exiftool.org/"</span>
|
|
|
|
<span class="s2">"https://exiftool.org/"</span>
|
|
|
|
<span class="p">)</span>
|
|
|
|
<span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">_ExifToolProc</span><span class="p">:</span>
|
|
|
|
<span class="k">class</span> <span class="nc">_ExifToolProc</span><span class="p">:</span>
|
|
|
|
<span class="sd">"""Runs exiftool in a subprocess via Popen</span>
|
|
|
|
<span class="sd">"""Runs exiftool in a subprocess via Popen</span>
|
|
|
|
<span class="sd"> Creates a singleton object"""</span>
|
|
|
|
<span class="sd"> Creates a singleton object"""</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""create new object or return instance of already created singleton"""</span>
|
|
|
|
<span class="sd">"""create new object or return instance of already created singleton"""</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="s2">"instance"</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="s2">"instance"</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="bp">cls</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
|
|
|
|
<span class="bp">cls</span><span class="o">.</span><span class="n">instance</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
|
|
|
|
<span class="bp">cls</span><span class="o">.</span><span class="n">instance</span> <span class="o">=</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">instance</span>
|
|
|
|
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">instance</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exiftool</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">large_file_support</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exiftool</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">large_file_support</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""construct _ExifToolProc singleton object or return instance of already created object</span>
|
|
|
|
<span class="sd">"""construct _ExifToolProc singleton object or return instance of already created object</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> exiftool: optional path to exiftool binary (if not provided, will search path to find it)</span>
|
|
|
|
<span class="sd"> exiftool: optional path to exiftool binary (if not provided, will search path to find it)</span>
|
|
|
|
<span class="sd"> large_file_support: if True, enables large file support (>4GB) via `-api largefilesupport=1`</span>
|
|
|
|
<span class="sd"> large_file_support: if True, enables large file support (>4GB) via `-api largefilesupport=1`</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"_process_running"</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_running</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"_process_running"</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_running</span><span class="p">:</span>
|
|
|
|
<span class="c1"># already running</span>
|
|
|
|
<span class="c1"># already running</span>
|
|
|
|
<span class="k">if</span> <span class="n">exiftool</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">exiftool</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exiftool</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="n">exiftool</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">exiftool</span> <span class="o">!=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exiftool</span><span class="p">:</span>
|
|
|
|
<span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
|
|
|
|
<span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span>
|
|
|
|
<span class="sa">f</span><span class="s2">"exiftool subprocess already running, "</span>
|
|
|
|
<span class="sa">f</span><span class="s2">"exiftool subprocess already running, "</span>
|
|
|
|
<span class="sa">f</span><span class="s2">"ignoring exiftool=</span><span class="si">{</span><span class="n">exiftool</span><span class="si">}</span><span class="s2">"</span>
|
|
|
|
<span class="sa">f</span><span class="s2">"ignoring exiftool=</span><span class="si">{</span><span class="n">exiftool</span><span class="si">}</span><span class="s2">"</span>
|
|
|
|
<span class="p">)</span>
|
|
|
|
<span class="p">)</span>
|
|
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">return</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_process_running</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_process_running</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_large_file_support</span> <span class="o">=</span> <span class="n">large_file_support</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_exiftool</span> <span class="o">=</span> <span class="n">exiftool</span> <span class="ow">or</span> <span class="n">get_exiftool_path</span><span class="p">()</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_exiftool</span> <span class="o">=</span> <span class="n">exiftool</span> <span class="ow">or</span> <span class="n">get_exiftool_path</span><span class="p">()</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_start_proc</span><span class="p">(</span><span class="n">large_file_support</span><span class="o">=</span><span class="n">large_file_support</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_start_proc</span><span class="p">(</span><span class="n">large_file_support</span><span class="o">=</span><span class="n">large_file_support</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="nd">@property</span>
|
|
|
|
<span class="nd">@property</span>
|
|
|
|
<span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""return the exiftool subprocess"""</span>
|
|
|
|
<span class="sd">"""return the exiftool subprocess"""</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_running</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_running</span><span class="p">:</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_start_proc</span><span class="p">()</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_start_proc</span><span class="p">(</span><span class="n">large_file_support</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_large_file_support</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="nd">@property</span>
|
|
|
|
<span class="nd">@property</span>
|
|
|
|
<span class="k">def</span> <span class="nf">pid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">pid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""return process id (PID) of the exiftool process"""</span>
|
|
|
|
<span class="sd">"""return process id (PID) of the exiftool process"""</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">pid</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">pid</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="nd">@property</span>
|
|
|
|
<span class="nd">@property</span>
|
|
|
|
<span class="k">def</span> <span class="nf">exiftool</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">exiftool</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""return path to exiftool process"""</span>
|
|
|
|
<span class="sd">"""return path to exiftool process"""</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exiftool</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exiftool</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">_start_proc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">large_file_support</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_start_proc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">large_file_support</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""start exiftool in batch mode"""</span>
|
|
|
|
<span class="sd">"""start exiftool in batch mode"""</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_running</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_running</span><span class="p">:</span>
|
|
|
|
<span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">"exiftool already running: </span><span class="si">{self._process}</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
<span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">"exiftool already running: </span><span class="si">{self._process}</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">return</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="c1"># open exiftool process</span>
|
|
|
|
<span class="c1"># open exiftool process</span>
|
|
|
|
<span class="c1"># make sure /usr/bin at start of path so exiftool can find xattr (see #636)</span>
|
|
|
|
<span class="c1"># make sure /usr/bin at start of path so exiftool can find xattr (see #636)</span>
|
|
|
|
<span class="n">env</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
|
|
<span class="n">env</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
|
|
<span class="n">env</span><span class="p">[</span><span class="s2">"PATH"</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'/usr/bin/:</span><span class="si">{</span><span class="n">env</span><span class="p">[</span><span class="s2">"PATH"</span><span class="p">]</span><span class="si">}</span><span class="s1">'</span>
|
|
|
|
<span class="n">env</span><span class="p">[</span><span class="s2">"PATH"</span><span class="p">]</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'/usr/bin/:</span><span class="si">{</span><span class="n">env</span><span class="p">[</span><span class="s2">"PATH"</span><span class="p">]</span><span class="si">}</span><span class="s1">'</span>
|
|
|
|
<span class="n">large_file_args</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"-api"</span><span class="p">,</span> <span class="s2">"largefilesupport=1"</span><span class="p">]</span> <span class="k">if</span> <span class="n">large_file_support</span> <span class="k">else</span> <span class="p">[]</span>
|
|
|
|
<span class="n">large_file_args</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"-api"</span><span class="p">,</span> <span class="s2">"largefilesupport=1"</span><span class="p">]</span> <span class="k">if</span> <span class="n">large_file_support</span> <span class="k">else</span> <span class="p">[]</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_process</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">(</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_process</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">(</span>
|
|
|
|
<span class="p">[</span>
|
|
|
|
<span class="p">[</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_exiftool</span><span class="p">,</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_exiftool</span><span class="p">,</span>
|
|
|
|
<span class="s2">"-stay_open"</span><span class="p">,</span> <span class="c1"># keep process open in batch mode</span>
|
|
|
|
<span class="s2">"-stay_open"</span><span class="p">,</span> <span class="c1"># keep process open in batch mode</span>
|
|
|
|
<span class="s2">"True"</span><span class="p">,</span> <span class="c1"># -stay_open=True, keep process open in batch mode</span>
|
|
|
|
<span class="s2">"True"</span><span class="p">,</span> <span class="c1"># -stay_open=True, keep process open in batch mode</span>
|
|
|
|
<span class="o">*</span><span class="n">large_file_args</span><span class="p">,</span>
|
|
|
|
<span class="o">*</span><span class="n">large_file_args</span><span class="p">,</span>
|
|
|
|
<span class="s2">"-@"</span><span class="p">,</span> <span class="c1"># read command-line arguments from file</span>
|
|
|
|
<span class="s2">"-@"</span><span class="p">,</span> <span class="c1"># read command-line arguments from file</span>
|
|
|
|
<span class="s2">"-"</span><span class="p">,</span> <span class="c1"># read from stdin</span>
|
|
|
|
<span class="s2">"-"</span><span class="p">,</span> <span class="c1"># read from stdin</span>
|
|
|
|
<span class="s2">"-common_args"</span><span class="p">,</span> <span class="c1"># specifies args common to all commands subsequently run</span>
|
|
|
|
<span class="s2">"-common_args"</span><span class="p">,</span> <span class="c1"># specifies args common to all commands subsequently run</span>
|
|
|
|
<span class="s2">"-n"</span><span class="p">,</span> <span class="c1"># no print conversion (e.g. print tag values in machine readable format)</span>
|
|
|
|
<span class="s2">"-n"</span><span class="p">,</span> <span class="c1"># no print conversion (e.g. print tag values in machine readable format)</span>
|
|
|
|
<span class="s2">"-P"</span><span class="p">,</span> <span class="c1"># Preserve file modification date/time</span>
|
|
|
|
<span class="s2">"-P"</span><span class="p">,</span> <span class="c1"># Preserve file modification date/time</span>
|
|
|
|
<span class="s2">"-G"</span><span class="p">,</span> <span class="c1"># print group name for each tag</span>
|
|
|
|
<span class="s2">"-G"</span><span class="p">,</span> <span class="c1"># print group name for each tag</span>
|
|
|
|
<span class="s2">"-E"</span><span class="p">,</span> <span class="c1"># escape tag values for HTML (allows use of HTML &#xa; for newlines)</span>
|
|
|
|
<span class="s2">"-E"</span><span class="p">,</span> <span class="c1"># escape tag values for HTML (allows use of HTML &#xa; for newlines)</span>
|
|
|
|
<span class="p">],</span>
|
|
|
|
<span class="p">],</span>
|
|
|
|
<span class="n">stdin</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span>
|
|
|
|
<span class="n">stdin</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span>
|
|
|
|
<span class="n">stdout</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span>
|
|
|
|
<span class="n">stdout</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span>
|
|
|
|
@ -375,14 +377,14 @@
|
|
|
|
<span class="n">EXIFTOOL_PROCESSES</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
|
|
<span class="n">EXIFTOOL_PROCESSES</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">_stop_proc</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_stop_proc</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""stop the exiftool process if it's running, otherwise, do nothing"""</span>
|
|
|
|
<span class="sd">"""stop the exiftool process if it's running, otherwise, do nothing"""</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_running</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process_running</span><span class="p">:</span>
|
|
|
|
<span class="k">return</span>
|
|
|
|
<span class="k">return</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">with</span> <span class="n">contextlib</span><span class="o">.</span><span class="n">suppress</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
|
|
|
<span class="k">with</span> <span class="n">contextlib</span><span class="o">.</span><span class="n">suppress</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">b</span><span class="s2">"-stay_open</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">b</span><span class="s2">"-stay_open</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">b</span><span class="s2">"False</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="sa">b</span><span class="s2">"False</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">communicate</span><span class="p">(</span><span class="n">timeout</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">communicate</span><span class="p">(</span><span class="n">timeout</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
|
|
|
|
@ -395,7 +397,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="ExifTool"><a class="viewcode-back" href="../../reference.html#osxphotos.ExifTool">[docs]</a><span class="k">class</span> <span class="nc">ExifTool</span><span class="p">:</span>
|
|
|
|
<div class="viewcode-block" id="ExifTool"><a class="viewcode-back" href="../../reference.html#osxphotos.ExifTool">[docs]</a><span class="k">class</span> <span class="nc">ExifTool</span><span class="p">:</span>
|
|
|
|
<span class="sd">"""Basic exiftool interface for reading and writing EXIF tags"""</span>
|
|
|
|
<span class="sd">"""Basic exiftool interface for reading and writing EXIF tags"""</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span>
|
|
|
|
<span class="bp">self</span><span class="p">,</span>
|
|
|
|
<span class="bp">self</span><span class="p">,</span>
|
|
|
|
@ -405,7 +407,7 @@
|
|
|
|
<span class="n">flags</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
|
|
<span class="n">flags</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
|
|
<span class="n">large_file_support</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
|
|
|
<span class="n">large_file_support</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
|
|
|
<span class="p">):</span>
|
|
|
|
<span class="p">):</span>
|
|
|
|
<span class="sd">"""Create ExifTool object</span>
|
|
|
|
<span class="sd">"""Create ExifTool object</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> file: path to image file</span>
|
|
|
|
<span class="sd"> file: path to image file</span>
|
|
|
|
@ -416,7 +418,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Returns:</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
|
|
<span class="sd"> ExifTool instance</span>
|
|
|
|
<span class="sd"> ExifTool instance</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">file</span> <span class="o">=</span> <span class="n">filepath</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">file</span> <span class="o">=</span> <span class="n">filepath</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">overwrite</span> <span class="o">=</span> <span class="n">overwrite</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">overwrite</span> <span class="o">=</span> <span class="n">overwrite</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">flags</span> <span class="o">=</span> <span class="n">flags</span> <span class="ow">or</span> <span class="p">[]</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">flags</span> <span class="o">=</span> <span class="n">flags</span> <span class="ow">or</span> <span class="p">[]</span>
|
|
|
|
@ -435,7 +437,7 @@
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exiftoolproc</span><span class="o">.</span><span class="n">process</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exiftoolproc</span><span class="o">.</span><span class="n">process</span>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="ExifTool.setvalue"><a class="viewcode-back" href="../../reference.html#osxphotos.ExifTool.setvalue">[docs]</a> <span class="k">def</span> <span class="nf">setvalue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
|
|
<div class="viewcode-block" id="ExifTool.setvalue"><a class="viewcode-back" href="../../reference.html#osxphotos.ExifTool.setvalue">[docs]</a> <span class="k">def</span> <span class="nf">setvalue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""Set tag to value(s); if value is None, will delete tag</span>
|
|
|
|
<span class="sd">"""Set tag to value(s); if value is None, will delete tag</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> tag: str; name of tag to set</span>
|
|
|
|
<span class="sd"> tag: str; name of tag to set</span>
|
|
|
|
@ -447,27 +449,27 @@
|
|
|
|
<span class="sd"> If error generated by exiftool, returns False and sets self.error to error string</span>
|
|
|
|
<span class="sd"> If error generated by exiftool, returns False and sets self.error to error string</span>
|
|
|
|
<span class="sd"> If warning generated by exiftool, returns True (unless there was also an error) and sets self.warning to warning string</span>
|
|
|
|
<span class="sd"> If warning generated by exiftool, returns True (unless there was also an error) and sets self.warning to warning string</span>
|
|
|
|
<span class="sd"> If called in context manager, returns True (execution is delayed until exiting context manager)</span>
|
|
|
|
<span class="sd"> If called in context manager, returns True (execution is delayed until exiting context manager)</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
<span class="n">value</span> <span class="o">=</span> <span class="s2">""</span>
|
|
|
|
<span class="n">value</span> <span class="o">=</span> <span class="s2">""</span>
|
|
|
|
<span class="n">value</span> <span class="o">=</span> <span class="n">escape_str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
|
|
<span class="n">value</span> <span class="o">=</span> <span class="n">escape_str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
|
|
<span class="n">command</span> <span class="o">=</span> <span class="p">[</span><span class="sa">f</span><span class="s2">"-</span><span class="si">{</span><span class="n">tag</span><span class="si">}</span><span class="s2">=</span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2">"</span><span class="p">]</span>
|
|
|
|
<span class="n">command</span> <span class="o">=</span> <span class="p">[</span><span class="sa">f</span><span class="s2">"-</span><span class="si">{</span><span class="n">tag</span><span class="si">}</span><span class="s2">=</span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2">"</span><span class="p">]</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">overwrite</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_context_mgr</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">overwrite</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_context_mgr</span><span class="p">:</span>
|
|
|
|
<span class="n">command</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"-overwrite_original"</span><span class="p">)</span>
|
|
|
|
<span class="n">command</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"-overwrite_original"</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="c1"># avoid "Warning: Some character(s) could not be encoded in Latin" warning</span>
|
|
|
|
<span class="c1"># avoid "Warning: Some character(s) could not be encoded in Latin" warning</span>
|
|
|
|
<span class="n">command</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"-iptc:codedcharacterset=utf8"</span><span class="p">)</span>
|
|
|
|
<span class="n">command</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"-iptc:codedcharacterset=utf8"</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_context_mgr</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_context_mgr</span><span class="p">:</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_commands</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_commands</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span>
|
|
|
|
<span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">run_commands</span><span class="p">(</span><span class="o">*</span><span class="n">command</span><span class="p">)</span>
|
|
|
|
<span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">run_commands</span><span class="p">(</span><span class="o">*</span><span class="n">command</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">error</span> <span class="o">==</span> <span class="s2">""</span></div>
|
|
|
|
<span class="k">return</span> <span class="n">error</span> <span class="o">==</span> <span class="s2">""</span></div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="ExifTool.addvalues"><a class="viewcode-back" href="../../reference.html#osxphotos.ExifTool.addvalues">[docs]</a> <span class="k">def</span> <span class="nf">addvalues</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="o">*</span><span class="n">values</span><span class="p">):</span>
|
|
|
|
<div class="viewcode-block" id="ExifTool.addvalues"><a class="viewcode-back" href="../../reference.html#osxphotos.ExifTool.addvalues">[docs]</a> <span class="k">def</span> <span class="nf">addvalues</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="o">*</span><span class="n">values</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""Add one or more value(s) to tag</span>
|
|
|
|
<span class="sd">"""Add one or more value(s) to tag</span>
|
|
|
|
<span class="sd"> If more than one value is passed, each value will be added to the tag</span>
|
|
|
|
<span class="sd"> If more than one value is passed, each value will be added to the tag</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
@ -485,32 +487,32 @@
|
|
|
|
<span class="sd"> the values being added are not already in the EXIF data</span>
|
|
|
|
<span class="sd"> the values being added are not already in the EXIF data</span>
|
|
|
|
<span class="sd"> For some tags, such as IPTC:Keywords, this will add a new value to the list of keywords,</span>
|
|
|
|
<span class="sd"> For some tags, such as IPTC:Keywords, this will add a new value to the list of keywords,</span>
|
|
|
|
<span class="sd"> but for others, such as EXIF:ISO, this will literally add a value to the existing value.</span>
|
|
|
|
<span class="sd"> but for others, such as EXIF:ISO, this will literally add a value to the existing value.</span>
|
|
|
|
<span class="sd"> It's up to the caller to know what exiftool will do for each tag</span>
|
|
|
|
<span class="sd"> It's up to the caller to know what exiftool will do for each tag</span>
|
|
|
|
<span class="sd"> If setvalue called before addvalues, exiftool does not appear to add duplicates,</span>
|
|
|
|
<span class="sd"> If setvalue called before addvalues, exiftool does not appear to add duplicates,</span>
|
|
|
|
<span class="sd"> but if addvalues called without first calling setvalue, exiftool will add duplicate values</span>
|
|
|
|
<span class="sd"> but if addvalues called without first calling setvalue, exiftool will add duplicate values</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">values</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">values</span><span class="p">:</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Must pass at least one value"</span><span class="p">)</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Must pass at least one value"</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="n">command</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<span class="n">command</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
|
|
|
|
<span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Can't add None value to tag"</span><span class="p">)</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Can't add None value to tag"</span><span class="p">)</span>
|
|
|
|
<span class="n">value</span> <span class="o">=</span> <span class="n">escape_str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
|
|
<span class="n">value</span> <span class="o">=</span> <span class="n">escape_str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
|
|
<span class="n">command</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"-</span><span class="si">{</span><span class="n">tag</span><span class="si">}</span><span class="s2">+=</span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
<span class="n">command</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"-</span><span class="si">{</span><span class="n">tag</span><span class="si">}</span><span class="s2">+=</span><span class="si">{</span><span class="n">value</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">overwrite</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_context_mgr</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">overwrite</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_context_mgr</span><span class="p">:</span>
|
|
|
|
<span class="n">command</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"-overwrite_original"</span><span class="p">)</span>
|
|
|
|
<span class="n">command</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"-overwrite_original"</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_context_mgr</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_context_mgr</span><span class="p">:</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_commands</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_commands</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span>
|
|
|
|
<span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">run_commands</span><span class="p">(</span><span class="o">*</span><span class="n">command</span><span class="p">)</span>
|
|
|
|
<span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">run_commands</span><span class="p">(</span><span class="o">*</span><span class="n">command</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">error</span> <span class="o">==</span> <span class="s2">""</span></div>
|
|
|
|
<span class="k">return</span> <span class="n">error</span> <span class="o">==</span> <span class="s2">""</span></div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="ExifTool.run_commands"><a class="viewcode-back" href="../../reference.html#osxphotos.ExifTool.run_commands">[docs]</a> <span class="k">def</span> <span class="nf">run_commands</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">commands</span><span class="p">,</span> <span class="n">no_file</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
|
|
<div class="viewcode-block" id="ExifTool.run_commands"><a class="viewcode-back" href="../../reference.html#osxphotos.ExifTool.run_commands">[docs]</a> <span class="k">def</span> <span class="nf">run_commands</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">commands</span><span class="p">,</span> <span class="n">no_file</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""Run commands in the exiftool process and return result.</span>
|
|
|
|
<span class="sd">"""Run commands in the exiftool process and return result.</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> *commands: exiftool commands to run</span>
|
|
|
|
<span class="sd"> *commands: exiftool commands to run</span>
|
|
|
|
@ -524,35 +526,35 @@
|
|
|
|
<span class="sd"> error: if exiftool generated errors, string containing otherwise empty string</span>
|
|
|
|
<span class="sd"> error: if exiftool generated errors, string containing otherwise empty string</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Note: Also sets self.warning and self.error if warning or error generated.</span>
|
|
|
|
<span class="sd"> Note: Also sets self.warning and self.error if warning or error generated.</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"_process"</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="p">):</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">"_process"</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="p">):</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"exiftool process is not running"</span><span class="p">)</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"exiftool process is not running"</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">commands</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">commands</span><span class="p">:</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"must provide one or more command to run"</span><span class="p">)</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">"must provide one or more command to run"</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_context_mgr</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">overwrite</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_context_mgr</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">overwrite</span><span class="p">:</span>
|
|
|
|
<span class="n">commands</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">commands</span><span class="p">)</span>
|
|
|
|
<span class="n">commands</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">commands</span><span class="p">)</span>
|
|
|
|
<span class="n">commands</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"-overwrite_original"</span><span class="p">)</span>
|
|
|
|
<span class="n">commands</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"-overwrite_original"</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="n">filename</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span> <span class="k">if</span> <span class="n">no_file</span> <span class="k">else</span> <span class="n">os</span><span class="o">.</span><span class="n">fsencode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="p">)</span>
|
|
|
|
<span class="n">filename</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span> <span class="k">if</span> <span class="n">no_file</span> <span class="k">else</span> <span class="n">os</span><span class="o">.</span><span class="n">fsencode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">flags</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">flags</span><span class="p">:</span>
|
|
|
|
<span class="c1"># need to split flags, e.g. so "--ext AVI" becomes ["--ext", "AVI"]</span>
|
|
|
|
<span class="c1"># need to split flags, e.g. so "--ext AVI" becomes ["--ext", "AVI"]</span>
|
|
|
|
<span class="n">flags</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<span class="n">flags</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">flags</span><span class="p">:</span>
|
|
|
|
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">flags</span><span class="p">:</span>
|
|
|
|
<span class="n">flags</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">split</span><span class="p">())</span>
|
|
|
|
<span class="n">flags</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">split</span><span class="p">())</span>
|
|
|
|
<span class="n">command_str</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">f</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">flags</span><span class="p">])</span>
|
|
|
|
<span class="n">command_str</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">f</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">)</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">flags</span><span class="p">])</span>
|
|
|
|
<span class="n">command_str</span> <span class="o">+=</span> <span class="sa">b</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
|
|
<span class="n">command_str</span> <span class="o">+=</span> <span class="sa">b</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span>
|
|
|
|
<span class="n">command_str</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span>
|
|
|
|
<span class="n">command_str</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="n">command_str</span> <span class="o">+=</span> <span class="p">(</span>
|
|
|
|
<span class="n">command_str</span> <span class="o">+=</span> <span class="p">(</span>
|
|
|
|
<span class="sa">b</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">c</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">commands</span><span class="p">])</span>
|
|
|
|
<span class="sa">b</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">c</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">commands</span><span class="p">])</span>
|
|
|
|
<span class="o">+</span> <span class="sa">b</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
|
|
<span class="o">+</span> <span class="sa">b</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
|
|
<span class="o">+</span> <span class="n">filename</span>
|
|
|
|
<span class="o">+</span> <span class="n">filename</span>
|
|
|
|
<span class="o">+</span> <span class="sa">b</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
|
|
<span class="o">+</span> <span class="sa">b</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
|
|
<span class="o">+</span> <span class="sa">b</span><span class="s2">"-execute</span><span class="se">\n</span><span class="s2">"</span>
|
|
|
|
<span class="o">+</span> <span class="sa">b</span><span class="s2">"-execute</span><span class="se">\n</span><span class="s2">"</span>
|
|
|
|
<span class="p">)</span>
|
|
|
|
<span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="c1"># send the command</span>
|
|
|
|
<span class="c1"># send the command</span>
|
|
|
|
@ -560,19 +562,19 @@
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="c1"># read the output</span>
|
|
|
|
<span class="c1"># read the output</span>
|
|
|
|
<span class="n">output</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span>
|
|
|
|
<span class="n">output</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span>
|
|
|
|
<span class="n">warning</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span>
|
|
|
|
<span class="n">warning</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span>
|
|
|
|
<span class="n">error</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span>
|
|
|
|
<span class="n">error</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">""</span>
|
|
|
|
<span class="k">while</span> <span class="n">EXIFTOOL_STAYOPEN_EOF</span> <span class="ow">not</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">output</span><span class="p">):</span>
|
|
|
|
<span class="k">while</span> <span class="n">EXIFTOOL_STAYOPEN_EOF</span> <span class="ow">not</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">output</span><span class="p">):</span>
|
|
|
|
<span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span>
|
|
|
|
<span class="n">line</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span>
|
|
|
|
<span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="sa">b</span><span class="s2">"Warning"</span><span class="p">):</span>
|
|
|
|
<span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="sa">b</span><span class="s2">"Warning"</span><span class="p">):</span>
|
|
|
|
<span class="n">warning</span> <span class="o">+=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
|
|
|
<span class="n">warning</span> <span class="o">+=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
|
|
|
<span class="k">elif</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="sa">b</span><span class="s2">"Error"</span><span class="p">):</span>
|
|
|
|
<span class="k">elif</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="sa">b</span><span class="s2">"Error"</span><span class="p">):</span>
|
|
|
|
<span class="n">error</span> <span class="o">+=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
|
|
|
<span class="n">error</span> <span class="o">+=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span>
|
|
|
|
<span class="k">else</span><span class="p">:</span>
|
|
|
|
<span class="n">output</span> <span class="o">+=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
|
|
|
<span class="n">output</span> <span class="o">+=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
|
|
|
<span class="n">warning</span> <span class="o">=</span> <span class="s2">""</span> <span class="k">if</span> <span class="n">warning</span> <span class="o">==</span> <span class="sa">b</span><span class="s2">""</span> <span class="k">else</span> <span class="n">warning</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">)</span>
|
|
|
|
<span class="n">warning</span> <span class="o">=</span> <span class="s2">""</span> <span class="k">if</span> <span class="n">warning</span> <span class="o">==</span> <span class="sa">b</span><span class="s2">""</span> <span class="k">else</span> <span class="n">warning</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">)</span>
|
|
|
|
<span class="n">error</span> <span class="o">=</span> <span class="s2">""</span> <span class="k">if</span> <span class="n">error</span> <span class="o">==</span> <span class="sa">b</span><span class="s2">""</span> <span class="k">else</span> <span class="n">error</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">)</span>
|
|
|
|
<span class="n">error</span> <span class="o">=</span> <span class="s2">""</span> <span class="k">if</span> <span class="n">error</span> <span class="o">==</span> <span class="sa">b</span><span class="s2">""</span> <span class="k">else</span> <span class="n">error</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">warning</span> <span class="o">=</span> <span class="n">warning</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">warning</span> <span class="o">=</span> <span class="n">warning</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">error</span> <span class="o">=</span> <span class="n">error</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">error</span> <span class="o">=</span> <span class="n">error</span>
|
|
|
|
|
|
|
|
|
|
|
|
@ -580,41 +582,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
<span class="nd">@property</span>
|
|
|
|
<span class="nd">@property</span>
|
|
|
|
<span class="k">def</span> <span class="nf">pid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">pid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""return process id (PID) of the exiftool process"""</span>
|
|
|
|
<span class="sd">"""return process id (PID) of the exiftool process"""</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">pid</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_process</span><span class="o">.</span><span class="n">pid</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="nd">@property</span>
|
|
|
|
<span class="nd">@property</span>
|
|
|
|
<span class="k">def</span> <span class="nf">version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""returns exiftool version"""</span>
|
|
|
|
<span class="sd">"""returns exiftool version"""</span>
|
|
|
|
<span class="n">ver</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">run_commands</span><span class="p">(</span><span class="s2">"-ver"</span><span class="p">,</span> <span class="n">no_file</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
|
|
<span class="n">ver</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">run_commands</span><span class="p">(</span><span class="s2">"-ver"</span><span class="p">,</span> <span class="n">no_file</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">ver</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">ver</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="ExifTool.asdict"><a class="viewcode-back" href="../../reference.html#osxphotos.ExifTool.asdict">[docs]</a> <span class="k">def</span> <span class="nf">asdict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag_groups</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">normalized</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
|
|
<div class="viewcode-block" id="ExifTool.asdict"><a class="viewcode-back" href="../../reference.html#osxphotos.ExifTool.asdict">[docs]</a> <span class="k">def</span> <span class="nf">asdict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag_groups</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">normalized</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""return dictionary of all EXIF tags and values from exiftool</span>
|
|
|
|
<span class="sd">"""return dictionary of all EXIF tags and values from exiftool</span>
|
|
|
|
<span class="sd"> returns empty dict if no tags</span>
|
|
|
|
<span class="sd"> returns empty dict if no tags</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> tag_groups: if True (default), dict keys have tag groups, e.g. "IPTC:Keywords"; if False, drops groups from keys, e.g. "Keywords"</span>
|
|
|
|
<span class="sd"> tag_groups: if True (default), dict keys have tag groups, e.g. "IPTC:Keywords"; if False, drops groups from keys, e.g. "Keywords"</span>
|
|
|
|
<span class="sd"> normalized: if True, dict keys are all normalized to lower case (default is False)</span>
|
|
|
|
<span class="sd"> normalized: if True, dict keys are all normalized to lower case (default is False)</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="n">json_str</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">run_commands</span><span class="p">(</span><span class="s2">"-json"</span><span class="p">)</span>
|
|
|
|
<span class="n">json_str</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">run_commands</span><span class="p">(</span><span class="s2">"-json"</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">json_str</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">json_str</span><span class="p">:</span>
|
|
|
|
<span class="k">return</span> <span class="nb">dict</span><span class="p">()</span>
|
|
|
|
<span class="k">return</span> <span class="nb">dict</span><span class="p">()</span>
|
|
|
|
<span class="n">json_str</span> <span class="o">=</span> <span class="n">unescape_str</span><span class="p">(</span><span class="n">json_str</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span>
|
|
|
|
<span class="n">json_str</span> <span class="o">=</span> <span class="n">unescape_str</span><span class="p">(</span><span class="n">json_str</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
|
|
<span class="n">exifdict</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">json_str</span><span class="p">)</span>
|
|
|
|
<span class="n">exifdict</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">json_str</span><span class="p">)</span>
|
|
|
|
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
|
|
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
|
|
<span class="c1"># will fail with some commands, e.g --ext AVI which produces</span>
|
|
|
|
<span class="c1"># will fail with some commands, e.g --ext AVI which produces</span>
|
|
|
|
<span class="c1"># 'No file with specified extension' instead of json</span>
|
|
|
|
<span class="c1"># 'No file with specified extension' instead of json</span>
|
|
|
|
<span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">"error loading json returned by exiftool: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">json_str</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
<span class="n">logging</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">"error loading json returned by exiftool: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">json_str</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="nb">dict</span><span class="p">()</span>
|
|
|
|
<span class="k">return</span> <span class="nb">dict</span><span class="p">()</span>
|
|
|
|
<span class="n">exifdict</span> <span class="o">=</span> <span class="n">exifdict</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
|
|
<span class="n">exifdict</span> <span class="o">=</span> <span class="n">exifdict</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">tag_groups</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">tag_groups</span><span class="p">:</span>
|
|
|
|
<span class="c1"># strip tag groups</span>
|
|
|
|
<span class="c1"># strip tag groups</span>
|
|
|
|
<span class="n">exif_new</span> <span class="o">=</span> <span class="p">{}</span>
|
|
|
|
<span class="n">exif_new</span> <span class="o">=</span> <span class="p">{}</span>
|
|
|
|
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">exifdict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
|
|
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">exifdict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
|
|
|
<span class="n">k</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">".*:"</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span>
|
|
|
|
<span class="n">k</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s2">".*:"</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span>
|
|
|
|
<span class="n">exif_new</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
|
|
|
|
<span class="n">exif_new</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span>
|
|
|
|
<span class="n">exifdict</span> <span class="o">=</span> <span class="n">exif_new</span>
|
|
|
|
<span class="n">exifdict</span> <span class="o">=</span> <span class="n">exif_new</span>
|
|
|
|
|
|
|
|
|
|
|
|
@ -624,17 +626,17 @@
|
|
|
|
<span class="k">return</span> <span class="n">exifdict</span></div>
|
|
|
|
<span class="k">return</span> <span class="n">exifdict</span></div>
|
|
|
|
|
|
|
|
|
|
|
|
<div class="viewcode-block" id="ExifTool.json"><a class="viewcode-back" href="../../reference.html#osxphotos.ExifTool.json">[docs]</a> <span class="k">def</span> <span class="nf">json</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<div class="viewcode-block" id="ExifTool.json"><a class="viewcode-back" href="../../reference.html#osxphotos.ExifTool.json">[docs]</a> <span class="k">def</span> <span class="nf">json</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""returns JSON string containing all EXIF tags and values from exiftool"""</span>
|
|
|
|
<span class="sd">"""returns JSON string containing all EXIF tags and values from exiftool"""</span>
|
|
|
|
<span class="n">json</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">run_commands</span><span class="p">(</span><span class="s2">"-json"</span><span class="p">)</span>
|
|
|
|
<span class="n">json</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">run_commands</span><span class="p">(</span><span class="s2">"-json"</span><span class="p">)</span>
|
|
|
|
<span class="n">json</span> <span class="o">=</span> <span class="n">unescape_str</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span>
|
|
|
|
<span class="n">json</span> <span class="o">=</span> <span class="n">unescape_str</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span>
|
|
|
|
<span class="k">return</span> <span class="n">json</span></div>
|
|
|
|
<span class="k">return</span> <span class="n">json</span></div>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">_read_exif</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">_read_exif</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""read exif data from file"""</span>
|
|
|
|
<span class="sd">"""read exif data from file"""</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">asdict</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">asdict</span><span class="p">()</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="k">return</span> <span class="sa">f</span><span class="s2">"file: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="si">}</span><span class="se">\n</span><span class="s2">exiftool: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_exiftoolproc</span><span class="o">.</span><span class="n">_exiftool</span><span class="si">}</span><span class="s2">"</span>
|
|
|
|
<span class="k">return</span> <span class="sa">f</span><span class="s2">"file: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">file</span><span class="si">}</span><span class="se">\n</span><span class="s2">exiftool: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">_exiftoolproc</span><span class="o">.</span><span class="n">_exiftool</span><span class="si">}</span><span class="s2">"</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="fm">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_context_mgr</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_context_mgr</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
@ -650,15 +652,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">ExifToolCaching</span><span class="p">(</span><span class="n">ExifTool</span><span class="p">):</span>
|
|
|
|
<span class="k">class</span> <span class="nc">ExifToolCaching</span><span class="p">(</span><span class="n">ExifTool</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""Basic exiftool interface for reading and writing EXIF tags, with caching.</span>
|
|
|
|
<span class="sd">"""Basic exiftool interface for reading and writing EXIF tags, with caching.</span>
|
|
|
|
<span class="sd"> Use this only when you know the file's EXIF data will not be changed by any external process.</span>
|
|
|
|
<span class="sd"> Use this only when you know the file's EXIF data will not be changed by any external process.</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Creates a singleton cached ExifTool instance"""</span>
|
|
|
|
<span class="sd"> Creates a singleton cached ExifTool instance"""</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="n">_singletons</span> <span class="o">=</span> <span class="p">{}</span>
|
|
|
|
<span class="n">_singletons</span> <span class="o">=</span> <span class="p">{}</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">filepath</span><span class="p">,</span> <span class="n">exiftool</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">filepath</span><span class="p">,</span> <span class="n">exiftool</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""create new object or return instance of already created singleton"""</span>
|
|
|
|
<span class="sd">"""create new object or return instance of already created singleton"""</span>
|
|
|
|
<span class="k">if</span> <span class="n">filepath</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_singletons</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="n">filepath</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_singletons</span><span class="p">:</span>
|
|
|
|
<span class="bp">cls</span><span class="o">.</span><span class="n">_singletons</span><span class="p">[</span><span class="n">filepath</span><span class="p">]</span> <span class="o">=</span> <span class="n">_ExifToolCaching</span><span class="p">(</span><span class="n">filepath</span><span class="p">,</span> <span class="n">exiftool</span><span class="o">=</span><span class="n">exiftool</span><span class="p">)</span>
|
|
|
|
<span class="bp">cls</span><span class="o">.</span><span class="n">_singletons</span><span class="p">[</span><span class="n">filepath</span><span class="p">]</span> <span class="o">=</span> <span class="n">_ExifToolCaching</span><span class="p">(</span><span class="n">filepath</span><span class="p">,</span> <span class="n">exiftool</span><span class="o">=</span><span class="n">exiftool</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_singletons</span><span class="p">[</span><span class="n">filepath</span><span class="p">]</span>
|
|
|
|
<span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_singletons</span><span class="p">[</span><span class="n">filepath</span><span class="p">]</span>
|
|
|
|
@ -666,7 +668,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">class</span> <span class="nc">_ExifToolCaching</span><span class="p">(</span><span class="n">ExifTool</span><span class="p">):</span>
|
|
|
|
<span class="k">class</span> <span class="nc">_ExifToolCaching</span><span class="p">(</span><span class="n">ExifTool</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filepath</span><span class="p">,</span> <span class="n">exiftool</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filepath</span><span class="p">,</span> <span class="n">exiftool</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""Create read-only ExifTool object that caches values</span>
|
|
|
|
<span class="sd">"""Create read-only ExifTool object that caches values</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> file: path to image file</span>
|
|
|
|
<span class="sd"> file: path to image file</span>
|
|
|
|
@ -674,21 +676,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Returns:</span>
|
|
|
|
<span class="sd"> Returns:</span>
|
|
|
|
<span class="sd"> ExifTool instance</span>
|
|
|
|
<span class="sd"> ExifTool instance</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_json_cache</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_json_cache</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_asdict_cache</span> <span class="o">=</span> <span class="p">{}</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_asdict_cache</span> <span class="o">=</span> <span class="p">{}</span>
|
|
|
|
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">filepath</span><span class="p">,</span> <span class="n">exiftool</span><span class="o">=</span><span class="n">exiftool</span><span class="p">,</span> <span class="n">overwrite</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
|
|
|
|
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">filepath</span><span class="p">,</span> <span class="n">exiftool</span><span class="o">=</span><span class="n">exiftool</span><span class="p">,</span> <span class="n">overwrite</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">run_commands</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">commands</span><span class="p">,</span> <span class="n">no_file</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">run_commands</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">commands</span><span class="p">,</span> <span class="n">no_file</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
|
|
<span class="k">if</span> <span class="n">commands</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"-json"</span><span class="p">,</span> <span class="s2">"-ver"</span><span class="p">]:</span>
|
|
|
|
<span class="k">if</span> <span class="n">commands</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="s2">"-json"</span><span class="p">,</span> <span class="s2">"-ver"</span><span class="p">]:</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="si">}</span><span class="s2"> is read-only"</span><span class="p">)</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="si">}</span><span class="s2"> is read-only"</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">run_commands</span><span class="p">(</span><span class="o">*</span><span class="n">commands</span><span class="p">,</span> <span class="n">no_file</span><span class="o">=</span><span class="n">no_file</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">run_commands</span><span class="p">(</span><span class="o">*</span><span class="n">commands</span><span class="p">,</span> <span class="n">no_file</span><span class="o">=</span><span class="n">no_file</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">setvalue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">setvalue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="si">}</span><span class="s2"> is read-only"</span><span class="p">)</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="si">}</span><span class="s2"> is read-only"</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">addvalues</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="o">*</span><span class="n">values</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">addvalues</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="o">*</span><span class="n">values</span><span class="p">):</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="si">}</span><span class="s2"> is read-only"</span><span class="p">)</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="vm">__class__</span><span class="si">}</span><span class="s2"> is read-only"</span><span class="p">)</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">json</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">json</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_json_cache</span><span class="p">:</span>
|
|
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_json_cache</span><span class="p">:</span>
|
|
|
|
@ -696,13 +698,13 @@
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_json_cache</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_json_cache</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">asdict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag_groups</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">normalized</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">asdict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tag_groups</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">normalized</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""return dictionary of all EXIF tags and values from exiftool</span>
|
|
|
|
<span class="sd">"""return dictionary of all EXIF tags and values from exiftool</span>
|
|
|
|
<span class="sd"> returns empty dict if no tags</span>
|
|
|
|
<span class="sd"> returns empty dict if no tags</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> Args:</span>
|
|
|
|
<span class="sd"> tag_groups: if True (default), dict keys have tag groups, e.g. "IPTC:Keywords"; if False, drops groups from keys, e.g. "Keywords"</span>
|
|
|
|
<span class="sd"> tag_groups: if True (default), dict keys have tag groups, e.g. "IPTC:Keywords"; if False, drops groups from keys, e.g. "Keywords"</span>
|
|
|
|
<span class="sd"> normalized: if True, dict keys are all normalized to lower case (default is False)</span>
|
|
|
|
<span class="sd"> normalized: if True, dict keys are all normalized to lower case (default is False)</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_asdict_cache</span><span class="p">[</span><span class="n">tag_groups</span><span class="p">][</span><span class="n">normalized</span><span class="p">]</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_asdict_cache</span><span class="p">[</span><span class="n">tag_groups</span><span class="p">][</span><span class="n">normalized</span><span class="p">]</span>
|
|
|
|
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
|
|
|
|
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
|
|
|
|
@ -714,7 +716,7 @@
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_asdict_cache</span><span class="p">[</span><span class="n">tag_groups</span><span class="p">][</span><span class="n">normalized</span><span class="p">]</span>
|
|
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_asdict_cache</span><span class="p">[</span><span class="n">tag_groups</span><span class="p">][</span><span class="n">normalized</span><span class="p">]</span>
|
|
|
|
|
|
|
|
|
|
|
|
<span class="k">def</span> <span class="nf">flush_cache</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="k">def</span> <span class="nf">flush_cache</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
|
|
<span class="sd">"""Clear cached data so that calls to json or asdict return fresh data"""</span>
|
|
|
|
<span class="sd">"""Clear cached data so that calls to json or asdict return fresh data"""</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_json_cache</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_json_cache</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_asdict_cache</span> <span class="o">=</span> <span class="p">{}</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_asdict_cache</span> <span class="o">=</span> <span class="p">{}</span>
|
|
|
|
</pre></div>
|
|
|
|
</pre></div>
|
|
|
|
@ -754,7 +756,9 @@
|
|
|
|
</div><script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
|
|
|
|
</div><script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
|
|
|
|
<script src="../../_static/jquery.js"></script>
|
|
|
|
<script src="../../_static/jquery.js"></script>
|
|
|
|
<script src="../../_static/underscore.js"></script>
|
|
|
|
<script src="../../_static/underscore.js"></script>
|
|
|
|
|
|
|
|
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
|
|
|
|
<script src="../../_static/doctools.js"></script>
|
|
|
|
<script src="../../_static/doctools.js"></script>
|
|
|
|
|
|
|
|
<script src="../../_static/sphinx_highlight.js"></script>
|
|
|
|
<script src="../../_static/scripts/furo.js"></script>
|
|
|
|
<script src="../../_static/scripts/furo.js"></script>
|
|
|
|
<script src="../../_static/clipboard.min.js"></script>
|
|
|
|
<script src="../../_static/clipboard.min.js"></script>
|
|
|
|
<script src="../../_static/copybutton.js"></script>
|
|
|
|
<script src="../../_static/copybutton.js"></script>
|
|
|
|
|