diff options
Diffstat (limited to 'pl/episode_data.pl')
-rw-r--r-- | pl/episode_data.pl | 83 |
1 files changed, 35 insertions, 48 deletions
diff --git a/pl/episode_data.pl b/pl/episode_data.pl index 1d8fdef..08201f7 100644 --- a/pl/episode_data.pl +++ b/pl/episode_data.pl @@ -1,8 +1,6 @@ -:- module(episode_data, [retract_episode/1, - episode_count/1, - lookup_episode/3, - lookup_episode_local/3, - lookup_episode_remote/3]). +:- module(episode_data, [ensure_episode_data/0, + retract_episode/1, + episode_count/1]). :- use_module(library(clpfd)). :- use_module(library(dcg/basics)). @@ -12,7 +10,8 @@ :- use_module(library(persistency)). :- use_module(atom_dcg). -:- persistent episode_name_data(episode:integer, name:atom, data:list). +:- persistent episode_title(episode:integer, title:atom). +:- persistent episode_datum(episode:integer, key:atom, value:atom). attach :- absolute_file_name('episode_data.db', F, [access(write)]), @@ -21,29 +20,24 @@ attach :- detach :- db_detach. -% Interface. - -episode_count(N) :- - ensure, - setof(E, N^D^lookup_episode_local(E,N,D), Es), - last(Es, N). - -lookup_episode(Ep, Name, Data) :- lookup_episode_local(Ep, Name, Data), !. -lookup_episode(Ep, Name, Data) :- lookup_episode_remote(Ep, Name, Data). - -lookup_episode_local(Ep, Name, Data) :- - episode_name_data(Ep, Name, Data). -lookup_episode_remote(Ep, Name, Data) :- - update, !, - episode_name_data(Ep, Name, Data). +ensure_episode_data :- episode_title(Ep, _), !. +ensure_episode_data :- fetch_episode_data. retract_episode(Ep) :- - ( episode_name_data(Ep, _, _) - -> retractall_episode_name_data(Ep, _, _) + ( episode_title(Ep, _) + -> retractall_episode_title(Ep, _) + ; true + ), + ( episode_datum(Ep, 'Hint', _) + -> retractall_episode_datum(Ep, 'Hint', _) ; true ). -% Parsing. +episode_count(N) :- + setof(E, T^episode_title(E,T), Es), + last(Es, N). + +% Remote data retrieval. padding(Ep) --> { Ep #< 10 }, "00". padding(Ep) --> { Ep #>= 10, Ep #< 100 }, "0". @@ -52,22 +46,20 @@ padding(Ep) --> { Ep #>= 100 }. episode_number(Ep) --> padding(Ep), integer(Ep). episode_number(Ep) --> padding(Ep), integer(Ep), "WPS", integer(_). -% Database updating. - -ensure :- episode_name_data(_, _, _), !. -ensure :- update. - -update :- - findall(Ep-Name-Data, (remote_row(R), - row_episode(R, Ep), - row_episode_name_data(R, Ep, Name, Data)), - ENDs), !, - maplist(update, ENDs). - -update(Ep-Name-Data) :- episode_name_data(Ep, Name, Data), !. -update(Ep-Name-Data) :- assert_episode_name_data(Ep, Name, Data). - -% Remote retrieval. +fetch_episode_data :- + findall(Ep-Title-Hint, + (remote_row(R), + row_episode_title_hint(R, Ep, Title, Hint)), + Data), + maplist(set_episode_data, Data). + +set_episode_data(Ep-Title-Hint) :- + ( episode_title(Ep, Title), ! + ; assert_episode_title(Ep, Title) + ), + ( episode_datum(Ep, 'Hint', Hint), ! + ; assert_episode_datum(Ep, 'Hint', Hint) + ). remote_row(R) :- catch(http_load_html( @@ -77,16 +69,11 @@ remote_row(R) :- fail), !, xpath(R0, //tr, R). -row_episode(R, Ep) :- - xpath(R, td(index(1),text), T), - atom_phrase(episode_number(Ep), T). - -row_episode_name_data(R, Ep, Name, Data) :- +row_episode_title_hint(R, Ep, Title, Hint) :- xpath(R, td(index(1),text), T), atom_phrase(episode_number(Ep), T), - xpath(R, td(index(2),text), Name), - xpath(R, td(index(3),text), Hint), - Data = ['Hint'(Hint)]. + xpath(R, td(index(2),text), Title), + xpath(R, td(index(3),text), Hint). http_load_html(URL, DOM) :- setup_call_cleanup(http_open(URL, In, |