Rubyでmp3のタグをいじるには3

タグの中身が取れたぜ! イェイ。

#!/usr/bin/env ruby
$KCODE="sjis"
require "dl/import"

module Id3lib
  extend DL::Importable
  dlload "id3lib.dll"

  typealias("ID3_Tag", "void")
  typealias("ID3_Frame", "void")
  typealias("ID3_FrameID", "int")
  typealias("ID3_Field", "void")
  typealias("ID3_FieldID", "int")
  typealias("luint", "long")

  ID3FID_ALBUM=29
  ID3FID_TITLE=47

  ID3FN_TEXT=2
  
  extern "ID3_Tag *ID3Tag_New()"
  extern "long        ID3Tag_Link        ( ID3_Tag *, char *)"
  extern "ID3_Frame   * ID3Tag_FindFrameWithID(ID3_Tag *, ID3_FrameID)"
  extern "ID3_Field    *ID3Frame_GetField    ( ID3_Frame *, ID3_FieldID)"
  extern "luint        ID3Field_GetASCII    ( ID3_Field *, char *, luint , luint)"
  #extern ""
end

tag=Id3lib.iD3Tag_New
Id3lib.iD3Tag_Link(tag, "test.mp3")

fid=Id3lib::ID3FID_ALBUM

frame=Id3lib.iD3Tag_FindFrameWithID(tag, fid)
field=Id3lib.iD3Frame_GetField(frame, Id3lib::ID3FN_TEXT)
bufsize=1024
str="\0"*bufsize
size=Id3lib.iD3Field_GetASCII(field, str, bufsize, 0)
p str[0...size]

externの書き方にクセがあって、プロトタイプそのままだとエラー出ます。

  • セミコロンを取る
  • 変数名を削除
  • 閉じカッコの直前に空白があってはいけない

めもめも。

あと、externで定義したメソッド名の頭は、強制的に小文字になります。
dl.soのリファレンスにも明記してあるんだけど、小一時間悩んじゃったから書いておく。
ていうか、めんどくさいからモジュール定義の中で

alias new iD3Tag_New

とかしてしまうのが吉ならん。

あとはタグの書き込みだけやね。