aboutsummaryrefslogtreecommitdiff
path: root/pl/episode_data.pl
diff options
context:
space:
mode:
authorJohn Ankarström <john@ankarstrom.se>2022-04-04 01:22:58 +0200
committerJohn Ankarström <john@ankarstrom.se>2022-04-04 01:22:58 +0200
commit0c996d6836defcc190a4f071437d95cb1f5140cb (patch)
tree3af475d4e6f8730279ade1fcd66cf7d33f950a3e /pl/episode_data.pl
parent12176831abde1f4545fae95ee9edd5688f8cc584 (diff)
downloadEpisodeBrowser-0c996d6836defcc190a4f071437d95cb1f5140cb.tar.gz
Rewrite episode data code.
TODO: Ignore duplicate hints.
Diffstat (limited to 'pl/episode_data.pl')
-rw-r--r--pl/episode_data.pl83
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,