# import the necessary packages from twilio.rest import Client import boto3 from threading import Thread import queue class TwilioNotifier: def __init__(self, conf): # store the configuration object self.conf = conf def send(self, msg, tempVideo, timelapse=False): # start a thread to upload the file and send it ret_VideoName = queue.Queue() ret_videoUrl = queue.Queue() t = Thread(target=self._send, args=(msg, tempVideo, ret_VideoName, ret_videoUrl, timelapse,)) t.start() ret1 = t.join() VideoName = ret_VideoName.get() videoUrl = ret_videoUrl.get() return VideoName, videoUrl # return fileName,fileUrl def _send(self, msg, tempVideo, out_VideoName, out_videoUrl, timelapse): # create a s3 client object s3 = boto3.client("s3", aws_access_key_id=self.conf["aws_access_key_id"], aws_secret_access_key=self.conf["aws_secret_access_key"], ) # get the filename and upload the video in public read mode if (timelapse): filename = tempVideo.split("/home/pi/SecurityCamera/tempTl/", 1)[1] print(filename) s3.upload_file(tempVideo, self.conf["s3_bucket"], filename, ExtraArgs={"ACL": "public-read", "ContentType": "video/mp4"}) else: filename = tempVideo.path[tempVideo.path.rfind("/") + 1:] s3.upload_file(tempVideo.path, self.conf["s3_bucket"], filename, ExtraArgs={"ACL": "public-read", "ContentType": "video/mp4"}) # get the bucket location and build the url location = s3.get_bucket_location( Bucket=self.conf["s3_bucket"])["LocationConstraint"] url = "https://s3-{}.amazonaws.com/{}/{}".format(location, self.conf["s3_bucket"], filename) msg = msg + 'You can check the video by clicking on following link: ' + url # initialize the twilio client and send the message print(msg) out_VideoName.put(filename) out_videoUrl.put(url) # Below code sends SMS alert to user via Twilio client = Client(self.conf["twilio_sid"], self.conf["twilio_auth"]) client.messages.create(to=self.conf["twilio_to"], from_=self.conf["twilio_from"], body=msg) # delete the temporary file if (timelapse == False): tempVideo.cleanup()