104 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
#!/usr/bin/env python
 | 
						|
 | 
						|
# Checks to see if certain RSS feeds (listed in ~/.prowl-rss/feeds) have been
 | 
						|
# updated recently, and if so, send a prowl notification.
 | 
						|
# It stores read guids in ~/.prowl-rss/guids.
 | 
						|
#
 | 
						|
# Intended to be run via cron or on-demand.
 | 
						|
 | 
						|
from __future__ import print_function
 | 
						|
 | 
						|
import httplib2
 | 
						|
import urllib
 | 
						|
import feedparser
 | 
						|
import time
 | 
						|
import sys
 | 
						|
import os
 | 
						|
import re
 | 
						|
 | 
						|
###
 | 
						|
 | 
						|
API_FILE = os.path.expanduser("~") + "/.prowl-apikey"
 | 
						|
GUID_FILE = os.path.expanduser("~") + "/.prowl-rss/guids"
 | 
						|
FEEDS_FILE = os.path.expanduser("~") + "/.prowl-rss/feeds"
 | 
						|
 | 
						|
API_DOMAIN = 'https://prowl.weks.net/publicapi'
 | 
						|
 | 
						|
# Pulled out of prowlpy @ https://github.com/omgmovieslol/prowlpy/tree/master
 | 
						|
def prowl_post(api, app=None, event=None, desc=None, priority=0):
 | 
						|
    # Create the http object
 | 
						|
    h = httplib2.Http()
 | 
						|
 | 
						|
    # Set User-Agent
 | 
						|
    headers = {'User-Agent': "Prowlpy/%s" % "0.41"}
 | 
						|
 | 
						|
    # Perform the request and get the response headers and content
 | 
						|
    data = {
 | 
						|
        'apikey': api,
 | 
						|
        'application': app,
 | 
						|
        'event': event,
 | 
						|
        'description': desc,
 | 
						|
        'priority': priority
 | 
						|
    }
 | 
						|
    headers["Content-type"] = "application/x-www-form-urlencoded"
 | 
						|
    resp,content = h.request("%s/add/" % API_DOMAIN, "POST", headers=headers, body=urllib.urlencode(data))
 | 
						|
 | 
						|
    if resp['status'] == '200':
 | 
						|
        return True
 | 
						|
    elif resp['status'] == '401': 
 | 
						|
        raise Exception("Auth Failed: {0}".format(content))
 | 
						|
    else:
 | 
						|
        raise Exception("Failed")
 | 
						|
 | 
						|
###
 | 
						|
 | 
						|
try:
 | 
						|
    
 | 
						|
    guids = [line.strip() for line in open(GUID_FILE)]
 | 
						|
    conf = [line.strip() for line in open(FEEDS_FILE)]
 | 
						|
 | 
						|
    with open(API_FILE) as f:
 | 
						|
        apikey = f.read().strip()
 | 
						|
    feeds = conf
 | 
						|
 | 
						|
    ##
 | 
						|
    fo = open(GUID_FILE, "a")
 | 
						|
    for feed in feeds:
 | 
						|
        f = feed.split(' ', 1)
 | 
						|
        print("-- Parsing {0}".format(f[0]))
 | 
						|
        xml = feedparser.parse(f[0])
 | 
						|
 | 
						|
        for e in xml.entries:
 | 
						|
            title = e.title.encode('utf-8')
 | 
						|
            try:
 | 
						|
                guid = e.guid
 | 
						|
            except Exception:
 | 
						|
                guid = e.link
 | 
						|
            if guid not in guids:
 | 
						|
                print("-- Looking")
 | 
						|
                if len(f) > 1 and not re.match(f[1], e.title):
 | 
						|
                    print("-- Does not match! Ignoring")
 | 
						|
                    continue
 | 
						|
 | 
						|
                print("-- Found, reporting: {0}".format(title))
 | 
						|
 | 
						|
                msg = "{0} - {1}".format(xml.feed.title.encode('utf-8'), title)
 | 
						|
                prowl_post(apikey, "RSS", title, msg)
 | 
						|
 | 
						|
                print("-- Writing to guids")
 | 
						|
                fo.write("{0}\n".format(guid))
 | 
						|
                guids.append(guid)
 | 
						|
 | 
						|
                print("Found: {0} => {1}".format(title, e.link))
 | 
						|
            else:
 | 
						|
                print("Ignored: {0} => {1}".format(title, e.link))
 | 
						|
                pass
 | 
						|
 | 
						|
    fo.close()
 | 
						|
 | 
						|
except IOError, e:
 | 
						|
    print("{0} file couldn't be found/opened".format(e.filename))
 | 
						|
    sys.exit(1)
 | 
						|
except Exception, msg:
 | 
						|
    print("Error: {0}".format(msg))
 |