SSブログ
前の10件 | -

iTunesからMusicBeeへの乗り換え その3くらい(まとめ) [IT]

  iTunesからMusicBeeに乗り換えたので、Android端末と同期するためのiSyncrと、Google Play Music(長いので以下GPM)のMusicManager(長いので以下GPMMM)のiTunesプレイリスト同期機能が使えなくなってしまったので、これを解決すべくWSL(Windows Subsystem for Linux)を利用して以下のスクリプトを作った。のでまとめ。


 MusicBeeの独自プレイリスト形式であるmbpというバイナリファイルがある。これはバイナリファイルだがテキストが埋め込まれているので、強引にテキストファイルとして読み込んでm3uプレイリスト形式に変換する。


  1.で作成したm3uプレイリストを、Android(Linux)用にパスの区切り文字を「\」から「/」にして、プレイリストが格納されているフォルダから相対パスで指定したUTF-8 改行コードLFのm3uファイルを作成する。 


  ffprobe(ffmpeg付属)で音楽ファイルのタグ(メタデータ)を抽出してGPM用のプレイリストcsv形式1行で出力する。


  mp3ファイルの場合、ffprobeで日本語文字化けが起こる(標準出力に出力されたときにはすでに壊れて修復不可能)ので、PythonのeyeD3というライブラリを使用して、mp3のメタデータの文字コードを変換してからメタデータをGPM用のプレイリストcsv形式1行で出力する。(ここで公開されている"id3conv.py"を改造)


  3.と4.を使用して、m3uプレイリストに書かれている音楽ファイルのタグ(メタデータ)を抽出してGPM用のプレイリストcsvファイルに変換する。

6.gmusic-playlist/common.py, gmusic-playlist/preference.py

  gmusicapi(Google Play Music非公式api )を使用してGPM用プレイリストcsvファイルをアップロード・ダウンロードできるgmusic-playlistというツールがあるのだが、これが1つのcsvファイルをアップするたびにパスワードを聞いてくるのでoauthで認証するように改造。 

  5.で生成するGPM用csvプレイリストのメタデータのフィールド(カラム)を多くしているのでその部分も変更している。GPMに渡すメタデータが多いほど正確にGPM上でプレイリストが生成されるため。


  rsyncを使用し、2.で作成したプレイリストに書いてある音楽ファイルだけをSRCフォルダからDSTフォルダにコピーする。書いていないファイルは削除する。sshとファイル名にあるように、sshで暗号化してrsyncサーバーとの通信が可能。

  1.2.7.がNASとAndroid端末と同期するためのスクリプトで、3.-6.がGoogle Play Musicのプレイリストを同期するためのスクリプトである。

  Android端末では/Playlistフォルダにプレイリストが、/Musicフォルダ以下に音楽ファイルが格納されているとすると、m3uファイルは

 ../Music/アーティスト名/…1.flac

 ../Music/アーティスト名/…2.flac

  という書式にする必要がある。そういう書式にするために2.を使う。2.で作成したプレイリストファイルを使って7.でAndroid端末に転送するのだが、単純にファイルのリストを渡しただけではコピーはできない。いや、コピーはできるのだが、指定していないファイルを削除することができず、ゴミファイルが溜まっていく。それを回避するためには、rsyncの--include-fromオプションで残すファイルを指定する必要がある。

  その書式が

  /foo/bar/hoge.piyoというファイルを残すのであれば、

  /foo/

  /foo/bar/

  /foo/bar/hoge.piyo

  とファイルの途中のパスを全部書き出さないとならないので7.のスクリプトでそういった処理をしている。

  GPM用のプレイリストの処理だが、困ったことに4.はPython3でしか動かないし、6.はPython2でしか動かない。それで最初はpyenvという環境切り替えツールを使用して6.のフォルダで使用するPythonのバージョンを"$ pyenv local 2.x.x"でPython2に指定して、5.内でもpyenvを使用してPython3に切り替えて4.を呼び出していた。

  WSLのLinux内で動かす分にはそれでよかったのだが、WindowsのGUIで指定したファイルをバッチファイルにドラッグアンドドロップして変換したいので、バッチファイル(コマンドプロンプト)のwslコマンドでWindowsから呼び出そうとすると、python(及びpyenv)なんてコマンドはねえよと返される。

  Pythonをaptでインストールしたときは問題ないので、pyenvが問題(多分環境変数の問題。WSLのターミナルを起動してログインした時とwslコマンドで呼び出した時ではおそらく読み込まれる設定ファイルが違う)ということでpyenvの使用は諦めて、4.と6.を実行する際にchmodで実行権限を与えて"$ ./bar.py"の様に実行するのではなく、"$ python3 bar.py"などとpyスクリプトで使用したいバージョンでPython自体のコマンドを変えて実行することで解決した。

  こちらのほうがよほどシンプルだが、pythonの共存と切り替えはpyenvが便利だよというネットの情報にはまり込んでしまった。Linux内だけで使用するならそうなんだろうけど、WLSを通して使うということの情報が見当たらなかったからだな。

  こうして作成した1.2.5.6.をWinsdowsのバッチファイル中のwslコマンドで呼び出すことで、MusicBeeのプレイリストをいじったときに、バッチファイルをダブルクリックだったりプレイリストファイルをドラッグアンドドロップするだけで、Android端末用のプレイリストの作製とGPM用プレイリストcsvの作製およびGPMへのアップができるようになった。

  5.で作ったGPM用プレイリストcsvは6.を使うよりこの野良Chromeアドオンでアップロードするのが楽じゃないかな。

余談

  WSL用ユーティリティのwsluにWindows形式とLinux形式のパスの文字列を変換するwslpathというコマンドがある(ここや ここらへん参照)のだが、なるべくWSL依存にはしたくなかったのでWindows形式のパスはsedを用いてLinux形式のパスに変換するようにしている。なので、素のLinux(wsluが無いLinux)で音楽ファイルとプレイリストm3uファイルを管理している場合でも1.-7.は動くはずである(試してないので「はず」止まりだが)。

全角チルダ・波ダッシュ問題(参考1 参考2

  Windowsでは全角チルダは波ダッシュに置換されてしまうが、Linuxでは区別されるので問題が生じることがあった。

  gmusic-playlist/ImportList.py に改造の余地があるな。csvファイル1つごとにGPMにログインログアウトするので時間がかかる。ログインしてから一気に複数のプレイリストをアップしたほうが高速になる。

まあ動くから、モチベが低い。

  google-music-scripsはどういうわけかアップロードできないバグが有る。そこでgmusicapiを使用してアップロードするpy(音楽アップロード用プレイリストcsvアップロード用)を書いた。(これを改造)


nice!(1)  コメント(0) 
共通テーマ:日記・雑感

MusicBeeからAndroidへのプレイリストの転送 その2 [PC]

前回の続き
 
bash用プレイリスト変換シェルスクリプトがあるのだから、m3uへの変換自体はTermuxか何かのAndroid用ターミナルアプリを使えば、Android端末からできるな。
 
NASにMusicBeeのライブラリを置いているので、m3uプレイリストを読み込んでそのファイルをコピーするスクリプトを作れば、PCを起動していなくてもAndroid端末だけでMusicBeeの好きなプレイリストと同期できる。かもしれない。
 
Google Play Musicへのプレイリストのアップロードもボタン一発でできるようにしたいところだが、音楽ファイルのタグを調べるのに使うffprobe(ffmpegに付属)が日本語文字コードの問題があってやれてない。プレイリストcsvファイルのアップもCLIでうまくできないし。暇があったらまた挑戦してみるか。
 
追記(2019/05/09)
よくよく考えたら、USB接続で転送先の音楽フォルダ・プレイリストフォルダを適切に設定すれば、別にシェルスクリプトを書かなくてもよかったな。ただ無線でやりたいので。WiFiでの転送だと改行コードの問題が出てくるのでどこかで変換処理をしないとならない。
 
MusicBeeの無線同期が正式版になれば(それで文字コードの仕様が直ってれば)問題解決なんだが。

nice!(0)  コメント(1) 

MusicBeeからAndroidへのプレイリストの転送 [PC]

MusicBeeのMTPデバイス(Android端末)への転送機能でプレイリストを転送したときにAndroid側でうまく解釈してくれないとう不具合に遭遇した。Dev版を使っているので、Stable版では起きないかもしれないが顛末を書いておく。
 
どうやら、問題が2つあって、転送したm3uプレイリストファイルに書かれているパスと文字コードに問題があるようだ。
 
まずパスの問題だが、MusicBeeで指定した転送先のプレイリスト用フォルダ名、例えば「Music\」を指定していたのであれば、m3uファイルが「格納パス(internalやexternalのSDカード)\Music\Playlists\」フォルダに転送される。
 
転送先の音楽ファイル用フォルダ名をプレイリストと同じフォルダ「Music\」とすると、転送されたm3uファイル内に書かれているパスの行頭に「\Music」と入ってしまう。
 
Android側ではm3uファイルを読んだフォルダから相対パスで指定されていると解釈される。m3uファイルは「格納パス\Music\」フォルダに格納されているので、「格納パス\Music\Music\曲が格納されているパス」と解釈してしまう。「格納パス\Music\曲が格納されているパス」と解釈してもらいたいのに。つまりm3uファイルの行頭の「\Music」が余計なのである。
 
プレイリストを格納するパスを「Music\」の親フォルダにするといいかもしれないが、SDカードのルートにプレイリストを置くことになり、あまりよろしくないのでやってない。
 
文字コードの問題だが、USBで有線接続したときはUTF-8, CR+LFで転送され、これはAndroidで解釈するのに問題はない。WiFiでの転送をしたときに、UTF-8, CR(LFは無い)というm3uファイルが転送されてしまう。Dev版での実装だからか。
 
LFが無いとAndroidのメディアストレージは改行が認識できず1行のプレイリストとして解釈してしまう。
 
そこで、この2つの問題を解決するために、MusicBeeのプレイリスト形式のMBPというバイナリファイルから、文字列を抽出して、文字コードがUTF-8, CR+LFで、行頭に\Musicが付かないm3uファイルを生成するWSL用bashのシェルスクリプト(バグが出てるので修正中) シェルスクリプト(修正版2019.05.10)を作成した。(WSLじゃなくても動くと思うが)(2019/05/27追記)最終的に作成したスクリプトについてはこちらの日記参照 
 
これで生成されたm3uファイルをMusicBeeで指定した音楽ファイル格納用フォルダに、適当なAndroid用ファイル転送アプリで転送してAndroidのメディアストレージを読み込み直すと、めでたくAndroidで正常なプレイリストが生成される。
 
このスクリプトを使う前提条件として、PCのMusicBeeのライブラリと、Androidに転送した際の音楽ファイル格納フォルダの構成が同じでなければならない。具体的には、MusicBeeのライブラリの音楽ファイル格納フォルダが「C:\User\piyo\Music\MusicBee\Music\」であれば、Android側では「格納パス\Music\」以下に同じ構成で転送しなければならない。
 
そうするにはMusicBeeのデバイスの設定で「音楽のストレージ->格納パス」の下のラジオボタンを「命名テンプレートを使用」ではなく「ファイル名を保持」にチェックを入れる。
 
ファイルの拡張子を抽出して改行を入れているため、スクリプトに書かれているflac, mp3, mp4, m4aファイルしか書かれていないプレイリストしか対応していない(自分が持ってるのがそれだけだから)。他の拡張子(oggとか)に対応させたい場合は適宜追加のこと。
 
自分の環境(MusicBeeのライブラリのパスとAndroid用m3uファイルを格納したいパス)を書き込んでダブルクリックで実行できるバッチも作って、MusicBeeでプレイリストを編集したときにダブルクリックするだけで反映させられるようにした。
 
サンプルのバッチファイルもアップしておくが、環境によってパスが違うので適宜書き換えのこと。
 
しかしMusicBeeは動作は軽快でいいのだが、思わぬ障害に遭遇したな。Google Play Musicへのプレイリストのアップといい。まあ、簡単にアップできる仕組みと手順を整えたからいいけど。
 
続きあり
 

nice!(1)  コメント(0) 

iTunesからMusicBeeへの移行 その2 [PC]

前回の続き
 
なぜ今までiTunesを使っていたかと言うと、Google Play Music(以下GPM)との連携のためだった。GPMのWindows用同期ソフト、「Music Manager」はiTunesの管理用xmlを読み込んでプレイリストを含めて簡単に同期することが可能である。
 
どうせFLACも24bitに対応していないならばALACに変換してしまい、iTunes上で全部管理してしまったほうがいいかなと。
 
ただし、GPMは24bitのALACには対応していないので、ALACが含まれたプレイリストは同じ曲のmp3バージョンに差し替えたプレイリストを作って、GPMと同期していた。
 
読者諸賢は最初から全部ALAC以外の曲でプレイリストを作ればいいじゃないかと思われるかもしれないが、ALAC入りプレイリストはPCで再生するのにできるだけいい品質で再生することと、ハイレゾ対応スマホと同期するのに必要だった。AndroidスマホとiTunesのプレイリストとはiSyncrというアプリで同期できる。
 
この同じ曲で2つのバージョンがあるのをなんとかしたいなと常々思っていて、ふとしたきっかけでGPMの対応ファイルを調べ直したところ、24bitのFLACにも対応していたので、「FLACに対応していないiTunes」以外の「FLACに対応した音楽管理ソフト」を使えば同じ曲の2つのバージョンの問題は解決するのではないかと思ったのだ。

nice!(1)  コメント(0) 

iTunesからMusicBeeへの移行 [PC]

PCでの音楽管理に関して、iTunesからMusicBeeへの移行が完了した。移行しようと思い立ったのは、Google Play Music(以後GPM)が24bitのFLACに対応していたのに気づいたから。
 
今までハイレゾのFLACを購入してもiTunesはFLACに対応していないのでALACに変換したものと、GPMは24bitのALACに対応していないためmp3に圧縮したものと、同じ曲をALACとmp3の2つの形式でiTunesで管理していた。GPMが24bitのALACと同様に24bitのFLACも対応してないと思ってたのでわざわざmp3を作っていたのだ。
 
ところが最近GPMでサポートされているファイル形式を調べたところ、ALACは16bitだけだが、FLACは24bitも対応していた。運用方式を決めた時調べて24bitのFLACには対応してなかったはずだが、2016年ごろに対応していたようだ。
 
ハイレゾの曲を買い始めたのが2015年ごろなので、そのころ調べてGPMは24bitのFLACに対応していないと思ったのだろうか?
 
それはさておき、Windows版のiTunesは非常に重くて不満なこともあったし、ファイルを2重に作って管理する(ALACが含まれたプレイリストもGPM用にmp3の同じ曲に差し替えたものを作って2重にメンテナンスする)のも嫌だったし、この際他の音楽管理・プレーヤーソフトに乗り換えることにした。
 
候補としてはフリーソフトとして著名なfoobar2000MusicBeeがあったが、前者はカスタマイズ性が高いものの扱いが難しそうだと思ったので、MusicBeeにした。
 
iTunesからMusicBeeへの移行に関してはインストールしたときにiTunesの設定ファイルを読み込むことができるので特に難しくはない。ただ、今回はALACをFLACにしたかったので、ALACファイルを抽出してXRECODE 3を使用してFLACに変換した。
 
ALACとFLACは共にロスレスであるためALACからFLACに変換してもPCMとしては劣化しない。ALACからFLACへの変換速度はmp3などに圧縮するよりだいぶ高速である。
 
MusicBeeのライブラリにあるALACの曲を削除し、作成したFLACをMusicBeeのライブラリに取り込む。この時プレイリストはハイレゾの曲が抜けている状態になっていたので、予めiTunesから書き出しておいたプレイリストの情報を元に手動で直した。これのスマートな移行方法は無かったかな?まあ作業は済んだのでもういいが。
 
GPMとの連携が少し苦労したが、GPMへの曲のアップそのものはGPMのMusic ManagerでMusicBeeの音楽フォルダを指定しておくだけで良い。
 
面倒なのがプレイリストだが、このChrome拡張で曲のリストが書かれているcsvファイルをアップすれば、タグの情報に従ってGPM内の曲がリストされ、GPM上のプレイリストとして生成される。
 
csvファイルを生成するには、MusicBeeからエクスポートしたm3uファイルをMp3Tagで読み込んで、フォーラムの情報を参考にテキストファイルをcsv形式で出力するのだが、このスクリプトだと順番が狂うという罠がある
 
$filename(csv,utf-8)title,artist,album,track,year,genre,playlist
$loop(%_filename_ext_%)"$regexp(%title%,",)","$regexp(%artist%,",)","$regexp(%album%,",)","$regexp(%track%,",)","$regexp(%year%,",)","$regexp(%genre%,",)","playlistname"
$loopend()
 
上記Mp3Tag用mteスクリプト(切れるのでファイルをアップした)を作成して使用したところ、m3uの曲順通りにGPM上にプレイリストが生成された。
 
プレイリストだけ先にアップしても、壊れた(適当な曲が割り当てられた)プレイリストが生成されるので注意が必要である。GPMのMusic Managerによる曲のアップ->Chrome拡張でのプレイリストcsvのアップという順番でやらなければならない。
 
Android端末との同期は、MusicBeeは標準でMTPでの同期に対応しているので、PCとUSBケーブルで繋げば同期できる。WiFiに関しては、今のところDev版でしか対応していない。
 
こうして移行できたわけだが、MusicBeeは非常に軽いので概ね満足。iTunesはよく固まるし、インクリメンタルサーチでイライラする事もしばしばだったし。
 
続きあり
 

nice!(1)  コメント(1) 

BOOX NOTEの分解 [IT]

E InkのAndroid読書端末「BOOX NOTE」はストレージが32GBあるが、そのうちユーザーが使えるのが27GB弱で、執筆時点で電子書籍ストアから書籍を買ったところ書籍がダウンロードできず、使い切ってしまったのがわかった。
 
一応USB Type-C端子が付いているが、それにストレージを接続することができない(ここはよく調べてないのでもしかしたらできるかもしれない)。SDカードスロットも無いのでストレージの拡張ができないのだ。
 
もしかしたら、内部的にSDカードのスロットがあって、そこにストレージが挿さっているのかもしれない、と思って、以前スマホを修理する際に購入した、手持ちのスマホリペアキットの特殊ドライバーとヘラを使って分解してみた。(読者の方はご自身の責任の下、行ってください)
DSC03704.JPG
 
底面のUSB Type-C端子の左右にネジがある。
DSC03703.JPG
これが五芒星の形をした特殊なもので、前述のリペアキットのドライバーで外す。本体の裏面のカバーは接着剤などで接着はされておらず嵌っているだけなので、ヘラで慎重に隙間に力をかけていくと外れる。
 
外した写真がこれである。
DSC03699.JPG
 
メイン基板を拡大した写真がこれで、
DSC03700.JPG
どうやらメインのSoCらしきものの周りにチップがいくつかある。2つある「K4E8E324EB-EGCF」というチップがLPDDR3のメインメモリで、「KLMBG2JENB-B041」というチップが32GBのeMMCのフラッシュロムのようだ。これはもちろんはんだ付けされており取り外すことはできない。
 
microSDカードスロットらしきものも見当たらない。
 
目論見が外れてしまったが、こうなると27GBのストレージ内で運用面でやりくりするしかない。この端末に入れているのは字の本のみで、マンガは入れてないんだけどな。
 
BOOX NOTE

BOOX NOTE

  • 出版社/メーカー: SKTSELECT
  • メディア: エレクトロニクス
Kindle Paperwhite、電子書籍リーダー、Wi-Fi 、ブラック

Kindle Paperwhite、電子書籍リーダー、Wi-Fi 、ブラック

  • 出版社/メーカー: Amazon
  • メディア: エレクトロニクス


nice!(2)  コメント(0) 
共通テーマ:パソコン・インターネット

Ubuntu 16.04 LTS でWindowsからリモートデスクトップで接続する方法 [PC]

古いノートPCにUbuntuを入れて遊んでいて、Ubuntu 16.04 LTSのGnome ClassicでWindowsからGUIで操作したいと思い付き、試行錯誤していたのだが、情報が錯綜してハマっていた。色んな情報があって、複雑なコマンドを駆使してインストールしている人がいたのだが、これが罠で、基本的にはこのページの方法でできた。
 
ただし、xrpdのバージョンが古いため、最新版(執筆時点でv0.9.3.1)を入れる必要があったのだが、tarボールを公式ページよりダウンロードして展開し、./configure, sudo make installというシンプルなコマンドでインストールすることで使用することができた。
 
ホント、Linux関連はいろんな環境やバージョンアップがあって過去の情報が役に立たないことがままあって、ノイズが多くて困る。
 
クラウド(Google Cloud PlatformやAmazon Web Service)のUbuntuサーバーでも多分同じ方法でデスクトップを使用することができるだろうな。実験してないけど。
 
ちなみにUbuntuからWindows 10のリモートデスクトップに接続するのは、Remminaというソフトが予めインストールされていて、それを使うだけで簡単である。


入門者のLinux 素朴な疑問を解消しながら学ぶ (ブルーバックス)

入門者のLinux 素朴な疑問を解消しながら学ぶ (ブルーバックス)

  • 作者: 奈佐原 顕郎
  • 出版社/メーカー: 講談社
  • 発売日: 2016/10/19
  • メディア: 新書
入門者のLinux 素朴な疑問を解消しながら学ぶ (ブルーバックス)

入門者のLinux 素朴な疑問を解消しながら学ぶ (ブルーバックス)

  • 出版社/メーカー: 講談社
  • 発売日: 2016/10/18
  • メディア: Kindle版

nice!(2)  コメント(0) 
共通テーマ:パソコン・インターネット

Reader Storeの複数ダウンロードの方法 [IT]

少し前にソニーの電子書籍ストアの「Reader Store」がリニューアルした。見やすく改善はされているものの、購入した書籍の一括ダウンロードができなくなっており、この点が非常に不便なのである。大量購入してもらいたくないのだろうか?
 
それはさておき、スマホやタブレットで見るならばPCのダウンロードは必要ないが、筆者が持っている電子書籍閲覧端末「Reader」はWiFi機能が無いモデルであるため、転送するにはPCでダウンロードする必要があり、いつ「Reader Store」が店じまいしてもいいようにバックアップもしたいので、PCでダウンロードはしたい。
 
[8/21追記:Webの「Reader Store」のサイトで購入完了の画面または自アカウントの本棚ページで読みたい本を選択して読みたい端末として「Reader」を選ぶと.mbbsファイルがダウンロードされる。]
 
この.mbbsファイルというのが、PCにインストールしたダウンローダーに関連付けられていて、ダブルクリックすると実データが「Reader」端末が接続されたPCおよび「Reader」端末本体にダウンロードされる仕組みになっている。1個1個.mbbsファイルをダブルクリックしてると、1冊ダウンロードして終わってからまたもう1回って繰り返すので面倒なのだ。
 
この.mbbsファイルの中身を見ると、XMLファイルになっている。とりあえず複数.mbbsファイルをダウンロードして、「<Product :xsi:type=…>…</Product>」で囲まれた範囲を「<Product_List xsi:type=…>…</Product_List>」の中にダウンロードしたい冊数分入れればいいようだ。
 
結局.mbbsファイルを1個1個ダウンロードして.mbbsファイルを編集する必要はあるけれども、とりあえずダブルクリック1回でPC及び「Reader」端末にダウンロードできるようにはなった。
 
自動化するバッチか、シェルスクリプトでも書いてみるかな。気が向いたら書きます。
 
追記:
できました。
bashのシェルスクリプトとWindowsのバッチファイル。バッチファイルの方はアイコンにまとめて放り込むとマージしてくれるようにしている。テキスト処理に使うのでsedをインストールといておくこと。
 
bash用シェルスクリプト
#!/bin/bash
#merge_mbbs.sh
#指定ディレクトリの.mbbsファイルをマージする
#書式 ./merge_mbbs.sh 引数1 引数2
#引数1 ディレクトリを指定
#引数2 出力する.mbbsファイルのファイル名
count=1
#指定ディレクトリの.mbbsファイルを読み込む
ls ${1}/*.mbbs | while read line
do
  #最初のファイルでヘッダとフッタを生成
  if [ ${count} = 1 ]; then
    #「<Product xsi」より後を削除したものがヘッダ
    sed -e 's/<Product xsi.*//g' ${line} > "${1}/${2%.*}_header.tmp"
    #「</Product>」より前を削除したものがヘッダ
    sed -e 's#.*</Product>##g' ${line} > "${1}/${2%.*}_footer.tmp"
    #ヘッダを出力してマージ用.mbbsファイルを生成
    cat "${1}/${2%.*}_header.tmp" > "${1}/${2%.*}.mbbs"
  fi
  #ヘッダ部とフッタ部を削除した(<Product>タグで囲まれた)文字列を追加
  sed -e 's/.*\<Product xsi/\<Product xsi/g' "${line}" | sed -e 's#</Product>.*#</Product>#g' >> "${1}/${2%.*}.mbbs"
  count=`expr ${count} + 1`
done
#最後にフッタを出力
cat "${1}/${2%.*}_footer.tmp" >> "${1}/${2%.*}.mbbs"
#ヘッダとフッタを削除
rm "${1}/${2%.*}_header.tmp"
rm "${1}/${2%.*}_footer.tmp"
Windows用バッチファイル

@echo off
setlocal enabledelayedexpansion
REM merge_mbbs.bat
REM ドラッグアンドドロップで放り込んだ.mbbsファイルを結合する
REM SED.exeをパスの通った場所にインストールすること
set /a count=1
for %%a in (%*) do (
  if !count!==1 (
    REM 「<Product xsi」より後を削除したものがヘッダ
    sed -e "s/<Product xsi.*//g" %%a > merge_header.tmp
    REM 「</Product>」より前を削除したものがヘッダ
    sed -e "s#.*</Product>##g" %%a > merge_footer.tmp
    REM ヘッダを出力してマージ用.mbbsファイルを生成
    type "merge_header.tmp" > merge.mbbs
  )
  REM ヘッダ部とフッタ部を削除した(<Product>タグで囲まれた)文字列を追加
  sed -e "s/.*\<Product xsi/\<Product xsi/g" "%%a" | sed -e "s#</Product>.*#</Product>#g" >> "merge.mbbs"
  set /a count=!count!+1
)
REM 最後にフッタを出力
type "merge_footer.tmp" >> "merge.mbbs"
REM ヘッダとフッタを削除
del "merge_header.tmp"
del "merge_footer.tmp"
)
REM pause
exit


青空文庫をSony Reader PRS-650用のePubに変換する その2 [IT]

 
以前青空文庫のファイルを分割するバッチファイルを載せたが、
・1行が長い文章だとうまく3分割できない
・ファイルの大きさでファイルを分割したい
など問題が生じたので、ファイルの大きさで分割するようバッチファイルを修正した。バッチファイル内の定数部分を変えれば好きな大きさでファイルを分割することができるようにした。

新たにperlとhead.batを使っているので、必要に応じてインストールされたし。

----------↓バッチファイルの中身-------------
@echo off
setlocal enabledelayedexpansion

REM ドラッグアンドドロップした青空文庫のZIPを展開して、短く分割する
REM SED.exeをパスの通った場所にインストールすること
REM head.batとtail.batをパスの通った場所にインストールすること
REM busybox.exeをパスの通った場所にインストールすること
REM ActivePerlをインストールすること

REM 2016/07/10 初版作成
REM 2016/11/18 動的にファイルを分割するようにした


REM ファイルをsplitする時のサイズ(kbyte)
SET split_size=150

for %%a in (%*) do (

  REM 展開済みのフォルダを削除
  rmdir /q /s "%%~na"

  REM ZIPファイルを展開
  "C:\Program Files\7-Zip\7z.exe" x -o"%%~na\" "%%~npxa" -y

  REM 展開先フォルダに移動
  cd "%%~na\"

  REM 展開したファイルを元フォルダにコピー
  copy *.txt ..\

  for %%b in (*.txt) do (

    REM 表題のファイルを作成(temp100)
    sed -n -e 1,/---/p "%%~nb.txt" > "%%~nb_temp100.txt"

    REM 【テキスト中に現れる記号について】ファイル(temp200)を作成
    sed -n -e /---/,/---/p "%%~nb.txt" > "%%~nb_temp200.txt"

    REM 表題を削ったファイル(temp210)を作成
    sed -n -e /---/,$p "%%~nb.txt" > "%%~nb_temp210.txt"

    REM 表題を削ったファイルからファイル1行目の----を削る(temp220)を作成
    sed -n -e 2,$p "%%~nb_temp210.txt" > "%%~nb_temp220.txt"

    REM 【テキスト中に現れる記号について】までを削ったファイル(temp230)を作成
    sed -n -e /----/,$p "%%~nb_temp220.txt" > "%%~nb_temp230.txt"

    REM 1行目の----を削る(temp240)
    sed -n -e 2,$p "%%~nb_temp230.txt" > "%%~nb_temp240.txt"

    REM 表題を削ったファイルからファイル1行目の----を削る(temp220)を作成
    sed -n -e 2,$p "%%~nb_temp210.txt" > "%%~nb_temp220.txt"

    REM 【テキスト中に現れる記号について】ファイル1行目の----を削る(temp300)
    sed -n -e 2,$p "%%~nb_temp200.txt" > "%%~nb_temp300.txt"

    REM 表題と【テキスト中に現れる記号について】ファイルを結合(ヘッダ部完成)(header)
    type "%%~nb_temp100.txt" "%%~nb_temp300.txt" > "%%~nb_header.txt"

    REM ヘッダ部分を削る(元の文から2回----が出るまで)削る(temp430)
    sed -n -e /----/,$p "%%~nb.txt" > "%%~nb_temp405.txt"
    sed -n -e 2,$p "%%~nb_temp405.txt" > "%%~nb_temp410.txt"
    sed -n -e /----/,$p "%%~nb_temp410.txt" > "%%~nb_temp420.txt"
    sed -n -e 2,$p "%%~nb_temp420.txt" > "%%~nb_temp430.txt"

    REM フッタ部分を削る(本文完成)(main)
    perl -0pe "s/\n\n\n\n/\njgokrpyht9iguyt\n\n\n/m" "%%~nb_temp430.txt" > "%%~nb_temp440.txt"
    sed -n -e 1,/jgokrpyht9iguyt/p "%%~nb_temp440.txt" > "%%~nb_temp450.txt"
    perl -0pe "s/jgokrpyht9iguyt\n//m" "%%~nb_temp450.txt" > "%%~nb_main.txt"

    REM フッタ部を作成(footer)
    sed -n -e /jgokrpyht9iguyt/,$p "%%~nb_temp440.txt" > "%%~nb_temp460.txt"
    perl -0pe "s/jgokrpyht9iguyt//m" "%%~nb_temp460.txt" > "%%~nb_footer.txt"


    REM 本文を指定したサイズ[kbyte]で分割
    busybox split -b !split_size!k "%%~nb_main.txt" "%%~nb_splited_main.txt"

    REM 各ファイルの先頭の行だけ抜き出す
    set /a num=1
    for %%c in (%%~nb_splited_main.txt*) do (

      REM 先頭の行を抜き出す
   call head "%%c" 1 > "%%~nc_sentou_!num!.txt"

      set /a num=num+1

    )

    REM 次のファイルの先頭の行を足して、改行でファイルが切れるようにする
    set /a num=1
    set /a num2=2
    for %%c in (%%~nb_splited_main.txt*) do (

      if exist "%%~nc_sentou_!num2!.txt" (
        type "%%c" "%%~nc_sentou_!num2!.txt" > "%%~nc_seiri_tail_!num!.txt"
      ) else (
        type "%%c" > "%%~nc_seiri_tail_!num!.txt"
      )

      set /a num=num+1
      set /a num2=num2+1

    )

    REM 次のファイルの先頭の行を削る(最初のファイル以外)(分割した本文完成)
    set /a num=1
    for %%c in (%%~nb_splited_main.txt*) do (

      if !num!==1 (
        type "%%~nc_seiri_tail_!num!.txt" > "%%~nc_seiri_head_tail_!num!.txt"
      ) else (
        sed -n -e 2,$p "%%~nc_seiri_tail_!num!.txt" > "%%~nc_seiri_head_tail_!num!.txt"
      )

      set /a num=num+1
    )

    REM 分割した本文にヘッダとフッタを足して完成
    set /a num=1
    for %%c in (%%~nb_splited_main_seiri_head_tail_*.txt) do (

      REM ヘッダに番号を付与
      sed -e "2s/$/ !num!/" "%%~nb_header.txt" > "%%~nb_header_!num!.txt"

      type "%%~nb_header_!num!.txt" "%%~nxc" "%%~nb_footer.txt" > "%%~nb_!num!.txt"

      REM 生成ファイルをコピー
      copy "%%~nb_!num!.txt" ..\

      set /a num=num+1
    )

  )

  REM 元フォルダに移動
  cd ..\

  REM 展開フォルダを削除
  rmdir /q /s "%%~na\"

)

REM pause
exit

----------↑バッチファイルの中身-------------


青空文庫をSony Reader PRS-650用のePubに変換する [IT]

 
ふと思いたって、青空文庫を手持ちのSony Readerで読もうと思い、色々試行錯誤してみた。

以前ChainLPというソフトを使ってPDFに変換していたのだが、これは中身は画像なので、文字の大きさなどが変換できなくて美しくない。ここはやはり、XMDFかePubに変換したいところ。

探したところ、AozoraEpub3(参照:http://www18.atwiki.jp/hmdev/pages/21.html)というソフトでePubに変換できるみたいだ。試しに「吉川英治 三国志」で試してみたところ、特にエラーも無く変換は可能だった。しかし、Readerに転送してみると、表示できるファイルと表示できないファイルがあった。

持ってるSony Rederは初号機で、ePubの対応が完全じゃないらしい。XMDFに変換したいので探したが、AozoraXMDFというソフトはあるが、シャープが提供していたXMDFビルダーに食わせるXMLを生成するソフトで、そのXMDFビルダーは個人向けの配布は終了していてどうにもならない。何とかしてePubで読むしかない。

エラーが出る原因は最初は第三水準の文字かな?と思ったが違うみたいだ。現象としては「序」は読めるけど、本編が読めない。「序」は短いから長さが原因かな?と思ってテキストを切り分けてからAozoraEpub3で変換してみると、ビンゴだった。大体2000行以上だと読み込めなくなるようだ。

手動で切り分けてもいいけど、どうせなら自動化したいなと思ってバッチファイルを作ってみた。色々洗練されてないけど、とりあえず「吉川英治 三国志」なら問題なく変換できている。

青空文庫からダウンロードしたZIPファイルを、作ったバッチファイルのアイコンにドラッグアンドドロップすると、ZIPファイルと同じフォルダにテキストが生成される。生成されたテキストファイルをAozoraEpub3に食わせると、ePubファイルができる。

余裕をもって1500行で切り分けている。「吉川英治 三国志」だと大体3分割できるので、上中下を作ることにした。「序」とか「余録」とか短いものでも上中下が出来てしまうので、決め打ちしないで元のファイルの行数に合わせて生成するファイル数を決めたいところだけれども今のところ妥協。

バッチファイルの中身を以下に書く。

予め"tail.bat"をPATHが通ったフォルダに入れておくこと。(参照:http://shinta0806be.ldblog.jp/archives/7991457.html
sed for Windows(参照:http://gnuwin32.sourceforge.net/packages/sed.htm)をインストールしておくこと。
7-Zip(参照:https://sevenzip.osdn.jp/)をインストールしておくこと。
 
--------------------以下バッチファイルの中身-------------------- 

@echo off

REM 青空文庫のZIPを展開して、短く分割する
REM 3分割する
REM ※「吉川英治 三国志」しか試してないので注意

for %%a in (%*) do (
  REM 展開済みのフォルダを削除
  rmdir /q /s "%%~na"

  REM ZIPファイルを展開
  "C:\Program Files\7-Zip\7z.exe" x -o"%%~na\" "%%~npxa" -y

  REM 展開先フォルダに移動
  cd "%%~na\"

  for %%b in (*.txt) do (

    REM 表題のファイルを作成(temp1)
    sed -n -e 1,/---/p "%%~nb.txt" > "%%~nb_temp1.txt"

    REM 【テキスト中に現れる記号について】ファイル(temp2)を作成
    sed -n -e /---/,/---/p "%%~nb.txt" > "%%~nb_temp2.txt"

    REM 【テキスト中に現れる記号について】ファイル1行目の----を削る(temp3)
    sed -n -e 2,$p "%%~nb_temp2.txt" > "%%~nb_temp3.txt"

    REM 表題と【テキスト中に現れる記号について】ファイルを結合(ヘッダ部完成)
    type "%%~nb_temp1.txt" "%%~nb_temp3.txt" > "%%~nb_temp4.txt"

    REM ヘッダ部込みで1行目から1500行までのファイル(上巻)を作成(temp5)
    sed -n -e 1,1500p "%%~nb.txt" > "%%~nb_temp5.txt"

    REM 1501行から3000行までのファイル(中巻)を作成(temp6)
    sed -n -e 1501,3000p "%%~nb.txt" > "%%~nb_temp6.txt"

    REM フッタ部込みで3001行から最後までのファイル(下巻)を作成(temp7)
    sed -n -e 3001,$p "%%~nb.txt" > "%%~nb_temp7.txt"

    REM キリ良くするため上巻に付け足すファイルを作成(次の見出しまで)(temp8)
    sed -n -e 1,/大見出し/p "%%~nb_temp6.txt" > "%%~nb_temp8.txt"

    REM キリ良くするため中巻に付け足すファイルを作成(次の見出しまで)(temp9)
    sed -n -e 1,/大見出し/p "%%~nb_temp7.txt" > "%%~nb_temp9.txt"

    REM 中巻の最初の「大見出し」から3000行まで切り出す(temp10)
    sed -n -e /大見出し/,$p "%%~nb_temp6.txt" > "%%~nb_temp10.txt"

    REM 下巻の最初の「大見出し」から最後まで切り出す(temp11)
    sed -n -e /大見出し/,$p "%%~nb_temp7.txt" > "%%~nb_temp11.txt"

    REM 上巻に付け足すファイルの末尾2行を削る(temp12)
    type "%%~nb_temp8.txt" | sed -e $d | sed -e $d > "%%~nb_temp12.txt"

    REM 中巻に付け足すファイルの末尾2行を削る(temp13)
    type "%%~nb_temp9.txt" | sed -e $d | sed -e $d > "%%~nb_temp13.txt"

    REM 中巻の先頭に1行追加する(temp14)
    REM 先頭に文字列を追加して、削除している
    sed -e "1i #############" "%%~nb_temp10.txt" | sed -e s/#############// > "%%~nb_temp14.txt"

    REM 下巻の先頭に1行追加する(temp15)
    REM 先頭に文字列を追加して、削除している
    sed -e "1i #############" "%%~nb_temp11.txt" | sed -e s/#############// > "%%~nb_temp15.txt"

    REM フッタを作るために適当に下から20行くらい切り出す(temp16)
    call tail "%%~nb.txt" 20 > "%%~nb_temp16.txt"

    REM フッタを作成(temp170)
    sed -n -e "/^$/,$p" "%%~nb_temp16.txt" > "%%~nb_temp17.txt"
    
    REM ファイルを結合
    
    REM ヘッダ+本文(上)
    type "%%~nb_temp5.txt" "%%~nb_temp12.txt" > "%%~nb_temp18.txt"

    REM (上)のヘッダ部を削除
    sed -n -e "/----------/,$p" "%%~nb_temp18.txt" > "%%~nb_temp19.txt"
    sed -n -e 2,$p "%%~nb_temp19.txt" > "%%~nb_temp20.txt"
    sed -n -e "/----------/,$p" "%%~nb_temp20.txt" > "%%~nb_temp21.txt"
    sed -e "/----/d" "%%~nb_temp21.txt" > "%%~nb_temp22.txt"
rem  | sed -e "1i #############" | sed -e s/#############// > "%%~nb_temp22.txt"

    REM 上巻本文にフッタ部分が含まれてたら削除
    sed -e "/底本:/,$d" "%%~nb_temp22.txt" > "%%~nb_temp24.txt"
    REM sed -e "/^$/d" "%%~nb_temp23.txt" > "%%~nb_temp24.txt"

    REM ヘッダ+本文(上)+フッタ
    type "%%~nb_temp4.txt" "%%~nb_temp24.txt" "%%~nb_temp17.txt" > "%%~nb_temp25.txt"

    REM 本文(中)
    type "%%~nb_temp14.txt" "%%~nb_temp13.txt" > "%%~nb_temp26.txt"

    REM 中巻本文にフッタ部分が含まれてたら削除
    sed -e "/底本:/,$d" "%%~nb_temp26.txt" > "%%~nb_temp27.txt"
    sed -e "/^$/d" "%%~nb_temp27.txt" > "%%~nb_temp28.txt"

    REM ヘッダ+本文(中)+フッタ
    type "%%~nb_temp4.txt" "%%~nb_temp27.txt" "%%~nb_temp17.txt" > "%%~nb_temp28.txt"

    REM ヘッダ+(本文(下)+フッタ)
    type "%%~nb_temp4.txt" "%%~nb_temp17.txt" > "%%~nb_temp29.txt"

    REM 「上」の文字を挿入(完成)
    sed -e "2s/$/ 上/" "%%~nb_temp25.txt" > "%%~nb_1_third.txt"
    REM 「中」の文字を挿入(完成)
    sed -e "2s/$/ 中/"  "%%~nb_temp28.txt" > "%%~nb_2_third.txt"
    REM 「下」の文字を挿入(完成)
    sed -e "2s/$/ 下/"  "%%~nb_temp29.txt" > "%%~nb_3_third.txt"

  )
  REM 生成ファイルをコピー
  copy *third.txt ..\

  REM 元フォルダに移動
  cd ..\

  REM 展開フォルダを削除
  rmdir /q /s "%%~na\"

)

pause

--------------------以上-------------------- 
 

ソニー 電子書籍リーダー Reader 6型 Wi-Fiモデル ブラック PRS-T3S/B

ソニー 電子書籍リーダー Reader 6型 Wi-Fiモデル ブラック PRS-T3S/B

  • 出版社/メーカー: ソニー
  • メディア: Personal Computers

 

前の10件 | -

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。