1:- module(omdb_query, [
2 retrieval_query/2,
3 search_query/2
4]). 5
6:- use_module(library(lists), [member/2, union/3]). 7:- use_module(library(apply), [maplist/2, maplist/3]). 8:- use_module(library(error), [must_be/2]). 9:- use_module(library(uri), [uri_encoded/3]). 10:- use_module(library(dcg/basics)). 11:- use_module(library(typedef)). 12
13
14/** <module> OMDB URL query construction
15This module is responsible for taking user supplied API parameters and
16constructing the URL responsible for the actual requests to the server.
17
18@author Ebrahim Azarisooreh
19@license MIT
20*/
21
22
23:- type retrieval_option --->
24 id
25 ;title
26 ;media_type
27 ;year
28 ;plot
29 ;tomatoes
30 ;callback
31 ;version.
32
33:- type search_option --->
34 title
35 ;media_type
36 ;year
37 ;page
38 ;callback
39 ;version.
40
41retrieval_option_set([
42 id=_,
43 title=_,
44 media_type=_,
45 year=_,
46 plot=_,
47 tomatoes=_,
48 callback=_,
49 version=_
50]).
51
52search_option_set([
53 title=_,
54 media_type=_,
55 year=_,
56 page=_,
57 callback=_,
58 version=_
59]).
60
61
65
66
67retrieval_query(Args, Template) :-
68 pretreat_params(retrieval, Args, Treated),
69 phrase(omdb_retrieval(Query), Treated),
70 format(atom(Template), '~w&~w&~w&~w&~w&~w&~w&~w', Query).
71
72search_query(Args, Template) :-
73 pretreat_params(search, Args, Treated),
74 phrase(omdb_search(Query), Treated),
75 format(atom(Template), '~w&~w&~w&~w&~w&~w', Query).
76
77pretreat_params(SetType, Params, Treated) :-
78 option_set(SetType, Set, OptionType),
79 union(Params, Set, Union),
80 maplist(set_default(OptionType), Union),
81 maplist(encode_atom, Union, Treated).
82
83set_default(OptionType, K=V) :-
84 must_be(OptionType, K),
85 ignore(V='').
86
87encode_atom(X=Y, X=E) :-
88 uri_encoded(fragment, Y, E).
89
90option_set(retrieval, Set, retrieval_option) :-
91 retrieval_option_set(Set).
92
93option_set(search, Set, search_option) :-
94 search_option_set(Set).
95
96
100
101
102omdb_retrieval([]) --> eos.
103omdb_retrieval([i=Value|Rest]) -->
104 [id=Value],
105 omdb_retrieval(Rest).
106
107omdb_retrieval([t=Value|Rest]) -->
108 [title=Value],
109 omdb_retrieval(Rest).
110
111omdb_retrieval(['type'=Value|Rest]) -->
112 [media_type=Value],
113 omdb_retrieval(Rest).
114
115omdb_retrieval([y=Value|Rest]) -->
116 [year=Value],
117 omdb_retrieval(Rest).
118
119omdb_retrieval([plot=Value|Rest]) -->
120 [plot=Value],
121 omdb_retrieval(Rest).
122
123omdb_retrieval([tomatoes=Value|Rest]) -->
124 [tomatoes=Value],
125 omdb_retrieval(Rest).
126
127omdb_retrieval([callback=Value|Rest]) -->
128 [callback=Value],
129 omdb_retrieval(Rest).
130
131omdb_retrieval([v=Value|Rest]) -->
132 [version=Value],
133 omdb_retrieval(Rest).
134
135
139
140
141omdb_search([]) --> eos.
142omdb_search([s=Value|Rest]) -->
143 [title=Value],
144 omdb_search(Rest).
145
146omdb_search(['type'=Value|Rest]) -->
147 [media_type=Value],
148 omdb_search(Rest).
149
150omdb_search([y=Value|Rest]) -->
151 [year=Value],
152 omdb_search(Rest).
153
154omdb_search([page=Value|Rest]) -->
155 [page=Value],
156 omdb_search(Rest).
157
158omdb_search([callback=Value|Rest]) -->
159 [callback=Value],
160 omdb_search(Rest).
161
162omdb_search([v=Value|Rest]) -->
163 [version=Value],
164 omdb_search(Rest)