summaryrefslogtreecommitdiff
path: root/feed/scripts/rss.scm
blob: a9005d5f1fcdd5db31503817844eb383d2b2ddb1 (about) (plain)
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
;;; Guile Feed --- Feed command-line interface.
;;; Copyright © 2018 Oleg Pykhalov <go.wigust@gmail.com>
;;;
;;; This file is part of Guile Feed.
;;;
;;; Guile Feed is free software; you can redistribute it and/or modify
;;; it under the terms of the GNU General Public License as published
;;; by the Free Software Foundation; either version 3 of the License,
;;; or (at your option) any later version.
;;;
;;; Guile Feed is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;;; General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with Guile Feed.  If not, see
;;; <http://www.gnu.org/licenses/>.

(define-module (feed scripts rss)
  #:use-module (guix scripts)
  #:use-module (guix ui)
  #:use-module (ice-9 match)
  #:use-module (ice-9 pretty-print)
  #:use-module (feed rss)
  #:use-module (srfi srfi-1)
  #:use-module (srfi srfi-11)
  #:use-module (srfi srfi-26)
  #:use-module (srfi srfi-37)
  #:export (feed-rss))


;;;
;;; Command-line options.
;;;

(define %default-options
  ;; Alist of default option values.
  '())

(define %options
  (list (option '(#\h "help") #f #f
                (lambda args
                  (show-help)
                  (exit 0)))
        (option '(#\o "output-file") #t #f
                 (lambda (opt name arg result)
                   (alist-cons 'output-file arg result)))
        (option '(#\s "search") #t #f
                 (lambda (opt name arg result)
                   (alist-cons 'search arg result)))
        (option '("show") #t #t
                 (lambda (opt name arg result)
                   (alist-cons 'show arg result)))))

(define (show-help)
  (display "Usage: guix rss -o FILE\n")
  (newline)
  (display "
  -h, --help             display this help and exit")
  (display "
  -V, --version          display version information and exit")
  (display "
  -o, --output-file=FILE convert rss to LISP FILE")
  (display "
  -s, --search=REGEXP    search in name and description using REGEXP")
  (display "
      --show=RSS        show details about RSS")
  (newline))


;;;
;;; Entry point.
;;;

(define (feed-rss . args)
  (define (parse-options)
    ;; Return the alist of option values.
    (parse-command-line args %options (list %default-options)
                        #:build-options? #f))
  (let* ((opts (parse-options))         
         (output (assoc-ref opts 'output-file))
         (search (assoc-ref opts 'search))
         (show (assoc-ref opts 'show)))
    (cond (show
           (leave-on-EPIPE
            (for-each (cute feed->recutils <>)
                      (find-feeds-by-name show))))
          (search
           (let* ((patterns (filter-map (match-lambda
                                          (('search . rx) rx)
                                          (_ #f))
                                        opts))
                  (regexps (map (cut make-regexp* <> regexp/icase) patterns)))
             (leave-on-EPIPE
              (let-values (((rss scores)
                            (find-feeds-by-description regexps)))
                (for-each (lambda (rss score)
                            (feed->recutils rss
                                            #:extra-fields
                                            `((relevance . ,score))))
                          rss
                          scores)))
             #t))
          (output
           (with-output-to-file output
             (lambda _ (pretty-print (feeds->lisp))))))))