ようやく分かった。
多分だけど Aggregator::Async が customfeed.handle で URI のデータが Feed であろうがなかろうが真を返していて、かつ Publish::OPML が$context->subscription->feeds を参照しているため、だと思う。
つまり相性の問題。
customfeed.handle で真を返された URI はパースが成功されたとみなされて、$context->subscription->delete_feed( $feed )されないので、もし対象が Feed で無かったとしても、パース出来なかった URI が残ってしまうっぽい。
Aggregator::Simple 使った場合で問題ないのは、パースできなかった場合、customfeed.handle が偽を返しているため。
あと customfeed.handle で問答無用で真を返してるタイプのプラグインはどれでもこうなると思う。
これの解決策としては、
- Aggregator::Simple 使う
- customfeed.handle で Feed を生成できなかった場合に削除するようにする
- Filter 系のプラグイン書いてパースされなかった URI を削除するようにする
ぐらい。
なんか面倒だなぁ。
#FIXME