TORICO Tech ブログhttps://tech.torico-corp.com/blog/2024-03-29T14:31:17+00:00株式会社TORICO 技術開発チームのブログ新卒エンジニア向けに、電子マンガのエンジニアリングについて話すイベントを開催します。2023-10-11T01:52:40+00:002024-03-28T10:27:32+00:00四柳剛https://tech.torico-corp.com/blog/author/yotsuyanagi/https://tech.torico-corp.com/blog/developer-event-manga-tech-talk-2023/<p>株式会社メディアドゥ、ピクシブ株式会社、株式会社ブックウォーカー、株式会社TORICO の技術部門の合同で、電子書籍の作成・流通から閲覧までの技術的裏側を紹介するイベントを行います。</p>
<p>イベント参加者は、connpass のイベントページから申し込みを行ってください。<br/><span>› </span><a href="https://mediado-go.connpass.com/event/296676/" target="_blank">connpass の マンガTechTalk のページを見る</a></p>
<h2>イベント概要</h2>
<p>「マンガTechTalk」は電子マンガ関連サービスを開発しているIT企業合同の、<br/>エンジニア学生向け業界研究・座談会イベントです!</p>
<p>みなさんは、電子マンガが執筆されてから読者が楽しむまでに<br/>どんなプロダクトやテクノロジーが利用されているか知っていますか?</p>
<p>このイベントでは、電子マンガに関わるプロダクトを開発・運営しているIT企業のエンジニアが登壇し、<br/>電子マンガビジネス全体の流れや利用しているテクノロジーをお話するパネルTalkと、<br/>実際に開発しているエンジニアとの少人数での座談会Talkを行います。</p>
<p>電子マンガ業界の全体感がつかめる!<br/>電子マンガに使われているテクノロジーがわかる!<br/>電子マンガのシステムを開発しているエンジニアと話せる!<br/>マンガに興味があって、将来エンジニアとして働くことに興味のある学生のみなさんのご参加をお待ちしています!</p>
<h2>イベント日時</h2>
<p>2023/10/25 (水) 18:30 ~ 21:00<br/>※入場受付は開始時間の30分前からを予定</p>
<h2>タイムテーブル</h2>
<table>
<thead>
<tr>
<th>時間</th>
<th>コンテンツ</th>
<th>開催形式</th>
</tr>
</thead>
<tbody>
<tr>
<td>18:30 ~ 18:35</td>
<td>オープニングTalk</td>
<td>オンライン/オフライン両方開催</td>
</tr>
<tr>
<td>18:35 ~ 19:05</td>
<td>パネルTalk「電子マンガのプロダクトを知ろう!」</td>
<td>オンライン/オフライン両方開催</td>
</tr>
<tr>
<td>19:05 ~ 19:15</td>
<td>休憩</td>
<td>オンラインの方はここで終了</td>
</tr>
<tr>
<td>19:15 ~ 20:50</td>
<td>企業別座談会Talk</td>
<td>オフライン開催のみ</td>
</tr>
<tr>
<td>20:50 ~ 21:00</td>
<td>クロージングTalk</td>
<td>オフライン開催のみ</td>
</tr>
</tbody>
</table>
<h2>コンテンツ詳細</h2>
<h3>パネルTalk「電子マンガのシステムを知ろう!」</h3>
<p>電子マンガが執筆〜読書されるまでの全体の流れを説明し、<br/>漫画家、出版社、取次、電子書店、読者それぞれに対して登壇する各社が提供しているプロダクトをご紹介!</p>
<p>ここまではオンライン/オフライン両方での参加が可能なコンテンツです。</p>
<h3>企業別座談会Talk</h3>
<p>企業ごとのスペースに分かれ、実際に働いているエンジニアと少人数の座談会を行います!<br/>企業概要、エンジニア組織、技術、プロダクトなどざっくばらんにTalkできるパートです。<br/>エンジニアの生の声を聞いてみたい方はぜひご参加ください。</p>
<p>※このコンテンツはオフライン会場のみ実施いたしますので、<br/>参加希望の方はオフライン枠にてお申し込みください。</p>
<h2>参加資格</h2>
<p>下記すべてを満たしている方</p>
<ul>
<li>高等専門学校、専門学校、大学、大学院に学生として在籍されている方</li>
<li>ITエンジニアを目指している方</li>
<li>今後就職活動をする予定の方 (卒業年度不問です)</li>
</ul>
<h2>イベント開催方法</h2>
<p>企業別座談会Talkはオフライン参加の方限定コンテンツです。<br/>オンライン参加は参加いただけませんので、ご注意ください。</p>
<p>参加希望者は、connpass のイベントのページから申し込みを行ってください。</p>
<p>› <a href="https://mediado-go.connpass.com/event/296676/" target="_blank">connpass の マンガTechTalk のページを見る</a></p>
<h3>オフライン会場</h3>
<p>メディアドゥ社オフィス(東京都千代田区一ツ橋1-1-1 パレスサイドビル 5F)<br/>竹橋駅直結(1b出口)または神保町駅(A8出口より徒歩5分)</p>
<p><a href="https://mediado.jp/about/access/" target="_blank">https://mediado.jp/about/access/</a></p>
<p>5Fセミナールーム</p>
<h3>オンライン会場</h3>
<p>参加登録者限定でのZoomオンライン配信<br/>イベント参加登録者にのみ、参加URLをお伝えします。</p>
<h1>登壇予定企業</h1>
<h3>株式会社メディアドゥ (<span> </span><a href="https://mediado.jp/" rel="nofollow" target="_blank">https://mediado.jp/</a><span> </span>)</h3>
<ul>
<li>電子書籍など出版を中心としたデジタルコンテンツ流通のサービスをメインに提供するIT企業です。</li>
<li>「ひとつでも多くのコンテンツをひとりでも多くの人に届ける」をVisionに掲げ、多くの人がコンテンツを楽しめる世界の実現を目指しています。</li>
<li>世界No.2の電子書籍流通総額を誇り、出版業界のIT企業として重要なポジションを担っています。</li>
<li>エンジニア向け採用HP(<a href="https://recruit.mediado.jp/" rel="nofollow" target="_blank">https://recruit.mediado.jp/</a>)</li>
</ul>
<h3>ピクシブ株式会社 (<span> </span><a href="https://www.pixiv.co.jp/" rel="nofollow" target="_blank">https://www.pixiv.co.jp/</a><span> </span>)</h3>
<p><a href="https://www.pixiv.co.jp/" rel="nofollow" target="_blank">ピクシブ株式会社</a>は「創作活動を、もっと楽しくする。」という理念のもと、クリエイターのためのプラットフォームを開発、運営しています。</p>
<p>そのプラットフォームの中心となる「<a href="https://www.pixiv.net/" rel="nofollow" target="_blank">pixiv</a>」は作品(イラスト・マンガ・小説)を介したコミュニケーションにフォーカスした、クリエイターのためのSNSです。2007年9月に開始され、現在9000万人を超えるユーザーが登録し、総作品数は1億作品以上にのぼり、世界中のユーザーに利用されてるプロダクトとして運営されています。</p>
<p>またpixiv以外にもCtoCの創作物の総合マーケット、「<a href="https://booth.pm/ja" rel="nofollow" target="_blank">BOOTH</a>」や創作活動を応援するためのファンコミュニティ「<a href="https://www.fanbox.cc/" rel="nofollow" target="_blank">pixivFANBOX</a>」など多くのサービスを展開しております。</p>
<h3>株式会社ブックウォーカー(<a href="https://www.bookwalker.co.jp/%EF%BC%89" rel="nofollow" target="_blank">https://www.bookwalker.co.jp/)</a></h3>
<ul>
<li>電子書籍サービスを主領域とするテックカンパニー</li>
<li>KADOKAWAグループのデジタル戦略子会社として、本のあり方、読書のあり方、出版のあり方をデジタルの力で再定義し、創造が循環し続ける社会の実現を目指している</li>
<li>電子書籍ストアの「BOOK☆WALKER」を日本や海外で展開、NTTドコモ社とともに電子雑誌読み放題「dマガジン」電子書籍サービス「dブック」を提供、マンガ上にコメントを書き込む等ユーザー参加型の読書体験が楽しめる「ニコニコ漫画」や国内最大級の書評サービス「読書メーター」などのサービスの開発・運営を行っている</li>
</ul>
<h3>株式会社TORICO(<a href="https://www.torico-corp.com/%EF%BC%89" rel="nofollow" target="_blank">https://www.torico-corp.com/)</a></h3>
<ul>
<li>株式会社TORICOは「世界を虜に」というVISIONを掲げ、エンターテインメントを通して「楽しさ」を提供し続ける会社を目指しています。</li>
<li>1巻から最終巻までの全巻セットのみを販売するECサイト「<a href="https://www.mangazenkan.com/" rel="nofollow" target="_blank">漫画全巻ドットコム</a>」、マンガを読みながらポイ活も出来るデジタルコミック配信サービス「<a href="https://www.sukima.me/" rel="nofollow">スキマ</a>」、リアル店舗を持ちマンガ作品の展示会、コラボカフェ、サイン会等を開催する「<a href="https://www.manga10.com/" rel="nofollow" target="_blank">マンガ展</a>」などを運営しています。</li>
<li>20卒からは総合職に加え、新卒エンジニア職の採用も開始しています!</li>
</ul>
<h1>登壇者紹介(順不動)</h1>
<h3>沓名 雅司さん / 株式会社メディアドゥ</h3>
<p>IP事業ソリューション本部 技術フェロー<br/>SIerでシステムの開発、設計・提案、PMを経験した後に、ERPパッケージベンダーに転職して人事や会計などのパッケージ製品開発に従事。 現在はメディアドゥの技術フェローとしてデジタルコンテンツに関わる新規事業の技術統括として様々なプロダクトを技術面から推進。<br/><img src="https://mediado.jp/wp-content/uploads/2021/04/aws-summit_2-819x1024.jpg" width="100"/></p>
<h3>柳瀬 直裕さん / 株式会社ブックウォーカー</h3>
<p>取締役CTO 2012年より電子書籍サービスBOOK☆WALKERの開発・マネージメントを担当。2017年より台湾漫読股份有限公司に兼務出向し台湾BOOK☆WALKER開発管理も担当。2021年にCTO就任、各種サービス開発と組織のマネージメントを務める。</p>
<h3>佐々木佳祐さん / ピクシブ株式会社</h3>
<p>コミック事業部 事業部長 2014年新卒入社。Android/iOSアプリエンジニアを経て、pixivコミック、Palcyのプロダクトマネージャーを経験。<br/>現在はコミック事業部の事業部長として「ピクシブのマンガ事業」の指揮を執っています。</p>
<p><img src="https://d1oxpwh25sez73.cloudfront.net/event_icons/ten.png" width="120"/></p>
<h3>四柳 剛さん / 株式会社TORICO</h3>
<p>開発本部 CTO スキマ・マンガ展のサービス立ち上げ、漫画全巻ドットコム・まんが王・ホーリンラブブックスの開発部門のマネージャーを担当。10年前はソーシャルゲームの開発者。</p>
<h1>注意事項</h1>
<ul>
<li>セクシュアルハラスメント、パワーハラスメント、ストーカー等の他者への迷惑行為を禁止します。</li>
<li>ネットワークビジネス等、その対象を問わず販売、勧誘、あっせん等を行うこと。また、宗教活動または政治活動を禁止します。</li>
<li>その他、イベントの趣旨・目的から逸脱した行為や、本来のイベント趣旨とは異なる行為があると判断した場合、退場いただいたうえで次回以降のイベント参加をお断りさせて頂きます。</li>
<li>当イベントへの参加は、事前登録をいただいた方のみに限定させていただきます。オンラインイベントの配信URLを事前登録のない方へ展開するのはご遠慮ください。</li>
<li>イベントの様子をブログや各種メディアにて発信するため、開催中に写真撮影をする場合がございます。ご了承お願い致します。</li>
</ul>
<h1>オフライン会場における新型コロナウイルス対策</h1>
<ul>
<li>感染拡大などやむをえない事情があった場合、オフラインでの開催は中止させて頂く場合があります。ご了承下さい。</li>
<li>発熱(37.5度以上)や風邪などの症状がある場合、参加をお控えください。</li>
<li>会場内ではマスクの着用をお願いいたします。大声での会話はお控えください。</li>
<li>会場施設の入口に消毒液が設置いたします。入場時に手の消毒をお願いいたします。</li>
</ul>
<h1>プライバシーポリシー</h1>
<p>アンケートなどで収集した個人情報に関しては、各社のプライバシーポリシーに則り、取り扱いいたします。</p>
<ul>
<li>
<p>株式会社メディアドゥ<br/><a href="https://mediado.jp/privacy-statement/" rel="nofollow" target="_blank">https://mediado.jp/privacy-statement/</a></p>
</li>
<li>
<p>ピクシブ株式会社<br/><a href="https://recruit.jobcan.jp/pixiv/policy" rel="nofollow" target="_blank">https://recruit.jobcan.jp/pixiv/policy</a></p>
</li>
<li>
<p>株式会社ブックウォーカー<br/><a href="https://www.bookwalker.co.jp/privacy_policy/main.html" rel="nofollow" target="_blank">https://www.bookwalker.co.jp/privacy_policy/main.html</a></p>
</li>
<li>
<p>株式会社TORICO<br/><a href="https://www.torico-corp.com/privacy/">https://www.torico-corp.com/privacy/</a></p>
</li>
</ul>
<p>参加希望者は、connpass のイベントのページから申し込みを行ってください。</p>
<p>› <a href="https://mediado-go.connpass.com/event/296676/" target="_blank">connpass の マンガTechTalk のページを見る</a></p>
<p></p>EPUBファイルから画像を抽出する2016-02-26T10:17:47+00:002024-03-29T14:31:17+00:00四柳剛https://tech.torico-corp.com/blog/author/yotsuyanagi/https://tech.torico-corp.com/blog/epub%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E7%94%BB%E5%83%8F%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%99%E3%82%8B/<p></p>
<p></p>
<p>電子書籍フォーマットとして広く使われている EPUB ファイルから、連番で画像を抽出する方法です。</p>
<p>ツール作りました! pip でインストールできます。<a href="https://github.com/ytyng/epub-extract-jpeg">https://github.com/ytyng/epub-extract-jpeg</a></p>
<p></p>
<div class="section" id="epub">
<h2>EPUB ファイルの概要</h2>
<p>EPUB ファイルとは、平たく言えば ZIP圧縮された XHTML です。 コミックで一般的に使われる形式では、1ページが1つの XHTML ファイルになっており、その中に 1 つの img タグが あり、画像ファイルにリンクされています。</p>
<p>そのため、手順としては</p>
<ul class="simple">
<li>EPUB ファイルを解凍</li>
<li>構成情報の XML ファイルを解析し、ページ画像の URL (パス) を取得</li>
<li>ページ画像を連番で改名コピー(移動)</li>
</ul>
<p>となります。</p>
</div>
<div class="section" id="id1">
<h2>1. EPUBファイルを解凍</h2>
<p>unzip で一発です。</p>
<div class="highlight-shell">
<div class="highlight">
<pre><span class="nv">$ </span>mkdir /tmp/epub-extract
<span class="nv">$ </span>unzip sample.epub -d /tmp/epub-extract
</pre>
</div>
</div>
</div>
<div class="section" id="xml-url">
<h2>2. 構成情報の XML ファイルを解析し、ページ画像の URL (パス) を取得</h2>
<p>まず、展開後のディレクトリにある META-INF/container.xml を開きます。 ここに、rootfile というタグがあるので、その full-path 属性を見ます。 full-path の XML ファイルが、各ページの目次のようなものになります。</p>
<p>full-path が示す XML ファイルで、manifest タグの中に item タグが複数あります。 これらは、EPUB 中の XHTML から使われているファイルです。</p>
</div>
<div class="section" id="id2">
<h2>3. ページ画像を連番で改名コピー(移動)</h2>
<p>この、item タグの中はおそらくページ順になっているので、このファイルをスクリプトで連番で改名コピーしながら収集すれば、ページ画像を抽出できます。</p>
<p>本来であれば、直接画像のパスを読むのではなく、ページの XHTML ファイルを開き、そこからリンクされている画像を収集していくのが正しいのですが、ページの XHTML の順と画像の item タグの順が一致しないケースは稀だと思いますので(EPUB 作成者が意図的に XHTML ファイルと画像ファイルの順番を一致させなかった場合などは、ページ数が正しく取得できません)、item タグの順で処理して基本的には問題無いでしょう。</p>
<p>これで、EPUB ファイルから画像ファイルを抽出する方法は終わりです。 最後に、Python スクリプトにした例を掲載しておきます。</p>
<div class="highlight-python">
<div class="highlight">
<pre><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">print_function</span><span class="p">,</span> <span class="n">unicode_literals</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">time</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">subprocess</span>
<span class="kn">import</span> <span class="nn">shutil</span>
<span class="kn">from</span> <span class="nn">xml.etree</span> <span class="kn">import</span> <span class="n">ElementTree</span>
<span class="n">TEMP_DIR</span> <span class="o">=</span> <span class="s">'/tmp/epub-extract-{}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()))</span>
<span class="k">def</span> <span class="nf">procedure</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">file_path</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"{} is not exist."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">file_path</span><span class="p">),</span> <span class="nb">file</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">output_dir</span><span class="p">,</span> <span class="n">ext</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">splitext</span><span class="p">(</span><span class="n">file_path</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ext</span> <span class="o">!=</span> <span class="s">'.epub'</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s">"{} is not epub."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">file_path</span><span class="p">),</span> <span class="nb">file</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">output_dir</span><span class="p">):</span>
<span class="k">print</span><span class="p">(</span><span class="s">"{} is already exists."</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">output_dir</span><span class="p">),</span> <span class="nb">file</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span>
<span class="k">return</span>
<span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">TEMP_DIR</span><span class="p">)</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="s">'unzip'</span><span class="p">,</span> <span class="n">file_path</span><span class="p">,</span> <span class="s">"-d"</span><span class="p">,</span> <span class="n">TEMP_DIR</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">stderr</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="o">.</span><span class="n">communicate</span><span class="p">()</span>
<span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">output_dir</span><span class="p">)</span>
<span class="n">container_xml_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">TEMP_DIR</span><span class="p">,</span> <span class="s">'META-INF'</span><span class="p">,</span> <span class="s">'container.xml'</span><span class="p">)</span>
<span class="n">etree</span> <span class="o">=</span> <span class="n">ElementTree</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">container_xml_path</span><span class="p">)</span>
<span class="n">rootfile_node</span> <span class="o">=</span> <span class="n">etree</span><span class="o">.</span><span class="n">find</span><span class="p">(</span>
<span class="s">".//{urn:oasis:names:tc:opendocument:xmlns:container}rootfile"</span><span class="p">)</span>
<span class="n">content_opf_path</span> <span class="o">=</span> <span class="n">rootfile_node</span><span class="o">.</span><span class="n">attrib</span><span class="p">[</span><span class="s">'full-path'</span><span class="p">]</span>
<span class="n">content_xml_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">TEMP_DIR</span><span class="p">,</span> <span class="n">content_opf_path</span><span class="p">)</span>
<span class="n">etree</span> <span class="o">=</span> <span class="n">ElementTree</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">content_xml_path</span><span class="p">)</span>
<span class="n">manifest</span> <span class="o">=</span> <span class="n">etree</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">'.//{http://www.idpf.org/2007/opf}manifest'</span><span class="p">)</span>
<span class="n">items</span> <span class="o">=</span> <span class="n">manifest</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="s">'.//{http://www.idpf.org/2007/opf}item'</span><span class="p">)</span>
<span class="n">image_paths</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">items</span><span class="p">:</span>
<span class="k">if</span> <span class="n">item</span><span class="o">.</span><span class="n">attrib</span><span class="p">[</span><span class="s">'media-type'</span><span class="p">]</span> <span class="o">==</span> <span class="s">'image/jpeg'</span><span class="p">:</span>
<span class="n">image_paths</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">attrib</span><span class="p">[</span><span class="s">'href'</span><span class="p">])</span>
<span class="n">root_dir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">content_xml_path</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">image_path</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">image_paths</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
<span class="n">destination_image_name</span> <span class="o">=</span> <span class="s">'{:03d}.jpg'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="n">source_image_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">root_dir</span><span class="p">,</span> <span class="n">image_path</span><span class="p">)</span>
<span class="n">destination_image_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
<span class="n">output_dir</span><span class="p">,</span> <span class="n">destination_image_name</span><span class="p">)</span>
<span class="n">shutil</span><span class="o">.</span><span class="n">move</span><span class="p">(</span><span class="n">source_image_path</span><span class="p">,</span> <span class="n">destination_image_path</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="s">'{} -> {}'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">image_path</span><span class="p">,</span> <span class="n">destination_image_name</span><span class="p">))</span>
<span class="n">shutil</span><span class="o">.</span><span class="n">rmtree</span><span class="p">(</span><span class="n">TEMP_DIR</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
<span class="n">procedure</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
<span class="n">main</span><span class="p">()</span>
</pre>
追記: Github に上げて、pip でインストールできるようにしました。</div>
<div class="highlight"><a href="https://github.com/ytyng/epub-extract-jpeg">https://github.com/ytyng/epub-extract-jpeg</a></div>
<div class="highlight"></div>
</div>
</div>