mirror of
https://github.com/btdig/dhtcrawler2.git
synced 2025-01-18 20:21:37 +00:00
complete all http uri to json api
This commit is contained in:
parent
980c6cad57
commit
3b0e5701c8
@ -5,20 +5,46 @@
|
||||
%% HTTP API
|
||||
%%
|
||||
-module(api).
|
||||
-export([search/3]).
|
||||
-export([search/3,
|
||||
today_top/3,
|
||||
stats/3,
|
||||
index/3]).
|
||||
-compile(export_all).
|
||||
-define(TEXT(Fmt, Args), lists:flatten(io_lib:format(Fmt, Args))).
|
||||
-define(MAX_FILE, 10).
|
||||
-define(MAX_FILE, 3).
|
||||
-define(CONTENT_TYPE, "Content-Type: application/json\r\n\r\n").
|
||||
|
||||
% search?q=keyword
|
||||
search(SessionID, _Env, Input) ->
|
||||
Res = case crawler_http:get_search_keyword(Input) of
|
||||
Res = case http_common:get_search_keyword(Input) of
|
||||
[] ->
|
||||
"{\"error\":\"null input\", \"suggest\":\"api/search?q=keyword\"}";
|
||||
Keyword ->
|
||||
do_search(Keyword)
|
||||
end,
|
||||
mod_esi:deliver(SessionID, ["Content-Type: application/json\r\n\r\n", Res]).
|
||||
mod_esi:deliver(SessionID, [?CONTENT_TYPE, Res]).
|
||||
|
||||
% today_top
|
||||
today_top(SessionID, _Env, _Input) ->
|
||||
Rets = http_cache:today_top(),
|
||||
BodyList = format_search_result(Rets),
|
||||
Body = ?TEXT("{\"results\":[~s]}", [BodyList]),
|
||||
mod_esi:deliver(SessionID, [?CONTENT_TYPE, Body]).
|
||||
|
||||
% index?q=hash
|
||||
index(SessionID, _Env, Input) ->
|
||||
Body = case http_common:get_view_hash(Input) of
|
||||
[] ->
|
||||
"{\"error\":\"invalid input\"}";
|
||||
Hash ->
|
||||
format_view(Hash)
|
||||
end,
|
||||
mod_esi:deliver(SessionID, [?CONTENT_TYPE, Body]).
|
||||
|
||||
stats(SessionID, _Env, _Input) ->
|
||||
Response = format_stats_list(http_cache:stats()),
|
||||
mod_esi:deliver(SessionID, [?CONTENT_TYPE, Response]).
|
||||
%%
|
||||
do_search(Keyword) ->
|
||||
{Rets, Stats} = http_cache:search(Keyword),
|
||||
{_Found, Cost, Scanned} = Stats,
|
||||
@ -27,6 +53,16 @@ do_search(Keyword) ->
|
||||
Body = ?TEXT("\"results\":[~s]}", [BodyList]),
|
||||
Tip ++ Body.
|
||||
|
||||
format_view(Hash) ->
|
||||
case db_frontend:search_one(Hash) of
|
||||
{} -> "{\"error\":\"not found\"}";
|
||||
Torrent ->
|
||||
format_torrent_detail(Torrent)
|
||||
end.
|
||||
|
||||
format_torrent_detail(Torrent) ->
|
||||
format_one_result(Torrent, true).
|
||||
|
||||
format_search_result([]) ->
|
||||
"";
|
||||
format_search_result([First|Rest]) ->
|
||||
@ -39,10 +75,13 @@ format_one_result({single, Hash, {Name, Length}, Announce, CTime}, ShowAll) ->
|
||||
format_one_result({multi, Hash, {Name, Files}, Announce, CTime}, ShowAll) ->
|
||||
format_one_result(Hash, Name, Files, Announce, CTime, ShowAll).
|
||||
|
||||
% {"hash":"abc", "name":"abc", "created_at":time, "req":count, "file_cnt":cnt,
|
||||
% "files":[{"name":"abc", "size":size}]}
|
||||
format_one_result(Hash, Name, Files, Announce, CTime, ShowAll) ->
|
||||
?TEXT("{\"hash\":\"~s\", \"name\":\"~s\", \"created_at\":~p, \"req\":~p,",
|
||||
[Hash, Name, CTime, Announce]) ++
|
||||
"\"files\":[" ++ format_files(Files, ShowAll) ++ "]}".
|
||||
SortedFiles = http_common:sort_file_by_size(Files),
|
||||
?TEXT("{\"hash\":\"~s\",\"name\":\"~s\",\"created_at\":~p,\"req\":~p,\"file_cnt\":~p,",
|
||||
[Hash, Name, CTime, Announce, length(Files)]) ++
|
||||
"\"files\":[" ++ format_files(SortedFiles, ShowAll) ++ "]}".
|
||||
|
||||
format_files([], _) ->
|
||||
"";
|
||||
@ -51,7 +90,7 @@ format_files(Files, false) ->
|
||||
Max = ?MAX_FILE,
|
||||
Sub = case length(Files) >= Max of
|
||||
true ->
|
||||
lists:sublist(Files, Max) ++ [{more, length(Files) - Max}];
|
||||
lists:sublist(Files, Max);
|
||||
false ->
|
||||
Files
|
||||
end,
|
||||
@ -70,6 +109,21 @@ format_file({more, Len}) ->
|
||||
format_file({Name, Length}) ->
|
||||
?TEXT("{\"name\":\"~s\",\"size\":~b}", [Name, Length]).
|
||||
|
||||
format_stats_list(Stats) ->
|
||||
{TorSum, StatsList} = Stats,
|
||||
?TEXT("{\"total\":~p, \"stats\":[", [TorSum]) ++
|
||||
do_format_stats(StatsList) ++ "]}".
|
||||
|
||||
do_format_stats([]) ->
|
||||
"";
|
||||
do_format_stats([First|Rest]) ->
|
||||
S = [format_stats(First)] ++ ["," ++ format_stats(Stats) || Stats <- Rest],
|
||||
lists:flatten(S).
|
||||
|
||||
format_stats({DaySec, Processed, RecvQuery, Updated, New}) ->
|
||||
?TEXT("{\"day_secs\":~p, \"recv\":~p, \"process\":~p, \"update\":~p, \"new\":~p}",
|
||||
[DaySec, RecvQuery, Processed, Updated, New]).
|
||||
|
||||
%%
|
||||
test_search(Keyword) ->
|
||||
Filename = ?TEXT("search_~s.html", [Keyword]),
|
||||
|
@ -15,7 +15,6 @@
|
||||
start/4,
|
||||
start/1,
|
||||
page_temp/0,
|
||||
get_search_keyword/1,
|
||||
stop/0]).
|
||||
-record(state, {html_temp, httpid}).
|
||||
|
||||
@ -91,12 +90,3 @@ code_change(_, _, State) ->
|
||||
handle_info(_, State) ->
|
||||
{noreply, State}.
|
||||
|
||||
get_search_keyword(Input) ->
|
||||
D = urldecode:decode(Input),
|
||||
ReqList = httpd:parse_query(D),
|
||||
case proplists:get_value("q", ReqList) of
|
||||
undefined ->
|
||||
"";
|
||||
Keyword ->
|
||||
Keyword
|
||||
end.
|
||||
|
30
src/http_front/http_common.erl
Normal file
30
src/http_front/http_common.erl
Normal file
@ -0,0 +1,30 @@
|
||||
%%
|
||||
%% http_common.erl
|
||||
%% Kevin Lynx
|
||||
%% 07.22.2013
|
||||
%%
|
||||
-module(http_common).
|
||||
-export([get_search_keyword/1,
|
||||
get_view_hash/1,
|
||||
sort_file_by_size/1]).
|
||||
|
||||
get_search_keyword(Input) ->
|
||||
get_q_arg(Input).
|
||||
|
||||
get_view_hash(Input) ->
|
||||
get_q_arg(Input).
|
||||
|
||||
get_q_arg(Input) ->
|
||||
D = urldecode:decode(Input),
|
||||
ReqList = httpd:parse_query(D),
|
||||
case proplists:get_value("q", ReqList) of
|
||||
undefined ->
|
||||
"";
|
||||
Arg ->
|
||||
Arg
|
||||
end.
|
||||
|
||||
sort_file_by_size(Files) ->
|
||||
lists:sort(fun({_, L1}, {_, L2}) ->
|
||||
L1 > L2
|
||||
end, Files).
|
@ -17,7 +17,7 @@
|
||||
-define(CONTENT_TYPE, "Content-Type: text/html\r\n\r\n").
|
||||
|
||||
search(SessionID, _Env, Input) ->
|
||||
{K, Body} = case crawler_http:get_search_keyword(Input) of
|
||||
{K, Body} = case http_common:get_search_keyword(Input) of
|
||||
[] ->
|
||||
{"", "invalid input"};
|
||||
Key ->
|
||||
@ -64,7 +64,7 @@ format_stats_list(Stats) ->
|
||||
simple_html("", Body).
|
||||
|
||||
index(SessionID, _Env, Input) ->
|
||||
Body = case get_index_hash(Input) of
|
||||
Body = case http_common:get_view_hash(Input) of
|
||||
[] ->
|
||||
"invalid hash";
|
||||
Hash ->
|
||||
@ -73,14 +73,6 @@ index(SessionID, _Env, Input) ->
|
||||
Response = simple_html("", Body),
|
||||
mod_esi:deliver(SessionID, [?CONTENT_TYPE, Response]).
|
||||
|
||||
get_index_hash(Input) ->
|
||||
case string:equal(string:substr(Input, 1, 2), "q=") of
|
||||
true ->
|
||||
string:substr(Input, 3);
|
||||
false ->
|
||||
[]
|
||||
end.
|
||||
|
||||
simple_html(Key, Body) ->
|
||||
?TEXT(crawler_http:page_temp(), [Key, Body]).
|
||||
|
||||
@ -111,9 +103,10 @@ format_one_result({multi, Hash, {Name, Files}, Announce, CTime}, ShowAll) ->
|
||||
format_one_result(Hash, Name, Files, Announce, CTime, ShowAll).
|
||||
|
||||
format_one_result(Hash, Name, Files, Announce, CTime, ShowAll) ->
|
||||
SortedFiles = http_common:sort_file_by_size(Files),
|
||||
?TEXT("<li><p class=\"search-title\">
|
||||
<a target='_blank' href=\"/e/http_handler:index?q=~s\">~s</a></p><ul>~s</ul>",
|
||||
[Hash, Name, format_files(Files, ShowAll)]) ++
|
||||
[Hash, Name, format_files(SortedFiles, ShowAll)]) ++
|
||||
?TEXT("<p class=\"search-detail\">Index at: ~s | File count: ~p | Query count: ~p
|
||||
<a href=\"~s\" class=\"download-tip\"> Download</a></p>",
|
||||
[format_time_string(CTime), length(Files), Announce, format_magnet(Hash)]).
|
||||
|
Loading…
Reference in New Issue
Block a user