19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
# File 'lib/dolit.rb', line 19
def self.parse(url, user_agent = nil)
pResult = FFI::MemoryPointer.new :pointer
ret = video_parse(url, user_agent, pResult)
return if ret != 0
pos = 0
res = {}
pVideoResult = pResult.read_pointer
res[:site_id] = pVideoResult.get_int(pos)
pos += 4
res[:time_length] = pVideoResult.get_long(pos)
pos += 8
res[:framCount] = pVideoResult.get_long(pos)
pos += 8
res[:total_size] = pVideoResult.get_long(pos)
pos += 8
res[:v_name] = pVideoResult.get_pointer(pos).read_string
pos += 4
res[:tags] = pVideoResult.get_pointer(pos).read_string
pos += 4
count = pVideoResult.get_int(pos)
pos += 4
pTypePtr = pVideoResult.get_pointer(pos)
pos += 4
if count > 0
p = 0
res[:strs] = []
count.times do |i|
type_hash = {}
type_hash[:str_type] = pTypePtr.get_pointer(p).read_string
p += 4
segCount = pTypePtr.get_int(p)
p += 4
pSegPtr = pTypePtr.get_pointer(p)
p += 4
if segCount > 0
type_hash[:files] = []
segPinterPos = 0
segCount.times do |j|
file_hash = {}
file_hash[:file_size] = pSegPtr.get_long(segPinterPos)
segPinterPos += 8
file_hash[:seconds] = pSegPtr.get_int(segPinterPos)
segPinterPos += 4
file_hash[:file_no] = pSegPtr.get_int(segPinterPos)
segPinterPos += 4
file_hash[:url] = pSegPtr.get_pointer(segPinterPos).read_string
segPinterPos += 4
type_hash[:files][j] = file_hash
end
end
res[:strs][i] = type_hash
end
end
video_freevideoresult(pVideoResult)
res
end
|