B ˆê]¢@ã @sddlZddlmZmZddlZddlZddlZddlZddlZddl m Z ddl Z ddl m Z ddlZddlZddl mZddlmZmZmZddlmZddlmZmZydd lmZmZd ZWneefk ràd ZYnXddlZddlZddl Z dd l!m!Z!dd l"m#Z#e#ƒZ"e$e"j%ƒd*dd„Z&e"j'd fdd„Z(d+dd„Z)d,dd„Z*d-dd„Z+d.dd„Z,d/d d!„Z-d0d"d#„Z.d1d&d'„Z/d2d(d)„Z0dS)3éN)ÚKeyÚAttr)ÚMP3)Úsleep)Ústrftime)ÚImageÚ ImageDrawÚ ImageFont)Úlistdir)ÚisfileÚjoin)ÚLEDÚButtonFT)Údatetime)Ú ConfigurationcCsLt d¡}| d¡|rd}nd}| d¡tjd|dd}| d ¡dS) Nzcerebro_utils.control_displayz&Entered the control_display method ...zvcgencmd display_power 1zvcgencmd display_power 0z#Calling the display control now ...z%sT)ÚshellzDisplay control now complete!)ÚloggingÚ getLoggerÚinfoÚ subprocessÚcall)Zenable_displayZcontrol_display_loggerZ display_cmdÚstatus©rúV/Users/sacholla/WorkDocs/My Projects/codecommit/project-cerebro/py_client/rpi_utils.pyÚcontrol_display\s    rcCsjt d¡}| d¡|r&| d¡dS| d¡d}d}dtj}tjd ||||fdd }| d ¡dS) Nzcerebro_utils.show_imagesz$Entered the switch_images method ...z'In Debug mode, so no showing of images!Tz,And now, starting up the slideshow again ...z../scripts/shutoff-display.shz!../scripts/start-picture-frame.shz%s/picframe.start.logz%s && %s "%s" > %s 2>&1 &)rz$Switching of images is now complete!)rrrÚconfigÚ__CEREBRO_LOGS_DIR__rr)Ú media_dirZ debug_modeZshow_images_loggerZslideshow_stop_utilZslideshow_utilZ slideshow_logrrrrÚ show_imagesns       rÚJoannaú sample textú speech.mp3cCst d¡}| d¡t ¡ d¡}| d¡| ¡}t|ƒ}|dkr†t|dƒ}d  |d|…¡}d  ||dd…¡} d || f} n d |d } d t j |f} t j  | ¡r¶td ƒnVtdƒ|j|dd| d} | d¡t| dƒ} |  | d ¡¡|  ¡| d| ¡| S)Nzcerebro_utils.generate_audioz7Starting the generate_audio method in cerebro_utils ...Zpollyz*Now, going to synthesize_speech with pollyé éú éz7%s%szzz%s/%sz2 File already exists locally, not calling Polly..z& File does not exist, making it now. Zmp3Zssml)ZVoiceIdZ OutputFormatZTextTypeÚTextz@Next, call to polly completed - now to stream the audio file ...ÚwbZ AudioStreamz-Finally, audio file is written and ready @ %s)rrrÚboto3ZSessionÚclientÚsplitÚlenÚintr rZ__CEREBRO_AUDIO_DIR__ÚosÚpathr ÚprintZsynthesize_speechÚopenÚwriteÚreadÚclose)Zvoice_idZ speech_textÚfilenameZgenerate_audio_loggerZ polly_clientZ speech_tokensZ token_cntZ mid_tokenZpart_oneZpart_twoZspeech_text_with_bufferÚ file_pathÚresponseÚfilerrrÚgenerate_audio†s6          r8ÚcCs¤t d¡}| d¡| d|¡|s4| d¡dS|r@t|ƒd}tjd||fdd }|rt| d |¡t|ƒtj  |¡  ¡}|d kr–t  |¡| d ¡dS) Nzcerebro_utils.play_audioz3Starting the play_audio method in cerebro_utils ...zFile_path provided : %szNo file_path provided!Fz sudo mpg321z%s %sT)rzSleeping for %d secsz speech.mp3zdone here. audio played ?) rrrÚerrorrrrr-r.ÚbasenameÚstripÚremove)r5Z delay_secsZdelay_to_startZplay_audio_loggerZmp3_utilrr4rrrÚ play_audio­s*       r>c CsŒt d¡}| d¡t d¡}| d|¡t|dƒ}|jd| ¡idgd}WdQRX| d ¡| |¡d |kr„| d ¡d S|d S) Nz(selfie_with_filters.get_facial_landmarksz&In the get_facial_landmarks method ...Z rekognitionz%Running Detect Faces on the image: %sÚrbÚBytesZALL)rZ Attributesz#Completed the detect_faces API callZ FaceDetailszNo Faces found!F) rrrr(r)r0Z detect_facesr2r:)Ú image_pathZget_facial_landmarks_loggerr)Úimager6rrrÚget_facial_landmarksÜs    "   rCú&../assets/printing/reinvent_bkgrnd.jpgú#../assets/printing/reinventLogo.pngcCs*t d¡}| d¡|s&| d¡dS|s8| d¡dS|sJ| d¡dS| d¡t |¡}t |¡}t |¡}| |j¡| |j¡| |j¡|jdd |jd d f}| |tj¡|  d ¡}|jdd |jd d f} | | tj¡t d ƒt dƒf} | | ¡|  | tj¡} |   ¡} t | jddƒt | jd dƒf} | | ¡|   || ¡t dd¡}t | ¡}d}| dd| d df}|j|||dd| d| d df}| |¡|   |||¡t dd¡}t | ¡}d}| dd| d df}|j|||dddtj}|  |¡|S)Nzrpi_utils.generate_print_imagezIn generate_print_image ...zNo background image providedFzNo image selectedzNo logo providedzAll images provided correctly!rgì?r%r"gÐ?g@@gt@gìQ¸…ë¡?gš™™™™™¹?Z Arial_Boldé0zCerebro: A Connected PhotoboothéiéP)éÿrIr)ÚfontÚfillÚVerdanaézNov 16 2019 12:30:05 (PST)ié()rIrIrIz%s/print_image.jpg)rrrr:rr0ÚsizeÚ thumbnailÚ ANTIALIASÚrotater,ÚresizeÚcopyÚpaster ÚtruetyperZDrawÚtextrÚ__CEREBRO_MEDIA_DIR__Úsave)Úimage_selectedZ bkgrnd_imageZ logo_imageZgenerate_print_image_loggerÚimage1Úimage2Z imageLogoZ selfie_sizeZimage2_rotatedZ logo_sizeZbackground_sizeZbackground_imageZim3_copyZ image_boxZfntÚdZ title_stringZ title_boxZlogo_boxZfnt2Úd2Zgenerated_print_image_pathrrrÚgenerate_print_imageðs\              $         r_cCs¶t d¡}| d¡t|d}| d|¡|}t ¡}| ¡}d}x2|D]*}| |||d¡tj|  ¡krJ|}qJW| d||f¡| d|¡|  ||d i¡| d ¡dS) Nzrpi_utils.print_imagez!Attempting to run a print job ...)rZzGenerated Print Image: %sr9z device-uriz8The Printer Chosen: %s , The Image Chosen is in path: %sz'Triggering the print job now for %s ...r$zCompleted the print job!) rrrr_ÚcupsÚ ConnectionZ getPrintersrZ__PRINTER_TYPE__ÚlowerZ printFile)ÚfileNameZprint_image_loggerZgenerated_imageÚconnZprintersZ printer_nameÚprinterrrrÚ print_image6s$      rfc CsÌt d¡}| d¡t d¡}| d¡i}||d<d|d<ttjƒ|d<|rVd |d <d tjd œ}tj }| d |t   |¡f¡t j d|t   |¡|d}tj} d} | dt   |  ¡¡¡t|  ¡ƒ} | d| ¡xè|  ¡D]Ü} | d| d¡| d} | d} |r d|tj | ¡f}ndtjtj | ¡f}| d| ¡y| | ¡ | |¡WnPtjjk rª}z,tdƒ|jdddkr˜tdƒn‚Wdd}~XYnX| d|¡qÞW| d¡| S)Nz cerebro_processor.download_mediazEntered Download_media ...Ús3zDownloading Media now ...ÚprofileÚyesÚaudioZimage_max_countÚ1Úignore_stock_profileszapplication/json)z Content-Typez x-api-keyzURL: %s, payload: %sÚPOST)ÚdataÚheadersr9z Response: %szTotal Number of Media files: %dzProcessing Media: %s ...Z image_keyZ image_captionz%s/%szTry downloading file: %sz Error seen!ÚErrorZCodeZ404zThe object does not exist.zImage Downloaded to %s.zMedia downloaded.)rrrr(ÚresourceÚstrrZ__IMAGE_MAX_COUNT__Z__APIGW_X_API_KEY__Z __APIGW_API__ÚjsonÚdumpsÚrequestsÚrequestZ __S3_BUCKET__Údebugr+r-r.r;rXZBucketZ download_fileZbotocoreÚ exceptionsZ ClientErrorr/r6)Z profile_namerrlZdownload_media_loggerrgÚpayloadroÚurlr6Z s3_bucketZs3_keyZ media_countÚitemZ media_captionÚ local_fileÚerrrÚdownload_media]sT        r~Ú setting_nameÚ setting_valuec CsÜt d¡}| d¡|s&| d¡dSd}t |¡}| ¡}| d¡d|}| d|¡| |¡| ¡d }t d d d ƒ}t   ¡}t ||  ¡ƒ} |  d ¡} ||| | f} | d|¡| || ¡| ¡| d ¡dS)Nzcerebro_utils.persist_settingzIn persist_setting ...zInvalid parameter provided!Fz cerebro.dbzCreated the DB connection...z6 DELETE from local_settings where setting_name = '%s' z'Now , executing sql: '%s', with params.zd INSERT INTO local_settings(setting_name,setting_value,last_updated,last_updated_dt) VALUES(?,?,?,?)i²r%z%m-%d-%YT%H:%M:%S.%fz!Setting is persisted into the db!T)rrrr:Úsqlite3ÚconnectÚcursorÚexecuteZcommitrÚnowr,Ú total_secondsr) rr€Zpersist_setting_loggerÚdb_filerdÚcÚdml_sqlZ epoch_timeZutc_timeZ last_updatedZlast_updated_dtZsettings_entryrrrÚpersist_settingœs0           rŠcCs´t d¡}| d¡|s&| d¡dSd}t |¡}| ¡}| d¡d|}| d|¡| |¡d}| ¡}t |ƒd kršt |d ƒd krš|d d }| d |¡|s°d }|S) Nzcerebro_utils.retrieve_settingzIn retrieve_setting ...zInvalid parameter provided!Fz cerebro.dbzCreated the DB connection...zB SELECT setting_value FROM local_settings WHERE setting_name='%s' zNow , executing sql: '%s' .r%rz*Now , retrieved the setting value as: %s .r9) rrrr:rr‚rƒr„Zfetchallr+)rZretrieve_setting_loggerr‡rdrˆr‰r€ÚrowsrrrÚretrieve_settingÄs*        rŒ)F)rr r!)r9rr)r9)r9rDrE)r9)r9r9F)rr€)r)1r(Zboto3.dynamodb.conditionsrrrrr-ÚglobrsZ mutagen.mp3rÚmathÚtimerÚos.pathÚsysrÚPILrrr r r r Zgpiozeror rZtest_environmentÚ ImportErrorÚ RuntimeErrorr`rurrrrr/Ú__SQS_BACKEND_QUEUE__rrXrr8r>rCr_rfr~rŠrŒrrrrÚsN        4  ' /  D ' ? (