Add plugin to use feed generating scripts
[canto-next.git] / plugins / script.py
1 # Canto Script Plugin
2 # by Jack Miller
3 # v1.0
4
5 # With this plugin you can add a feed with a URL starting with "script:" and
6 # ending with a simple script invocation. You must specify a name for the feed.
7 #
8 # For example:
9 #   canto-remote addfeed "script:~/bin/feed.sh" name="Script Feed"
10 #
11 # Scripts must have executable permissions.
12 #
13 # Scripts can be passed constant arguments, but are not executed in a shell
14 # environment.
15 #
16 # The script path should be absolute, or relative to home (~/), relative path
17 # behavior is undefined.
18 #
19 # Scripts are expected to output parsable RSS/Atom XML to stdout.
20
21 from canto_next.plugins import check_program
22
23 check_program("canto-daemon")
24
25 from canto_next.fetch import DaemonFetchThreadPlugin
26 from canto_next.feed import DaemonFeedPlugin
27
28 import feedparser
29 import subprocess
30 import logging
31 import shlex
32 import os
33
34 log = logging.getLogger("SCRIPT")
35
36 def debug(message):
37     if EXTRA_LOG_OUTPUT:
38         log.debug(message)
39
40 class ScriptFetch(DaemonFetchThreadPlugin):
41     def __init__(self, fetch_thread):
42         self.plugin_attrs = {
43                 "fetch_script" : self.fetch_script,
44         }
45
46     def fetch_script(self, **kwargs):
47         if not kwargs["feed"].URL.startswith("script:"):
48             return
49
50         path = os.path.expanduser(kwargs["feed"].URL[7:])
51
52         log.debug("path: %s", path)
53
54         path = shlex.split(path)
55
56         log.debug("split: %s", path)
57
58         output = subprocess.check_output(path)
59
60         log.debug("output: %s", output)
61
62         contents = kwargs["newcontent"]
63         contents.clear()
64
65         feed = feedparser.parse(output)
66
67         for key in feed:
68             contents[key] = feed[key]