HDDレコーダーの RD-XS37 の DVDドライブが壊れてしまったので、HDDに溜まった番組を移すことができなくなってしまいました。
保証期間はとっくに切れてるので、修理を依頼すると2〜3万円もかかるみたいなので、そろそろ地デジ対応の装置を買わないといけないかなぁ…と思ったのですが、どうやら東芝のHDDレコーダーのネットdeダビングという機能をハックして、録画した番組を PC にコピーすることができるようです。
どうやら次のような仕組みになっているようです。
- RDの高速ダビングでダビング先として「ネットワーク」を選択。
- RDがブロードキャストで同一セグメント内に別のRDを探す。
- RDが Anonymous FTPで、リモートRDから情報取得&リモートRDに番組転送。
RD機の検索
最初のブロードキャストは NetBIOS っぽいものらしいです。
- http://www.usefullcode.net/2007/03/netbios.html
- http://www.geocities.co.jp/SiliconValley-Cupertino/9578/vrd2.zip
この辺を参考に Ruby で書いてみました。
require 'socket' $ftp_server = "192.168.11.5" $rd_name = "VIRTUAL-RD" UDPSocket.do_not_reverse_lookup = true class Packet attr_reader :dev, :tid, :name, :ftpserver def initialize(dev, tid, name, ftpserver) @dev, @tid, @name, @ftpserver = dev, tid, name, ftpserver end def serialize ftpip = @ftpserver.split(".").map(&:to_i).pack("C4") [@dev, @tid, 0x8500, 0, 1, 0, 0, 32, Packet.encode_name(@name), 0, 32, 1, 0, 0, 6, 0, ftpip].pack("CCn5Ca32Cn6a4") end def self.parse(str) data = str.unpack("CCn5Ca32") self.new 0, data[1], decode_name(data[8]), nil end def self.encode_name(str) ("%-15s\0"%str).each_byte.map{|c|[(c>>4)+0x41,(c&0xf)+0x41].pack("CC")}.join end def self.decode_name(str) str.each_byte.each_slice(2).map{|c1,c2|((c1-0x41)<<4|c2-0x41).chr}.join.chop end end def main(ftp_server, rd_name) s = UDPSocket.new s.bind "<any>", 137 while true data, peer = s.recvfrom 1024 req = Packet.parse data peer_ip, peer_port = peer.values_at(3, 1) printf "tid=%d, peer_name=%s, peer_ip=%s, peer_port=%d\n", req.tid, req.name, peer_ip, peer_port if $DEBUG dev = 1 # 1:HDD, 2:DVD, ... res = Packet.new dev, req.tid, rd_name, ftp_server s.send res.serialize, 0, peer_ip, peer_port end end main($ftp_server, $rd_name) if __FILE__ == $0
FTP
あとは Anonymous FTP をたてておけばいいです。
今回は pure-ftpd を使いました。
# aptitude install pure-ftpd # cd /etc/pure-ftpd/conf # echo yes > AnonymousOnly # echo yes > AutoRename # echo yes > DontResolve # echo no > NoAnonymous
あと、/home/ftp/$xml$status.xml というファイルを次の内容で作っておきます。
<?xml version="1.0" encoding="shift_jis"?> <status> <dubbing>ready</dubbing> <accept_dubbing>ready</accept_dubbing> <device0_remain>167772160</device0_remain> <device0_recorded>0</device0_recorded> <device0_title_remain>350</device0_title_remain> <device1_remain>167772160</device1_remain> <device1_recorded>0</device1_recorded> <device1_title_remain>350</device1_title_remain> </status>
これで pure-ftpd を動かしておけば、/home/ftp の下に $netdubbing$dev0.dat という名前で MPEG ファイルが作られます。番組名や番組情報もこのファイル中に入ってます。
転送速度
LP画質の15分番組(277MB)を転送するのに 3分22秒かかりました。1.4 MB/sec くらい出てるみたいです。