Added a minimalistic README.
[amarok_sonynw.git] / walkgirl / sonynwput.rb
blob9f1171a2b702a02450b58006f0c687abbc03e03f
1 #!/usr/bin/ruby
2 # == Synopsis
4 # sonynwput: scrambles an MPEG audio file for Sony Network Walkman
6 # == Usage
8 # sonynwput [OPTION] ... MPGFILE
10 # -h, --help:
11 #    show help
13 # -k 0xDEADBEEF, --dvid 0xDEADBEEF:
14 #    use this device id key to scramble
16 # -d DEVICEPATH, --device DEVICEPATH
17 #    put file on the device mounted at DEVICEPATH
19 # -s N, --slot N
20 #    scrambles for slot number N
22 # -o FILE, --out FILE
23 #    outputs to FILE instead of stdout
25 # MPGFILE: the file to scramble.
27 # It is mandatory to give slot. If DEVICEPATH is not given
28 # or there is no mp3fm/dvid.dat file on the device, a dvid
29 # needs also be given.
31 # == Comments
33 # File scrambled for slot number N has to be put in
34 # printf("OMGAUDIO\\10F%02x\\1%07x.OMA", N >> 8, N)
35 # on the device in order to be descrambled correctly.
37 # Currently the tool does its best to also copy tags in
38 # the way the device could read.
39 # However, please note that not all encodings are
40 # covered by the device charset.
42 # Tested with NW-507.
44 # == Bugs
46 # - VBR file support hasn't been tested yet and possibly is flaky or doesn't work at all.
47 # - Broken mpeg files produce OMA files which don't play at all.
49 # == Author
51 # Please forward flowers and flames to RafaƂ Rzepecki <divided.mind@gmail.com>.
53 require 'Walkman'
54 require 'getoptlong'
55 require 'rdoc/usage'
57 opts = GetoptLong.new(
58   [ "--slot",   "-s", GetoptLong::REQUIRED_ARGUMENT ],
59   [ "--dvid",   "-k", GetoptLong::REQUIRED_ARGUMENT ],
60   [ "--device", "-d", GetoptLong::REQUIRED_ARGUMENT ],
61   [ "--out",    "-o", GetoptLong::REQUIRED_ARGUMENT ],
62   [ "--help",   "-h", GetoptLong::NO_ARGUMENT ]
65 slot = nil
66 dvid = nil
67 device = nil
68 outfile = STDOUT
70 opts.each do |opt, arg|
71   case opt
72   when '--help'
73     RDoc::usage
74   when '--slot'
75     slot = arg.to_i
76   when '--dvid'
77     dvid = arg.hex
78   when '--device'
79     device = arg
80   when '--out'
81     outfile = File.new(arg, 'w+')
82   end
83 end
85 mp3file = ARGV[0]
87 if device and not dvid
88   f = File.new(File.join([device, "mp3fm", "dvid.dat"]))
89   f.seek(10)
90   dvid = f.read(4).unpack("N")[0]
91 end
93 if device
94   dir = sprintf "10f%02x", slot >> 8
95   fname = sprintf "1%07x.oma", slot
96   outfile = File.new(File.join([device, "omgaudio", dir, fname]), 'w+')
97 end
99 if !slot || !dvid || !outfile || !mp3file
100   RDoc::usage("Usage")
103 mp3 = Walkman::Oma.new(slot, dvid).fromMp3(mp3file)
104 puts "Scrambling... "
105 mp3.write(outfile)