夕暮ログ

C#やJavascript、最近はAndroidなんかも好きなtinqのブログ。「夕暮れログ」

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Rubyでバイナリデータを標準出力に出力する

Same-Originポリシーを回避するためにRubyでCGIを作っていたのですが、ほかのサーバーの画像を書き出すのでつまりそうになったのでメモ。

画像なのでもちろんバイナリモードで書き出さないといけません。
しかし、標準出力はテキストモードで開かれているため普通に書き出すと改行がおかしくなってしまいます。(windowsなら)

すでに開いているFileをバイナリモードにするにはIO#binmodeを使うそうです。
開発規約/95 - BugbearR's Wiki
instance method IO#binmode
f = "file.jpg"
print "Content-Type: image/jpegn\n"
STDOUT.binmode
print open(f,"rb").read

もう一度テキストモードにするには再オープンしかないようですが、Rubyで標準出力を再オープンする方法はわかりません・・・

CGIでもっとまともな方法


で、さすがにこんなことはないだろうと思って探したらありました。
instance method CGI#out
一件落着。
cgi = CGI.new
f = "file.jpg"
cgi.out("image/jpeg" ){ open(f,"rb").read }
スポンサーサイト

プログラムで自動処理をする時にファイル名に使えない文字ではまった

現在、とある処理を自動化しようとrubyを組んでいます。
その最中にファイルをダウンロードしてきて保存する箇所があるのですが、なぜかうまく保存されない。

スペースやファイル名が長すぎるのが原因かと思っていろいろやってみましたが、よくよく見たらファイル名に使えない文字のおかげでした。

そういえば、*とか:とか使えないことをすっかり忘れていました・・・。
普通ならファイルを作成できなくて例外を吐くはずなのですが、その時含まれていた文字が「:」だったので例外が出ませんでした。
多分、代替データストリームあたりに必死に書き込んでいたのではないかと思います。
(そのあと代替データストリームを開こうとしましたが開けず。結局どこに書き込んでいたんだろう)

使えない文字はこのページの下のほうにあるように(FATではなくNTFSです)
FAT、HPFS、NTFS ファイル システムについて - Microsoft

? " / \ < > * | :
です。
ということで、これが含まれていたらはじくなり置き換えるなりの処理が必要です。

雑ですが、こんな感じでしょうか。
file = text.gsub!(/[?"\\\<>*|]/,"_")


意外と気が使いないものなので注意しましょう・・・

mp3info-rubyでmp3のタグを書き換える


便利だったのでメモ。
MP3のタグ変更を自動化したかったのでライブラリを探してみたところ、「ruby-mp3info」というライブラリが簡単でした。
ruby-mp3info
Windowsの場合ですが、普通にgemからインストールします。

gem install ruby-mp3info

(もしかすると、DevKitとかが必要かもしれませんが・・・)

使い方は非常に簡単です。
require "mp3info"
Mp3Info.open("test.mp3"){|mp3|
puts mp3.tag.title
puts mp3.tag.artist
puts mp3.tag.album
puts mp3.tag.tracknum
mp3.tag.title = "タイトル"
mp3.tag.artist = "アルバム名"
}

このように見るだけではなく書き込みも一発です。

ID3v2にも対応しており、tag2からアクセスできます。

何のタグを書き換えればいいか分からない場合



私は歌詞を書き換えたかったのですが、いろいろ調べてもうまく出てきませんでした。
そのような場合、iTunesなどの書き換えが可能なソフトから必要な情報を書き換えることで、Rubyからタグの名前を参照できます。

Mp3Info.open("test.mp3"){|mp3|
mp3.tag2.ULT = "\x00jpn\x00hogehoge!\x00"
}

iTunesなどで上の画像のように書き換えた場合(+歌詞も書き換え)を行った場合こうなります。

MPEG 1 Layer 3 CBR 32 Kbps Single Channel 44100 Hz length 299.36325 sec. header {:error_protection=>false, :padding=>false, :private=>true, :mode_extension=>0, :copyright=>false, :original=>true, :emphasis=>0} tag2: {"TT2"=>"hoge", "TYE"=>"0000", "ULT"=>"\x00eng\x00Hello!\x00", "TP1"=>"piyo", "COM"=>"\u30B3\u30E1\u30F3\u30C8"}

これより、COMにコメントが格納されているとか、ULTに歌詞がnull文字で区切られて入っているとかがわかります。(状況によって変わったりする場合があるので、いろいろ試してみてください。)
もちろん、歌詞やアートワークを書き込んだりすることもできます!

・・・そして、現在iPodで歌詞が表示されず。なぜ。

ホーム

プロフィール

tinq tinq(もしくはTinqWill)

Sky  For   Every 改装予定

プログラミングお勉強中の高校生。月一くらいは更新したい

最新記事

カテゴリ

月別アーカイブ

検索フォーム

最新コメント

リンク

最新トラックバック

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。