Merge pull request #183 from JackDandy/feature/ChangeICAL

Change to streamline iCal function and make it handle missing network na...
This commit is contained in:
JackDandy 2015-02-15 00:12:57 +00:00
commit 11fb12e566
2 changed files with 29 additions and 41 deletions

View file

@ -55,6 +55,7 @@
* Update PNotify to latest master (2014-12-25) for desktop notifications * Update PNotify to latest master (2014-12-25) for desktop notifications
* Add desktop notifications * Add desktop notifications
* Change the AniDB provider image for a sharper looking version * Change the AniDB provider image for a sharper looking version
* Change to streamline iCal function and make it handle missing network names
[develop changelog] [develop changelog]
* Change uT params from unicode to str.format as magnet URLs worked but sending files in POST bodies failed * Change uT params from unicode to str.format as magnet URLs worked but sending files in POST bodies failed

View file

@ -438,70 +438,57 @@ class MainHandler(RequestHandler):
return _munge(t) return _munge(t)
# Raw iCalendar implementation by Pedro Jose Pereira Vieito (@pvieito).
#
# iCalendar (iCal) - Standard RFC 5545 <http://tools.ietf.org/html/rfc5546> # iCalendar (iCal) - Standard RFC 5545 <http://tools.ietf.org/html/rfc5546>
# Works with iCloud, Google Calendar and Outlook. # Works with iCloud, Google Calendar and Outlook.
def calendar(self, *args, **kwargs): def calendar(self, *args, **kwargs):
""" Provides a subscribeable URL for iCal subscriptions """ Provides a subscribeable URL for iCal subscriptions
""" """
logger.log(u"Receiving iCal request from %s" % self.request.remote_ip) logger.log(u'Receiving iCal request from %s' % self.request.remote_ip)
# Create a iCal string
ical = 'BEGIN:VCALENDAR\r\n'
ical += 'VERSION:2.0\r\n'
ical += 'X-WR-CALNAME:SickGear\r\n'
ical += 'X-WR-CALDESC:SickGear\r\n'
ical += 'PRODID://Sick-Beard Upcoming Episodes//\r\n'
# Limit dates # Limit dates
past_date = (datetime.date.today() + datetime.timedelta(weeks=-52)).toordinal() past_date = (datetime.date.today() + datetime.timedelta(weeks=-52)).toordinal()
future_date = (datetime.date.today() + datetime.timedelta(weeks=52)).toordinal() future_date = (datetime.date.today() + datetime.timedelta(weeks=52)).toordinal()
utc = tz.gettz('GMT')
# Get all the shows that are not paused and are currently on air (from kjoconnor Fork) # Get all the shows that are not paused and are currently on air
myDB = db.DBConnection() myDB = db.DBConnection()
calendar_shows = myDB.select( show_list = myDB.select(
"SELECT show_name, indexer_id, network, airs, runtime FROM tv_shows WHERE ( status = 'Continuing' OR status = 'Returning Series' ) AND paused != '1'") 'SELECT show_name, indexer_id, network, airs, runtime FROM tv_shows WHERE ( status = "Continuing" OR status = "Returning Series" ) AND paused != "1"')
for show in calendar_shows:
nl = "\\n\\n"
crlf = "\r\n"
# Create iCal header
appname = 'SickGear'
ical = 'BEGIN:VCALENDAR%sVERSION:2.0%sX-WR-CALNAME:%s%sX-WR-CALDESC:%s%sPRODID://%s Upcoming Episodes//%s'\
% (crlf, crlf, appname, crlf, appname, crlf, appname, crlf)
for show in show_list:
# Get all episodes of this show airing between today and next month # Get all episodes of this show airing between today and next month
episode_list = myDB.select( episode_list = myDB.select(
"SELECT indexerid, name, season, episode, description, airdate FROM tv_episodes WHERE airdate >= ? AND airdate < ? AND showid = ?", 'SELECT indexerid, name, season, episode, description, airdate FROM tv_episodes WHERE airdate >= ? AND airdate < ? AND showid = ?',
(past_date, future_date, int(show["indexer_id"]))) (past_date, future_date, int(show['indexer_id'])))
utc = tz.gettz('GMT')
for episode in episode_list: for episode in episode_list:
air_date_time = network_timezones.parse_date_time(episode['airdate'], show["airs"], air_date_time = network_timezones.parse_date_time(episode['airdate'], show['airs'],
show['network']).astimezone(utc) show['network']).astimezone(utc)
air_date_time_end = air_date_time + datetime.timedelta( air_date_time_end = air_date_time + datetime.timedelta(
minutes=helpers.tryInt(show["runtime"], 60)) minutes=helpers.tryInt(show['runtime'], 60))
# Create event for episode # Create event for episode
ical = ical + 'BEGIN:VEVENT\r\n' ical += 'BEGIN:VEVENT%s' % crlf\
ical = ical + 'DTSTART:' + air_date_time.strftime("%Y%m%d") + 'T' + air_date_time.strftime( + 'DTSTART:%sT%sZ%s' % (air_date_time.strftime('%Y%m%d'), air_date_time.strftime('%H%M%S'), crlf)\
"%H%M%S") + 'Z\r\n' + 'DTEND:%sT%sZ%s' % (air_date_time_end.strftime('%Y%m%d'), air_date_time_end.strftime('%H%M%S'), crlf)\
ical = ical + 'DTEND:' + air_date_time_end.strftime( + 'SUMMARY:%s - %sx%s - %s%s' % (show['show_name'], str(episode['season']), str(episode['episode']), episode['name'], crlf)\
"%Y%m%d") + 'T' + air_date_time_end.strftime( + 'UID:%s-%s-%s-E%sS%s%s' % (appname, str(datetime.date.today().isoformat()), show['show_name'].replace(' ', '-'), str(episode['episode']), str(episode['season']), crlf)\
"%H%M%S") + 'Z\r\n' + 'DESCRIPTION:%s on %s' % ((show['airs'] or '(Unknown airs)'), (show['network'] or 'Unknown network'))\
ical = ical + 'SUMMARY:' + show['show_name'] + ' - ' + str( + ('' if not episode['description'] else '%s%s' % (nl, episode['description'].splitlines()[0]))\
episode['season']) + "x" + str(episode['episode']) + " - " + episode['name'] + '\r\n' + '%sEND:VEVENT%s' % (crlf, crlf)
ical = ical + 'UID:Sick-Beard-' + str(datetime.date.today().isoformat()) + '-' + show[
'show_name'].replace(" ", "-") + '-E' + str(episode['episode']) + 'S' + str(
episode['season']) + '\r\n'
if (episode['description'] is not None and episode['description'] != ''):
ical = ical + 'DESCRIPTION:' + show['airs'] + ' on ' + show['network'] + '\\n\\n' + \
episode['description'].splitlines()[0] + '\r\n'
else:
ical = ical + 'DESCRIPTION:' + (show['airs'] or '(Unknown airs)') + ' on ' + (show['network'] or 'Unknown network') + '\r\n'
ical = ical + 'END:VEVENT\r\n'
# Ending the iCal # Ending the iCal
ical += 'END:VCALENDAR' return ical + 'END:VCALENDAR'
return ical
def _genericMessage(self, subject, message): def _genericMessage(self, subject, message):
t = PageTemplate(headers=self.request.headers, file="genericMessage.tmpl") t = PageTemplate(headers=self.request.headers, file="genericMessage.tmpl")