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
|
import sys
import urllib
import urllib2
import urlparse
import xbmcgui
import xbmcplugin
import xbmcaddon
import json
import time
import uuid
import re
from ring_doorbell import Ring
from datetime import datetime
from dateutil import tz
base_url = sys.argv[0]
addon_handle = int(sys.argv[1])
args = urlparse.parse_qs(sys.argv[2][1:])
ADDON = xbmcaddon.Addon(id='plugin.video.ring_doorbell')
xbmcplugin.setContent(addon_handle, 'movies')
mode = args.get('mode', None)
def init():
email = ADDON.getSetting('email')
password = ADDON.getSetting('password')
items = ADDON.getSetting('items')
if len(email) <= 7:
return showModal(ADDON.getLocalizedString(30200))
if not re.match(r'[\w.-]+@[\w.-]+.\w+', email):
return showModal(ADDON.getLocalizedString(30200))
if len(password) <= 3:
return showModal(ADDON.getLocalizedString(30201))
if items.isdigit() == False:
return showModal(ADDON.getLocalizedString(30202))
try:
myring = Ring(email, password)
except:
return showModal(ADDON.getLocalizedString(30203))
if mode is None:
events = []
for device in list(myring.stickup_cams + myring.doorbells):
for event in device.history(limit=items):
event['formatted'] = format_event(device, event)
event['doorbell_id'] = device.id
events.append(event)
sorted_events = sorted(events, key=lambda k: k['id'], reverse=True)
for event in sorted_events:
url = build_url({'mode': 'play', 'doorbell_id': event['doorbell_id'], 'video_id': event['id']})
li = xbmcgui.ListItem(str(event['formatted']), iconImage='DefaultVideo.png')
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li, isFolder=True)
xbmcplugin.endOfDirectory(addon_handle)
else:
if mode[0] == 'play':
doorbell_id = args['doorbell_id'][0]
video_id = args['video_id'][0]
for doorbell in list(myring.stickup_cams + myring.doorbells):
if doorbell.id == doorbell_id:
try:
url = doorbell.recording_url(video_id)
play_video(url)
except:
return showModal(ADDON.getLocalizedString(30204))
def play_video(path):
if xbmc.Player().isPlaying():
xbmc.Player().stop()
play_item = xbmcgui.ListItem(path=path)
xbmc.Player().play(item=path, listitem=play_item)
def build_url(query):
return base_url + '?' + urllib.urlencode(query)
def build_url2(query):
return base_url + ', ' + urllib.urlencode(query)
def format_event(device, event):
from_zone = tz.tzutc()
to_zone = tz.tzlocal()
utc = event['created_at'].replace(tzinfo=from_zone)
local_time = utc.astimezone(to_zone)
local_time_string = local_time.strftime('%I:%M %p ')
local_time_string += ADDON.getLocalizedString(30300)
local_time_string += local_time.strftime(' %A %b %d %Y')
event_name = ''
if event['kind'] == 'on_demand':
event_name = ADDON.getLocalizedString(30301)
if event['kind'] == 'motion':
event_name = ADDON.getLocalizedString(30302)
if event['kind'] == 'ding':
event_name = ADDON.getLocalizedString(30303)
return ' '.join([device.name, event_name, local_time_string])
def showModal(text):
__addon__ = xbmcaddon.Addon()
__addonname__ = __addon__.getAddonInfo('name')
xbmcgui.Dialog().ok(__addonname__, text)
init()
|