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