24 |
open BasicSocket |
open BasicSocket |
25 |
open TcpBufferedSocket |
open TcpBufferedSocket |
26 |
open Md4 |
open Md4 |
27 |
|
|
28 |
open CommonClient |
open CommonClient |
29 |
open CommonComplexOptions |
open CommonComplexOptions |
30 |
open CommonTypes |
open CommonTypes |
40 |
| Bitzi_ticket of string |
| Bitzi_ticket of string |
41 |
|
|
42 |
and bitzi_ticket = { |
and bitzi_ticket = { |
43 |
mutable bitzi_state : bitzi_state; |
mutable bitzi_state : bitzi_state; |
44 |
mutable bitzi_uids : Uid.t list; |
mutable bitzi_uids : Uid.t list; |
45 |
bitzi_size : int64; |
bitzi_size : int64; |
46 |
} |
} |
48 |
let add_uid ticket uid = |
let add_uid ticket uid = |
49 |
if not (List.mem uid ticket.bitzi_uids) then |
if not (List.mem uid ticket.bitzi_uids) then |
50 |
ticket.bitzi_uids <- uid :: ticket.bitzi_uids |
ticket.bitzi_uids <- uid :: ticket.bitzi_uids |
51 |
|
|
52 |
let add_uids ticket uids = |
let add_uids ticket uids = |
53 |
List.iter (add_uid ticket) uids |
List.iter (add_uid ticket) uids |
54 |
|
|
55 |
(* |
(* |
56 |
|
|
57 |
To find equivalent UIDs on different networks, we can use www.bitzi.com: |
To find equivalent UIDs on different networks, we can use www.bitzi.com: |
58 |
|
|
59 |
http://ticket.bitzi.com/rdf/BCLD3DINKJJRGYGHIYAX7HG5HXSM3XNH.E4IHTEMZIJE4NBCWSBZ6TIWQTDGYYXVPGIRJ5KQ |
http://ticket.bitzi.com/rdf/BCLD3DINKJJRGYGHIYAX7HG5HXSM3XNH.E4IHTEMZIJE4NBCWSBZ6TIWQTDGYYXVPGIRJ5KQ |
60 |
http://ticket.bitzi.com/rdf/urn:sha1:BCLD3DINKJJRGYGHIYAX7HG5HXSM3XNH |
http://ticket.bitzi.com/rdf/urn:sha1:BCLD3DINKJJRGYGHIYAX7HG5HXSM3XNH |
61 |
|
|
62 |
# let t = Xml.parse_file "xml1";; |
# let t = Xml.parse_file "xml1";; |
63 |
val t : Xml.xml = |
val t : Xml.xml = |
64 |
Xml.XML ("rdf:RDF", |
Xml.XML ("rdf:RDF", |
80 |
("dc:format", "audio/mp3"); ("bz:fileLength", "4577608"); |
("dc:format", "audio/mp3"); ("bz:fileLength", "4577608"); |
81 |
("bz:fileFirst20Bytes", "4944330200000000006E54543200000F00546865"); |
("bz:fileFirst20Bytes", "4944330200000000006E54543200000F00546865"); |
82 |
|
|
83 |
|
|
84 |
("bz:fileMD5", "NTUHNJDIJH6IDHQ5GPOSUFVSCM"); |
("bz:fileMD5", "NTUHNJDIJH6IDHQ5GPOSUFVSCM"); |
85 |
("bz:fileUUHash", "mcR96OHbEJLjxV4eudW9YDMW8q4"); |
("bz:fileUUHash", "mcR96OHbEJLjxV4eudW9YDMW8q4"); |
86 |
("bz:fileED2kHash", "83d6c3bef2732d310bd9105e850c7864"); |
("bz:fileED2kHash", "83d6c3bef2732d310bd9105e850c7864"); |
87 |
|
|
88 |
|
|
89 |
("mm:duration", "286743"); ("bz:audioBitrate", "128"); |
("mm:duration", "286743"); ("bz:audioBitrate", "128"); |
90 |
("bz:audioSamplerate", "44100"); ("bz:audioChannels", "1"); |
("bz:audioSamplerate", "44100"); ("bz:audioChannels", "1"); |
91 |
("bz:audioSha1", "LQAIDHEMU43QFN5JNYFAVFEYZI3TOZ6L")], |
("bz:audioSha1", "LQAIDHEMU43QFN5JNYFAVFEYZI3TOZ6L")], |
110 |
|
|
111 |
*) |
*) |
112 |
|
|
113 |
let make_request url = |
let make_request url = |
114 |
|
|
115 |
let module H = Http_client in |
let module H = Http_client in |
116 |
let r = { |
let r = { |
117 |
H.basic_request with |
H.basic_request with |
118 |
|
|
119 |
H.req_url = Url.of_string url; |
H.req_url = Url.of_string url; |
120 |
H.req_user_agent = "Mozilla/5.0 (Linux 2.4.19-16mdk i686; U) Opera 6.11 [en]"; |
H.req_user_agent = "Mozilla/5.0 (Linux 2.4.19-16mdk i686; U) Opera 6.11 [en]"; |
121 |
H.req_referer = None; |
H.req_referer = None; |
122 |
H.req_request = H.GET; |
H.req_request = H.GET; |
123 |
} in |
} in |
124 |
|
|
125 |
r |
r |
126 |
|
|
127 |
let progress _ _ = () |
let progress _ _ = () |
134 |
List.iter (fun xml -> |
List.iter (fun xml -> |
135 |
let (header, args, _) = Xml.xml_of xml in |
let (header, args, _) = Xml.xml_of xml in |
136 |
match header with |
match header with |
137 |
"rdf:Description" -> |
"rdf:Description" -> |
138 |
(* |
(* |
139 |
("bz:fileMD5", "NTUHNJDIJH6IDHQ5GPOSUFVSCM"); |
("bz:fileMD5", "NTUHNJDIJH6IDHQ5GPOSUFVSCM"); |
140 |
("bz:fileUUHash", "mcR96OHbEJLjxV4eudW9YDMW8q4"); |
("bz:fileUUHash", "mcR96OHbEJLjxV4eudW9YDMW8q4"); |
141 |
("bz:fileED2kHash", "83d6c3bef2732d310bd9105e850c7864"); |
("bz:fileED2kHash", "83d6c3bef2732d310bd9105e850c7864"); |
170 |
List.iter (fun xml -> |
List.iter (fun xml -> |
171 |
let (header, args, _) = Xml.xml_of xml in |
let (header, args, _) = Xml.xml_of xml in |
172 |
match header with |
match header with |
173 |
"rdf:Description" -> |
"rdf:Description" -> |
174 |
(* |
(* |
175 |
("bz:fileMD5", "NTUHNJDIJH6IDHQ5GPOSUFVSCM"); |
("bz:fileMD5", "NTUHNJDIJH6IDHQ5GPOSUFVSCM"); |
176 |
("bz:fileUUHash", "mcR96OHbEJLjxV4eudW9YDMW8q4"); |
("bz:fileUUHash", "mcR96OHbEJLjxV4eudW9YDMW8q4"); |
177 |
("bz:fileED2kHash", "83d6c3bef2732d310bd9105e850c7864"); |
("bz:fileED2kHash", "83d6c3bef2732d310bd9105e850c7864"); |
203 |
|
|
204 |
let request_possible_bitzi_ticket file sha1 = |
let request_possible_bitzi_ticket file sha1 = |
205 |
lprintf "***** request_possible_bitzi_ticket *****\n"; |
lprintf "***** request_possible_bitzi_ticket *****\n"; |
206 |
Http_client.wget_string |
Http_client.wget_string |
207 |
(make_request |
(make_request |
208 |
(Printf.sprintf "http://ticket.bitzi.com/rdf/urn:sha1:%s" |
(Printf.sprintf "http://ticket.bitzi.com/rdf/urn:sha1:%s" |
209 |
(Sha1.to_string sha1))) |
(Sha1.to_string sha1))) |
210 |
(parse_possible_bitzi_ticket sha1 file) progress |
(parse_possible_bitzi_ticket sha1 file) progress |
211 |
|
|
212 |
let parse_bitzi_lookup file s = |
let parse_bitzi_lookup file s = |
213 |
lprintf "******* parse_bitzi_lookup *******\n%s\n" |
lprintf "******* parse_bitzi_lookup *******\n%s\n" |
214 |
(String.escaped s); |
(String.escaped s); |
215 |
let rec iter pos = |
let rec iter pos = |
232 |
ticket.bitzi_state <- Bitzi_try_indirect_lookup; |
ticket.bitzi_state <- Bitzi_try_indirect_lookup; |
233 |
List.iter (fun uid -> |
List.iter (fun uid -> |
234 |
match Uid.to_uid uid with |
match Uid.to_uid uid with |
235 |
Sha1 sha1 -> |
Sha1 sha1 -> |
236 |
lprintf "Retrieve bitzi ticket\n"; |
lprintf "Retrieve bitzi ticket\n"; |
237 |
Http_client.wget_string |
Http_client.wget_string |
238 |
(make_request |
(make_request |
239 |
(Printf.sprintf "http://ticket.bitzi.com/rdf/urn:sha1:%s" |
(Printf.sprintf "http://ticket.bitzi.com/rdf/urn:sha1:%s" |
240 |
(Sha1.to_string sha1))) |
(Sha1.to_string sha1))) |
241 |
(parse_bitzi_ticket ticket) progress |
(parse_bitzi_ticket ticket) progress |
242 |
| _ -> () |
| _ -> () |
243 |
) ticket.bitzi_uids; |
) ticket.bitzi_uids; |
244 |
|
|
245 |
| Bitzi_try_indirect_lookup -> |
| Bitzi_try_indirect_lookup -> |
246 |
ticket.bitzi_state <- Bitzi_not_found; |
ticket.bitzi_state <- Bitzi_not_found; |
247 |
List.iter (fun uid -> |
List.iter (fun uid -> |
248 |
match Uid.to_uid uid with |
match Uid.to_uid uid with |
249 |
Ed2k ed2k -> |
Ed2k ed2k -> |
250 |
|
|
251 |
lprintf "********** Retrieve bitzi lookup by ed2k\n"; |
lprintf "********** Retrieve bitzi lookup by ed2k\n"; |
252 |
Http_client.wget_string |
Http_client.wget_string |
253 |
(make_request |
(make_request |
254 |
(Printf.sprintf "http://bitzi.com/lookup/urn:ed2k:%s" (Md4.to_string ed2k))) |
(Printf.sprintf "http://bitzi.com/lookup/urn:ed2k:%s" (Md4.to_string ed2k))) |
255 |
(parse_bitzi_lookup ticket) progress |
(parse_bitzi_lookup ticket) progress |
256 |
| Md5Ext md5ext -> |
| Md5Ext md5ext -> |
257 |
|
|
258 |
lprintf "********** Retrieve bitzi lookup by sig2dat\n"; |
lprintf "********** Retrieve bitzi lookup by sig2dat\n"; |
259 |
let md5ext = Md5Ext.to_string md5ext in |
let md5ext = Md5Ext.to_string md5ext in |
260 |
let len = String.length md5ext in |
let len = String.length md5ext in |
261 |
Http_client.wget_string |
Http_client.wget_string |
262 |
(make_request |
(make_request |
263 |
(Printf.sprintf "http://bitzi.com/lookup/sig2dat:%s" (String.sub md5ext 1 (len -2)))) |
(Printf.sprintf "http://bitzi.com/lookup/sig2dat:%s" (String.sub md5ext 1 (len -2)))) |
264 |
(parse_bitzi_lookup ticket) progress |
(parse_bitzi_lookup ticket) progress |