2009年10月31日作成
AmaTunesツール
1行に1つISBNを記述したファイルから、AmaTunesに 取り込むためのプログラムです。
これはずいぶん前にBooks for Mac OS Xの データを移行させようとして作ったのですが、 AmaTunes自体、数回しか使いませんでしたので、 なんらかのバグが残っているのではないかと思います。
COCOA_APP_RESOURCES_DIR = File.dirname(File.expand_path(__FILE__))
resource_path = COCOA_APP_RESOURCES_DIR
$LOAD_PATH.reject! { |d| d.index(File.dirname(COCOA_APP_RESOURCES_DIR))!=0 }
$LOAD_PATH << File.join(COCOA_APP_RESOURCES_DIR,"ThirdParty")
$LOAD_PATH << File.join(File.dirname(COCOA_APP_RESOURCES_DIR),"lib")
$LOAD_PATH << File.join(COCOA_APP_RESOURCES_DIR,"RubyGems","gems","rb-appscript-0.4.0","lib")
$LOAD_PATH << File.join(COCOA_APP_RESOURCES_DIR,"RubyGems","gems","hpricot-0.6","lib")
$LOAD_PATH << File.join(COCOA_APP_RESOURCES_DIR,"RubyGems","gems","hpricot-0.6","ext","hpricot_scan")
$LOADED_FEATURES << "rubycocoa.bundle"
ENV['GEM_HOME'] = ENV['GEM_PATH'] = File.join(COCOA_APP_RESOURCES_DIR,"RubyGems")
#require 'rubygems'
#require 'osx/cocoa'
require 'appscript'
require 'open-uri'
require 'fileutils'
$KCODE='u'
require resource_path + '/ecs.rb'
$faac_path = resource_path + "/../MacOS/lib"
def conv_year(str)
str =~ /^(\d\d\d\d).*/
$1
end
def conv_artwork(str)
filename = "/tmp/amatunes.artwork"
@tmpfiles.push filename
f = File.open(filename, "wb")
f.write open(str).read
f.close
filename
end
class MyBarcodeScannerDelegate
def initialize
@barcodes = Hash.new
@lastcode = nil
end
def gotBarcode(barcode)
barcode = barcode.to_s
barcode = '0' + barcode if barcode.size == 12
sum = 0
mod = 1
barcode.reverse.each_byte do |c|
n = c - '0'[0]
sum += n * mod
if mod == 1
mod = 3
else
mod = 1
end
end
sum %= 10
return unless sum == 0
return if @lastcode == barcode
@lastcode = barcode
if @barcodes[barcode].nil?
Amazon::Ecs.options = {
:aWS_access_key_id => '1N37DT5CJCZQKPZR7BG2',
:country => 'jp',
}
res = Amazon::Ecs.item_search(barcode, {:response_group => 'Medium'})
item = res.first_item
return if item.nil?
@tmpfiles = Array.new
option = ""
[
["artist", "author"],
["album", "title"],
["title", "title"],
["writer", "manufacturer"],
["cover-art", "largeimage/url", :conv_artwork],
["year", "publicationdate", :conv_year],
["genre", "productgroup"],
].each do |o|
str = item.get(o[1])
next if str.nil?
option += ' --' + o[0] + ' "' +
(o[2].nil? ? str : send(o[2], str)) + '"'
end
begin
m4b = "/tmp/#{barcode}.m4b"
@tmpfiles.push m4b
system "#{$faac_path}/faac128 #{option} -o #{m4b} #{$faac_path}/base.wav"
app = Appscript.app('iTunes')
app.activate
app.open MacTypes::Alias.path(m4b)
app.stop
#@tmpfiles.each {|file| FileUtils.rm file}
@barcodes[barcode] = item
$snd.play
rescue
end
end
end
end
while(s = gets)
d = MyBarcodeScannerDelegate.new()
d.gotBarcode(s.to_i)
end
遭遇したトラブル
require osx/cocoaが通らない
使わない方向で逃げました。
ThirdParty/open-uri.rb:require stringioが通らない
相対パスだと、reject!のマッチングで問題があったので、 絶対パスに変換するよう修正して解決。
faacが落ちる
AmaTunesに付属のfaacは、/opt/local/以下から ライブラリをロードしようとして落ちていました。 そこで、faacをコンパイルして、そちらを使いました。
$ ./configure --disable-shared
$ make
$ mv frontend/faac $dir