1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
:- module(local_episodes, [local_episode//1,
episode_file/2,
open_episode_locally/1,
open_episode_online/1]).
:- use_module(library(dcg/basics)).
:- use_module(atom_dcg).
:- use_module(cfg).
local_episode_prefix --> string(_), "Detective_Conan_-_".
local_episode_prefix --> string(_), "Detective Conan - ".
local_episode_prefix --> string(_), "Detective-Conan-".
local_episode_prefix --> string(_), "detective_conan_".
nondigit --> [C], !, { \+ code_type(C, digit) }.
nondigit --> [].
zeroes --> "0".
zeroes --> "0", zeroes.
paddedint(N) --> integer(N).
paddedint(N) --> zeroes, integer(N).
local_episode -->
local_episode(_).
local_episode(N) -->
local_episode_prefix, paddedint(N), nondigit, string(_).
local_episode(N) -->
local_episode_prefix, paddedint(First), "-", paddedint(Last), nondigit, string(_),
{ Second is First + 1, between(Second, Last, N) }.
% Find episode on disk.
episode_file(N, F) :-
get_root(R),
get_glob(G),
atomic_list_concat([R, '/', G], G1),
expand_file_name(G1, F1),
( nonvar(N)
-> include(atom_phrase(local_episode(N)), F1, [F|_])
; include(atom_phrase(local_episode), F1, F2),
member(F, F2),
atom_phrase(local_episode(N), F)
).
% Open episode.
episode_url(N) --> { with_codes(get_url(U)) }, string(U), integer(N).
open_episode_locally(N) :- episode_file(N, F), !, win_shell(open, F).
open_episode_online(N) :- atom_phrase(episode_url(N), U), win_shell(open, U).
|