vpk 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +22 -0
- data/bin/vpk +50 -0
- data/lib/vpk.rb +12 -5
- data/lib/vpk/version.rb +1 -1
- metadata +6 -4
- data/README.md +0 -5
data/README.rdoc
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
= vpk
|
2
|
+
VPK File Format Parser (extract and archive)
|
3
|
+
|
4
|
+
= Require
|
5
|
+
- Ruby 1.9
|
6
|
+
|
7
|
+
= What is VPK
|
8
|
+
VPK means "Valve Pak".
|
9
|
+
Description is here https://developer.valvesoftware.com/wiki/VPK
|
10
|
+
|
11
|
+
= Install
|
12
|
+
gem install vpk
|
13
|
+
|
14
|
+
= Usage
|
15
|
+
Extract from your vpk file
|
16
|
+
require 'vpk'
|
17
|
+
VPK::VPKFile.new("./path_to.vpk").extract_to("./")
|
18
|
+
|
19
|
+
Archive your directory
|
20
|
+
require 'vpk'
|
21
|
+
VPK::VPKFile.archive("./path_to_dir").write_to("./archive.vpk")
|
22
|
+
|
data/bin/vpk
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
#!/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
# Author: kimoto
|
4
|
+
require 'vpk'
|
5
|
+
require 'optparse'
|
6
|
+
|
7
|
+
options = {}
|
8
|
+
|
9
|
+
opt = OptionParser.new
|
10
|
+
opt.banner = "#{File.basename($0)} [options] <dirname or vpkfile>"
|
11
|
+
opt.on("-c", "create archive"){ |v| options[:mode] = :archive }
|
12
|
+
opt.on("-x", "extract mode"){ |v| options[:mode] = :extract }
|
13
|
+
opt.parse! ARGV
|
14
|
+
|
15
|
+
#VPK::VPKFile.logger = Logger.new(STDERR)
|
16
|
+
|
17
|
+
case options[:mode]
|
18
|
+
when :archive
|
19
|
+
path = ARGV.shift
|
20
|
+
|
21
|
+
# trim last slashes
|
22
|
+
path = path.gsub(/(\/)+$/, "")
|
23
|
+
|
24
|
+
if File.directory? path
|
25
|
+
after_path = path + ".vpk"
|
26
|
+
if File.exists? after_path
|
27
|
+
STDERR.puts "already exist file: #{after_path}"
|
28
|
+
exit(1)
|
29
|
+
else
|
30
|
+
puts "compressed #{path} -> #{after_path}"
|
31
|
+
VPK::VPKFile.archive(path).write_to(after_path)
|
32
|
+
end
|
33
|
+
else
|
34
|
+
STDERR.puts "not directory: #{path}"
|
35
|
+
exit(1)
|
36
|
+
end
|
37
|
+
when :extract
|
38
|
+
path = ARGV.shift
|
39
|
+
if File.exists? path
|
40
|
+
VPK::VPKFile.new(path).extract_to("./")
|
41
|
+
puts "extracted!: #{path}"
|
42
|
+
else
|
43
|
+
STDERR.puts "not found specified file: #{path}"
|
44
|
+
exit(1)
|
45
|
+
end
|
46
|
+
else
|
47
|
+
puts opt.help
|
48
|
+
exit(1)
|
49
|
+
end
|
50
|
+
|
data/lib/vpk.rb
CHANGED
@@ -3,6 +3,7 @@ require 'logger'
|
|
3
3
|
require 'zlib'
|
4
4
|
require 'find'
|
5
5
|
require 'stringio'
|
6
|
+
require 'fileutils'
|
6
7
|
|
7
8
|
module VPK
|
8
9
|
class VPKHeader
|
@@ -30,7 +31,7 @@ module VPK
|
|
30
31
|
|
31
32
|
def self.load_from(path)
|
32
33
|
entry = VPKDirectoryEntry.new
|
33
|
-
entry.payload = File.
|
34
|
+
entry.payload = File.binread(path)
|
34
35
|
entry.full_path = path
|
35
36
|
entry
|
36
37
|
end
|
@@ -106,7 +107,7 @@ module VPK
|
|
106
107
|
@@logger.info "try to read #{entry.full_path} (#{entry.entry_length} bytes)"
|
107
108
|
entry.read_payload(io, end_of_header + @header.directory_length)
|
108
109
|
unless entry.valid?
|
109
|
-
@@logger.error "crc is invalid:
|
110
|
+
@@logger.error "crc is invalid: @entry.payload:#{Zlib.crc32(entry.payload)} != @crc:#{entry.crc.inspect}"
|
110
111
|
raise VPKFileInvalidCRCError
|
111
112
|
end
|
112
113
|
@@logger.info "done"
|
@@ -174,7 +175,7 @@ module VPK
|
|
174
175
|
next if File.directory?(f)
|
175
176
|
entry = VPKDirectoryEntry.new
|
176
177
|
entry.full_path = f.gsub(/^#{target_dir}(\/)?/, "")
|
177
|
-
entry.payload = File.
|
178
|
+
entry.payload = File.binread(f)
|
178
179
|
vpk.dir_entries << entry
|
179
180
|
}
|
180
181
|
vpk
|
@@ -232,7 +233,7 @@ module VPK
|
|
232
233
|
|
233
234
|
while true
|
234
235
|
path = read_string(io)
|
235
|
-
@@logger.debug "path = #{path.inspect}"
|
236
|
+
@@logger.debug "path = #{path.inspect} (#{path.unpack('H*')})"
|
236
237
|
break if path == ""
|
237
238
|
|
238
239
|
while true
|
@@ -257,9 +258,15 @@ module VPK
|
|
257
258
|
total_offset = 0
|
258
259
|
to_file_struct_tree.each{ |extension, path_map|
|
259
260
|
write_string(io, extension)
|
261
|
+
|
260
262
|
path_map.each{ |path, entries|
|
261
263
|
@@logger.debug "write path: #{path.inspect}"
|
262
|
-
|
264
|
+
if path == "."
|
265
|
+
write_string(io, " ")
|
266
|
+
else
|
267
|
+
write_string(io, path)
|
268
|
+
end
|
269
|
+
|
263
270
|
entries.each{ |entry|
|
264
271
|
write_string(io, entry.file)
|
265
272
|
|
data/lib/vpk/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vpk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,19 +9,21 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-19 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: VPK File Format Parser (extract and archive)
|
15
15
|
email:
|
16
16
|
- sub+peerler@gmail.com
|
17
|
-
executables:
|
17
|
+
executables:
|
18
|
+
- vpk
|
18
19
|
extensions: []
|
19
20
|
extra_rdoc_files: []
|
20
21
|
files:
|
21
22
|
- .gitignore
|
22
23
|
- Gemfile
|
23
|
-
- README.
|
24
|
+
- README.rdoc
|
24
25
|
- Rakefile
|
26
|
+
- bin/vpk
|
25
27
|
- lib/vpk.rb
|
26
28
|
- lib/vpk/version.rb
|
27
29
|
- vpk.gemspec
|