-
Notifications
You must be signed in to change notification settings - Fork 5
/
RSS.py
144 lines (111 loc) · 4.25 KB
/
RSS.py
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# coding: utf-8
import ui
import sqlite3
import console
import feedparser
import clipboard
import urlparse
from dateutil.parser import parse as parse_date
conn = sqlite3.connect('feeds.db')
cursor = conn.execute('pragma user_version')
version = cursor.fetchone()[0]
if version == 0:
conn.execute('BEGIN TRANSACTION')
conn.execute('PRAGMA USER_VERSION=1')
conn.execute('CREATE TABLE feeds (title TEXT UNIQUE, url TEXT UNIQUE)')
conn.commit()
feeds = []
for title, url in conn.execute('SELECT * FROM feeds ORDER BY title'):
feeds.append({'title': title,
'url': url })
conn.close()
class FeedListController(object):
def __init__(self, feeds=[]):
self.feeds = feeds
def tableview_did_select(self, tableview, section, row):
console.show_activity()
feed = feedparser.parse(self.feeds[row]['url'])
rss_controller = RSSController(feed)
tv = ui.TableView()
tv.name = self.feeds[row]['title']
tv.allows_multiple_selection_during_editing = True
tv.data_source = rss_controller
tv.delegate = rss_controller
table_view.navigation_view.push_view(tv)
console.hide_activity()
def tableview_number_of_sections(self, tableview):
return 1
def tableview_number_of_rows(self, tableview, section):
return len(self.feeds)
def tableview_cell_for_row(self, tableview, section, row):
cell = ui.TableViewCell()
cell.text_label.text = self.feeds[row]['title']
return cell
feed_list_controller = FeedListController(feeds)
@ui.in_background
def add_feed(sender):
url = console.input_alert('', "Enter RSS feed URL:", 'http://www.macstories.net/feed/')
result = urlparse.urlparse(url)
if result.netloc == '':
url = 'http://www.macstories.net/feed/'
indicator = ui.ActivityIndicator()
indicator.center = navigation_view.center
navigation_view.add_subview(indicator)
indicator.bring_to_front()
indicator.start()
feed = feedparser.parse(url)
title = feed['feed']['title']
conn = sqlite3.connect('feeds.db')
conn.execute('INSERT INTO feeds VALUES (?, ?)', (title, url))
conn.commit()
feeds = []
for title, url in conn.execute('SELECT * FROM feeds ORDER BY title'):
feeds.append({'title': title,
'url': url })
conn.close()
feed_list_controller.feeds = feeds
table_view.reload()
indicator.stop()
navigation_view.remove_subview(indicator)
class RSSController(object):
def __init__(self, feed):
index = 0
self.feed = feed
self.dates = {}
self.date_indices = []
if feed is None:
return
for entry in self.feed['entries']:
dt = parse_date(entry['published'])
if dt.date() in self.dates:
self.dates[dt.date()].append(entry)
else:
self.dates[dt.date()] = [entry]
self.date_indices.append(dt.date())
index += 1
def tableview_did_select(self, tableview, section, row):
entry = self.dates[self.date_indices[section]][row]
webview = ui.WebView()
webview.name = entry['title']
webview.load_url(entry['link'])
tableview.navigation_view.push_view(webview)
def tableview_number_of_sections(self, tableview):
return len(self.dates)
def tableview_number_of_rows(self, tableview, section):
return len(self.dates[self.date_indices[section]])
def tableview_cell_for_row(self, tableview, section, row):
cell = ui.TableViewCell()
cell.text_label.text = self.dates[self.date_indices[section]][row]['title']
return cell
def tableview_title_for_header(self, tableview, section):
return str(self.date_indices[section])
add_button_item = ui.ButtonItem('Add Feed URL', None, add_feed)
table_view = ui.TableView()
table_view.name = 'Feeds'
table_view.allows_multiple_selection_during_editing = True
table_view.data_source = feed_list_controller
table_view.delegate = feed_list_controller
navigation_view = ui.NavigationView(table_view)
navigation_view.right_button_items = [add_button_item]
navigation_view.name = 'RSS Reader'
navigation_view.present('fullscreen')