FlexGet의 최대 난관이었던 설정파일 작성 방법을 정리해봅니다. 다만, 초보자의 경우 글 하나로 완료할 만만한 작업은 절대 아니고, 저 역시도 초보자에 불과하기 때문에 한번에 모든 것을 정리할 능력도 없습니다. 그래서 이번 글의 목표는 아주 기초적이지만 적어도 FlexGet을 직접 구동해보면서 연습하기에는 충분한 최소 설정을 만들어보는 것입니다.

실용 가능한 설정 파일은 FlexGet 설정파일 만들기 2편, 3편의 내용까지 습득해야 작성할 수 있으며, 본문의 말미에 링크를 남겨두었습니다.


1. task 정의 - FlexGet이 말하는 방법 배우기

task는 해외 포럼에서 흔히 쓰는 용어입니다만, 처음 FlexGet을 배울 때는 용어가 영어로 되어 있으니 헷갈렸습니다. 예시에 사용된 용어가 사전적으로 "할 일"을 말하는 것인지, 문법에 의해서 그 자리에 task라는 단어를 반드시 써야하는지 잘 모르겠더라구요. 그래서 일단 한동안은 문법에 포함되지 않은(key가 아닌) 용어는 한글로 작성합니다.


설정 파일 작성에 필요한 가장 기본적인 이해는 "할 일"을 FlexGet에게 알려주는 방법입니다. 도란도란 말로 전하면 좋겠지만 아직은 불가능하고, 사람이 기계의 눈높이에 맞춰서 "할 일"을 구조적으로 정의하는 수 밖에요. 기계 입장에서 한번 생각해봅시다.


우선 FlexGet은 "할 일"을 "입력", "필터", "출력" 이라는 세가지 구성요소의 집합으로 인식합니다. FlexGet 홈페이지와 포럼에서는 input, filter, output이라는 용어를 사용합니다.

일상적으로 일어나는 일로 예를 들어보겠습니다.

- 사람의 일과
  저는 오늘 퇴근버스 안에서 로또 홈페이지에 접속해서 xxx 회차의 당첨번호를 찾아서 수첩에 적을껍니다. 편의점에 들려서 칫솔, 홈런볼, 삼각김밥을 구입하고, 서점에서 영화잡지 8월호를 살껍니다.

- 기계의 일과

1
2
3
4
5
6
7
8
9
10
11
12
13
tasks:
  로또번호_수집:
    입력: 나눔로또 홈페이지
    필터: xxx회차 당첨번호
    출력: 수첩에 기록
  장보기:
    입력: 편의점
    필터: 칫솔, 홈런볼, 삼각김밥
    출력: 구입
  잡지구입:
    입력: 서점
    필터: 영화잡지 8월호
    출력: 구입
cs

부수적인 내용은 쏙 빼고 명료하게 정리가 되었지요.
여기서 주목할 것은 "할 일"은 제목을 가진다는 것, "입력", "필터", "출력" 딱 세가지 구성요소로 이루어지면서, 동시에 세가지 요소를 모두 갖춰야한다는 것입니다.


그런데 조금 까다로운 것은 "입력", "필터", "출력"을 구분하는 키워드가 하나가 아니라는 점입니다. "입력" 대상, "필터" 기준, "출력" 방법을 전달하는 역할을 하지만 구성요소의 구체적인 기능에 따라 키워드가 달라집니다. 즉, 개념적으로는 위 예시가 적절하시만 실제로는 아래 예시와 훨씬 비슷하게 설정파일이 만들어집니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
tasks:
  로또번호_수집:
    홈페이지: 나눔로또 홈페이지
    검색: xxx회차 당첨번호
    기록: 수첩
  장보기:
    방문: 편의점
    제품명으로고르기: 칫솔, 홈런볼, 삼각김밥
    현금: 결제
  잡지구입:
    방문: 서점
    내용확인: 영화잡지 8월호
    신용카드: 결제
cs


이제 실제 코드로 넘어가기 전에 한 단계 더 정리해봅니다.

- tasks 는 "할 일" 모음을 정의하는 키워드입니다.
tasks 뒤의 콜론( : ) 도 중요한 의미가 있습니다. 키워드(여기서는 tasks)의 기능에 대한 정의가 계속 이어진다는 뜻입니다. 이어지는 내용은 다름아닌 "할 일" 들이지요. 언제까지 이어지냐면 같은 열에서 시작하는 다른 키워드가 나올 때 까지 이어집니다. 위 예시에서는 1열에서 시작되는 키워드는 tasks가 유일하니까 끝까지 이어지겠네요.

- "할 일"은 tasks: 다음 행에 써 줍니다.
"할 일 모음"의 일부이므로 공손하게 두 칸을 떨어져서 따라가야 합니다. 즉, "할 일 모음"을 의미하는 tasks가 1열부터 시작하니까, "할 일"은 3열부터 시작해야 합니다. 그런데 여기도 : 이 붙었네요. 로또번호_수집 "할 일"도 관련내용이 이어지나봅니다. 같은 열에서 시작하는 키워드가 발견될 때 까지니까 장보기: 직전 까지인 5행 까지 로또번호_수집:의 일부겠네요.

그런데, "할 일"의 제목은 고정된 키워드가 없고 마음대로 정하면 됩니다. 심지어 한글로 정해도 됩니다.

- "할 일"의 구성 요소는 "할 일" 다음 행에 써 줍니다.
앞서 배운대로 "할 일" 보다 두 칸 떨어져야 합니다. 즉, 5열 부터 써줍니다. 아까도 두칸, 이번에도 두칸.. 항상 두칸입니다. 세칸 안되고, 네칸 안되고, 탭 안됩니다. 절대두칸을 기억합시다.

한편, 이 구성 요소들은 세부 기능에 따라 전용 키워드가 따로 있고, 플러그인이라고 부릅니다. 앞으로 이 플러그인의 기능을 알아가는 것이 설정파일 작성의 모든 것이될껍니다.


2. 바로 동작하는 최초 설정파일 만들기 - FlexGet에게 첫 마디 걸기

쩝.. 예시가 너무 길었던 것 같습니다. 실제 바로 동작하는 설정파일을 작성해봅시다.

FlexGet은 아래 순서대로 디렉토리를 검색해서 처음 발견된 config.yml 파일의 설정을 사용합니다.
  - flexget 명령이 실행된 현재 디렉토리
  - virtualenv 에 설치했을 경우 바로 그 virtualenv 디렉토리
  - ~/.flexget  (윈도우즈는 C:\Users\사용자이름\flexget\)
  - ~/.config/flexget

마음에 드는 곳에 config.yml 파일을 만들고 아래 내용을 넣고 저장해줍니다.

1
2
3
4
5
tasks:
  trailers:
    apple_trailers: 480p
    accept_all: yes
    download: /home/torrent/trailers
cs

여기서 trailers 가 "할 일"의 제목이고, 구성 요소는 다음과 같습니다.
apple_trailers 라는 "입력" 플러그인을 사용했고, "필터"는 accept_all , "출력"은 download 입니다.

구성요소의 기능은 아래와 같습니다.

- apple_trailers
"입력" 플러그인인데, 아이튠즈의 영화 트레일러 rss를 읽어와서 "엔트리"를 만들어주는 기능입니다. "엔트리"의 의미는 일다 넘어갑니다. 480p는 apple_trailers 플러그인의 옵션이니 지금은 관심두지 않습니다.

- accept_all
"필터" 플러그인입니다. 이름이 말해주듯 특정 품목을 고르지 않고 싹쓸이 하겠다는 괴씸한 필터네요. 토렌트 rss에는 잘 쓰이지 않고, youtube 재생목록 등을 다운받을 때 쏠쏠히 사용됩니다. 일단은 가장 간단한 필터니까 우선 이걸로 시작하지요.

- download
"출력" 플러그인입니다. FlexGet이 직접 "엔트리"에 적혀있는 URL에 접속해서 파일을 받아옵니다. 오른쪽에 저장할 디렉토리가 정의되어 있네요.

종합하면 아이튠즈 트레일러 rss의 내용을 읽어와서 /home/torrent/trailers 디렉토리에 싹쓸이 다운로드를 합니다. "할 일" 실행 전 아래 rss 주소에 접속해서 FlexGet이 무얼 읽고, 무얼 다운받을지 예상한번 해보시지요.
https://trailers.apple.com/trailers/home/rss/newtrailers.rss



3. 설정파일 테스트 명령

마음의 준비가 되었으면, 이제 아래 명령으로 첫 실행을 해봅시다. 애플 트레일러 rss의 내용물이 용량이 그리 많지는 않지만 다운로드는 한참 걸립니다. 그래서 FlexGet에게 실제 다운로드는 하지 않고 연습만 하자고 알려줍니다.

./bin/은 flexget 이 설치된 디렉토리로 바꿔주셔야 합니다.

1
$ ./bin/flexget --test execute --tasks trailers
cs

--test 옵션이 실제 다운로드는 하지 말라는 의미입니다. execute는 "할 일 모음"을 실행하라는 명령이고, execute의 옵션으로 붙은 --tasks trailers는 trailers "할 일"만 콕 찍어서 실행하라는 의미입니다.

아래와 비슷한 메시지가 출력된다면 설정이 제대로 된 것입니다. 시각 등 불필요한 내용을 일부 정리했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ ./bin/flexget --test execute --tasks trailers
# "입력"에 2개의 엔트리가 있네요.
VERBOSE  details    trailers  Produced 2 entries.
# 'Death Wish - Trailer'와 'Novitiate - Trailer' 엔트리가 ACCEPT 되었습니다. 필터를 통과했다는 뜻입니다.
VERBOSE  task       trailers  ACCEPTED: `Death Wish - Trailer` by accept_all plugin
VERBOSE  task       trailers  ACCEPTED: `Novitiate - Trailer` by accept_all plugin
# 필터를 통과한 두 엔트리를 다운로드 받습니다.
INFO     download   trailers  Would download: Death Wish - Trailer
INFO     download   trailers  Would download: Novitiate - Trailer
# 2개의 엔트리가 ACCEPT 되었습니다. Rejected, Undecided, Failed는 따로 이야기합시다.
VERBOSE  details    trailers  Summary - Accepted: 2 (Rejected: 0 Undecided: 0 Failed: 0)
# 다운로드 완료된 파일을 지정된 디렉토리로 이동합니다.
INFO     download   trailers  Would write `Death Wish - Trailer` to `/home/torrent/trailers`
INFO     download   trailers  Would write `Novitiate - Trailer` to `/home/torrent/trailers`
cs

만약 위와 같이 download (현재 설정의 "출력" 플러그인)까지 제대로 실행되지 않는다면 앞으로 돌아가서 원인을 찾아보세요. 여기서 에러가 난다면 다음 단계로 진행하는 것은 의미가 없습니다.

아직 설명되지 않은 용어가 몇개 있네요. 엔트리만 정리하고 일단 넘어갑니다. 엔트리는 "입력"에 포함되어 있는 항목 하나하나를 FlexGet이 인식하는 양식을 말합니다. 위 예제에서는 'Death Wish - Trailer'와 'Novitiate -Trailer'가 바로 엔트리입니다. 물론 이 글을 따라서 실행해본 시점에는 애플 트레일러의 최신 내용이 갱신되었으니 아마도 바뀌어 있겠지요.

명령어에 --dump 옵션을 더하면 엔트리를 직접 확인할 수 있습니다.

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
$ ./bin/flexget --test execute --tasks trailers --dump
VERBOSE  details    trailers  Produced 2 entries.
VERBOSE  task       trailers  ACCEPTED: `Death Wish - Trailer` by accept_all plugin
VERBOSE  task       trailers  ACCEPTED: `Novitiate - Trailer` by accept_all plugin
INFO     download   trailers  Would download: Death Wish - Trailer
INFO     download   trailers  Would download: Novitiate - Trailer
VERBOSE  details    trailers  Summary - Accepted: 2 (Rejected: 0 Undecided: 0 Failed: 0)
INFO     download   trailers  Would write `Death Wish - Trailer` to `/home/torrent/trailers`
INFO     download   trailers  Would write `Novitiate - Trailer` to `/home/torrent/trailers`
# --dump 옵션에 의해서 아래 내용이 추가됩니다. Accept된 2개의 엔트리입니다.
-- Accepted: ---------------------------
# 엔트리 1
title            : Death Wish - Trailer
url              : http://movietrailers.apple.com/movies/mgm/death-wish/death-wish-trailer-1-_h480p.mov
original_url     : http://movietrailers.apple.com/movies/mgm/death-wish/death-wish-trailer-1-_h480p.mov
accepted_by      : accept_all
apple_trailers_name: Trailer
content-length   : 19162747
download_auth    : <flexget.plugins.input.apple_trailers.AppleTrailersHeader object at 0x7fe37424c090>
filename         : death-wish-trailer-1-_h480p.mov
genres           : Thriller
location         : /home/torrent/trailers/death-wish-trailer-1-_h480p.mov
mime-type        : video/quicktime
movie_name       : Death Wish
movie_studio     : MGM Studios
quality          : <LazyField - value will be determined when it is accessed>
release_date     : 2017-11-22
task             : trailers
 
# 엔트리 2
title            : Novitiate - Trailer
url              : http://movietrailers.apple.com/movies/sony/novitiate/novitiate-trailer-1_h480p.mov
original_url     : http://movietrailers.apple.com/movies/sony/novitiate/novitiate-trailer-1_h480p.mov
accepted_by      : accept_all
apple_trailers_name: Trailer
content-length   : 15002249
download_auth    : <flexget.plugins.input.apple_trailers.AppleTrailersHeader object at 0x7fe37424c3d0>
filename         : novitiate-trailer-1_h480p.mov
genres           : Drama
location         : /home/torrent/trailers/novitiate-trailer-1_h480p.mov
mime-type        : video/quicktime
movie_name       : Novitiate
movie_studio     : Sony Pictures Classics
quality          : <LazyField - value will be determined when it is accessed>
release_date     : 2017-10-27
task             : trailers
cs

즉, 엔트리는 FlexGet이 "입력"의 내용을 읽어서 정리한 데이터베이스 입니다. 각 엔트리는 여러개의 필드로 구성되어 있으며, 필드의 종류는 "입력" 플러그인에 따라서 각기 달라집니다. 필드는 콜론 왼쪽에 있는 title, url, filename, genres 등을 말합니다.

모든 것을 이해할 필요는 없지만, 엔트리와 필드의 개념은 대충이나마 기억해두는 것이 좋습니다. 나중에 필터를 구성할 때 이 필드의 내용을 사용하기 때문입니다.



4. 필터 제대로 사용해보기 - regexp 플러그인

accept_all "필터"는 유튜브 재생목록, 팟캐스트 등 구독형 서비스를 다운받을 때는 유용합니다만, 아마도 대부분의 경우 그다지 유용한 필터가 아닐껍니다. 실상 필터라기 보다는 필터를 생략하겠다는 의미이기도 하구요. 게다가 구독형 서비스는 다운로드 보다는 전용 프로그램을 사용하는 것이 훨씬 편하기 때문에 쓸 일이 별로 없기도 합니다.

"필터" 플러그인은 정말 많은 종류가 있지만 결국엔 regexp 플러그인을 주로 사용하실껍니다. 정규식(정규표현식)을 사용하는 필터인데, 정규식을 잘 몰라도 아주 간단한 규칙만 배워두면 일단 기초적인 자동 다운로드 서버는 구축할 수 있고, 쓰면서 차차 조금씩 배워서 보강하면 됩니다. 정규식이 무슨 뜻인지 모르신다고 해도 지금은 상관 없습니다.

다시 한번 애플 트레일러 rss에 접속해서 다운로드 받을 영상의 제목을 복사한 후 설정 파일의 필터를 아래와 같이 수정합니다. 저는 현제 최신 영상인 "Death Wish - Trailer"를 가지고 테스트 해보겠습니다. 이후 계속되는 내용과의 연계를 위해서 제목에 Trailer가 포함된 영상 중 하나를 골라서 실습해보시면 좋겠습니다.

1
2
3
4
5
6
7
8
9
10
tasks:
  trailers:
    # "입력"
    apple_trailers: 480p
    # "필터"
    regexp:
      accept:
        - 'Death Wish - Trailer'
    # "출력"
    download: /home/torrent/trailers
cs

"필터"가 regexp로 바뀌었고, regexp의 구성요소는 두칸 룰을 충실히 따르고 있습니다. 다운받을 영상의 제목인 Death With - Trailers를 작은 따옴표로 감쌌는데, 작은 따옴표가 필요한 경우와 필요 없는 경우가 있습니다. 검색할 문구에 [ ] { } % 중 한 문자가 포함되어 있을 경우에 작은 따옴표가 필요합니다. 실은 위 경우엔 필요가 없었지만 처음엔 그냥 무조껀 작은 따옴표를 쓰는 것이 에러를 방지하는 작은 팁이 됩니다. 나쁜 팁이지요. ^^

다만, 정규식을 제대로 사용할 경우엔 따옴표를 넣는 것이 되려 좀 번거로운 단점을 가져오기도 합니다. \d, \s 등 이스케이프 문자를 중복으로 써줘야 하거든요. \\d, \\s 처럼 말입니다. 무슨 말인지 모르시는 분들은 일단은 그냥 넘어갑니다.

아래 명령으로 테스트해봅니다.

1
2
3
4
5
6
7
8
9
10
$ ./bin/flexget --test execute --tasks trailers
INFO     manager               Test mode, creating a copy from database ...
INFO     manager               Test database created
VERBOSE  task_queue            There are 1 tasks to execute. Shutdown will commence when they have completed.
VERBOSE  details     trailers  Produced 20 entries.
VERBOSE  task        trailers  ACCEPTED: `Death Wish - Trailer` by regexp plugin because regexp 'Death Wish - Trailer' matched field 'title'
INFO     download    trailers  Would download: Death Wish - Trailer
VERBOSE  details     trailers  Summary - Accepted: 1 (Rejected: 0 Undecided: 19 Failed: 0)
INFO     download    trailers Would write `Death Wish - Trailer` to `/home/torrent/trailers`
INFO     manager               Removed test database
cs

총 20개의 엔트리 중 1개는 Accepted, 19개는 Undecided로 처리했고, 제가 지정한 Death Wish - Trailer를 다운로드 한다고 하네요.. 그나저나 이제 보니 하필 예제가 Death Wish(유언)라니 기분이 좀 별로네요. 이제와서 고치기는 귀찮습니다.

이 시점에 다시 정리할 것이 있습니다. 앞서 그냥 무시하고 넘어갔던 Summary에 등장하는 Accepted, Rejected, Undecided, Failed 의 정의입니다. 이 중 Accepted, Rejected, Undecided가 필터와 연관이 있습니다.
- Accepted: "필터"에 의해서 "출력"을 실행하도록 지정된 엔트리를 말합니다.
- Rejected: "필터"에 의해서 콕 찍어서 "출력"을 실행하지 않도록 지정된 엔트리를 말합니다.
- Undecided: "필터"에 걸리지 않은 엔트리이며, "출력"을 실행하지 않습니다. Rejected와 차이가 없어보이지만 다음 예제를 보시면 차이가 딱 느껴지실껍니다.
- Failed: "필터"에 의해서 Accept 되었지만 "출력" 과정에서 에러가 발생한 엔트리입니다.


이제 Rejected가 필요한 이유를 확인해보겠습니다.

애플 트레일러에는 Trailer 이외에 Clip, Featurette 등이 있는데 이 중에서 Trailer만 받을 경우 regexpt의 accept에 Trailer라고 적어주면 됩니다. 그런데, Death Wish는 제외하고 싶을 때 바로 Reject가 사용됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
tasks:
  trailers:
    # "입력"
    apple_trailers: 480p
    # "필터"
    regexp:
      accept:
        - 'Trailer'
      reject:
        - 'Death Wish'
    # "출력"
    download: /home/torrent/trailerscs
cs

이래 명령으로 새 설정파일을 실행해봅니다.

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
$ ./bin/flexget --test execute --tasks trailers
INFO     manager               Test mode, creating a copy from database ...
INFO     manager               Test database created
VERBOSE  task_queue            There are 1 tasks to execute. Shutdown will commence when they have completed.
VERBOSE  details     trailers  Produced 20 entries.
VERBOSE  task        trailers  ACCEPTED: `Death Wish - Trailer` by regexp plugin because regexp 'Trailer' matched field 'title'
VERBOSE  task        trailers  ACCEPTED: `Novitiate - Trailer` by regexp plugin because regexp 'Trailer' matched field 'title'
VERBOSE  task        trailers  ACCEPTED: `A Taxi Driver - Trailer` by regexp plugin because regexp 'Trailer' matched field 'title'
VERBOSE  task        trailers  ACCEPTED: `4 Days in France - Trailer` by regexp plugin because regexp 'Trailer' matched field 'title'
VERBOSE  task        trailers  ACCEPTED: `A Boy Called Po - Trailer` by regexp plugin because regexp 'Trailer' matched field 'title'
VERBOSE  task        trailers  ACCEPTED: `Deep - Trailer` by regexp plugin because regexp 'Trailer' matched field 'title'
VERBOSE  task        trailers  ACCEPTED: `Its Not Yet Dark - Trailer` by regexp plugin because regexp 'Trailer' matched field 'title'
VERBOSE  task        trailers  ACCEPTED: `Shot - Trailer` by regexp plugin because regexp 'Trailer' matched field 'title'
VERBOSE  task        trailers  ACCEPTED: `It - Trailer 2` by regexp plugin because regexp 'Trailer' matched field 'title'
VERBOSE  task        trailers  ACCEPTED: `Dolores - Trailer` by regexp plugin because regexp 'Trailer' matched field 'title'
VERBOSE  task        trailers  ACCEPTED: `Machines - Trailer` by regexp plugin because regexp 'Trailer' matched field 'title'
VERBOSE  task        trailers  ACCEPTED: `Clash - Trailer` by regexp plugin because regexp 'Trailer' matched field 'title'
VERBOSE  task        trailers  REJECTED: `Death Wish - Trailer` by regexp plugin because regexp 'Death Wish' matched field 'title'
INFO     download    trailers  Would download: Novitiate - Trailer
INFO     download    trailers  Would download: A Taxi Driver - Trailer
INFO     download    trailers  Would download: 4 Days in France - Trailer
INFO     download    trailers  Would download: A Boy Called Po - Trailer
INFO     download    trailers  Would download: Deep - Trailer
INFO     download    trailers  Would download: Its Not Yet Dark - Trailer
INFO     download    trailers  Would download: Shot - Trailer
INFO     download    trailers  Would download: It - Trailer 2
INFO     download    trailers  Would download: Dolores - Trailer
INFO     download    trailers  Would download: Machines - Trailer
INFO     download    trailers  Would download: Clash - Trailer
VERBOSE  details     trailers  Summary - Accepted: 11 (Rejected: 1 Undecided: 8 Failed: 0)
INFO     download    trailers  Would write `Novitiate - Trailer` to `/home/torrent/trailers`
INFO     download    trailers  Would write `A Taxi Driver - Trailer` to `/home/torrent/trailers`
INFO     download    trailers  Would write `4 Days in France - Trailer` to `/home/torrent/trailers`
INFO     download    trailers  Would write `A Boy Called Po - Trailer` to `/home/torrent/trailers`
INFO     download    trailers  Would write `Deep - Trailer` to `/home/torrent/trailers`
INFO     download    trailers  Would write `Its Not Yet Dark - Trailer` to `/home/torrent/trailers`
INFO     download    trailers  Would write `Shot - Trailer` to `/home/torrent/trailers`
INFO     download    trailers  Would write `It - Trailer 2` to `/home/torrent/trailers`
INFO     download    trailers  Would write `Dolores - Trailer` to `/home/torrent/trailers`
INFO     download    trailers  Would write `Machines - Trailer` to `/home/torrent/trailers`
INFO     download    trailers  Would write `Clash - Trailer` to `/home/torrent/trailers`
INFO     manager               Removed test database
cs

Death Wish가 Reject되고 11개의 엔트리가 Accept 되었으며, Trailer가 포함되지 않은 8개의 엔트리는 Undecided로 분류되었네요. 즉, Trailer를 포함한 모든 엔트리를 다운로드하되, reject로 지정한 Death Wish는 제외되었습니다. 추가로 regexp의 reject는 accept보다 강하다는 것을 알게되었네요.

이제 필터를 어떻게 구성할지 구상이 떠오를껍니다. 특정 프로그램을 다운로드 하되 어떤 해상도는 제외한다던지..


한 단계만 더 나가보겠습니다. 바로 regexp 플러그인을 조금 더 정규식답게 써보는 것입니다. 그러나 정규식은 간단히 설명할 수 있는 것이 아닙니다. 능력도 안되구요. 그래서 아주 살짝 최소한의 지식만 가지고 갑시다.

이런 상황을 가정해보지요. Death라는 영상을 받고 싶은데, Trailer라는 릴그룹이 배포한 것만 골라서 받고 싶은겁니다. regexp의 accept와 reject 옵션만으로는 불가능합니다. (현존하는 모든 릴그룹을 reject하는 근성을...) 이럴 때 필요한 것이 정규식입니다. 정말 간단한 정규식 문법만 사용해서 필터를 이렇게 써 봅니다. 그리고 하는김에 Death 뿐 아니라 Novitiate 도 받아봅시다.

1
2
3
4
5
6
7
8
9
10
11
tasks:
  trailers:
    # "입력"
    apple_trailers: 480p
    # "필터"
    regexp:
      accept:
        - 'Death.*Trailer'
        - 'Novitiate.*Trailer'
    # "출력"
    download: /home/torrent/trailers
cs

정규식을 모르는 분들은 Death와 Trailer 사이의 .* 가 좀 어리둥절할껍니다. 그냥 모든 문자라고 생각하시지요. Death와 Trailer 사이에 어떤 문자(띄워쓰기,부호 포함)가 몇개 들어있던 신경쓰지 않으니, Death와 Trailer가 순서대로 등장하는 모든 엔트리를 accept하라는 의미입니다.

그리고 Novitiate를 추가하는 것은 아주 간단했네요. 그냥 accept에 한 줄 추가해주면 되는 것이었습니다. reject에도 동일합니다.

만약 릴그룹명이 프로그램명보다 앞에 나오면 어쩌냐구요? '릴그룹.*프로그램명' 이렇게 쓰시면 되지요. 이런건 어떨까요? '프로그램명.*1080p.*릴그룹명' 넵, 엔트리 필드에 기록된 문구와 순서만 맞으면 됩니다.

사람마다 생각은 다를 수 있습니다만, 제 생각에는 regexp 플러그인을 사용하실 때 accept 조건은 최대한 촘촘하게 원하는 영상을 걸러낼 수 있도록 작성하시고, reject는 극히 예외적인 경우를 걸러내는데 사용하시는 것이 좋습니다. 정식 릴이 아니라는 의미의 internal을 걸러낸다던지...

물론 촘촘한 필터를 만드시려면 정규식을 조금은 더 공부하셔야 합니다. 그러나 .* 만으로도 일단 당장 사용가능한 필터를 만들 수 있습니다. 가끔씩 불필요한 파일을 받는 일이 생길 수는 있습니다만, 일단 쓰면서 조금씩 더 공부하고 개선하는게 덜 힘들고 재미난 방법이 아닐까 생각합니다.



5. 정리

여기까지 따라오셨으면 이제 이해하셨어야 하는 내용입니다.

- FlexGet의 설정파일 위치

- "할 일"은 "입력", "필터", "출력" 으로 구성되며, 모든 요소가 다 갖춰져야한다는 것

- "할 일 목록" 작성 방법

- 두칸 규칙과 : (콜론)의 역할 + 콜론의 한계는 동등 레벨의 키워드가 등장할 때 까지

- 엔트리와 필드

- regexp 플러그인 기초 사용방법


추가로 본문에 등장하지는 않았지만, 언젠가는 알아야할 내용을 간략히 정리해봅니다.

- 키워드의 값에 { } [ ] %가 포함되어 있을 경우 '작은 따옴표'로 감싸준다. regexp에서 검색식 작성할 때 잘 모르겠으면 작은 따옴표로 감싸주라고 했던 말 기억하시지요? 진짜 이유가 이것입니다.

- 숫자를 TEXT로 사용할 때도 '작은 따옴표'로 감싸주는데, 초보 단계에서는 숫자를 숫자로 사용할 일이 없을 것 같습니다. 일단 [ ] { } % 및 숫자가 값에 들어갈 경우 '작은 따옴표'를 쓴다.. 정도로 기억하시지요.

- Top-Level Keys (앞서 Key는 모두 키워드라고 표현했습니다)

아래 여섯 키워드는 항상 최상위에 위치해야 합니다. 어떤 경우에도 들여쓸 일이 없고, 들여쓰면 안됩니다. 물론 예제에 나온 키워드는 tasks 하나 밖에 없고, 모든 탑 레벨 키워드를 다 사용할 필요는 없습니다. 즉, tasks만 필수이며, 나머지는 옵션이니 차차 배워가시지요. 별도 글로 정리하겠습니다.

tasks
templates
schedule
web_werver
variables
irc

자연스레 상기 여섯 키워드를 제외한 모든 키워드는 최하 한단계 이상 들여쓰기가 되어야합니다.



6. 앞으로 더 알아가야 할 것

앞으로 더 알아야할 내용을 정리했습니다. 적어도 아래에 필수로 되어있는 두 단계는 거쳐야 FlexGet을 원활히 사용할 수 있습니다. 조만간 추가 글 완료하겠습니다.

- 필수: 설정파일 만들기 2편 - rss("입력") 및 토렌트 클라이언트("출력") 연동
  RSS + Deluge 연동 - http://notme.tistory.com/63
  RSS + Transmission 연동 - http://notme.tistory.com/91

- 필수: 설정파일 만들기 3편 - 주기적으로 task 자동 실행하기: http://notme.tistory.com/88

- 옵션: youtube 채널, 재생목록 자동 다운로드 하기: http://notme.tistory.com/84

- 옵션: 다운로드 시 파일명 자동 변경 -

- 옵션: FlexGet Web UI 사용하기 - (작성중) http://notme.tistory.com/89