読者です 読者をやめる 読者になる 読者になる

RD-XS37 ネットdeダビング

Ruby

HDDレコーダーの RD-XS37 の DVDドライブが壊れてしまったので、HDDに溜まった番組を移すことができなくなってしまいました。
保証期間はとっくに切れてるので、修理を依頼すると2〜3万円もかかるみたいなので、そろそろ地デジ対応の装置を買わないといけないかなぁ…と思ったのですが、どうやら東芝のHDDレコーダーのネットdeダビングという機能をハックして、録画した番組を PC にコピーすることができるようです。

どうやら次のような仕組みになっているようです。

  1. RDの高速ダビングでダビング先として「ネットワーク」を選択。
  2. RDがブロードキャストで同一セグメント内に別のRDを探す。
  3. RDが Anonymous FTPで、リモートRDから情報取得&リモートRDに番組転送。

RD機の検索

最初のブロードキャストは NetBIOS っぽいものらしいです。

この辺を参考に 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 くらい出てるみたいです。