平衡点
2011/11/06
_ feed2imap で UTF-8 以外の Feed を読む場合
Feed2imap は RSS/Atom feed をパースして imap サーバに送信する, Ruby で書かれたソフトウェアです. 作者は Lucas 先生. RSS/Atom feed を読むために慣れた MUA が使えるのがとても便利で良いところだと思います.
feed のパースと整形には Ruby-Feedparser) が使われています. これは内部で REXML を呼んでいるのですが, 文字列が全て UTF-8 決め打ちになっていたりして, euc-jp とか shift_jis な feed を食べさせると, 綺麗に文字化け(?)してくれます.
というわけで, ad hoc ですが feed を fetch して feedparser(REXML) に渡す前に NKF で文字コードを変換してみたり.
% diff -u httpfetcher.rb.bak httpfetcher.rb --- httpfetcher.rb.bak 2011-11-06 05:49:55.000000000 +0900 +++ httpfetcher.rb 2011-11-06 05:26:05.000000000 +0900 @@ -24,6 +24,7 @@ rescue LoadError end require 'uri' +require 'nkf' # max number of redirections @@ -81,7 +82,7 @@ end case response when Net::HTTPSuccess - return response.body + return NKF.nkf('-w', response.body) when Net::HTTPRedirection # if not modified if Net::HTTPNotModified === response
いちおうコレで動きますが, 相変わらず ad hoc.
ちなみに feed2imap は Ruby1.8 決め打ちなので NKF にしましたけれど, Ruby1.9 系列からは Encoding 使うのが良いんでしょうね.
_ Banshee で取得したアルバムアートを jpg にして出力
メモがてら. 要 ruby-mpi3info, unf_ext
#!/usr/bin/ruby1.9.1 # -*- mode: ruby; coding: utf-8-unix; indent-tabs-mode: nil -*- # Copyright(C) 2011 Youhei SASAKI All rights reserved. # License: GPL-2+ # # Code: require 'rubygems' require 'mp3info' require 'digest/md5' require 'RMagick' require 'unf_ext' musicdir = Dir.glob(ENV['HOME']+"/Music/*/*/") list = Hash.new norm = UNF::Normalizer.new musicdir.each do |src| Dir.chdir(src) mp3file = Dir.glob("*.mp3")[0] unless mp3file.nil? Mp3Info.open(mp3file) do |info| artist = info.tag.artist album = info.tag.album name = artist + "\t" + album digest = Digest::MD5.hexdigest(norm.normalize(name, :nfkd)) list[src] = "album-" + digest + ".jpg" end end end cachefiles = Dir.glob(ENV['HOME']+'/.cache/media-art/**.jpg') cache = cachefiles.collect{|x| File.basename(x)} found_count = 0 list.each_pair {|key, value| if cache.index(value) puts "cp " + cachefiles[cache.index(value)] + " to " + key+"/cover.jpg" img = Magick::ImageList.new(cachefiles[cache.index(value)]) img.resize_to_fit!(340,300).write(key+"/cover.jpg") found_count += 1 end } puts "hash mismatch is " + (cachefiles.size - found_count).to_s
画像が「アーティスト名+タブ+アルバム名」の nkfd ノーマライズ, なので MP3 のタグから情報を取得して, 画像を探すことに.