平衡点
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 のタグから情報を取得して, 画像を探すことに.
[ツッコミを入れる]