mirror of
https://bitbucket.org/myhomie/mycorerepository.git
synced 2025-12-06 17:51:20 +00:00
89 lines
3.7 KiB
Python
89 lines
3.7 KiB
Python
import sys, os
|
|
sys.path.append('..')
|
|
import requests
|
|
from arlo import Arlo
|
|
from datetime import timedelta, date
|
|
import datetime
|
|
import json
|
|
import re
|
|
|
|
USERNAME = 'user@example.com'
|
|
PASSWORD = 'supersecretpassword'
|
|
|
|
videopath = 'videos'
|
|
cameraNumber = 2
|
|
datetimeFrom = datetime.datetime.strptime('2018-08-11 03:00:00', '%Y-%m-%d %H:%M:%S');
|
|
datetimeTo = datetime.datetime.strptime('2018-08-11 04:00:00', '%Y-%m-%d %H:%M:%S');
|
|
|
|
|
|
try:
|
|
print("Downloading cvr videos from " + datetimeFrom.strftime("%Y-%m-%d %H:%M:%S") + " to " + datetimeTo.strftime("%Y-%m-%d %H:%M:%S"))
|
|
# Instantiating the Arlo object automatically calls Login(), which returns an oAuth token that gets cached.
|
|
# Subsequent successful calls to login will update the oAuth token.
|
|
arlo = Arlo(USERNAME, PASSWORD)
|
|
# At this point you're logged into Arlo.
|
|
|
|
# Get the list of devices and filter on device type to only get the basestation.
|
|
# This will return an array which includes all of the basestation's associated metadata.
|
|
basestations = arlo.GetDevices('basestation')
|
|
|
|
# Get the list of devices and filter on device type to only get the camera.
|
|
# This will return an array which includes all of the camera's associated metadata.
|
|
cameras = arlo.GetDevices('camera')
|
|
|
|
# Get all of the recordings for a date range.
|
|
playlist = arlo.GetCvrPlaylist(cameras[cameraNumber], datetimeFrom.strftime("%Y%m%d"), datetimeTo.strftime("%Y%m%d"))
|
|
|
|
# If no recordings are available exit
|
|
if not playlist['playlist']:
|
|
print("No playlist found for camera for the period " + datetimeFrom.strftime("%Y-%m-%d %H:%M:%S") + " and " + datetimeTo.strftime("%Y-%m-%d %H:%M:%S"))
|
|
arlo.Logout()
|
|
print('Logged out')
|
|
sys.exit()
|
|
|
|
|
|
# Check if videos folder already exists
|
|
if not os.path.exists(videopath):
|
|
os.makedirs(videopath)
|
|
|
|
# debug to show the playlist json
|
|
# print(json.dumps(playlist, indent = 4))
|
|
|
|
# Iterate through each day in the cvr playlist.
|
|
for playlistPerDay in playlist['playlist']:
|
|
# Iterate through each m3u8 (playlist) file
|
|
for recordings in playlist['playlist'][playlistPerDay]:
|
|
m3u8 = requests.get(recordings['url']).text.split("\n")
|
|
# Iterate the m3u8 file and get all the streams
|
|
for m3u8Line in m3u8:
|
|
# debug to show the m3u8 file
|
|
# print m3u8Line
|
|
|
|
# Split the url into parts used for filename (camera id and timestamp)
|
|
m = re.match("^http.+([A-Z0-9]{13})_[0-9]{13}_([0-9]{13})", m3u8Line)
|
|
if m:
|
|
cameraId = m.group(1)
|
|
videoTime = datetime.datetime.fromtimestamp(int(m.group(2)) // 1000)
|
|
|
|
# If we are within desired range, then download
|
|
if videoTime > datetimeFrom and videoTime < datetimeTo:
|
|
# Get video as a chunked stream; this function returns a generator.
|
|
stream = arlo.StreamRecording(m3u8Line)
|
|
videofilename = cameraId + '-' + videoTime.strftime('%Y%m%d-%H%M%S') + '.mp4'
|
|
|
|
# Skip files already downloaded
|
|
if os.path.isfile(videopath + '/' + videofilename):
|
|
print("Video " + videofilename + " already exists")
|
|
else:
|
|
print('Downloading video ' + videofilename)
|
|
with open(videopath + '/' + videofilename, 'wb') as f:
|
|
for chunk in stream:
|
|
f.write(chunk)
|
|
f.close()
|
|
|
|
arlo.Logout()
|
|
print('Logged out')
|
|
|
|
except Exception as e:
|
|
print(e)
|