diff --git a/MacOS/benji.py b/MacOS/benji.py
index 532b469..df7d128 100644
--- a/MacOS/benji.py
+++ b/MacOS/benji.py
@@ -43,6 +43,7 @@
def events(frame, put,link):
+ """Identifies the event to be performed."""
identity_keywords = ["who are you", "who r u", "what is your name"]
youtube_keywords = ["play ", "stream ", "queue " , "youtube"]
launch_keywords = ["open "]
@@ -426,9 +427,9 @@ def events(frame, put,link):
i=0
-#A stdout class to redirect output to tkinter window
-class StdRedirector(object):
+class StdRedirector(object):
+ """A stdout class to redirect output to tkinter window."""
def __init__(self, text_window):
self.text_window = text_window
@@ -436,6 +437,7 @@ def write(self, output):
self.text_window.insert(tk.END, output)
class MyFrame(tk.Frame):
+ """Creates the graphical user interface."""
def __init__(self,*args,**kwargs):
self.textBox = tk.Text(root,
@@ -470,6 +472,7 @@ def __init__(self,*args,**kwargs):
def OnEnter(self,event):
+ """Identifies the text and sends it for display to displayText."""
put=self.textBox.get("1.2","end-1c")
print(put)
self.textBox.delete('1.2',tk.END)
@@ -482,6 +485,7 @@ def OnEnter(self,event):
self.displayText('Reenter')
def OnClicked(self):
+ """Recognizes the audio and sends it for display to displayText."""
r = sr.Recognizer()
with sr.Microphone() as source:
system('say Hey I am Listening ')
@@ -505,6 +509,7 @@ def OnClicked(self):
def displayText(self, text):
+ """Displays the text in a output window."""
try :
if not self.output_window.winfo_viewable() :
self.output_window.update()
@@ -514,6 +519,7 @@ def displayText(self, text):
print(text)
def createOutputWindow(self):
+ """Creates a output window to display the text."""
self.output_window = tk.Toplevel()
output_text_window = tk.Text(self.output_window)
self.stddirec = StdRedirector(output_text_window)
diff --git a/README.md b/README.md
index e8e9825..67c9f7c 100644
--- a/README.md
+++ b/README.md
@@ -49,9 +49,10 @@ Maintainers : [Dhruv Apte](https://github.com/the-ethan-hunt), [Abhimanyu Thakre
You can install B.E.N.J.I. on your laptop by cloning this repository as of first:
1. `git clone http://github.com/the-ethan-hunt/B.E.N.J.I`
2. Open your `IPython notebook` to `%run benji.py`. For `Command Prompt` try `python benji.py`.
+Note:If a module is not found, then install each module by: pip install modulename
P.S. B.E.N.J.I. now works for Windows, Linux and Mac OS :tada:
-#### Mac installation Troubleshooting
+#### Mac Installation Troubleshooting
````
creating build/temp.macosx-10.12-x86_64-3.6/src
@@ -77,6 +78,30 @@ ModuleNotFoundError: No module named 'PIL'
```
Command to solve the above: ```pip3 install Pillow```
+```
+Traceback (most recent call last):
+ File "MacOS/benji.py", line 10, in
+ import wikipedia
+ModuleNotFoundError: No module named 'wikipedia'
+```
+Command to solve the above: ```pip3 install wikipedia```
+
+```
+Traceback (most recent call last):
+ File "MacOS/benji.py", line 21, in
+ import speech_recognition as sr
+ModuleNotFoundError: No module named 'speech_recognition'
+```
+Command to solve the above: ```pip3 install SpeechRecognition```
+
+```
+Traceback (most recent call last):
+ File "MacOS/benji.py", line 23, in
+ import pyttsx3
+ModuleNotFoundError: No module named 'pyttsx3'
+```
+Command to solve the above: ```pip3 install pyttsx3```
+
Change the pip version above according to what you have installed on your mac.
### B.E.N.J.I working in Linux
@@ -85,6 +110,9 @@ Change the pip version above according to what you have installed on your mac.
### B.E.N.J.I working on Windows
![Working on Windows](working-benji-windows.gif)
+### B.E.N.J.I working on Mac
+![Working on Windows](working-benji-mac.gif)
+
### Contributing
[(Back to top)](#list-of-contents)
diff --git a/linux/benji.py b/linux/benji.py
index 5d204b3..19d6d67 100644
--- a/linux/benji.py
+++ b/linux/benji.py
@@ -47,6 +47,7 @@
def events(frame, put):
+ """Identifies the event to be performed."""
identity_keywords = ["who are you", "who r u", "what is your name"]
open_keywords = ["open "]
launcher_keywords = ["launch "]
@@ -320,9 +321,9 @@ def events(frame, put):
except:
speak.say("Sorry,couldn't print")
-#A customized thread class for tracking reminders
-class reminderThread(threading.Thread):
+class reminderThread(threading.Thread):
+ """A customized thread class for tracking reminders."""
def __init__(self, frame):
threading.Thread.__init__(self)
self.event = threading.Event()
@@ -330,6 +331,7 @@ def __init__(self, frame):
self.frame = frame
def run(self):
+ """Displays the upcoming reminders."""
while not self.event.is_set() :
upcoming_reminders = list()
self.removePastReminders()
@@ -360,6 +362,7 @@ def run(self):
time.sleep(1)
def removePastReminders(self):
+ """Removes the past reminders."""
try :
file_hand = open(reminder_filename, 'r')
reminder_list = file_hand.readlines()
@@ -380,9 +383,9 @@ def removePastReminders(self):
self.frame.displayText("Error occured")
i=0
-#A stdout class to redirect output to tkinter window
-class StdRedirector(object):
+class StdRedirector(object):
+ """A stdout class to redirect output to tkinter window."""
def __init__(self, text_window):
self.text_window = text_window
@@ -390,8 +393,9 @@ def write(self, output):
self.text_window.insert(tk.END, output)
class MyFrame(tk.Frame):
+ """Creates the graphical user interface."""
def __init__(self,*args,**kwargs):
- #new Thread to track reminders
+ """Creates a new thread to track reminders."""
global reminder_thread
reminder_thread = reminderThread(self)
tk.Frame.__init__(self,*args,**kwargs)
@@ -419,6 +423,7 @@ def __init__(self,*args,**kwargs):
reminder_thread.start()
def OnEnter(self,event):
+ """Identifies the text and sends it for display to displayText."""
put=self.textBox.get("1.2","end-1c")
self.displayText(put)
self.textBox.insert('1.2',put)
@@ -428,6 +433,7 @@ def OnEnter(self,event):
self.displayText('Reenter')
def OnClicked(self):
+ """Recognizes the audio and sends it for display to displayText."""
r = sr.Recognizer()
with sr.Microphone() as source:
speak.say('Hey I am Listening ')
@@ -446,11 +452,13 @@ def OnClicked(self):
self.displayText("Could not request results; {0}".format(e))
def onClose(self, event):
+ """Destroys the thread."""
global reminder_thread
reminder_thread.event.set()
#root.destroy()
def displayText(self, text):
+ """Displays the text in a output window."""
try :
if not self.output_window.winfo_viewable() :
self.output_window.update()
@@ -460,6 +468,7 @@ def displayText(self, text):
print(text)
def createOutputWindow(self):
+ """Creates a output window to display the text."""
self.output_window = tk.Toplevel()
output_text_window = tk.Text(self.output_window)
self.stddirec = StdRedirector(output_text_window)
diff --git a/windows/benji.py b/windows/benji.py
index 9593bb6..8110d54 100644
--- a/windows/benji.py
+++ b/windows/benji.py
@@ -1,920 +1,931 @@
-# coding: utf-8
-from __future__ import print_function
-import tkinter as tk
-from tkinter import ttk
-import wx
-import regex
-import os
-import pyautogui
-import wikipedia
-import time
-import webbrowser
-import youtube_dl
-#import winshell
-import json
-import requests
-import ctypes
-import random
-import urllib
-import datetime
-import ssl
-from bs4 import BeautifulSoup
-'import win32com.client as wicl'
-from urllib.request import urlopen
-import speech_recognition as sr
-import requests
-from pptx import Presentation
-from xlsxwriter import Workbook
-import subprocess
-import sys
-import pyttsx3
-import getpass
-from pytube import YouTube
-import matplotlib.pyplot as plt
-import numpy as np
-import httplib2
-import os
-from apiclient.discovery import build
-from oauth2client import client
-from oauth2client import tools
-from oauth2client.file import Storage
-import datetime
-#import face_recognition
-import cv2
-import tweepy
-from tweepy import OAuthHandler
-#import twitterCredentials
-from googletrans import Translator
-from langdetect import detect
-import threading
-from win10toast import ToastNotifier
-
-import lyrics
-import screenshot
-import google_translator
-import add_face
-import upcoming_events_google
-
-#requests.packages.urllib3.disable_warnings()
-#try:5
-# _create_unverified_https_context=ssl._create_unverified_context
-#except 'AttributeError':
-# pass
-#else:
-# ssl._create_default_https_context=_create_unverified_https_context
-
-#headers = {'''user-agent':'Chrome/53.0.2785.143'''}
-#speak=wicl.Dispatch("SAPI.SpVoice")
-speak = pyttsx3.init() # Offline python library for Converting Text to Speech
-
-#Function providing feature for maintaining good eye-sight.
-#Provides notification to look 20 feet away for 20 seconds every 20 minutes.
-def run():
- toaster = ToastNotifier() # Windows 10 Toast notifications for GUI development
- time_seconds = 60 # Time to display the notification for
- while True:
- time.sleep(time_seconds-5)
- speak.say("Please look 20 feet away for 20 seconds")
- speak.runAndWait()
- #Takes 5 seconds to execute
- toaster.show_toast("Advice","Please look 20 feet away for 20 seconds")
- time.sleep(5)
- #Takes 5 seconds to execute
- toaster.show_toast("Remaining Time", "10 seconds remaining")
- time.sleep(5)
- toaster.show_toast("Get Ready!", "Please carry your work!")
- speak.say("Please carry your work!")
- speak.runAndWait()
-
-def events(frame,put): # To determine the events
- identity_keywords = ["who are you", "who r u", "what is your name"]
- youtube_keywords = ("play ", "stream ", "queue ")
- launch_keywords = ["open ", "launch "]
- search_keywords = ["search "]
- wikipedia_keywords = ["wikipedia ", "wiki "]
- location_keywords = ["locate","spot"]
- check_keywords = ["what","when","was","how","has","had","should","would","can","could","cool","good"] #could or cool or good
- download_music=("download ","download music ")
- search_pc= ("find ","lookfor ")
- graph_generation = ("draw graph for ")
- close_keywords=("close ","over ","stop ","exit ")
- pc_locations = ("desktop", "documents", "downloads")
-
- put = put.lower()
- link = put.split()
-
- # Translate the sentence into given language
- if link[0] == "translate" and link[-2] == "to":
- google_translator.google_translate(link) # google_translate(link) function in google_translator.py
-
- #Add user for face detection
- elif link[0] == "face" or link[0] == "phase": # Adding user for face detection
- add_face.add_face_detect(link) # add_face_detect(link) function in add_face.py
-
- #Get lyrics
- elif link[0] == "lyrics":
- lyrics.lyric(link) # lyric(link) function in lyrics.py
- '''
- #Get top 10 tweets
- elif link[0] == "get" and link[-1] == "tweets":
- auth = OAuthHandler(twitterCredentials.consumer_key, twitterCredentials.consumer_secret)
- auth.set_access_token(twitterCredentials.access_token, twitterCredentials.access_secret)
- api = tweepy.API(auth)
- if link[-2] == "my":
- for tweet in tweepy.Cursor(api.user_timeline).items(10):
- print("\n", json.dumps(tweet.text))
- print("on ", tweet.created_at)
- elif link[1] == "tweets":
- for status in tweepy.Cursor(api.home_timeline).items(10):
- print("\n", status.text)
- print("By ", status.user.screen_name, " at ", status.user.created_at)
-
- #Get friends from twitter
- elif link[-1] == "twitter":
- if link[-3] == "follow" and link[-1] == "twitter":
- auth = OAuthHandler(twitterCredentials.consumer_key, twitterCredentials.consumer_secret)
- auth.set_access_token(twitterCredentials.access_token, twitterCredentials.access_secret)
- api = tweepy.API(auth)
- for friend in tweepy.Cursor(api.friends).items():
- print("\nName: ", json.dumps(friend.name), " Username: ", json.dumps(friend.screen_name))
- '''
-
-
-
- elif put.startswith('take screenshot') or put.startswith("screenshot"): # To take screenshot
- screenshot.screenshot_win() # screenshot_win() function in screenshot.py
-
-
- #Upcoming events
- elif put.startswith("upcoming events") or put.startswith("coming events") or put.startswith("events"):
- upcoming_events_google.upcoming_events() #upcoming_events() function in upcoming_events_google.py
-
- #Add note
- elif put.startswith("note") or put.startswith("not") or put.startswith("node"):
- try:
- check = link[1]
- username = os.getlogin()
- filename = "Notes.txt"
- f1 = open(r'''C:\Users\{0}\Desktop\{1}'''.format(username,filename),'a')
- link = '+'.join(link[1:])
- text = link.replace('+',' ')
- text = text[0].capitalize() + text[1:]
- if check in check_keywords:
- text += "?"
- else:
- text += "."
- f1.write(text)
- f1.write("\n")
- f1.close()
- speak.say("Note added successfully!")
- speak.runAndWait()
- except:
- print("Could not add the specified note!")
-
-
- #adding an event in google calendar
- elif link[0] == "add" and link[1]=="event":
- try:
- try:
- import argparse
- flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
- except ImportError:
- flags = None
-
- SCOPES = 'https://www.googleapis.com/auth/calendar'
- CLIENT_SECRET_FILE = 'Client_Secret.json'
- APPLICATION_NAME = 'GSSOC '
-
- def get_credentials():
- home_dir = os.path.expanduser('~')
- credential_dir = os.path.join(home_dir, '.credentials')
- if not os.path.exists(credential_dir):
- os.makedirs(credential_dir)
- credential_path = os.path.join(credential_dir,'calendar-python-quickstart.json')
- store = Storage(credential_path)
- credentials = store.get()
- if not credentials or credentials.invalid:
- flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
- flow.user_agent = APPLICATION_NAME
- if flags:
- credentials = tools.run_flow(flow, store, flags)
- else:
- credentials = tools.run(flow, store)
- print('Storing credentials to ' + credential_path)
- return credentials
-
- def main():
- credentials = get_credentials()
- http = credentials.authorize(httplib2.Http())
- service = discovery.build('calendar', 'v3', http=http)
- summary = link[2]
- d = link[-3]
- e = link[-1]
- date = d+"T00:00:00-07:00"
- end = e+"T00:00:00-07:00"
- event = {
- 'summary': summary,
- 'start': {
- 'dateTime': date,
- },
- 'end': {
- 'dateTime': end,
- },
- 'reminders': {
- 'useDefault': False,
- 'overrides': [
- {'method': 'email', 'minutes': 24 * 60},
- {'method': 'popup', 'minutes': 15},
- ],
- },
- }
-
- event = service.events().insert(calendarId='primary', body=event).execute()
- #print('Event created: %s' % (event.get('htmlLink')))
- #webbrowser.open('https://calendar.google.com/calendar/r')
-
- if __name__ == '__main__':
- main()
-
- except Exception as e:
- print(e)
- #Open a existing folder
- elif put.startswith(search_pc):
- try:
- if any(word in put for word in pc_locations):
- username = getpass.getuser()
- location = link[-1]
- file_name = link[1]
- path = r"C:\Users\%s\%s\%s" %( username, location, file_name)
- os.system("start "+path)
- elif link[-1] == "drive" and link[-3] == "in":
- drive = link[-2]
- file_name1 = link[1]
- if link[2] == link[-3]:
- file_name2 = ''
- else:
- file_name2 = link[2]
- path = r"%s:\%s %s " %(drive, file_name1, file_name2)
- os.system("start " +path)
- elif link[-1] == "drive":
- drive = link[-2]
- path = r"%s:\ " %(drive)
- os.system("start "+path)
- except Exception as e:
- print(e)
- #Screen Recorder
- elif link[0] == "recorder":
- try:
- if len(link) < 2:
- video = '"UScreenCapture"'
- audio = '"Microphone (Realtek High Definition Audio)"'
- elif len(link) < 3:
- video = link[1]
- video = video.replace('_',' ')
- video = '"' + video + '"'
- audio = '"Microphone (Realtek High Definition Audio)"'
- else:
- video = link[1]
- video = video.replace('_',' ')
- video = '"' + video + '"'
- audio = link[2]
- audio = audio.replace('_',' ')
- audio = '"' + audio + '"'
- username = os.getlogin()
- speak.say("Recording started!")
- speak.runAndWait()
- os.chdir(r'''C:\Users\{}\Desktop'''.format(username))
- subprocess.call(r'''ffmpeg -rtbufsize 1500M -f dshow -i video={0}:audio={1} -vcodec mpeg4 -vtag xvid -qscale:v 0 -crf 0 -acodec libmp3lame -ab 320k -ac 1 -ar 44100 video.avi'''.format(video,audio),shell=True) #video = UScreenCapture , audio = Microphone (Realtek High Definition Audio)
- except:
- print("Unable to start requested service!")
- #Voice Recorder
- elif link[0] == "audio" and link[1] == "recorder":
- try:
- if len(link) < 3:
- audio = '"Microphone (Realtek High Definition Audio)"'
- else:
- audio = link[2]
- audio = audio.replace('_',' ')
- audio = '"' + audio + '"'
- username = os.getlogin()
- speak.say("Recording started!")
- speak.runAndWait()
- os.chdir(r'''C:\Users\{}\Desktop'''.format(username))
- subprocess.call(r'''ffmpeg -rtbufsize 1500M -f dshow -i audio={0} -acodec libmp3lame -ab 320k -ac 1 -ar 44100 audio.mp3'''.format(audio),shell=True)
- except:
- print("Unable to start requested service!")
- #Video Recorder
- elif link[0] == "video" and link[1] == "recorder":
- try:
- if len(link) < 3:
- video = '"UScreenCapture"'
- else:
- video = link[2]
- video = video.replace('_',' ')
- video = '"' + video + '"'
- username = os.getlogin()
- speak.say("Recording started!")
- speak.runAndWait()
- os.chdir(r'''C:\Users\{}\Desktop'''.format(username))
- subprocess.call(r'''ffmpeg -rtbufsize 1500M -f dshow -i video={0} -vcodec mpeg4 -vtag xvid -qscale:v 0 -crf 0 video.avi'''.format(video),shell=True)
- except:
- print("Unable to start requested service!")
- #Merge audio and video
- elif link[0] == "merge":
- try:
- username = os.getlogin()
- os.chdir(r'''C:\Users\{}\Desktop'''.format(username))
- video = link[1]
- audio = link[2]
- output = link[3]
- subprocess.call(r'''ffmpeg -i {} -i {} -c:v copy -c:a copy {}'''.format(video,audio,output),shell=True)
- except:
- print("Unable to process requested service!")
- #Convert video
- elif link[0] == "convert":
- try:
- username = os.getlogin()
- os.chdir(r'''C:\Users\{}\Desktop'''.format(username))
- if link[1] == "na":
- form_in = link[2]
- video1 = link[3]
- form_out = link[4]
- video2 = link[5]
- if (form_in == "avi" or form_in == "webm" or form_in == "mp4" or form_in == "mkv") and (form_out == "mp4" or form_out == "mkv"):
- subprocess.call(r'''ffmpeg -i {} -c:v libx264 -an {}'''.format(video1,video2), shell = True)
- elif (form_in == "avi" or form_in == "mp4" or form_in == "mkv") and form_out == "webm":
- subprocess.call(r'''ffmpeg -i {} -c:v libvpx-vp9 -b:v 2M -an {}'''.format(video1,video2),shell=True)
- else:
- form_in = link[1]
- video1 = link[2]
- form_out = link[3]
- video2 = link[4]
- if (form_in == "avi" or form_in == "webm" or form_in == "mp4" or form_in == "mkv") and (form_out == "mp4" or form_out == "mkv"):
- subprocess.call(r'''ffmpeg -i {} -c:v libx264 -acodec aac {}'''.format(video1,video2), shell = True)
- elif (form_in == "avi" or form_in == "mp4" or form_in == "mkv") and form_out == "webm":
- subprocess.call(r'''ffmpeg -i {} -c:v libvpx-vp9 -b:v 2M -cpu-used -5 -deadline realtime -c:a libvorbis {}'''.format(video1,video2), shell = True)
- elif (form_in == "mp4" or form_in == "mkv" or form_in == "webm") and form_out == "avi":
- subprocess.call(r'''ffmpeg -i {} -c:v mpeg4 -vtag xvid -qscale:v 0 -acodec libmp3lame {}'''.format(video1,video2), shell = True)
- elif (form_in == "avi" or form_in == "webm" or form_in == "mp4" or form_in == "mkv" or form_in == "mp3" or form_in == "m4a") and (form_out == "m4a" or form_out == "mp3"):
- subprocess.call(r'''ffmpeg -i {} {}'''.format(video1,video2), shell = True)
- except:
- print("Unable to process requested service!")
-
- #Closing Benji
- elif put.startswith(close_keywords):
- os._exit(0)
-
-
- #Images to video
- elif put.startswith("images to video "):
- try:
- framerate = link[3]
- username = os.getlogin()
- os.chdir(r'''C:\Users\{}\Desktop\Images'''.format(username))
- subprocess.call(r'''ffmpeg -framerate 1/{} -i img%03d.jpg -vcodec mpeg4 -vtag xvid -qscale:v 0 -crf 0 output.avi'''.format(framerate),shell=True)
- speak.say("Video created!")
- speak.runAndWait()
- except:
- print("Unable to create video file!")
-
- #Open Files
- elif put.startswith(search_pc):
- try:
- name=link[1]
- rex=regex.compile(name)
- filepath=link[2]
- realpath=filepath
- for root,dirs,files in os.walk(os.path.normpath(filepath)):
- for f in files:
- result = rex.search(f)
- if result:
- realpath=os.path.join(root, f)
- print (realpath+"\n")
- os.startfile(realpath)
- except:
- print("Error")
-
- #Plotting of graph
- elif put.startswith(graph_generation):
- try:
- formula = link[3]
- lower_limit = int(link[5])
- upper_limit = int(link[7])
- x = np.array(range(lower_limit,upper_limit))
- y = eval(formula)
- speak.say("Plotting The Graph")
- speak.runAndWait()
- plt.plot(x, y)
- plt.show()
- except:
- print("Error")
- speak.say("Sorry Graph can not be Plotted")
- speak.runAndWait()
-
- #Box Office Status
- elif link[-1] == "boxoffice":
- try:
- url = "https://in.bookmyshow.com/" + link[0] + "/movies/nowshowing"
- r = requests.get(url)
- soup = BeautifulSoup(r.content, 'html.parser')
-
- soup_level2 = []
- show_status_list = []
- shows_list = soup.find_all('div', attrs={'class': 'card-container wow fadeIn movie-card-container'})
- for i in shows_list:
- start = str(i).index("href=")
- end = str(i).index("title=")
- soup_level2.append("https://in.bookmyshow.com" + str(i)[start+6 : end-2])
-
- show_status_raw = soup.find_all('div', attrs={'class': 'popularity sa-data-plugin'})
- for i in show_status_raw:
- start = str(i).index("data-coming-soon=")
- end = str(i).index('data-event-code')
- data = str(i)[start+18 : end-2]
-
- if data == "false":
- show_status_list.append("In Cinemas Now...")
- if data == "true":
- show_status_list.append("Coming Soon...")
-
- Tags_list = []
- Name_list = []
-
- for url in soup_level2:
- r = requests.get(url)
- tags = BeautifulSoup(r.content, 'html.parser')
- Tags_raw = tags.find_all('span', attrs={'class': '__genre-tag'})
- tmp_tags = ""
- for i in Tags_raw:
- tmp_tags = tmp_tags + str(i)[str(i).index('">')+2 : str(i).index("")] + " - "
- Tags_list.append(tmp_tags[:-3])
-
- Names_raw = tags.find_all('h1', attrs={'class': '__name'})
- for i in Names_raw:
- Name_list.append(str(i)[str(i).index('">')+2 : str(i).index("")])
-
- speak.say("Preparing List")
- speak.runAndWait()
- cntr = len(Name_list)
- print("----------------------------------------------")
- print(link[0].capitalize())
- print("----------------------------------------------")
- print("")
- for i in range(cntr):
- print("Name : " + Name_list[i])
- print("Tags : " + Tags_list[i])
- print("Status : " + show_status_list[i])
- print("")
- print("----------------------------------------------")
- print("")
- except:
- print("Sorry, List Cannot be Prepared...")
- speak.say("Sorry, List Cannot be Prepared...")
- speak.runAndWait()
-
-# elif put.startswith(search_pc):
-# process=subprocess.Popen("dir /b/s "+link[1],shell=True,stdout=subprocess.PIPE)
-# while True:
-# output = process.stdout.readline()
-# if output == '' and process.poll() is not None:
-# break
-# if output:
-# print (output.strip()+"\n")
-# outp=output
-# try:
-# os.startfile(outp)
-# except:
-# speak.say("Sorry,couldn't open")
-
- #Play song on youtube
- if put.startswith(youtube_keywords):
- try:
- link = '+'.join(link[1:])
-# print(link)
- say = link.replace('+', ' ')
- url = 'https://www.youtube.com/results?search_query='+link
-# webbrowser.open('https://www.youtube.com'+link)
- fhand=urllib.request.urlopen(url).read()
- soup = BeautifulSoup(fhand, "html.parser")
- songs = soup.findAll('div', {'class': 'yt-lockup-video'})
- hit = songs[0].find('a')['href']
-# print(hit)
- speak.say("playing "+say)
- speak.runAndWait()
- webbrowser.open('https://www.youtube.com'+hit)
- except:
- print('Sorry Ethan. Looks like its not working!')
- #Download video
- if put.startswith("download video "):
- try:
- link = '+'.join(link[2:])
- say = link.replace('+', ' ')
- url = 'https://www.youtube.com/results?search_query='+link
- fhand=urllib.request.urlopen(url).read()
- soup = BeautifulSoup(fhand, "html.parser")
- songs = soup.findAll('div', {'class': 'yt-lockup-video'})
- hit = songs[0].find('a')['href']
- speak.say("downloading video "+say)
- speak.runAndWait()
- username = os.getlogin()
- os.chdir(r'''C:\Users\{}\Desktop'''.format(username))
- YouTube('https://www.youtube.com' + hit).streams.first().download()
- speak.say("download complete!")
- speak.runAndWait()
- except:
- print('Sorry Ethan. Looks like its not working!')
- #Download music
- elif put.startswith(download_music):
- try:
- link = '+'.join(link[1:])
-# print(link)
- say = link.replace('+', ' ')
- url = 'https://www.youtube.com/results?search_query='+link
-# webbrowser.open('https://www.youtube.com'+link)
- fhand=urllib.request.urlopen(url).read()
- soup = BeautifulSoup(fhand, "html.parser")
- songs = soup.findAll('div', {'class': 'yt-lockup-video'})
- hit = songs[0].find('a')['href']
-# print(hit)
- speak.say("downloading "+say)
- speak.runAndWait()
- ydl_opts = {
- 'format': 'bestaudio/best',
- 'postprocessors': [{
- 'key': 'FFmpegExtractAudio',
- 'preferredcodec': 'mp3',
- 'preferredquality': '192',
- }],
- 'quiet': True,
- 'restrictfilenames': True,
- 'outtmpl': 'C:\\Users\\'+os.environ['USERNAME']+'\\Desktop\\%(title)s.%(ext)s'
- }
-
- ydl = youtube_dl.YoutubeDL(ydl_opts)
- ydl.download(['https://www.youtube.com'+hit])
- speak.say("download completed Check your desktop for the song")
- speak.runAndWait()
- except:
- print("Unable to download requested music!")
- #Location
- elif any(word in put for word in location_keywords):
- try:
- link='+'.join(link[1:])
- say=link.replace('+',' ')
- speak.say("locating "+ say)
- speak.runAndWait()
- webbrowser.open('https://www.google.nl/maps/place/'+link)
- except:
- print('The place seems to be sequestered.')
- #Who are you?
- elif any(word in put for word in identity_keywords):
- try:
- speak.say("I am BENJI, a digital assistant declassified for civilian use. Previously I was used by the Impossible Missions Force")
- speak.runAndWait()
- except:
- print('Error. Try reading the ReadMe to know about me!')
- #Open a webpage
- elif any(word in put for word in launch_keywords):
- try:
- link = '+'.join(link[1:])
- speak.say("opening "+link)
- speak.runAndWait()
- webbrowser.open('http://www.'+ link)
- except:
- print('Sorry Ethan,unable to access it. Cannot hack either-IMF protocol!')
- #Google search
- elif any(word in put for word in search_keywords):
- try:
- link='+'.join(link[1:])
- say=link.replace('+',' ')
- speak.say("searching google for "+say)
- speak.runAndWait()
- webbrowser.open('https://www.google.com/search?q='+link)
- except:
- print('Nope, this is not working.')
- #Google Images
- elif put.startswith("images of "):
- try:
- link='+'.join(link[2:])
- say=link.replace('+',' ')
- speak.say("searching images of " + say)
- speak.runAndWait()
- webbrowser.open('https://www.google.co.in/search?q=' + link + '&source=lnms&tbm=isch')
- except:
- print('Could not search for images!')
- #Gmail
- elif put.startswith("gmail"):
- try:
- speak.say("Opening Gmail!")
- speak.runAndWait()
- webbrowser.open('https://www.google.com/gmail')
- except:
- print("Could not open Gmail!")
- #Google Cloud Print
- elif put.startswith("google cloud print"):
- try:
- speak.say("Opening google cloud print!")
- speak.runAndWait()
- webbrowser.open('https://www.google.com/cloudprint')
- except:
- print("Could not open Google Cloud Print!")
- #Google Others
- elif put.startswith("google "):
- try:
- say = link[1]
- speak.say("Opening google " + say)
- speak.runAndWait()
- webbrowser.open('https://'+ say +'.google.com')
- except:
- print("Could not open Google " + say.capitalize() + "!")
- #Blogger
- elif put.startswith("blogger"):
- try:
- speak.say("Opening blogger!")
- speak.runAndWait()
- webbrowser.open('https://www.blogger.com')
- except:
- print("Could not open Blogger!")
- #Wikipedia
- elif any(word in put for word in wikipedia_keywords):
- try:
- link = '+'.join(link[1:])
- say = link.replace('+', ' ')
- wikisearch = wikipedia.page(say)
- speak.say("Opening wikipedia page for" + say)
- speak.runAndWait()
- webbrowser.open(wikisearch.url)
- except:
- print('Wikipedia could not either find the article or your Third-world connection is unstable')
- #Podcast
- elif put.startswith("podcast"):
- try:
- speak.say("Opening podcast!")
- speak.runAndWait()
- webbrowser.open('https://castbox.fm/home')
- except:
- print("Could not open podcast!")
- #Lock the device
- elif put.startswith('secure ') or put.startswith('lock '):
- try:
- speak.say("locking the device")
- speak.runAndWait()
- ctypes.windll.user32.LockWorkStation()
- except :
- print('Cannot lock device')
- #News of various press agencies
- elif put.startswith('news '):
- try:
- say = '+'.join(link[1:])
- say = say.replace('+','-')
- if link[1] == "al" and link[2] == "jazeera":
- say += "-english"
- elif link[1] == "bbc":
- say += "-news"
- elif link[1] == "espn" and link[2] == "cric":
- say += "-info"
- url = ('https://newsapi.org/v1/articles?source=' + say + '&sortBy=latest&apiKey=571863193daf421082a8666fe4b666f3')
- newsresponce = requests.get(url)
- newsjson = newsresponce.json()
- speak.say('Our agents from ' + say + ' report this')
- speak.runAndWait()
- print(' ====='+ say.upper() +'===== \n')
- i = 1
- for item in newsjson['articles']:
- print(str(i) + '. ' + item['title'] + '\n')
- print(item['description'] + '\n')
- i += 1
- except:
- print('Unable to retrieve data!')
- #shutdown after specific time
- elif put.startswith('shutdown after '):
- try:
- if link[2].isdigit() and link[4].isdigit():
- if link[2] == "zero":
- link[2] = "0"
- if link[4] == "zero":
- link[4] = "0"
- hours = int(link[2])
- minutes = int(link[4])
- time_seconds = 60 * minutes
- time_seconds = time_seconds + hours * 3600
- subprocess.call("shutdown /s /t {0}".format(str(time_seconds)), shell = True)
- speak.say("Shutdown initialized!")
- speak.runAndWait()
- except:
- print("Please shutdown manually!")
- #shutdown now
- elif put.startswith("shutdown now"):
- try:
- subprocess.call("shutdown /s /t 0", shell = True)
- except:
- print("Please shutdown manually!")
- #abort shutdown
- elif put.startswith("cancel shutdown"):
- try:
- subprocess.call("shutdown /a", shell = True)
- speak.say("Shutdown cancelled!")
- speak.runAndWait()
- except:
- print("Unable do cancel shutdown!")
- #restart
- elif put.startswith("restart now"):
- try:
- subprocess.call("shutdown /r /t 0", shell = True)
- except:
- print("Unable do restart device!")
- #Folder
- elif put.startswith('create ') and link[-1] == "folder":
- try:
- username = os.getlogin()
- filename = '+'.join(link[1:-1])
- filename = filename.replace('+','_').capitalize()
- path = r'''C:\Users\{0}\Desktop\{1}'''.format(username,filename)
- os.mkdir(path)
- speak.say("Folder created!")
- speak.runAndWait()
- except:
- print("Couldn't create specified folder!")
- #create file
- elif put.startswith('create ') and link[-1] == "document":
- try:
- username = os.getlogin()
- filename = '+'.join(link[1:-2])
- filename = filename.replace('+','_').capitalize()
- if link[-2] == "text":
- filename += ".txt"
- f1 = open(r'''C:\Users\{0}\Desktop\{1}'''.format(username,filename),'a')
- f1.close()
- elif link[-2] == "word" or link[-2] == "world":
- filename += ".docx"
- f1 = open(r'''C:\Users\{0}\Desktop\{1}'''.format(username,filename),'a')
- f1.close()
- elif link[-2] == "powerpoint" or link[-2] =="presentation":
- filename += ".pptx"
- prs = Presentation()
- title_slide_layout = prs.slide_layouts[0]
- slide = prs.slides.add_slide(title_slide_layout)
- os.chdir(r'''C:\Users\{0}\Desktop'''.format(username))
- prs.save(filename)
- elif link[-2] == "excel" or link[-2] == "Excel":
- filename += ".xlsx"
- wb = Workbook(filename)
- ws = wb.add_worksheet()
- os.chdir(r'''C:\Users\{0}\Desktop'''.format(username))
- wb.close()
- elif link[-2] == "visio" or link[-2] == "vizio":
- filename += ".vsdx"
- f1 = open(r'''C:\Users\{0}\Desktop\{1}'''.format(username,filename),'a')
- f1.close()
- elif link[-2] == "rich" or link[-2] == "reach":
- filename += ".rtf"
- f1 = open(r'''C:\Users\{0}\Desktop\{1}'''.format(username,filename),'a')
- f1.close()
- speak.say("Created" + filename)
- speak.runAndWait()
- except:
- print("Unable to create a file.")
- #Calculator
- elif put.startswith('calculator'):
- try:
- subprocess.call('calc',shell=True)
- except:
- print("Unable to open calculator!")
- #Exit/Quit
- elif put.startswith('exit') or put.startswith('quit'):
- sys.exit()
-
-#A stdout class to redirect output to tkinter window
-class StdRedirector(object):
-
- def __init__(self, text_window):
- self.text_window = text_window
-
- def write(self, output):
- self.text_window.insert(tk.END, output)
-
-
-# Creating the graphical user interface
-class MyFrame(tk.Frame):
- def __init__(self,*args,**kwargs):
-
- self.textBox = tk.Text(root,
- height=1,width=30,
- font=("Times", 16),
- bg="#666", fg="#0f0",
- spacing1=6, spacing3=6,
- insertbackground="#0f0"
- )
- self.textBox.insert("1.0", "$>")
- self.textBox.grid(row=1,column=1, padx=10, pady=10)
- root.bind('', self.OnEnter)
- #root.bind('', self.onClose)
- self.textBox.focus_set()
- speak.say('''Hi Agent! BENJI at your service''')
- speak.runAndWait()
-
- self.photo1 = tk.PhotoImage(file="E:/Open Source/B.E.N.J.I.-master/B.E.N.J.I.-master/windows/mic_icon.png")
-
- self.btn = ttk.Button(root,command=self.OnClicked,
- image=self.photo1, style="C.TButton")
- self.btn.grid(row=1,column=2, padx=10, pady=20)
-
- '''
- self.output_window = tk.Toplevel()
- output_text_window = tk.Text(self.output_window)
- self.stddirec = StdRedirector(output_text_window)
- sys.stdout = self.stddirec
- output_text_window.pack()
- self.output_window.withdraw()
- '''
-
- def OnEnter(self,event):
- put=self.textBox.get("1.2","end-1c")
- self.displayText(put)
- self.textBox.insert('1.2',put)
- self.textBox.delete('1.2',tk.END)
- events(self, put)
- if put=='':
- self.displayText('Reenter')
-
- def OnClicked(self):
- r = sr.Recognizer()
- with sr.Microphone() as source:
- speak.say('Hey I am Listening ')
- speak.runAndWait()
- audio = r.listen(source)
- try:
- put=r.recognize_google(audio)
- self.displayText(put)
- self.textBox.insert('1.2',put)
- self.textBox.delete('1.2',tk.END)
- events(self,put)
- except sr.UnknownValueError:
- self.displayText("Could not understand audio")
- except sr.RequestError as e:
- self.displayText("Could not request results; {0}".format(e))
-
- def displayText(self, text):
- try :
- if not self.output_window.winfo_viewable() :
- self.output_window.update()
- self.output_window.deiconify()
- except :
- self.createOutputWindow()
- print(text)
-
- def createOutputWindow(self):
- self.output_window = tk.Toplevel()
- output_text_window = tk.Text(self.output_window)
- self.stddirec = StdRedirector(output_text_window)
- sys.stdout = self.stddirec
- output_text_window.pack()
-
- #Trigger the GUI. Light the fuse!
-if __name__=="__main__":
-
- #Face detection
- path = 'C:/'
- lisdir = os.listdir(path)
- flag = 0
- '''
- for lis in lisdir:
- # if users face is in dataset, then the following code will run for authentication
- if lis == 'dataset':
- face_recognition.main()
- flag = 1
-
- if flag != 1:
- os.mkdir('C:/dataset')
- name = "admin"
- path = 'C:/dataset'
- cam = cv2.VideoCapture(0)
- ret, img = cam.read()
- cv2.imwrite(path + "/" + str(name) + ".jpg", img)
- cam.release()
- cv2.destroyAllWindows()
- '''
- #GUI
- root = tk.Tk()
- view = MyFrame(root)
-
- #Thread for running run() mthod in parallel
- t1 = threading.Thread(target=run)
- t1.start()
- #
-
- style = ttk.Style()
- style.configure('C.TButton',
- background='#555',
- highlightthickness='0'
- )
- style.map("C.TButton",
- background=[('pressed', '!disabled', '#333'), ('active', '#666')]
- )
- # root.geometry('{}x{}'.format(400, 100))
- # view.pack(side="top",fill="both",expand=False)
- root.iconphoto(True, tk.PhotoImage(file=os.path.join(sys.path[0],'benji_final.gif')))
- root.title('B.E.N.J.I.')
- root.configure(background="#444")
- root.resizable(0,0)
- root.mainloop()
+# coding: utf-8
+from __future__ import print_function
+import tkinter as tk
+from tkinter import ttk
+import wx
+import regex
+import os
+import pyautogui
+import wikipedia
+import time
+import webbrowser
+import youtube_dl
+#import winshell
+import json
+import requests
+import ctypes
+import random
+import urllib
+import datetime
+import ssl
+from bs4 import BeautifulSoup
+'import win32com.client as wicl'
+from urllib.request import urlopen
+import speech_recognition as sr
+import requests
+from pptx import Presentation
+from xlsxwriter import Workbook
+import subprocess
+import sys
+import pyttsx3
+import getpass
+from pytube import YouTube
+import matplotlib.pyplot as plt
+import numpy as np
+import httplib2
+import os
+from apiclient.discovery import build
+from oauth2client import client
+from oauth2client import tools
+from oauth2client.file import Storage
+import datetime
+#import face_recognition
+import cv2
+import tweepy
+from tweepy import OAuthHandler
+#import twitterCredentials
+from googletrans import Translator
+from langdetect import detect
+import threading
+from win10toast import ToastNotifier
+
+import lyrics
+import screenshot
+import google_translator
+import add_face
+import upcoming_events_google
+
+#requests.packages.urllib3.disable_warnings()
+#try:5
+# _create_unverified_https_context=ssl._create_unverified_context
+#except 'AttributeError':
+# pass
+#else:
+# ssl._create_default_https_context=_create_unverified_https_context
+
+#headers = {'''user-agent':'Chrome/53.0.2785.143'''}
+#speak=wicl.Dispatch("SAPI.SpVoice")
+speak = pyttsx3.init() # Offline python library for Converting Text to Speech
+
+
+def run():
+
+ """Provides feature for maintaining good eye-sight.
+
+ Provides notification to look 20 feet away for 20 seconds every 20 minutes.
+ """
+ toaster = ToastNotifier()
+ time_seconds = 60
+ while True:
+ time.sleep(time_seconds-5)
+ speak.say("Please look 20 feet away for 20 seconds")
+ speak.runAndWait()
+ #Takes 5 seconds to execute
+ toaster.show_toast("Advice","Please look 20 feet away for 20 seconds")
+ time.sleep(5)
+ #Takes 5 seconds to execute
+ toaster.show_toast("Remaining Time", "10 seconds remaining")
+ time.sleep(5)
+ toaster.show_toast("Get Ready!", "Please carry your work!")
+ speak.say("Please carry your work!")
+ speak.runAndWait()
+
+
+def events(frame,put):
+ """Identifies the event to be performed."""
+
+ identity_keywords = ["who are you", "who r u", "what is your name"]
+ youtube_keywords = ("play ", "stream ", "queue ")
+ launch_keywords = ["open ", "launch "]
+ search_keywords = ["search "]
+ wikipedia_keywords = ["wikipedia ", "wiki "]
+ location_keywords = ["locate","spot"]
+ check_keywords = ["what","when","was","how","has","had","should","would","can","could","cool","good"] #could or cool or good
+ download_music=("download ","download music ")
+ search_pc= ("find ","lookfor ")
+ graph_generation = ("draw graph for ")
+ close_keywords=("close ","over ","stop ","exit ")
+ pc_locations = ("desktop", "documents", "downloads")
+
+ put = put.lower()
+ link = put.split()
+
+ # Translate the sentence into given language
+ if link[0] == "translate" and link[-2] == "to":
+ google_translator.google_translate(link) # google_translate(link) function in google_translator.py
+
+ #Add user for face detection
+ elif link[0] == "face" or link[0] == "phase": # Adding user for face detection
+ add_face.add_face_detect(link) # add_face_detect(link) function in add_face.py
+
+ #Get lyrics
+ elif link[0] == "lyrics":
+ lyrics.lyric(link) # lyric(link) function in lyrics.py
+ '''
+ #Get top 10 tweets
+ elif link[0] == "get" and link[-1] == "tweets":
+ auth = OAuthHandler(twitterCredentials.consumer_key, twitterCredentials.consumer_secret)
+ auth.set_access_token(twitterCredentials.access_token, twitterCredentials.access_secret)
+ api = tweepy.API(auth)
+ if link[-2] == "my":
+ for tweet in tweepy.Cursor(api.user_timeline).items(10):
+ print("\n", json.dumps(tweet.text))
+ print("on ", tweet.created_at)
+ elif link[1] == "tweets":
+ for status in tweepy.Cursor(api.home_timeline).items(10):
+ print("\n", status.text)
+ print("By ", status.user.screen_name, " at ", status.user.created_at)
+
+ #Get friends from twitter
+ elif link[-1] == "twitter":
+ if link[-3] == "follow" and link[-1] == "twitter":
+ auth = OAuthHandler(twitterCredentials.consumer_key, twitterCredentials.consumer_secret)
+ auth.set_access_token(twitterCredentials.access_token, twitterCredentials.access_secret)
+ api = tweepy.API(auth)
+ for friend in tweepy.Cursor(api.friends).items():
+ print("\nName: ", json.dumps(friend.name), " Username: ", json.dumps(friend.screen_name))
+ '''
+
+
+
+ elif put.startswith('take screenshot') or put.startswith("screenshot"): # To take screenshot
+ screenshot.screenshot_win() # screenshot_win() function in screenshot.py
+
+
+ #Upcoming events
+ elif put.startswith("upcoming events") or put.startswith("coming events") or put.startswith("events"):
+ upcoming_events_google.upcoming_events() #upcoming_events() function in upcoming_events_google.py
+
+ #Add note
+ elif put.startswith("note") or put.startswith("not") or put.startswith("node"):
+ try:
+ check = link[1]
+ username = os.getlogin()
+ filename = "Notes.txt"
+ f1 = open(r'''C:\Users\{0}\Desktop\{1}'''.format(username,filename),'a')
+ link = '+'.join(link[1:])
+ text = link.replace('+',' ')
+ text = text[0].capitalize() + text[1:]
+ if check in check_keywords:
+ text += "?"
+ else:
+ text += "."
+ f1.write(text)
+ f1.write("\n")
+ f1.close()
+ speak.say("Note added successfully!")
+ speak.runAndWait()
+ except:
+ print("Could not add the specified note!")
+
+
+ #adding an event in google calendar
+ elif link[0] == "add" and link[1]=="event":
+ try:
+ try:
+ import argparse
+ flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
+ except ImportError:
+ flags = None
+
+ SCOPES = 'https://www.googleapis.com/auth/calendar'
+ CLIENT_SECRET_FILE = 'Client_Secret.json'
+ APPLICATION_NAME = 'GSSOC '
+
+ def get_credentials():
+ home_dir = os.path.expanduser('~')
+ credential_dir = os.path.join(home_dir, '.credentials')
+ if not os.path.exists(credential_dir):
+ os.makedirs(credential_dir)
+ credential_path = os.path.join(credential_dir,'calendar-python-quickstart.json')
+ store = Storage(credential_path)
+ credentials = store.get()
+ if not credentials or credentials.invalid:
+ flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
+ flow.user_agent = APPLICATION_NAME
+ if flags:
+ credentials = tools.run_flow(flow, store, flags)
+ else:
+ credentials = tools.run(flow, store)
+ print('Storing credentials to ' + credential_path)
+ return credentials
+
+ def main():
+ credentials = get_credentials()
+ http = credentials.authorize(httplib2.Http())
+ service = discovery.build('calendar', 'v3', http=http)
+ summary = link[2]
+ d = link[-3]
+ e = link[-1]
+ date = d+"T00:00:00-07:00"
+ end = e+"T00:00:00-07:00"
+ event = {
+ 'summary': summary,
+ 'start': {
+ 'dateTime': date,
+ },
+ 'end': {
+ 'dateTime': end,
+ },
+ 'reminders': {
+ 'useDefault': False,
+ 'overrides': [
+ {'method': 'email', 'minutes': 24 * 60},
+ {'method': 'popup', 'minutes': 15},
+ ],
+ },
+ }
+
+ event = service.events().insert(calendarId='primary', body=event).execute()
+ #print('Event created: %s' % (event.get('htmlLink')))
+ #webbrowser.open('https://calendar.google.com/calendar/r')
+
+ if __name__ == '__main__':
+ main()
+
+ except Exception as e:
+ print(e)
+ #Open a existing folder
+ elif put.startswith(search_pc):
+ try:
+ if any(word in put for word in pc_locations):
+ username = getpass.getuser()
+ location = link[-1]
+ file_name = link[1]
+ path = r"C:\Users\%s\%s\%s" %( username, location, file_name)
+ os.system("start "+path)
+ elif link[-1] == "drive" and link[-3] == "in":
+ drive = link[-2]
+ file_name1 = link[1]
+ if link[2] == link[-3]:
+ file_name2 = ''
+ else:
+ file_name2 = link[2]
+ path = r"%s:\%s %s " %(drive, file_name1, file_name2)
+ os.system("start " +path)
+ elif link[-1] == "drive":
+ drive = link[-2]
+ path = r"%s:\ " %(drive)
+ os.system("start "+path)
+ except Exception as e:
+ print(e)
+ #Screen Recorder
+ elif link[0] == "recorder":
+ try:
+ if len(link) < 2:
+ video = '"UScreenCapture"'
+ audio = '"Microphone (Realtek High Definition Audio)"'
+ elif len(link) < 3:
+ video = link[1]
+ video = video.replace('_',' ')
+ video = '"' + video + '"'
+ audio = '"Microphone (Realtek High Definition Audio)"'
+ else:
+ video = link[1]
+ video = video.replace('_',' ')
+ video = '"' + video + '"'
+ audio = link[2]
+ audio = audio.replace('_',' ')
+ audio = '"' + audio + '"'
+ username = os.getlogin()
+ speak.say("Recording started!")
+ speak.runAndWait()
+ os.chdir(r'''C:\Users\{}\Desktop'''.format(username))
+ subprocess.call(r'''ffmpeg -rtbufsize 1500M -f dshow -i video={0}:audio={1} -vcodec mpeg4 -vtag xvid -qscale:v 0 -crf 0 -acodec libmp3lame -ab 320k -ac 1 -ar 44100 video.avi'''.format(video,audio),shell=True) #video = UScreenCapture , audio = Microphone (Realtek High Definition Audio)
+ except:
+ print("Unable to start requested service!")
+ #Voice Recorder
+ elif link[0] == "audio" and link[1] == "recorder":
+ try:
+ if len(link) < 3:
+ audio = '"Microphone (Realtek High Definition Audio)"'
+ else:
+ audio = link[2]
+ audio = audio.replace('_',' ')
+ audio = '"' + audio + '"'
+ username = os.getlogin()
+ speak.say("Recording started!")
+ speak.runAndWait()
+ os.chdir(r'''C:\Users\{}\Desktop'''.format(username))
+ subprocess.call(r'''ffmpeg -rtbufsize 1500M -f dshow -i audio={0} -acodec libmp3lame -ab 320k -ac 1 -ar 44100 audio.mp3'''.format(audio),shell=True)
+ except:
+ print("Unable to start requested service!")
+ #Video Recorder
+ elif link[0] == "video" and link[1] == "recorder":
+ try:
+ if len(link) < 3:
+ video = '"UScreenCapture"'
+ else:
+ video = link[2]
+ video = video.replace('_',' ')
+ video = '"' + video + '"'
+ username = os.getlogin()
+ speak.say("Recording started!")
+ speak.runAndWait()
+ os.chdir(r'''C:\Users\{}\Desktop'''.format(username))
+ subprocess.call(r'''ffmpeg -rtbufsize 1500M -f dshow -i video={0} -vcodec mpeg4 -vtag xvid -qscale:v 0 -crf 0 video.avi'''.format(video),shell=True)
+ except:
+ print("Unable to start requested service!")
+ #Merge audio and video
+ elif link[0] == "merge":
+ try:
+ username = os.getlogin()
+ os.chdir(r'''C:\Users\{}\Desktop'''.format(username))
+ video = link[1]
+ audio = link[2]
+ output = link[3]
+ subprocess.call(r'''ffmpeg -i {} -i {} -c:v copy -c:a copy {}'''.format(video,audio,output),shell=True)
+ except:
+ print("Unable to process requested service!")
+ #Convert video
+ elif link[0] == "convert":
+ try:
+ username = os.getlogin()
+ os.chdir(r'''C:\Users\{}\Desktop'''.format(username))
+ if link[1] == "na":
+ form_in = link[2]
+ video1 = link[3]
+ form_out = link[4]
+ video2 = link[5]
+ if (form_in == "avi" or form_in == "webm" or form_in == "mp4" or form_in == "mkv") and (form_out == "mp4" or form_out == "mkv"):
+ subprocess.call(r'''ffmpeg -i {} -c:v libx264 -an {}'''.format(video1,video2), shell = True)
+ elif (form_in == "avi" or form_in == "mp4" or form_in == "mkv") and form_out == "webm":
+ subprocess.call(r'''ffmpeg -i {} -c:v libvpx-vp9 -b:v 2M -an {}'''.format(video1,video2),shell=True)
+ else:
+ form_in = link[1]
+ video1 = link[2]
+ form_out = link[3]
+ video2 = link[4]
+ if (form_in == "avi" or form_in == "webm" or form_in == "mp4" or form_in == "mkv") and (form_out == "mp4" or form_out == "mkv"):
+ subprocess.call(r'''ffmpeg -i {} -c:v libx264 -acodec aac {}'''.format(video1,video2), shell = True)
+ elif (form_in == "avi" or form_in == "mp4" or form_in == "mkv") and form_out == "webm":
+ subprocess.call(r'''ffmpeg -i {} -c:v libvpx-vp9 -b:v 2M -cpu-used -5 -deadline realtime -c:a libvorbis {}'''.format(video1,video2), shell = True)
+ elif (form_in == "mp4" or form_in == "mkv" or form_in == "webm") and form_out == "avi":
+ subprocess.call(r'''ffmpeg -i {} -c:v mpeg4 -vtag xvid -qscale:v 0 -acodec libmp3lame {}'''.format(video1,video2), shell = True)
+ elif (form_in == "avi" or form_in == "webm" or form_in == "mp4" or form_in == "mkv" or form_in == "mp3" or form_in == "m4a") and (form_out == "m4a" or form_out == "mp3"):
+ subprocess.call(r'''ffmpeg -i {} {}'''.format(video1,video2), shell = True)
+ except:
+ print("Unable to process requested service!")
+
+ #Closing Benji
+ elif put.startswith(close_keywords):
+ os._exit(0)
+
+
+ #Images to video
+ elif put.startswith("images to video "):
+ try:
+ framerate = link[3]
+ username = os.getlogin()
+ os.chdir(r'''C:\Users\{}\Desktop\Images'''.format(username))
+ subprocess.call(r'''ffmpeg -framerate 1/{} -i img%03d.jpg -vcodec mpeg4 -vtag xvid -qscale:v 0 -crf 0 output.avi'''.format(framerate),shell=True)
+ speak.say("Video created!")
+ speak.runAndWait()
+ except:
+ print("Unable to create video file!")
+
+ #Open Files
+ elif put.startswith(search_pc):
+ try:
+ name=link[1]
+ rex=regex.compile(name)
+ filepath=link[2]
+ realpath=filepath
+ for root,dirs,files in os.walk(os.path.normpath(filepath)):
+ for f in files:
+ result = rex.search(f)
+ if result:
+ realpath=os.path.join(root, f)
+ print (realpath+"\n")
+ os.startfile(realpath)
+ except:
+ print("Error")
+
+ #Plotting of graph
+ elif put.startswith(graph_generation):
+ try:
+ formula = link[3]
+ lower_limit = int(link[5])
+ upper_limit = int(link[7])
+ x = np.array(range(lower_limit,upper_limit))
+ y = eval(formula)
+ speak.say("Plotting The Graph")
+ speak.runAndWait()
+ plt.plot(x, y)
+ plt.show()
+ except:
+ print("Error")
+ speak.say("Sorry Graph can not be Plotted")
+ speak.runAndWait()
+
+ #Box Office Status
+ elif link[-1] == "boxoffice":
+ try:
+ url = "https://in.bookmyshow.com/" + link[0] + "/movies/nowshowing"
+ r = requests.get(url)
+ soup = BeautifulSoup(r.content, 'html.parser')
+
+ soup_level2 = []
+ show_status_list = []
+ shows_list = soup.find_all('div', attrs={'class': 'card-container wow fadeIn movie-card-container'})
+ for i in shows_list:
+ start = str(i).index("href=")
+ end = str(i).index("title=")
+ soup_level2.append("https://in.bookmyshow.com" + str(i)[start+6 : end-2])
+
+ show_status_raw = soup.find_all('div', attrs={'class': 'popularity sa-data-plugin'})
+ for i in show_status_raw:
+ start = str(i).index("data-coming-soon=")
+ end = str(i).index('data-event-code')
+ data = str(i)[start+18 : end-2]
+
+ if data == "false":
+ show_status_list.append("In Cinemas Now...")
+ if data == "true":
+ show_status_list.append("Coming Soon...")
+
+ Tags_list = []
+ Name_list = []
+
+ for url in soup_level2:
+ r = requests.get(url)
+ tags = BeautifulSoup(r.content, 'html.parser')
+ Tags_raw = tags.find_all('span', attrs={'class': '__genre-tag'})
+ tmp_tags = ""
+ for i in Tags_raw:
+ tmp_tags = tmp_tags + str(i)[str(i).index('">')+2 : str(i).index("")] + " - "
+ Tags_list.append(tmp_tags[:-3])
+
+ Names_raw = tags.find_all('h1', attrs={'class': '__name'})
+ for i in Names_raw:
+ Name_list.append(str(i)[str(i).index('">')+2 : str(i).index("")])
+
+ speak.say("Preparing List")
+ speak.runAndWait()
+ cntr = len(Name_list)
+ print("----------------------------------------------")
+ print(link[0].capitalize())
+ print("----------------------------------------------")
+ print("")
+ for i in range(cntr):
+ print("Name : " + Name_list[i])
+ print("Tags : " + Tags_list[i])
+ print("Status : " + show_status_list[i])
+ print("")
+ print("----------------------------------------------")
+ print("")
+ except:
+ print("Sorry, List Cannot be Prepared...")
+ speak.say("Sorry, List Cannot be Prepared...")
+ speak.runAndWait()
+
+# elif put.startswith(search_pc):
+# process=subprocess.Popen("dir /b/s "+link[1],shell=True,stdout=subprocess.PIPE)
+# while True:
+# output = process.stdout.readline()
+# if output == '' and process.poll() is not None:
+# break
+# if output:
+# print (output.strip()+"\n")
+# outp=output
+# try:
+# os.startfile(outp)
+# except:
+# speak.say("Sorry,couldn't open")
+
+ #Play song on youtube
+ if put.startswith(youtube_keywords):
+ try:
+ link = '+'.join(link[1:])
+# print(link)
+ say = link.replace('+', ' ')
+ url = 'https://www.youtube.com/results?search_query='+link
+# webbrowser.open('https://www.youtube.com'+link)
+ fhand=urllib.request.urlopen(url).read()
+ soup = BeautifulSoup(fhand, "html.parser")
+ songs = soup.findAll('div', {'class': 'yt-lockup-video'})
+ hit = songs[0].find('a')['href']
+# print(hit)
+ speak.say("playing "+say)
+ speak.runAndWait()
+ webbrowser.open('https://www.youtube.com'+hit)
+ except:
+ print('Sorry Ethan. Looks like its not working!')
+ #Download video
+ if put.startswith("download video "):
+ try:
+ link = '+'.join(link[2:])
+ say = link.replace('+', ' ')
+ url = 'https://www.youtube.com/results?search_query='+link
+ fhand=urllib.request.urlopen(url).read()
+ soup = BeautifulSoup(fhand, "html.parser")
+ songs = soup.findAll('div', {'class': 'yt-lockup-video'})
+ hit = songs[0].find('a')['href']
+ speak.say("downloading video "+say)
+ speak.runAndWait()
+ username = os.getlogin()
+ os.chdir(r'''C:\Users\{}\Desktop'''.format(username))
+ YouTube('https://www.youtube.com' + hit).streams.first().download()
+ speak.say("download complete!")
+ speak.runAndWait()
+ except:
+ print('Sorry Ethan. Looks like its not working!')
+ #Download music
+ elif put.startswith(download_music):
+ try:
+ link = '+'.join(link[1:])
+# print(link)
+ say = link.replace('+', ' ')
+ url = 'https://www.youtube.com/results?search_query='+link
+# webbrowser.open('https://www.youtube.com'+link)
+ fhand=urllib.request.urlopen(url).read()
+ soup = BeautifulSoup(fhand, "html.parser")
+ songs = soup.findAll('div', {'class': 'yt-lockup-video'})
+ hit = songs[0].find('a')['href']
+# print(hit)
+ speak.say("downloading "+say)
+ speak.runAndWait()
+ ydl_opts = {
+ 'format': 'bestaudio/best',
+ 'postprocessors': [{
+ 'key': 'FFmpegExtractAudio',
+ 'preferredcodec': 'mp3',
+ 'preferredquality': '192',
+ }],
+ 'quiet': True,
+ 'restrictfilenames': True,
+ 'outtmpl': 'C:\\Users\\'+os.environ['USERNAME']+'\\Desktop\\%(title)s.%(ext)s'
+ }
+
+ ydl = youtube_dl.YoutubeDL(ydl_opts)
+ ydl.download(['https://www.youtube.com'+hit])
+ speak.say("download completed Check your desktop for the song")
+ speak.runAndWait()
+ except:
+ print("Unable to download requested music!")
+ #Location
+ elif any(word in put for word in location_keywords):
+ try:
+ link='+'.join(link[1:])
+ say=link.replace('+',' ')
+ speak.say("locating "+ say)
+ speak.runAndWait()
+ webbrowser.open('https://www.google.nl/maps/place/'+link)
+ except:
+ print('The place seems to be sequestered.')
+ #Who are you?
+ elif any(word in put for word in identity_keywords):
+ try:
+ speak.say("I am BENJI, a digital assistant declassified for civilian use. Previously I was used by the Impossible Missions Force")
+ speak.runAndWait()
+ except:
+ print('Error. Try reading the ReadMe to know about me!')
+ #Open a webpage
+ elif any(word in put for word in launch_keywords):
+ try:
+ link = '+'.join(link[1:])
+ speak.say("opening "+link)
+ speak.runAndWait()
+ webbrowser.open('http://www.'+ link)
+ except:
+ print('Sorry Ethan,unable to access it. Cannot hack either-IMF protocol!')
+ #Google search
+ elif any(word in put for word in search_keywords):
+ try:
+ link='+'.join(link[1:])
+ say=link.replace('+',' ')
+ speak.say("searching google for "+say)
+ speak.runAndWait()
+ webbrowser.open('https://www.google.com/search?q='+link)
+ except:
+ print('Nope, this is not working.')
+ #Google Images
+ elif put.startswith("images of "):
+ try:
+ link='+'.join(link[2:])
+ say=link.replace('+',' ')
+ speak.say("searching images of " + say)
+ speak.runAndWait()
+ webbrowser.open('https://www.google.co.in/search?q=' + link + '&source=lnms&tbm=isch')
+ except:
+ print('Could not search for images!')
+ #Gmail
+ elif put.startswith("gmail"):
+ try:
+ speak.say("Opening Gmail!")
+ speak.runAndWait()
+ webbrowser.open('https://www.google.com/gmail')
+ except:
+ print("Could not open Gmail!")
+ #Google Cloud Print
+ elif put.startswith("google cloud print"):
+ try:
+ speak.say("Opening google cloud print!")
+ speak.runAndWait()
+ webbrowser.open('https://www.google.com/cloudprint')
+ except:
+ print("Could not open Google Cloud Print!")
+ #Google Others
+ elif put.startswith("google "):
+ try:
+ say = link[1]
+ speak.say("Opening google " + say)
+ speak.runAndWait()
+ webbrowser.open('https://'+ say +'.google.com')
+ except:
+ print("Could not open Google " + say.capitalize() + "!")
+ #Blogger
+ elif put.startswith("blogger"):
+ try:
+ speak.say("Opening blogger!")
+ speak.runAndWait()
+ webbrowser.open('https://www.blogger.com')
+ except:
+ print("Could not open Blogger!")
+ #Wikipedia
+ elif any(word in put for word in wikipedia_keywords):
+ try:
+ link = '+'.join(link[1:])
+ say = link.replace('+', ' ')
+ wikisearch = wikipedia.page(say)
+ speak.say("Opening wikipedia page for" + say)
+ speak.runAndWait()
+ webbrowser.open(wikisearch.url)
+ except:
+ print('Wikipedia could not either find the article or your Third-world connection is unstable')
+ #Podcast
+ elif put.startswith("podcast"):
+ try:
+ speak.say("Opening podcast!")
+ speak.runAndWait()
+ webbrowser.open('https://castbox.fm/home')
+ except:
+ print("Could not open podcast!")
+ #Lock the device
+ elif put.startswith('secure ') or put.startswith('lock '):
+ try:
+ speak.say("locking the device")
+ speak.runAndWait()
+ ctypes.windll.user32.LockWorkStation()
+ except :
+ print('Cannot lock device')
+ #News of various press agencies
+ elif put.startswith('news '):
+ try:
+ say = '+'.join(link[1:])
+ say = say.replace('+','-')
+ if link[1] == "al" and link[2] == "jazeera":
+ say += "-english"
+ elif link[1] == "bbc":
+ say += "-news"
+ elif link[1] == "espn" and link[2] == "cric":
+ say += "-info"
+ url = ('https://newsapi.org/v1/articles?source=' + say + '&sortBy=latest&apiKey=571863193daf421082a8666fe4b666f3')
+ newsresponce = requests.get(url)
+ newsjson = newsresponce.json()
+ speak.say('Our agents from ' + say + ' report this')
+ speak.runAndWait()
+ print(' ====='+ say.upper() +'===== \n')
+ i = 1
+ for item in newsjson['articles']:
+ print(str(i) + '. ' + item['title'] + '\n')
+ print(item['description'] + '\n')
+ i += 1
+ except:
+ print('Unable to retrieve data!')
+ #shutdown after specific time
+ elif put.startswith('shutdown after '):
+ try:
+ if link[2].isdigit() and link[4].isdigit():
+ if link[2] == "zero":
+ link[2] = "0"
+ if link[4] == "zero":
+ link[4] = "0"
+ hours = int(link[2])
+ minutes = int(link[4])
+ time_seconds = 60 * minutes
+ time_seconds = time_seconds + hours * 3600
+ subprocess.call("shutdown /s /t {0}".format(str(time_seconds)), shell = True)
+ speak.say("Shutdown initialized!")
+ speak.runAndWait()
+ except:
+ print("Please shutdown manually!")
+ #shutdown now
+ elif put.startswith("shutdown now"):
+ try:
+ subprocess.call("shutdown /s /t 0", shell = True)
+ except:
+ print("Please shutdown manually!")
+ #abort shutdown
+ elif put.startswith("cancel shutdown"):
+ try:
+ subprocess.call("shutdown /a", shell = True)
+ speak.say("Shutdown cancelled!")
+ speak.runAndWait()
+ except:
+ print("Unable do cancel shutdown!")
+ #restart
+ elif put.startswith("restart now"):
+ try:
+ subprocess.call("shutdown /r /t 0", shell = True)
+ except:
+ print("Unable do restart device!")
+ #Folder
+ elif put.startswith('create ') and link[-1] == "folder":
+ try:
+ username = os.getlogin()
+ filename = '+'.join(link[1:-1])
+ filename = filename.replace('+','_').capitalize()
+ path = r'''C:\Users\{0}\Desktop\{1}'''.format(username,filename)
+ os.mkdir(path)
+ speak.say("Folder created!")
+ speak.runAndWait()
+ except:
+ print("Couldn't create specified folder!")
+ #create file
+ elif put.startswith('create ') and link[-1] == "document":
+ try:
+ username = os.getlogin()
+ filename = '+'.join(link[1:-2])
+ filename = filename.replace('+','_').capitalize()
+ if link[-2] == "text":
+ filename += ".txt"
+ f1 = open(r'''C:\Users\{0}\Desktop\{1}'''.format(username,filename),'a')
+ f1.close()
+ elif link[-2] == "word" or link[-2] == "world":
+ filename += ".docx"
+ f1 = open(r'''C:\Users\{0}\Desktop\{1}'''.format(username,filename),'a')
+ f1.close()
+ elif link[-2] == "powerpoint" or link[-2] =="presentation":
+ filename += ".pptx"
+ prs = Presentation()
+ title_slide_layout = prs.slide_layouts[0]
+ slide = prs.slides.add_slide(title_slide_layout)
+ os.chdir(r'''C:\Users\{0}\Desktop'''.format(username))
+ prs.save(filename)
+ elif link[-2] == "excel" or link[-2] == "Excel":
+ filename += ".xlsx"
+ wb = Workbook(filename)
+ ws = wb.add_worksheet()
+ os.chdir(r'''C:\Users\{0}\Desktop'''.format(username))
+ wb.close()
+ elif link[-2] == "visio" or link[-2] == "vizio":
+ filename += ".vsdx"
+ f1 = open(r'''C:\Users\{0}\Desktop\{1}'''.format(username,filename),'a')
+ f1.close()
+ elif link[-2] == "rich" or link[-2] == "reach":
+ filename += ".rtf"
+ f1 = open(r'''C:\Users\{0}\Desktop\{1}'''.format(username,filename),'a')
+ f1.close()
+ speak.say("Created" + filename)
+ speak.runAndWait()
+ except:
+ print("Unable to create a file.")
+ #Calculator
+ elif put.startswith('calculator'):
+ try:
+ subprocess.call('calc',shell=True)
+ except:
+ print("Unable to open calculator!")
+ #Exit/Quit
+ elif put.startswith('exit') or put.startswith('quit'):
+ sys.exit()
+
+
+class StdRedirector(object):
+ """A stdout class to redirect output to tkinter window."""
+ def __init__(self, text_window):
+ self.text_window = text_window
+
+ def write(self, output):
+ self.text_window.insert(tk.END, output)
+
+
+class MyFrame(tk.Frame):
+ """Creates the graphical user interface."""
+ def __init__(self,*args,**kwargs):
+
+ self.textBox = tk.Text(root,
+ height=1,width=30,
+ font=("Times", 16),
+ bg="#666", fg="#0f0",
+ spacing1=6, spacing3=6,
+ insertbackground="#0f0"
+ )
+ self.textBox.insert("1.0", "$>")
+ self.textBox.grid(row=1,column=1, padx=10, pady=10)
+ root.bind('', self.OnEnter)
+ #root.bind('', self.onClose)
+ self.textBox.focus_set()
+ speak.say('''Hi Agent! BENJI at your service''')
+ speak.runAndWait()
+
+ self.photo1 = tk.PhotoImage(file="E:/Open Source/B.E.N.J.I.-master/B.E.N.J.I.-master/windows/mic_icon.png")
+
+ self.btn = ttk.Button(root,command=self.OnClicked,
+ image=self.photo1, style="C.TButton")
+ self.btn.grid(row=1,column=2, padx=10, pady=20)
+
+ '''
+ self.output_window = tk.Toplevel()
+ output_text_window = tk.Text(self.output_window)
+ self.stddirec = StdRedirector(output_text_window)
+ sys.stdout = self.stddirec
+ output_text_window.pack()
+ self.output_window.withdraw()
+ '''
+
+ def OnEnter(self,event):
+ """Identifies the text and sends it for display to displayText."""
+ put=self.textBox.get("1.2","end-1c")
+ self.displayText(put)
+ self.textBox.insert('1.2',put)
+ self.textBox.delete('1.2',tk.END)
+ events(self, put)
+ if put=='':
+ self.displayText('Reenter')
+
+ def OnClicked(self):
+ """Recognizes the audio and sends it for display to displayText."""
+ r = sr.Recognizer()
+ with sr.Microphone() as source:
+ speak.say('Hey I am Listening ')
+ speak.runAndWait()
+ audio = r.listen(source)
+ try:
+ put=r.recognize_google(audio)
+ self.displayText(put)
+ self.textBox.insert('1.2',put)
+ self.textBox.delete('1.2',tk.END)
+ events(self,put)
+ except sr.UnknownValueError:
+ self.displayText("Could not understand audio")
+ except sr.RequestError as e:
+ self.displayText("Could not request results; {0}".format(e))
+
+ def displayText(self, text):
+ """Displays the text in a output window."""
+ try :
+ if not self.output_window.winfo_viewable() :
+ self.output_window.update()
+ self.output_window.deiconify()
+ except :
+ self.createOutputWindow()
+ print(text)
+
+ def createOutputWindow(self):
+ """Creates a output window to display the text."""
+ self.output_window = tk.Toplevel()
+ output_text_window = tk.Text(self.output_window)
+ self.stddirec = StdRedirector(output_text_window)
+ sys.stdout = self.stddirec
+ output_text_window.pack()
+
+ #Trigger the GUI. Light the fuse!
+if __name__=="__main__":
+
+ #Face detection
+ path = 'C:/'
+ lisdir = os.listdir(path)
+ flag = 0
+ '''
+ for lis in lisdir:
+ # if users face is in dataset, then the following code will run for authentication
+ if lis == 'dataset':
+ face_recognition.main()
+ flag = 1
+
+ if flag != 1:
+ os.mkdir('C:/dataset')
+ name = "admin"
+ path = 'C:/dataset'
+ cam = cv2.VideoCapture(0)
+ ret, img = cam.read()
+ cv2.imwrite(path + "/" + str(name) + ".jpg", img)
+ cam.release()
+ cv2.destroyAllWindows()
+ '''
+ #GUI
+ root = tk.Tk()
+ view = MyFrame(root)
+
+ #Thread for running run() mthod in parallel
+ t1 = threading.Thread(target=run)
+ t1.start()
+ #
+
+ style = ttk.Style()
+ style.configure('C.TButton',
+ background='#555',
+ highlightthickness='0'
+ )
+ style.map("C.TButton",
+ background=[('pressed', '!disabled', '#333'), ('active', '#666')]
+ )
+ # root.geometry('{}x{}'.format(400, 100))
+ # view.pack(side="top",fill="both",expand=False)
+ root.iconphoto(True, tk.PhotoImage(file=os.path.join(sys.path[0],'benji_final.gif')))
+ root.title('B.E.N.J.I.')
+ root.configure(background="#444")
+ root.resizable(0,0)
+ root.mainloop()
diff --git a/windows/face_recognition.py b/windows/face_recognition.py
index 5fd8119..a1d6ed1 100644
--- a/windows/face_recognition.py
+++ b/windows/face_recognition.py
@@ -12,6 +12,7 @@
import cv2
def scan_known_people(known_people_folder):
+ """Scans the dataset containing images of known people."""
known_names = []
known_face_encodings = []
@@ -32,6 +33,7 @@ def scan_known_people(known_people_folder):
return known_names, known_face_encodings
def test_image(known_names, known_face_encodings):
+ """Compares the captured image to the images in the dataset."""
cam = cv2.VideoCapture(0)
ret, image_to_check = cam.read()
@@ -63,6 +65,7 @@ def test_image(known_names, known_face_encodings):
sys.exit()
def image_files_in_folder(folder):
+ """Return a list containing the path of the images in the folder."""
return [os.path.join(folder, f) for f in os.listdir(folder) if re.match(r'.*\.(jpg|jpeg|png)', f, flags=re.I)]
def main():
diff --git a/working-benji-mac.gif b/working-benji-mac.gif
new file mode 100644
index 0000000..084e7d3
Binary files /dev/null and b/working-benji-mac.gif differ