mirror of
https://github.com/btdig/dhtcrawler2.git
synced 2025-01-31 10:31: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
|
%% HTTP API
|
||||||
%%
|
%%
|
||||||
-module(api).
|
-module(api).
|
||||||
-export([search/3]).
|
-export([search/3,
|
||||||
|
today_top/3,
|
||||||
|
stats/3,
|
||||||
|
index/3]).
|
||||||
-compile(export_all).
|
-compile(export_all).
|
||||||
-define(TEXT(Fmt, Args), lists:flatten(io_lib:format(Fmt, Args))).
|
-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) ->
|
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\"}";
|
"{\"error\":\"null input\", \"suggest\":\"api/search?q=keyword\"}";
|
||||||
Keyword ->
|
Keyword ->
|
||||||
do_search(Keyword)
|
do_search(Keyword)
|
||||||
end,
|
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) ->
|
do_search(Keyword) ->
|
||||||
{Rets, Stats} = http_cache:search(Keyword),
|
{Rets, Stats} = http_cache:search(Keyword),
|
||||||
{_Found, Cost, Scanned} = Stats,
|
{_Found, Cost, Scanned} = Stats,
|
||||||
@ -27,6 +53,16 @@ do_search(Keyword) ->
|
|||||||
Body = ?TEXT("\"results\":[~s]}", [BodyList]),
|
Body = ?TEXT("\"results\":[~s]}", [BodyList]),
|
||||||
Tip ++ Body.
|
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([]) ->
|
||||||
"";
|
"";
|
||||||
format_search_result([First|Rest]) ->
|
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({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).
|
||||||
|
|
||||||
|
% {"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) ->
|
format_one_result(Hash, Name, Files, Announce, CTime, ShowAll) ->
|
||||||
?TEXT("{\"hash\":\"~s\", \"name\":\"~s\", \"created_at\":~p, \"req\":~p,",
|
SortedFiles = http_common:sort_file_by_size(Files),
|
||||||
[Hash, Name, CTime, Announce]) ++
|
?TEXT("{\"hash\":\"~s\",\"name\":\"~s\",\"created_at\":~p,\"req\":~p,\"file_cnt\":~p,",
|
||||||
"\"files\":[" ++ format_files(Files, ShowAll) ++ "]}".
|
[Hash, Name, CTime, Announce, length(Files)]) ++
|
||||||
|
"\"files\":[" ++ format_files(SortedFiles, ShowAll) ++ "]}".
|
||||||
|
|
||||||
format_files([], _) ->
|
format_files([], _) ->
|
||||||
"";
|
"";
|
||||||
@ -51,7 +90,7 @@ format_files(Files, false) ->
|
|||||||
Max = ?MAX_FILE,
|
Max = ?MAX_FILE,
|
||||||
Sub = case length(Files) >= Max of
|
Sub = case length(Files) >= Max of
|
||||||
true ->
|
true ->
|
||||||
lists:sublist(Files, Max) ++ [{more, length(Files) - Max}];
|
lists:sublist(Files, Max);
|
||||||
false ->
|
false ->
|
||||||
Files
|
Files
|
||||||
end,
|
end,
|
||||||
@ -70,6 +109,21 @@ format_file({more, Len}) ->
|
|||||||
format_file({Name, Length}) ->
|
format_file({Name, Length}) ->
|
||||||
?TEXT("{\"name\":\"~s\",\"size\":~b}", [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) ->
|
test_search(Keyword) ->
|
||||||
Filename = ?TEXT("search_~s.html", [Keyword]),
|
Filename = ?TEXT("search_~s.html", [Keyword]),
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
start/4,
|
start/4,
|
||||||
start/1,
|
start/1,
|
||||||
page_temp/0,
|
page_temp/0,
|
||||||
get_search_keyword/1,
|
|
||||||
stop/0]).
|
stop/0]).
|
||||||
-record(state, {html_temp, httpid}).
|
-record(state, {html_temp, httpid}).
|
||||||
|
|
||||||
@ -91,12 +90,3 @@ code_change(_, _, State) ->
|
|||||||
handle_info(_, State) ->
|
handle_info(_, State) ->
|
||||||
{noreply, 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").
|
-define(CONTENT_TYPE, "Content-Type: text/html\r\n\r\n").
|
||||||
|
|
||||||
search(SessionID, _Env, Input) ->
|
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"};
|
{"", "invalid input"};
|
||||||
Key ->
|
Key ->
|
||||||
@ -64,7 +64,7 @@ format_stats_list(Stats) ->
|
|||||||
simple_html("", Body).
|
simple_html("", Body).
|
||||||
|
|
||||||
index(SessionID, _Env, Input) ->
|
index(SessionID, _Env, Input) ->
|
||||||
Body = case get_index_hash(Input) of
|
Body = case http_common:get_view_hash(Input) of
|
||||||
[] ->
|
[] ->
|
||||||
"invalid hash";
|
"invalid hash";
|
||||||
Hash ->
|
Hash ->
|
||||||
@ -73,14 +73,6 @@ index(SessionID, _Env, Input) ->
|
|||||||
Response = simple_html("", Body),
|
Response = simple_html("", Body),
|
||||||
mod_esi:deliver(SessionID, [?CONTENT_TYPE, Response]).
|
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) ->
|
simple_html(Key, Body) ->
|
||||||
?TEXT(crawler_http:page_temp(), [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).
|
||||||
|
|
||||||
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\">
|
?TEXT("<li><p class=\"search-title\">
|
||||||
<a target='_blank' href=\"/e/http_handler:index?q=~s\">~s</a></p><ul>~s</ul>",
|
<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
|
?TEXT("<p class=\"search-detail\">Index at: ~s | File count: ~p | Query count: ~p
|
||||||
<a href=\"~s\" class=\"download-tip\"> Download</a></p>",
|
<a href=\"~s\" class=\"download-tip\"> Download</a></p>",
|
||||||
[format_time_string(CTime), length(Files), Announce, format_magnet(Hash)]).
|
[format_time_string(CTime), length(Files), Announce, format_magnet(Hash)]).
|
||||||
|
Loading…
Reference in New Issue
Block a user