├── .gitignore ├── LICENSE ├── Models ├── Sidebar │ ├── rrquirements.txt │ ├── sidebar.py │ └── tanscript_details_api.py └── Transcription │ ├── requirements │ └── transcription.py ├── README.md ├── Retriever ├── fetch_summaries.py └── requirements.txt └── website ├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── favicon.ico ├── index.html ├── logo192.png ├── logo512.png ├── manifest.json └── robots.txt ├── src ├── App.js ├── NextPage.js ├── README.md ├── assets │ ├── FIREFLIES_UI.png │ ├── FULLReactREDUXToolkit │ │ └── FULLReactREDUXToolkit │ │ │ ├── .gitignore │ │ │ ├── README.md │ │ │ ├── package-lock.json │ │ │ ├── package.json │ │ │ ├── postcss.config.js │ │ │ ├── src │ │ │ ├── App.js │ │ │ ├── STEPS │ │ │ ├── components │ │ │ │ ├── Navbar.js │ │ │ │ └── Products.js │ │ │ ├── images │ │ │ │ ├── amazonin.svg │ │ │ │ └── whiteamazonlogo.png │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── pages │ │ │ │ ├── Cart.js │ │ │ │ └── Home.js │ │ │ └── store │ │ │ │ ├── cartSlice.js │ │ │ │ ├── productSlice.js │ │ │ │ └── store.js │ │ │ └── tailwind.config.js │ ├── Helvetica-Font │ │ ├── Helvetica-Bold.ttf │ │ ├── Helvetica-BoldOblique.ttf │ │ ├── Helvetica-Oblique.ttf │ │ ├── Helvetica.ttf │ │ ├── helvetica-compressed-5871d14b6903a.otf │ │ ├── helvetica-light-587ebe5a59211.ttf │ │ └── helvetica-rounded-bold-5871d05ead8de.otf │ ├── HomeContent.jpg │ ├── Netflix_2015_logo.svg │ ├── RECORDING.mp4 │ ├── Vrushali_TRANSCRIPT.txt │ ├── Zoom_cm_fe588s5MkboM5fZ9vvrZo4_mKT+WVqwNeKisgOrYAmT3fSwq976Eoyu1Jycn@RkzR9-G00ioJlXXD_k448d161884e7e241_.exe │ ├── arrow_down.svg │ ├── arrow_up.svg │ ├── business (1).txt │ ├── close-minimiz-max.webp │ ├── close.png │ ├── demoaudio.mp3 │ ├── hindi_rec.mp4 │ ├── menu.png │ ├── rec.mp4 │ ├── sidebar-logo.svg │ ├── testingvideo.mp4 │ ├── tickmark.png │ ├── transcript_FINAL.txt │ └── user-pfp.jpg ├── components │ ├── Accordion.js │ ├── Account.js │ ├── AddSpeaker.js │ ├── BodySection.js │ ├── ButtonSection.jsx │ ├── ImageViewer.js │ ├── Navbar.js │ ├── ProtectedRoutes.js │ ├── Sidebar.js │ ├── Signin.js │ ├── Signup.js │ ├── SubMenu.jsx │ ├── Transcript.js │ └── Uploader.js ├── config │ └── firebaseapp.js ├── context.js ├── context │ └── AuthContext.js ├── data.js ├── firebase.js ├── index.css ├── index.js ├── pages │ ├── Analytics.js │ ├── EditableTextField.js │ ├── GotoSummary.js │ ├── Home.js │ ├── MySummary.js │ ├── Notebook.js │ ├── SharedMe.js │ ├── SummaryPage.js │ ├── Test.js │ ├── Testing.js │ └── UploadPage.js ├── postcss.config.js ├── reducer.js ├── server │ ├── API-main.zip │ ├── API-main │ │ ├── 02_06_39_mask.flac │ │ ├── G015_S021.wav │ │ ├── README.md │ │ ├── api.py │ │ ├── recordings │ │ │ └── 02_06_39_mask.flac │ │ ├── transcriptions │ │ │ ├── p.txt │ │ │ └── transcript.txt │ │ └── upload_audio.py │ ├── DB │ │ └── conn.js │ ├── appServer.js │ ├── models │ │ └── UserSchema.js │ ├── readme.txt │ └── router │ │ └── router.js └── tailwind.config.js └── tailwind.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Yusuf Ansari 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Models/Sidebar/rrquirements.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/Models/Sidebar/rrquirements.txt -------------------------------------------------------------------------------- /Models/Sidebar/sidebar.py: -------------------------------------------------------------------------------- 1 | from googletrans import Translator 2 | import re 3 | import pandas as pd 4 | from transformers import pipeline 5 | 6 | 7 | classifier = pipeline("zero-shot-classification", model="facebook/bart-large-mnli") 8 | 9 | def meeting_type(text,lan): 10 | 11 | candidate_labels = ['Business', 'General', 'Workshop'] 12 | classifier(text, candidate_labels) 13 | 14 | meeting_type = classifier(text, candidate_labels) 15 | possible_type = max(meeting_type["scores"]) 16 | index_of_type = meeting_type["scores"].index(possible_type) 17 | # print(f"The meeting type is:- {candidate_labels[index_of_type]}") 18 | 19 | type_of_meeting = candidate_labels[index_of_type] 20 | 21 | return translation(lan,type_of_meeting) 22 | 23 | # meeting_type(text,'en') 24 | 25 | def translation( target_language,sentences): 26 | translator = Translator() 27 | 28 | target_language = target_language 29 | result = '' 30 | if type(sentences) == str: 31 | sentences = sentences.split("\n") 32 | for i in range(len(sentences)): 33 | text_to_translate = sentences[i] 34 | target_sentence = translator.translate(text_to_translate, src ='en', dest=target_language).text 35 | result = result+" "+ target_sentence +" " 36 | return result 37 | 38 | 39 | 40 | def preprocess(sentence,noofspeaker): 41 | namep="SPEAKER\s\d*" 42 | # print("under preprocess",sentence) 43 | new = [] 44 | l= len(sentence) 45 | 46 | x = re.findall(namep,sentence[0]) 47 | 48 | if len(x) == 0: 49 | 50 | final = "" 51 | for i in range(len(sentence)): 52 | final = final + sentence[i] + "\n" 53 | return final 54 | else: 55 | for i in range(1,l): 56 | if i%2 == 0: 57 | print("sentence in preprocess = ",sentence[i]) 58 | x = re.findall(namep,sentence[i]) 59 | 60 | sentence[i]= x 61 | final = "" 62 | print("8"*20) 63 | print(sentence) 64 | for i in range(len(sentence) - 1): 65 | if i%2 == 0 : 66 | name = str(sentence[i]) 67 | strings = sentence[i+1] 68 | name = name[2:-2] 69 | 70 | 71 | final= final + str(name) +":"+ strings 72 | final = final + "\n" 73 | 74 | print("final is",final) 75 | return final 76 | 77 | 78 | from flask import Flask,request,abort 79 | from pyngrok import ngrok 80 | import os 81 | import re 82 | import json 83 | from flask import jsonify 84 | from keybert import KeyBERT 85 | from sentence_transformers import SentenceTransformer 86 | smodel = SentenceTransformer('sentence-transformers/all-mpnet-base-v2') 87 | kw_model2 = KeyBERT(model= smodel) 88 | 89 | def key(text,lan): 90 | print("in keywords") 91 | doc = text 92 | keywords = kw_model2.extract_keywords(doc, keyphrase_ngram_range=(4,4), stop_words= 'english',use_maxsum=True, nr_candidates=20, top_n=5) 93 | # print(keywords) 94 | key = [] 95 | for i in range(5): 96 | dic = {"value": translation(lan,keywords[i][0]) } 97 | key.append(dic) 98 | 99 | 100 | 101 | return key 102 | 103 | 104 | 105 | 106 | 107 | def talktime(sentences,lan): 108 | # path = filename 109 | regex = 'SPEAKER\s\d*' 110 | reg = '[a-zA-Z]*\s*:' 111 | # file = open(path,"r") 112 | c=0 113 | count=0 114 | counts =0 115 | l=[] 116 | li = [] 117 | ratio=[] 118 | d = {} 119 | print("sentence in talktime:",sentences ) 120 | for f in range(len(sentences)): 121 | print("heyyyy:",type(sentences[f])) 122 | match = re.search(regex,str(sentences[f])) 123 | print("f:",sentences[f]) 124 | 125 | if match != None: 126 | print("hi in if",match.group(0),match) 127 | l.append(match.group(0)) 128 | else: 129 | match = re.search(reg,sentences[f]) 130 | if match != None: 131 | print("hi in else",match.group(0),match) 132 | l.append(match.group(0)) 133 | 134 | 135 | 136 | 137 | df = pd.DataFrame(l , columns = ["sentence"]) 138 | for idx, name in enumerate(df['sentence'].value_counts().index.tolist()): 139 | print('Name :', translation(lan,name)) 140 | print('Counts :', df['sentence'].value_counts()[idx]) 141 | li.append([translation(lan,name),df['sentence'].value_counts()[idx]]) 142 | 143 | 144 | 145 | print(li) 146 | for i in range(len(li)): 147 | counts =li[i][1] + counts 148 | 149 | for i in range(len(li)): 150 | dic = {"main": li[i][0] , "value": (li[i][1]/counts)*100} 151 | ratio.append(dic) 152 | # d = defaultdict(list) 153 | # for k, v in ratio: 154 | # d[k].append(v) 155 | 156 | r = ratio 157 | return r 158 | 159 | 160 | 161 | from flask_cors import CORS 162 | 163 | def remove_punctuation_except(text, exceptions): 164 | translator = str.maketrans('', '', string.punctuation.replace(exceptions, '')) 165 | return text.translate(translator) 166 | 167 | def transtoeng(filepath): 168 | sentence = [] 169 | # realname = "[a-zA-Z]*\s*\d" 170 | file = filepath.split('\n') 171 | print(file) 172 | sentence = [] 173 | finalsum = "" 174 | 175 | for f in file: 176 | # print("f is",f) 177 | f= f.replace("\r","") 178 | f = remove_punctuation_except(f, ':') 179 | for i in f : 180 | if i == "\n" or i == "\\" or i == "\r" : 181 | f = f.replace('\\',"") 182 | f= f.replace('\n',"") 183 | f= f.replace('\r',"") 184 | 185 | # print("f",f) 186 | # print(final) 187 | sentence.append(translation('en',str(f)+".").strip()) 188 | # for f in fi: 189 | # sentence.append(translation('en',f.strip())) 190 | 191 | if sentence[0].strip() == '.': 192 | del sentence[0] 193 | print('sentece first is',sentence[0],"type is", type(sentence[0])) 194 | return sentence 195 | 196 | 197 | 198 | # filepath = '/content/transcript (2).txt' 199 | 200 | 201 | 202 | 203 | import boto3 204 | import uuid 205 | 206 | import string 207 | 208 | app = Flask(__name__) 209 | cors = CORS(app) 210 | ngrok.set_auth_token("") # ---> Add your Auth token string from this link - [https://dashboard.ngrok.com/get-started/your-authtoken] 211 | public_url = ngrok.connect(5050).public_url 212 | @app.route("/sidebar", methods=["POST","OPTIONS"]) 213 | def summary(): 214 | if not request.files: 215 | print("BU=RUH") 216 | abort(400) 217 | data = request.form['data'] 218 | data = json.loads(data) 219 | print(type(data)) 220 | print(data) 221 | sentence = [] 222 | noofspeaker = data['no_of_speakers'] 223 | lan = data['user_language'] 224 | # file = data['old_file'] 225 | new_filename = data['new_file'] 226 | bucket_name = "deepbluetranscript" 227 | s3_key = new_filename 228 | s31 = boto3.client( 229 | service_name = 's3', 230 | region_name='us-east-2', 231 | aws_access_key_id ='', #add you key id 232 | aws_secret_access_key='' #add your secret access key 233 | ) 234 | 235 | response = s31.get_object(Bucket=bucket_name, Key=s3_key) 236 | contents = response['Body'].read().decode('utf-8') 237 | print(type(contents),contents) 238 | print(data) 239 | sentence = transtoeng(contents) 240 | print("variable sentence",sentence) 241 | text = preprocess(sentence,noofspeaker) 242 | print("text",text) 243 | k = key(text,lan) 244 | types = meeting_type(text,lan) 245 | t= talktime(sentence,lan) 246 | print(noofspeaker) 247 | print(k) 248 | di = {"num_speaker": noofspeaker,"keywords": k,"talktime":t ,"type": types} 249 | typess = {'id':1 , 'title':'Type','data':{'content':[{'value':types}]}} 250 | no = {'id':2 , 'title':'Speakers','data':{'content':[{'value':noofspeaker}]}} 251 | talk = {'id':3 , 'title':'Talktime','data':{'content':t}} 252 | keywords = {'id':4 , 'title':'Keywords','data':{'content':k}} 253 | 254 | # date = {'id':5 , 'title':'Date','data':{'content':dates}} 255 | # times = {'id':6 , 'title':'Time','data':{'content':time}} 256 | senddic = {"datacontent" : [typess , no, talk , keywords],"new_filename":new_filename} 257 | print(senddic) 258 | return senddic 259 | 260 | print(public_url) 261 | app.run(port = 5050) -------------------------------------------------------------------------------- /Models/Sidebar/tanscript_details_api.py: -------------------------------------------------------------------------------- 1 | import string 2 | 3 | def remove_punctuation_except(text, exceptions): 4 | """ 5 | This function removes all punctuation marks from a given text, except for a specified set of characters. 6 | """ 7 | translator = str.maketrans('', '', string.punctuation.replace(exceptions, '')) 8 | return text.translate(translator) 9 | 10 | 11 | import re 12 | 13 | def readfile(filename): 14 | translator = Translator() 15 | file = open(filename, "r") 16 | sentence = [] 17 | finalsum = "" 18 | 19 | for f in file: 20 | if f == '\n': 21 | continue 22 | else: 23 | f = remove_punctuation_except(f, ':') 24 | for i in f : 25 | if i == "\n" or i == "\\" : 26 | f = f.replace('\\',"") 27 | f= f.replace('\n',"") 28 | # print("f",f) 29 | # print(final) 30 | sentence.append(f + ".") 31 | 32 | lan = translator.detect(str(sentence[0])) 33 | lang_code = lan.lang 34 | # language = LANGUAGES[lang_code] 35 | file.close() 36 | return lang_code,sentence 37 | 38 | def noofspeaker(sentences): 39 | names = [] 40 | speaker = [] 41 | namep="SPEAKER\s\d*" 42 | x = re.findall(namep,sentences[0]) 43 | print(x) 44 | if len(x) == 0 : 45 | for i in range(len(sentences)): 46 | name = sentences[i].split(':')[0].strip() 47 | names.append(name) 48 | else: 49 | for i in range(len(sentences)): 50 | # print("sentence = ",sentences[i]) 51 | x = re.findall(namep,sentences[i]) 52 | # print(x) 53 | if str(x) != '[]': 54 | names.append(str(x)) 55 | # print(names) 56 | sets = set(names) 57 | print(sets) 58 | nameslist = list(sets) 59 | num = len(nameslist) 60 | return num 61 | 62 | 63 | 64 | from flask import Flask,request,abort 65 | from pyngrok import ngrok 66 | import os 67 | import re 68 | import json 69 | from flask import jsonify 70 | from flask_cors import CORS 71 | import time 72 | import datetime 73 | import filetype 74 | from googletrans import Translator 75 | import boto3,uuid 76 | 77 | 78 | os.mkdir("uploads") 79 | 80 | def translation( target_language,sentences): 81 | translator = Translator() 82 | 83 | target_language = target_language 84 | result = [] 85 | if type(sentences) == str: 86 | sentences = sentences.split("\n") 87 | # total_segments = 0 88 | # for i in result['segments']: 89 | # total_segments = total_segments + 1 90 | # print(total_segments) 91 | for i in range(len(sentences)): 92 | text_to_translate = sentences[i] 93 | target_sentence = translator.translate(text_to_translate, src ='en', dest=target_language).text 94 | result.append(target_sentence) 95 | return result 96 | 97 | 98 | ALLOWED_EXTENSIONS = {'txt'} 99 | 100 | def allowed_file(filename): 101 | return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS 102 | 103 | import boto3 104 | import uuid 105 | s3 = boto3.resource( 106 | service_name = 's3', 107 | region_name='us-east-2', 108 | aws_access_key_id ='ACESS_KEY', 109 | aws_secret_access_key='SECRET_ACCESS_KEY' 110 | ) 111 | 112 | def transcript(sentence,noofspeaker): 113 | namep="SPEAKER\s\d*" 114 | timestamp = "\d*:\d*:\d*" 115 | names = "[A-Za-z]*\s*:" 116 | namenp = "[A-Za-z]*:" 117 | new = [] 118 | l= len(sentence) 119 | x = re.findall(namep,sentence[0]) 120 | print("sentence = ",sentence[0]) 121 | print("first x",x) 122 | lists = [] 123 | if len(x) == 0: 124 | y = re.findall(names,sentence[0]) 125 | z = re.findall(namenp,sentence[0]) 126 | if len(y)!=0 or len(z)!= 0 : 127 | for i in range(len(sentence)): 128 | print("y"*30) 129 | print(sentence[i]) 130 | y = re.findall(names,sentence[i]) 131 | z = re.findall(namenp,sentence[i]) 132 | t = re.findall(timestamp,sentence[i]) 133 | if len(y) != 0: 134 | name = str(y)[2:-2] 135 | else: 136 | name = str(z)[2:-2] 137 | if len(t) == 0 : 138 | t ="" 139 | text = sentence[i].split(':')[-1] 140 | print("text 0 is",text[1]) 141 | if len(re.findall('[A-za-z]',text[1])) != 0: 142 | dic = {"speaker":name,"time":str(t)[2:-2],"dialogue":text } 143 | lists.append(dic) 144 | 145 | 146 | else: 147 | for i in range(0,l - 1): 148 | if i%2 == 0: 149 | print("sentence in preprocess = ",sentence[i]) 150 | y = re.findall(names,sentence[i]) 151 | z = re.findall(namenp,sentence[i]) 152 | t = re.findall(timestamp,sentence[i]) 153 | if len(y) != 0: 154 | name = str(y)[2:-2] 155 | else: 156 | name = str(z)[2:-2] 157 | if len(t) == 0 : 158 | t ="" 159 | text = sentence[i+1] 160 | dic = {"speaker":name,"time":str(t)[2:-2],"dialogue":text } 161 | lists.append(dic) 162 | 163 | 164 | 165 | 166 | else: 167 | for i in range(0,l - 1): 168 | if i%2 == 0: 169 | print("sentence in preprocess = ",sentence[i]) 170 | y = re.findall(namep,sentence[i]) 171 | t = re.findall(timestamp,sentence[i]) 172 | if len(y) != 0: 173 | name = str(y)[2:-2] 174 | text = sentence[i+1] 175 | dic = {"speaker":name,"time":str(t)[2:-2],"dialogue":text } 176 | lists.append(dic) 177 | return lists 178 | 179 | 180 | 181 | def remove_punctuation_except(text, exceptions): 182 | """ 183 | This function removes all punctuation marks from a given text, except for a specified set of characters. 184 | """ 185 | translator = str.maketrans('', '', string.punctuation.replace(exceptions, '')) 186 | return text.translate(translator) 187 | 188 | 189 | def translation( target_language,sentences): 190 | translator = Translator() 191 | 192 | target_language = target_language 193 | result = [] 194 | if type(sentences) == str: 195 | sentences = sentences.split("\n") 196 | # total_segments = 0 197 | # for i in result['segments']: 198 | # total_segments = total_segments + 1 199 | # print(total_segments) 200 | for i in range(len(sentences)): 201 | text_to_translate = sentences[i] 202 | target_sentence = translator.translate(text_to_translate, src ='en', dest=target_language).text 203 | result.append(target_sentence) 204 | return result 205 | 206 | def readfile(filename): 207 | translator = Translator() 208 | file = filename.split('\n') 209 | print("o"*50) 210 | print(file) 211 | sentence = [] 212 | finalsum = "" 213 | 214 | for f in file: 215 | if f == "\r": 216 | f= f.replace("\r","") 217 | 218 | elif f == "\n": 219 | f = f.replace("\r","") 220 | else: 221 | f = remove_punctuation_except(f, ':') 222 | 223 | 224 | for i in f : 225 | if i == "\n" or i == "\\" or i == "\r" : 226 | f = f.replace('\\',"") 227 | f= f.replace('\n',"") 228 | f= f.replace('\r',"") 229 | # print("f",f) 230 | # print(final) 231 | if f != "": 232 | sentence.append((f + ".").strip()) 233 | 234 | lan = translator.detect(str(sentence[0])) 235 | lang_code = lan.lang 236 | # language = LANGUAGES[lang_code] 237 | # file.close() 238 | return lang_code,sentence 239 | 240 | def noofspeaker(sentences): 241 | names = [] 242 | speaker = [] 243 | namep="SPEAKER\s\d*" 244 | x = re.findall(namep,sentences[0]) 245 | print(x) 246 | if len(x) == 0 : 247 | for i in range(len(sentences)): 248 | name = sentences[i].split(':')[0].strip() 249 | names.append(name) 250 | else: 251 | for i in range(len(sentences)): 252 | # print("sentence = ",sentences[i]) 253 | x = re.findall(namep,sentences[i]) 254 | # print(x) 255 | if str(x) != '[]': 256 | names.append(str(x)) 257 | # print(names) 258 | sets = set(names) 259 | print(sets) 260 | nameslist = list(sets) 261 | num = len(nameslist) 262 | return num 263 | 264 | 265 | app = Flask(__name__) 266 | cors = CORS(app) 267 | ngrok.set_auth_token("2Nvuiodzf44RE7mIAJP3jgDjVRf_Nhzb5yD8Zan8QABjHxT8") 268 | public_url = ngrok.connect(5050).public_url 269 | @app.route("/details", methods=["POST", "OPTIONS"]) 270 | def summary(): 271 | if not request.files: 272 | print("BU=RUH") 273 | abort(400) 274 | file = request.files['file'] 275 | new_filename = uuid.uuid4().hex + '.' + file.filename.rsplit('.', 1)[1].lower() 276 | bucket_name = "deepbluetranscript" 277 | s3_key = new_filename 278 | s3 = boto3.resource( 279 | service_name = 's3', 280 | region_name='us-east-2', 281 | aws_access_key_id ='AKIARFSHEEWZVMTD7F54', 282 | aws_secret_access_key='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' 283 | ) 284 | s3.Bucket(bucket_name).upload_fileobj(file, new_filename) 285 | to_language = request.form['user_language'] 286 | username = request.form['email'] 287 | print(to_language , username) 288 | s31 = boto3.client( 289 | service_name = 's3', 290 | region_name='us-east-2', 291 | aws_access_key_id ='AKIARFSHEEWZVMTD7F54', 292 | aws_secret_access_key='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' 293 | ) 294 | # file.save('uploads/' + 'transcript.txt') 295 | # filepath = 'uploads/transcript.txt' 296 | response = s31.get_object(Bucket=bucket_name, Key=s3_key) 297 | contents = response['Body'].read().decode('utf-8') 298 | print("contents",type(contents),contents) 299 | 300 | lan ,sentences = readfile(contents) 301 | 302 | print(sentences) 303 | num = noofspeaker(sentences) 304 | listofnames = transcript(sentences,num) 305 | print(num) 306 | senddic = {"language": lan , "no_of_speakers": num,"user_language":to_language,"email":username,"new_file":new_filename,'speakers':listofnames} 307 | return senddic 308 | 309 | print(public_url) 310 | app.run(port = 5050) 311 | 312 | -------------------------------------------------------------------------------- /Models/Transcription/requirements: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/Models/Transcription/requirements -------------------------------------------------------------------------------- /Models/Transcription/transcription.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pyannote.audio 3 | import whisper 4 | import datetime 5 | import subprocess 6 | import torch 7 | from pyannote.audio.pipelines.speaker_verification import PretrainedSpeakerEmbedding 8 | from pyannote.audio import Audio 9 | from pyannote.core import Segment 10 | import wave 11 | import contextlib 12 | from sklearn.cluster import AgglomerativeClustering 13 | import numpy as np 14 | from pydub import AudioSegment 15 | from googletrans import Translator 16 | from pyngrok import ngrok 17 | from flask import Flask, request, jsonify, send_file 18 | from flask_cors import CORS 19 | from moviepy.editor import * 20 | import time 21 | import filetype 22 | import cv2 23 | import re 24 | import pandas as pd 25 | import locale 26 | 27 | 28 | newpath = r'temp' 29 | if not os.path.exists(newpath): 30 | os.makedirs(newpath) 31 | newpath = r'transcript' 32 | if not os.path.exists(newpath): 33 | os.makedirs(newpath) 34 | newpath = r'segments' 35 | if not os.path.exists(newpath): 36 | os.makedirs(newpath) 37 | 38 | 39 | translator = Translator() 40 | embedding_model = PretrainedSpeakerEmbedding("speechbrain/spkrec-ecapa-voxceleb", device=torch.device("cuda")) 41 | # If you have GPU enabled cuda, leave as it is, otherwise set torch.device to "CPU" 42 | 43 | def getpreferredencoding(do_setlocale = True): 44 | return "UTF-8" 45 | locale.getpreferredencoding = getpreferredencoding 46 | 47 | 48 | language = 'English' #@param ['any', 'English'] 49 | 50 | model_size = 'large' #@param ['tiny', 'base', 'small', 'medium', 'large'] 51 | 52 | model_name = model_size 53 | if language != 'English' and model_size == 'large': 54 | model_name += '.en' 55 | 56 | 57 | print("MODEL LOADING INITIATED.....!!!!") 58 | 59 | model = whisper.load_model(model_size) 60 | 61 | print("MODEL LOADED.....!!!!") 62 | 63 | 64 | port_no = 5000 65 | 66 | from flask import Flask, request, jsonify, send_file 67 | import re 68 | import pandas as pd 69 | 70 | app = Flask(__name__) 71 | CORS(app) 72 | ngrok.set_auth_token("") # ---> Add your Auth token string from this link - [https://dashboard.ngrok.com/get-started/your-authtoken] 73 | public_url = ngrok.connect(port_no).public_url 74 | 75 | translator = Translator() 76 | 77 | @app.route("/video", methods=['POST','OPTIONS']) 78 | def transcription(): 79 | 80 | print("_____WAITING FOR FILE_____") 81 | 82 | # Check if the POST request contains a file 83 | if 'file' not in request.files: 84 | return jsonify({'error': 'No file included in the request'}), 400 85 | 86 | print("_____FILE RECIEVED!!!_____") 87 | 88 | file = request.files['file'] 89 | 90 | print(file) 91 | 92 | file_type = filetype.guess_mime(file) 93 | 94 | print(file_type) 95 | 96 | if 'video' in file_type: 97 | file.save('temp/' + 'RECORDING.mp4') 98 | elif 'audio' in file_type: 99 | file.save('temp/' + 'recording.wav') 100 | else: 101 | return 'Invalid file type' 102 | 103 | # file.save('temp/' + 'RECORDING.mp4') 104 | 105 | print("_____FILE SAVED!_____") 106 | 107 | #============================================================================================================ 108 | 109 | 110 | #----------------------------------------------------------------------------------------------------------------- 111 | 112 | if 'video' in file_type: 113 | 114 | #CODE FOR TAKING VIDEO AS INPUT THEN CONVERTING IT TO AUDIO 115 | 116 | clip = VideoFileClip('temp/RECORDING.mp4') 117 | 118 | # Extract the audio from the video 119 | audio = clip.audio 120 | 121 | # Save the audio as a separate file 122 | audio.write_audiofile('temp/recording.wav') 123 | 124 | #----------------------------------------------------------------------------------------------------------------- 125 | 126 | # CODE TO GET THE DURATION OF MEET RECORDING 127 | 128 | #----------------------------------------------------------------------------------------------------------------- 129 | 130 | audio_file_path = 'temp/recording.wav' 131 | with wave.open(audio_file_path, "rb") as wave_file: 132 | frame_rate = wave_file.getframerate() 133 | num_frames = wave_file.getnframes() 134 | duration = num_frames / float(frame_rate) 135 | # return duration 136 | hours = duration // 3600 137 | minutes = (duration % 3600) // 60 138 | seconds = duration % 60 139 | meeting_duration = f"{'0' + str(int(hours)) if hours < 10 else str(int(hours))}:{'0' + str(int(minutes)) if minutes < 10 else str(int(minutes))}:{'0' + str(int(seconds)) if seconds < 10 else str(int(seconds))}" 140 | print(f"THE DURATION OF MEETING IS-----> {meeting_duration}") 141 | 142 | # #----------------------------------------------------------------------------------------------------------------- 143 | 144 | 145 | # for i in range(0, count): 146 | path = f"temp/recording.wav" 147 | 148 | if path[-3:] != 'wav': 149 | subprocess.call(['ffmpeg', '-i', path, 'recording.wav', '-y']) 150 | path = 'recording.wav' 151 | 152 | print("TRANSCRIPTION STARTED......!!!") 153 | 154 | # result = model.transcribe(path, task='translate') 155 | result = model.transcribe(path) 156 | 157 | print("TRANSCRIPTION DONE......!!!") 158 | 159 | segments = result["segments"] 160 | 161 | current_language = result["language"] 162 | 163 | 164 | with contextlib.closing(wave.open(path,'r')) as f: 165 | frames = f.getnframes() 166 | rate = f.getframerate() 167 | duration = frames / float(rate) 168 | 169 | print("GOT FRAMES AND RATE.....!!!") 170 | 171 | audio = Audio() 172 | 173 | def segment_embedding(segment): 174 | start = segment["start"] 175 | end = min(duration, segment["end"]) 176 | clip = Segment(start, end) 177 | waveform, sample_rate = audio.crop(path, clip) 178 | return embedding_model(waveform[None]) 179 | 180 | print("SEGMENT_EMBEDDING FUNCTION DEFINED......!!!") 181 | 182 | 183 | embeddings = np.zeros(shape=(len(segments), 192)) 184 | for i, segment in enumerate(segments): 185 | embeddings[i] = segment_embedding(segment) 186 | 187 | embeddings = np.nan_to_num(embeddings) 188 | print(embedding_model) 189 | 190 | print("SEGMENT_EMBEDDING DONE BROOOO......!!!") 191 | 192 | 193 | clustering = AgglomerativeClustering().fit(embeddings) 194 | labels = clustering.labels_ 195 | for i in range(len(segments)): 196 | segments[i]["speaker"] = 'SPEAKER ' + str(labels[i] + 1) 197 | print(segments) 198 | 199 | 200 | print("AGGLOMERATIVE CLUSTERING DONE SHEEEEEESSHHH.......!!!!!!") 201 | 202 | 203 | def time(secs): 204 | return datetime.timedelta(seconds=round(secs)) 205 | 206 | print("TIME FETCHED YAAARRR......!!!!") 207 | 208 | f = open(f"transcript/transcript_FINAL.txt", "w") 209 | 210 | print("TRANSCRIPT FILE CREATED......!!!!") 211 | 212 | 213 | for (i, segment) in enumerate(segments): 214 | if i == 0 or segments[i - 1]["speaker"] != segment["speaker"]: 215 | f.write('\n' + segment["speaker"] + ' ' + str(time(segment["start"])) + '\n') 216 | print('\n' + str(time(segment["start"])) + '\n') 217 | try: 218 | f.write(segment["text"][1:]) 219 | print(segment["text"][1:] + ' ') 220 | except: 221 | print("MASK") 222 | 223 | print("WRITING IN TRANSCRIPT FILE DONE!!! HURRAYYY!!......!!!!") 224 | 225 | f.close() 226 | 227 | 228 | 229 | 230 | def translated_transcript(): 231 | 232 | total_segments = 0 233 | for i in result['segments']: 234 | total_segments = total_segments + 1 235 | print(total_segments) 236 | 237 | for i in range(0, total_segments): 238 | print(result['segments'][i]['text']) 239 | 240 | text_to_translate = result['segments'][i]['text'] 241 | 242 | result['segments'][i]['text'] = translator.translate(text_to_translate, src = current_language, dest='en').text 243 | i = i+1 244 | print(result) 245 | 246 | 247 | f = open(f"transcript/translated_transcript_FINAL.txt", "w") 248 | 249 | print("TRANSCRIPT FILE CREATED......!!!!") 250 | 251 | 252 | for (i, segment) in enumerate(segments): 253 | if i == 0 or segments[i - 1]["speaker"] != segment["speaker"]: 254 | f.write('\n' + segment["speaker"] + ' ' + str(time(segment["start"])) + '\n') 255 | # f.write('\n' + str(time(segment["start"])) + '\n') 256 | print('\n' + str(time(segment["start"])) + '\n') 257 | try: 258 | f.write(segment["text"][0:]) 259 | print(segment["text"][0:] + ' ') 260 | except: 261 | print("MASK") 262 | 263 | print("WRITING IN TRANSCRIPT FILE DONE!!! HURRAYYY!!......!!!!") 264 | 265 | f.close() 266 | 267 | translated_transcript() 268 | 269 | 270 | #============================================================================================================= 271 | 272 | c_time = os.path.getmtime("transcript/transcript_FINAL.txt") 273 | creation_date = datetime.datetime.fromtimestamp(c_time).strftime('%Y-%m-%d') 274 | creation_time = datetime.datetime.fromtimestamp(c_time).strftime('%H:%M:%S') 275 | filename = 'transcript/transcript_FINAL.txt' 276 | 277 | #=================================================================================================================================== 278 | 279 | def preprocess(filepath): 280 | sentences=[] 281 | namep="SPEAKER\s\d*" 282 | fi = open(filepath, "r", encoding="utf8") 283 | for f in fi: 284 | sentences.append(f.strip()) 285 | sentences 286 | 287 | final = [] 288 | for i in range(len(sentences)-1): 289 | if i%2 != 0 : 290 | name = str(sentences[i]) 291 | strings = sentences[i+1] 292 | # name = name[2:-2] 293 | 294 | 295 | final.append(name+": "+ strings ) 296 | 297 | 298 | 299 | return final 300 | 301 | 302 | 303 | 304 | def dialogue(filepath): 305 | fin=[] 306 | dic = {} 307 | preprocess(filepath) 308 | f = preprocess(filepath) 309 | print(f[1]) 310 | lens = len(f) 311 | p_s = "SPEAKER\s\d*" 312 | p_t = "\d*:\d*:\d*" 313 | for i in range(lens): 314 | match = re.search( p_s, f[i]) 315 | if match != None: 316 | name = match[0] 317 | match = re.search( p_t, f[i]) 318 | if match != None: 319 | time = match[0] 320 | 321 | text = f[i].split(':')[3] 322 | 323 | dic = {"id": i ,"speaker":name,"time":time, "dialogue": text} 324 | fin.append(dic) 325 | 326 | 327 | return fin 328 | 329 | 330 | def noofspeaker(filepath): 331 | sentence=[] 332 | speaker = [] 333 | namep="SPEAKER\s\d*" 334 | fi = open(filepath, "r", encoding="utf8") 335 | for f in fi: 336 | sentence.append(f.strip()) 337 | sentence 338 | l= len(sentence) 339 | for i in range(1,l): 340 | if i%2 != 0: 341 | x = re.findall(namep,sentence[i]) 342 | speaker.append(x) 343 | # print(speaker) 344 | df = pd.DataFrame(speaker , columns =['speakers']) 345 | # print(df) 346 | value = df['speakers'].nunique() 347 | print(value) 348 | return value 349 | 350 | #=================================================================================================================================== 351 | no_of_speakers = noofspeaker("/content/transcript/transcript_FINAL.txt") 352 | 353 | o = dialogue("/content/transcript/transcript_FINAL.txt") 354 | e = dialogue("/content/transcript/translated_transcript_FINAL.txt") 355 | di = {"no_of_speakers": no_of_speakers, 356 | "user_language": { "speaker" : o}, 357 | "english": { "speaker" : e}, 358 | "user_language_code": current_language, 359 | "meeting_duration": meeting_duration, 360 | "created_time": creation_time, 361 | "created_date": creation_date 362 | } 363 | 364 | return di 365 | 366 | 367 | 368 | 369 | @app.route("/transcript", methods=['GET']) 370 | def text_file(): 371 | filename = 'transcript/transcript_FINAL.txt' 372 | return send_file(filename, as_attachment=True), 200 373 | 374 | print(f"To access the Gloable link please click {public_url}") 375 | app.run(port=port_no) 376 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Virtual Meetings Summarizer 2 | In the work from home scenario prevailing over the last 18 months and with hybrid working picking steam, most Official meetings have been or will be conducted virtually. While MICROSOFT TEAMS / Google Meet / Zoom do provide a feature to download TRANSCRIPT, it does not summarise the meeting. 3 | 4 | 5 | #### Problem Dimensions : 6 | 7 | - Parse the Transcript to figure out many attendees were there in the meeting. 8 | - Duration of the meeting 9 | - Most importantly produce a gist / summary of the meeting 10 | - List the Action items if they are specifically called out. 11 | - Incase where Transcript is not available, you will have to additionally work on converting SPEECH to TEXT 12 | 13 |
14 |
15 | 16 | ## Website Installation : 17 | 18 | ```js 19 | cd website 20 | npm install 21 | npm start 22 | ``` 23 | ### Transcription Model : 24 | To run transcription generator file: 25 | 26 | ``` 27 | cd Models/Transcription 28 | pip install -r requirements.txt 29 | python transcription.py 30 | ``` 31 | (PS: Before running this file, please check if you have CUDA and make necessary changes [line 40] & add your Auth Token String mentioned in the code [line 72]) 32 | 33 | ### Fetch Summary : 34 | To run Summary Fetcher file: 35 | 36 | ``` 37 | cd Retriever 38 | pip install -r requirements.txt 39 | python fetch_summaries.py 40 | ``` 41 | 42 | ### API Endpoints 43 | ### The SummaryPage API provides the following endpoints: 44 | 45 | ``` 46 | /sidebar: Use this endpoint to generate items in the sidebar such as action items, talk time, speaker names, etc. 47 | /details: To generate user details. 48 | ``` 49 | 50 | 51 | 52 | ## Contributors 53 | 54 | | Profile | Role | 55 | | :------------------------------------------------------- | :------- | 56 | | [Yusuf Ansari](https://github.com/Yusuf80216) | ML/Backend Developer | 57 | | [Vrushali Chaudhari](https://github.com/Vrushali-anil-Chaudhari) | ML/Backend Developer | 58 | | [Yash Kamble](https://github.com/yash-devop) | Full Stack Developer | 59 | | [Khushi Sharma](https://github.com/khushishar) | Backend Developer | 60 | -------------------------------------------------------------------------------- /Retriever/fetch_summaries.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, jsonify, request 2 | from pymongo import MongoClient 3 | from pyngrok import ngrok 4 | from flask_cors import CORS 5 | from bson.objectid import ObjectId 6 | 7 | port_no = 5000 8 | app = Flask(__name__) 9 | CORS(app) 10 | ngrok.set_auth_token("") # ---> Add your Auth token string from this link - [https://dashboard.ngrok.com/get-started/your-authtoken] 11 | public_url = ngrok.connect(port_no).public_url 12 | client = MongoClient("") # ---> Add your Mongo Client string link 13 | db = client["summaries"] 14 | 15 | @app.route('/fetch_summaries', methods=["POST","OPTIONS"]) 16 | def get_summaries(): 17 | collection_name = request.form['email'] 18 | 19 | collection = db[collection_name] 20 | 21 | document_ids = [] 22 | document_ids = [str(id) for id in collection.distinct("_id")] 23 | 24 | all_summaries = [] 25 | 26 | for individual_summary in range(0, len(document_ids)): 27 | obj_id = ObjectId(document_ids[individual_summary]) 28 | document = collection.find_one({'_id': obj_id}) 29 | title = document.get("subject") 30 | data = document.get("data") 31 | my_dic = {"title": title, "data": data} 32 | all_summaries.append(my_dic) 33 | 34 | return jsonify({"all_summaries": all_summaries}) 35 | 36 | print(f"To access the Gloable link please click {public_url}") 37 | app.run(port=port_no) -------------------------------------------------------------------------------- /Retriever/requirements.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/Retriever/requirements.txt -------------------------------------------------------------------------------- /website/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /website/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Create React App 2 | 3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 4 | 5 | ## Available Scripts 6 | 7 | In the project directory, you can run: 8 | 9 | ### `npm start` 10 | 11 | Runs the app in the development mode.\ 12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser. 13 | 14 | The page will reload when you make changes.\ 15 | You may also see any lint errors in the console. 16 | 17 | ### `npm test` 18 | 19 | Launches the test runner in the interactive watch mode.\ 20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 21 | 22 | ### `npm run build` 23 | 24 | Builds the app for production to the `build` folder.\ 25 | It correctly bundles React in production mode and optimizes the build for the best performance. 26 | 27 | The build is minified and the filenames include the hashes.\ 28 | Your app is ready to be deployed! 29 | 30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 31 | 32 | ### `npm run eject` 33 | 34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!** 35 | 36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 37 | 38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. 39 | 40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. 41 | 42 | ## Learn More 43 | 44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 45 | 46 | To learn React, check out the [React documentation](https://reactjs.org/). 47 | 48 | ### Code Splitting 49 | 50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) 51 | 52 | ### Analyzing the Bundle Size 53 | 54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) 55 | 56 | ### Making a Progressive Web App 57 | 58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) 59 | 60 | ### Advanced Configuration 61 | 62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) 63 | 64 | ### Deployment 65 | 66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) 67 | 68 | ### `npm run build` fails to minify 69 | 70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) 71 | -------------------------------------------------------------------------------- /website/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "website", 3 | "version": "0.1.0", 4 | "private": true, 5 | "proxy": "http://localhost:5000", 6 | "dependencies": { 7 | "@reduxjs/toolkit": "^1.9.3", 8 | "@testing-library/jest-dom": "^5.16.5", 9 | "@testing-library/react": "^13.4.0", 10 | "@testing-library/user-event": "^13.5.0", 11 | "axios": "^1.3.4", 12 | "bootstrap-icons": "^1.10.3", 13 | "cors": "^2.8.5", 14 | "express": "^4.18.2", 15 | "firebase": "^9.17.1", 16 | "framer-motion": "^10.8.4", 17 | "mongodb": "^5.1.0", 18 | "mongoose": "^7.0.3", 19 | "react": "^18.2.0", 20 | "react-dom": "^18.2.0", 21 | "react-icons": "^4.8.0", 22 | "react-redux": "^8.0.5", 23 | "react-responsive": "^9.0.2", 24 | "react-router": "^6.8.2", 25 | "react-router-dom": "^6.8.2", 26 | "react-scripts": "5.0.1", 27 | "tailwindcss": "^3.2.7", 28 | "web-vitals": "^2.1.4" 29 | }, 30 | "scripts": { 31 | "start": "react-scripts start", 32 | "build": "react-scripts build", 33 | "test": "react-scripts test", 34 | "eject": "react-scripts eject" 35 | }, 36 | "eslintConfig": { 37 | "extends": [ 38 | "react-app", 39 | "react-app/jest" 40 | ] 41 | }, 42 | "browserslist": { 43 | "production": [ 44 | ">0.2%", 45 | "not dead", 46 | "not op_mini all" 47 | ], 48 | "development": [ 49 | "last 1 chrome version", 50 | "last 1 firefox version", 51 | "last 1 safari version" 52 | ] 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /website/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /website/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/public/favicon.ico -------------------------------------------------------------------------------- /website/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /website/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/public/logo192.png -------------------------------------------------------------------------------- /website/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/public/logo512.png -------------------------------------------------------------------------------- /website/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /website/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /website/src/App.js: -------------------------------------------------------------------------------- 1 | import { Route, Routes } from "react-router"; 2 | import Analytics from "./pages/Analytics"; 3 | import Home from "./pages/Home"; 4 | import SharedMe from "./pages/SharedMe"; 5 | import SummaryPage from "./pages/SummaryPage"; 6 | import UploadPage from "./pages/UploadPage"; 7 | import Notebook from "./pages/Notebook"; 8 | import EditableTextField from "./pages/EditableTextField"; 9 | import { AppContext } from "./context"; 10 | import { useContext } from "react"; 11 | import Signin from "./components/Signin"; 12 | import Signup from "./components/Signup"; 13 | import Account from "./components/Account"; 14 | import ProtectedRoutes from "./components/ProtectedRoutes"; 15 | import MySummary from "./pages/MySummary"; 16 | 17 | function App() { 18 | return ( 19 | // px-3 lg:px-2 lg:py-2 xl:max-w-[1300px] w-full mx-auto 20 | <> 21 |
22 | 23 | }/> 24 | }/> 25 | }/> 26 | }/> 27 | }/> 28 | }/> 29 | }/> 30 | }/> 31 | }/> 32 | }/> 33 | }/> 34 | }/> 35 | 36 |
37 | 38 | 39 | 40 | ); 41 | } 42 | 43 | export default App; 44 | -------------------------------------------------------------------------------- /website/src/NextPage.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { useLocation } from 'react-router'; 3 | import ImageViewer from './components/ImageViewer' 4 | 5 | const NextPage = () => { 6 | 7 | return( 8 | <> 9 |

Nextpage

10 | 11 | ) 12 | 13 | 14 | } 15 | 16 | export default NextPage 17 | 18 | 19 | 20 | // const location = useLocation(); 21 | // const myProp = location.state?.myProp; 22 | // return ( 23 | // <> 24 | //

{myProp}

25 | // { 26 | // myProp.map((data)=>{ 27 | // console.log('nextpage',data); 28 | // return( 29 | // <> 30 | // 31 | // 32 | // ) 33 | // }) 34 | // } 35 | // -------------------------------------------------------------------------------- /website/src/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Create React App 2 | 3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 4 | 5 | ## Available Scripts 6 | 7 | In the project directory, you can run: 8 | 9 | ### `npm start` 10 | 11 | Runs the app in the development mode.\ 12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser. 13 | 14 | The page will reload when you make changes.\ 15 | You may also see any lint errors in the console. 16 | 17 | ### `npm test` 18 | 19 | Launches the test runner in the interactive watch mode.\ 20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 21 | 22 | ### `npm run build` 23 | 24 | Builds the app for production to the `build` folder.\ 25 | It correctly bundles React in production mode and optimizes the build for the best performance. 26 | 27 | The build is minified and the filenames include the hashes.\ 28 | Your app is ready to be deployed! 29 | 30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 31 | 32 | ### `npm run eject` 33 | 34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!** 35 | 36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 37 | 38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. 39 | 40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. 41 | 42 | ## Learn More 43 | 44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 45 | 46 | To learn React, check out the [React documentation](https://reactjs.org/). 47 | 48 | ### Code Splitting 49 | 50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) 51 | 52 | ### Analyzing the Bundle Size 53 | 54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) 55 | 56 | ### Making a Progressive Web App 57 | 58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) 59 | 60 | ### Advanced Configuration 61 | 62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) 63 | 64 | ### Deployment 65 | 66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) 67 | 68 | ### `npm run build` fails to minify 69 | 70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) 71 | -------------------------------------------------------------------------------- /website/src/assets/FIREFLIES_UI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/FIREFLIES_UI.png -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Create React App 2 | 3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 4 | 5 | ## Available Scripts 6 | 7 | In the project directory, you can run: 8 | 9 | ### `npm start` 10 | 11 | Runs the app in the development mode.\ 12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser. 13 | 14 | The page will reload when you make changes.\ 15 | You may also see any lint errors in the console. 16 | 17 | ### `npm test` 18 | 19 | Launches the test runner in the interactive watch mode.\ 20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 21 | 22 | ### `npm run build` 23 | 24 | Builds the app for production to the `build` folder.\ 25 | It correctly bundles React in production mode and optimizes the build for the best performance. 26 | 27 | The build is minified and the filenames include the hashes.\ 28 | Your app is ready to be deployed! 29 | 30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 31 | 32 | ### `npm run eject` 33 | 34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!** 35 | 36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 37 | 38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. 39 | 40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. 41 | 42 | ## Learn More 43 | 44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 45 | 46 | To learn React, check out the [React documentation](https://reactjs.org/). 47 | 48 | ### Code Splitting 49 | 50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) 51 | 52 | ### Analyzing the Bundle Size 53 | 54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) 55 | 56 | ### Making a Progressive Web App 57 | 58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) 59 | 60 | ### Advanced Configuration 61 | 62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) 63 | 64 | ### Deployment 65 | 66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) 67 | 68 | ### `npm run build` fails to minify 69 | 70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) 71 | -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tutorial", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@reduxjs/toolkit": "^1.9.1", 7 | "@testing-library/jest-dom": "^5.16.5", 8 | "@testing-library/react": "^13.4.0", 9 | "@testing-library/user-event": "^13.5.0", 10 | "react": "^18.2.0", 11 | "react-dom": "^18.2.0", 12 | "react-redux": "^8.0.5", 13 | "react-router-dom": "^6.7.0", 14 | "react-scripts": "5.0.1", 15 | "web-vitals": "^2.1.4" 16 | }, 17 | "scripts": { 18 | "start": "react-scripts start", 19 | "build": "react-scripts build", 20 | "test": "react-scripts test", 21 | "eject": "react-scripts eject" 22 | }, 23 | "eslintConfig": { 24 | "extends": [ 25 | "react-app", 26 | "react-app/jest" 27 | ] 28 | }, 29 | "browserslist": { 30 | "production": [ 31 | ">0.2%", 32 | "not dead", 33 | "not op_mini all" 34 | ], 35 | "development": [ 36 | "last 1 chrome version", 37 | "last 1 firefox version", 38 | "last 1 safari version" 39 | ] 40 | }, 41 | "devDependencies": { 42 | "tailwindcss": "^3.2.4" 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/src/App.js: -------------------------------------------------------------------------------- 1 | import { Provider } from "react-redux"; 2 | import { BrowserRouter, Route, Routes } from "react-router-dom"; 3 | import Navbar from "./components/Navbar"; 4 | import Cart from "./pages/Cart"; 5 | import Home from "./pages/Home"; 6 | import store from "./store/store"; 7 | 8 | function App() { 9 | return ( 10 |
11 | {/* STEP3 of REDUX TOOLKIT */} 12 | 13 | 14 | 15 | 16 | }/> 17 | }/> 18 | 19 | 20 | 21 |
22 | ); 23 | } 24 | 25 | export default App; 26 | -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/src/STEPS: -------------------------------------------------------------------------------- 1 | 1) create a slice for ur data 2 | inside that , initialState is defined 3 | and inside reducers , we create functions 4 | then from that slice , we get the actions ( cartSlice.actions ) 5 | then export actions and reducers 6 | 7 | 2) configure store 8 | 3) add the provider in App.js and wrap everything 9 | inside the Provider> 10 | 11 | 12 | TO GET DATA FROM STORE : use : useSelector -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/src/components/Navbar.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Link } from 'react-router-dom' 3 | import logo from '../images/whiteamazonlogo.png' 4 | // import ShoppingCartOutlinedIcon from '@mui/icons-material/ShoppingCartOutlined'; 5 | import { BiCart } from 'react-icons/bi' 6 | import { useSelector } from 'react-redux' 7 | 8 | 9 | const Navbar = () => { 10 | const items = useSelector((state)=>state.cart) 11 | return ( 12 | <> 13 |
14 |
15 | 16 |
17 |
18 | 32 |
33 |
34 | 35 | ) 36 | } 37 | 38 | export default Navbar -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/src/components/Products.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from 'react' 2 | // to use the actions , useDispatch is used. 3 | import { useDispatch, useSelector } from 'react-redux'; 4 | import { add, remove } from '../store/cartSlice'; 5 | import { fetchProducts } from '../store/productSlice'; 6 | 7 | const Products = () => { 8 | const dispatch = useDispatch(); 9 | const {data : products, status} = useSelector((state)=>state.product) 10 | // const [products , setProducts ] = useState([]); 11 | useEffect(()=>{ 12 | dispatch(fetchProducts()) 13 | // const fetchProducts = async ()=>{ 14 | // const response = await fetch('https://fakestoreapi.com/products') 15 | // const data = await response.json() 16 | // console.log(data); 17 | // setProducts(data); 18 | // } 19 | // fetchProducts() 20 | },[]) 21 | // #EAEDED 22 | 23 | const handleAdd = (product)=>{ 24 | // dispatch is used to place that function when we do something 25 | // and inside that we pass : action 26 | // so syntax , dispatch(action); 27 | 28 | dispatch(add(product)) 29 | 30 | } 31 | 32 | return ( 33 | <> 34 |
35 | { 36 | products.map((currentElem)=>{ 37 | return( 38 | <> 39 |
40 | 41 |

{currentElem.title}

42 |
{currentElem.price}
43 | 44 |
45 | 46 | ) 47 | }) 48 | } 49 |
50 | 51 | ) 52 | } 53 | 54 | export default Products -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/src/images/amazonin.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/src/images/whiteamazonlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/src/images/whiteamazonlogo.png -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | body { 6 | margin: 0; 7 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 8 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 9 | sans-serif; 10 | -webkit-font-smoothing: antialiased; 11 | -moz-osx-font-smoothing: grayscale; 12 | } 13 | 14 | code { 15 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 16 | monospace; 17 | } 18 | 19 | .card { 20 | background: white; 21 | padding: 20px; 22 | text-align: center; 23 | border-radius: 10px; 24 | } 25 | .productsWrapper { 26 | display: grid; 27 | grid-template-columns: repeat(4, 1fr); 28 | gap: 30px; 29 | } 30 | .btn { 31 | border: none; 32 | outline: none; 33 | background: #764abc; 34 | padding: 5px 10px; 35 | color: #fff; 36 | border-radius: 5px; 37 | font-weight: bold; 38 | cursor: pointer; 39 | transition: all 0.3s ease-in-out; 40 | } 41 | .cartCard { 42 | display: flex; 43 | align-items: center; 44 | justify-content: space-between; 45 | background: #fff; 46 | margin-bottom: 20px; 47 | padding: 14px; 48 | border-radius: 5px; 49 | } -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import './index.css'; 4 | import App from './App'; 5 | 6 | const root = ReactDOM.createRoot(document.getElementById('root')); 7 | root.render( 8 | 9 | 10 | 11 | ); 12 | 13 | -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/src/pages/Cart.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { useDispatch, useSelector } from 'react-redux' 3 | import { remove } from '../store/cartSlice'; 4 | 5 | 6 | const Cart = () => { 7 | const products = useSelector((state)=>state.cart); 8 | const dispatch = useDispatch() 9 | const handleRemove = (productId)=>{ 10 | dispatch(remove(productId)) 11 | } 12 | console.log('PRODUCTS ', products.length); 13 | return ( 14 | <> 15 |
16 |

{products.length < 1 ? 'Your Cart is Empty' : 'Your Cart : '}

17 |
18 | { 19 | products.map((product)=>{ 20 | return( 21 | <> 22 |
23 | 24 |
{product.title}
25 |
{product.price}
26 | 27 |
28 | 29 | ) 30 | }) 31 | 32 | } 33 |
34 |
35 | 36 | ) 37 | } 38 | 39 | export default Cart -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/src/pages/Home.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Products from '../components/Products' 3 | 4 | const Home = () => { 5 | return ( 6 | <> 7 |
8 | 9 |
10 | 11 | ) 12 | } 13 | 14 | export default Home -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/src/store/cartSlice.js: -------------------------------------------------------------------------------- 1 | // STEP 1 : creating Slice 2 | const { createSlice } = require("@reduxjs/toolkit"); 3 | 4 | const initialState = []; 5 | 6 | const cartSlice = createSlice({ 7 | name : 'cart', 8 | initialState, 9 | reducers: { 10 | add(state ,action){ 11 | // old redux : 12 | // return [...state , action.payload] 13 | // Redux Toolkit : 14 | state.push(action.payload) 15 | }, 16 | remove(state ,action){ 17 | return state.filter((item)=> item.id !== action.payload) 18 | }, 19 | // if more function/property are there, add them below, 20 | } 21 | }); 22 | export const { add , remove } = cartSlice.actions // exporting actions 23 | export default cartSlice.reducer // exporting reducer 24 | // if more reducers are there, export them below. 25 | 26 | // previously we were doing as : 27 | /* 28 | { 29 | type : 'add/cart', 30 | payload : 1 31 | } 32 | 33 | instead of this , now we are using CreateSlice function 34 | */ -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/src/store/productSlice.js: -------------------------------------------------------------------------------- 1 | // STEP 1 : creating Slice 2 | const { createSlice } = require("@reduxjs/toolkit"); 3 | 4 | export const STATUSES = Object.freeze({ 5 | IDLE: 'idle', 6 | ERROR: 'error', 7 | LOADING: 'loading', 8 | }); 9 | 10 | const initialState = { 11 | data : [], 12 | status : STATUSES.IDLE, 13 | }; 14 | 15 | const productSlice = createSlice({ 16 | name : 'product', 17 | initialState, 18 | reducers: { 19 | // state = initialState 20 | setProducts(state ,action){ 21 | // NEVER DO THE Below ANY async API Call in REDUCER 22 | // const response = await fetch('https://fakestoreapi.com/products') 23 | // so to do api calling in reducer , THUNKS MiddleWare is used 24 | state.data = action.payload 25 | }, 26 | setStatus(state,action){ 27 | state.status = action.payload 28 | } 29 | } 30 | }); 31 | export const {setProducts ,setStatus} = productSlice.actions // exporting actions 32 | export default productSlice.reducer // exporting reducer 33 | 34 | 35 | // Thunks 36 | export function fetchProducts() { 37 | return async function fetchProductThunk(dispatch, getState) { 38 | dispatch(setStatus(STATUSES.LOADING)); 39 | try { 40 | const res = await fetch('https://fakestoreapi.com/products'); 41 | const data = await res.json(); 42 | dispatch(setProducts(data)); 43 | dispatch(setStatus(STATUSES.IDLE)); 44 | } catch (err) { 45 | console.log(err); 46 | dispatch(setStatus(STATUSES.ERROR)); 47 | } 48 | }; 49 | } -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/src/store/store.js: -------------------------------------------------------------------------------- 1 | // STEP 2 : configureStore / creatingStore / createStore 2 | import { configureStore } from "@reduxjs/toolkit"; 3 | import cartReducer from './cartSlice' 4 | import productReducer from './productSlice' 5 | // just like , in step1 , we created Slice and passed object.. same have we will do that here. 6 | const store = configureStore({ 7 | // this is cartSlice.reducer that we exported. 8 | reducer : { 9 | // name : reducer => name is taken from slice 10 | cart : cartReducer, 11 | product : productReducer 12 | // now if we have created another slice., simply add it below. 13 | // example: products : productReducer <-- like this. 14 | } 15 | }) 16 | 17 | export default store; -------------------------------------------------------------------------------- /website/src/assets/FULLReactREDUXToolkit/FULLReactREDUXToolkit/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./src/**/*.{js,jsx,ts,tsx}", 5 | ], 6 | theme: { 7 | extend: {}, 8 | }, 9 | plugins: [], 10 | } 11 | -------------------------------------------------------------------------------- /website/src/assets/Helvetica-Font/Helvetica-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/Helvetica-Font/Helvetica-Bold.ttf -------------------------------------------------------------------------------- /website/src/assets/Helvetica-Font/Helvetica-BoldOblique.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/Helvetica-Font/Helvetica-BoldOblique.ttf -------------------------------------------------------------------------------- /website/src/assets/Helvetica-Font/Helvetica-Oblique.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/Helvetica-Font/Helvetica-Oblique.ttf -------------------------------------------------------------------------------- /website/src/assets/Helvetica-Font/Helvetica.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/Helvetica-Font/Helvetica.ttf -------------------------------------------------------------------------------- /website/src/assets/Helvetica-Font/helvetica-compressed-5871d14b6903a.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/Helvetica-Font/helvetica-compressed-5871d14b6903a.otf -------------------------------------------------------------------------------- /website/src/assets/Helvetica-Font/helvetica-light-587ebe5a59211.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/Helvetica-Font/helvetica-light-587ebe5a59211.ttf -------------------------------------------------------------------------------- /website/src/assets/Helvetica-Font/helvetica-rounded-bold-5871d05ead8de.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/Helvetica-Font/helvetica-rounded-bold-5871d05ead8de.otf -------------------------------------------------------------------------------- /website/src/assets/HomeContent.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/HomeContent.jpg -------------------------------------------------------------------------------- /website/src/assets/Netflix_2015_logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/src/assets/RECORDING.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/RECORDING.mp4 -------------------------------------------------------------------------------- /website/src/assets/Zoom_cm_fe588s5MkboM5fZ9vvrZo4_mKT+WVqwNeKisgOrYAmT3fSwq976Eoyu1Jycn@RkzR9-G00ioJlXXD_k448d161884e7e241_.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/Zoom_cm_fe588s5MkboM5fZ9vvrZo4_mKT+WVqwNeKisgOrYAmT3fSwq976Eoyu1Jycn@RkzR9-G00ioJlXXD_k448d161884e7e241_.exe -------------------------------------------------------------------------------- /website/src/assets/arrow_down.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/src/assets/arrow_up.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/src/assets/business (1).txt: -------------------------------------------------------------------------------- 1 | Alice: "Hello everyone, thanks for joining this meeting. As you all know, we have a tight deadline for the launch of our new product, which is set for July 1st. Ben, could you please give us an update on the marketing side?" 2 | 3 | Ben: "Sure, Alice. We're currently finalizing the marketing plan, and we're planning to start the pre-launch activities by June 1st. We're going to use a mix of social media, email marketing, and paid advertising to reach our target audience." 4 | 5 | Alice: "Thanks, Ben. Chris, how is the product development coming along?" 6 | 7 | Chris: "We're making good progress, Alice. We have all the core features implemented, and we're currently working on adding some additional features that we think will really make the product stand out. We should have everything done by the end of May." 8 | 9 | Alice: "That's great to hear. Diana, what's the status of the design?" 10 | 11 | Diana: "We're on track to meet the deadline, Alice. We've completed the initial design, and we're currently refining the user interface and experience. We should be done by the end of next week." 12 | 13 | Alice: "Fantastic. Emma, how is the development going?" 14 | 15 | Emma: "It's going well, Alice. We've been working closely with Chris and Diana to ensure that everything is running smoothly. We should be ready to release the first beta version to the QA team by next week." 16 | 17 | Alice: "That's good to hear. Frank, what's the status of the sales team?" 18 | 19 | Frank: "We're all set, Alice. We have a list of potential customers that we're going to reach out to, and we're confident that we'll be able to generate a lot of interest in the product." 20 | 21 | Alice: "Great work, Frank. So, we're all on track to meet the July 1st deadline for the product launch. However, we need to make sure that we're all aligned on the actions that we need to take to get there. Ben, could you please send us a detailed marketing plan by May 15th?" 22 | 23 | Ben: "Yes, Alice. I'll make sure to get that done." 24 | 25 | Alice: "Thanks, Ben. Chris, could you please ensure that all the features are implemented and tested by May 31st?" 26 | 27 | Chris: "Will do, Alice. We'll make sure everything is working as it should be by the end of May." 28 | 29 | Alice: "Great. Diana, could you please make sure that the final designs are complete and ready for development by May 24th?" 30 | 31 | Diana: "No problem, Alice. We'll make sure to get everything done on time." 32 | 33 | Alice: "Excellent. And Emma, could you please ensure that the beta version is ready for the QA team by May 31st?" 34 | 35 | Emma: "Yes, Alice. We'll have everything tested and ready to go by the end of May." 36 | 37 | Alice: "Fantastic. And Frank, could you please start reaching out to potential customers by June 1st?" 38 | 39 | Frank: "Absolutely, Alice. We'll start our outreach efforts on June 1st." 40 | 41 | Alice: "Thank you, everyone, for your hard work. We'll have another meeting in a week to review the progress and make any necessary adjustments to the plan." -------------------------------------------------------------------------------- /website/src/assets/close-minimiz-max.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/close-minimiz-max.webp -------------------------------------------------------------------------------- /website/src/assets/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/close.png -------------------------------------------------------------------------------- /website/src/assets/demoaudio.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/demoaudio.mp3 -------------------------------------------------------------------------------- /website/src/assets/hindi_rec.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/hindi_rec.mp4 -------------------------------------------------------------------------------- /website/src/assets/menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/menu.png -------------------------------------------------------------------------------- /website/src/assets/rec.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/rec.mp4 -------------------------------------------------------------------------------- /website/src/assets/sidebar-logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /website/src/assets/testingvideo.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/testingvideo.mp4 -------------------------------------------------------------------------------- /website/src/assets/tickmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/tickmark.png -------------------------------------------------------------------------------- /website/src/assets/transcript_FINAL.txt: -------------------------------------------------------------------------------- 1 | 2 | 0:00:00 3 | Hello, my name is Jenny. 4 | Hi, how are you doing? 5 | 6 | 0:00:04 7 | I am fine, thank you. 8 | 9 | 0:00:06 10 | Where do you live? 11 | 12 | 0:00:07 13 | I live in Dubai. 14 | 15 | 0:00:08 16 | Nice, I live Abu Dhabi. 17 | How long do you live there? 18 | I live there for 7 years. 19 | 20 | 0:00:13 21 | Do you live alone, or with your family? 22 | I live with my wife. 23 | Really, nice, I'll live with mother. 24 | 25 | 0:00:19 26 | How long have you been married? 27 | 28 | 0:00:20 29 | I have been married for 3 years. 30 | Where are you working? 31 | 32 | 0:00:23 33 | I am working in a factory. 34 | 35 | 0:00:25 36 | Do you like working in the factory? 37 | 38 | 0:00:27 39 | No, I do not like working in the factory, but I need money. 40 | 41 | 0:00:30 42 | Yes, I understand. Where do you want to work? 43 | 44 | 0:00:34 45 | I want to work in an office. 46 | 47 | 0:00:35 48 | I see, I hope you get a job in an office. 49 | 50 | 0:00:38 51 | Thank you Jenny, where do you work? 52 | 53 | 0:00:40 54 | I work in the supermarket. 55 | 56 | 0:00:41 57 | What do you do in the supermarket? 58 | 59 | 0:00:43 60 | I am a manager, I love my job. 61 | 62 | 0:00:45 63 | That's great, I am happy you have a good job. 64 | 65 | 0:00:48 66 | Thank you Peter. 67 | 68 | 0:00:49 69 | I have lots of friends. 70 | 71 | 0:00:50 72 | Really, how many do you have? 73 | 74 | 0:00:52 75 | I don't know, maybe 1000. 76 | 77 | 0:00:54 78 | That is a lot of friends, I don't believe. 79 | Check out the number of friends I have on Facebook. 80 | 81 | 0:00:59 82 | Do you have a best friend? 83 | Of course, I have lost of best friends. 84 | 85 | 0:01:03 86 | How many best friends do you have? 87 | 88 | 0:01:05 89 | I think about 30. 90 | 91 | 0:01:06 92 | I have only one best friend. 93 | 94 | 0:01:08 95 | I feel sorry for you. 96 | 97 | 0:01:09 98 | I have only a 5 friends. 99 | 100 | 0:01:11 101 | You must be lonely, I will share my friends with you. 102 | 103 | 0:01:14 104 | That's very nice of you. 105 | My ear is killing me. 106 | 107 | 0:01:16 108 | What is the matter? 109 | 110 | 0:01:17 111 | I was on a plane. 112 | 113 | 0:01:18 114 | So? 115 | Every time the plane goes up, my ear starts to hurt. 116 | That's no good. 117 | Sometimes the pain goes away, and sometimes it doesn't. 118 | 119 | 0:01:26 120 | Have you seen a doctor? 121 | 122 | 0:01:28 123 | I've been to 3 doctors. 124 | 125 | 0:01:29 126 | And they couldn't fix your problem? 127 | 128 | 0:01:31 129 | They said I have to live with it. 130 | 131 | 0:01:32 132 | Or you can stay off planes. 133 | 134 | 0:01:34 135 | Yes. 136 | 137 | 0:01:35 138 | It was nice talking to you, but I have to go. 139 | Ok, bye bye. 140 | 141 | 0:01:38 142 | Bye. 143 | -------------------------------------------------------------------------------- /website/src/assets/user-pfp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/assets/user-pfp.jpg -------------------------------------------------------------------------------- /website/src/components/Accordion.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react' 2 | import { BsChevronDown, BsChevronUp } from 'react-icons/bs'; 3 | 4 | const Accordion = ({title,type,speakers,keywords,talktime,data}) => { 5 | const [filterdata ,setFilterData ] = useState(null); 6 | const speakersObj = {}; 7 | const [show , setShow] = useState(true); 8 | const [value, setValue] = useState('Speaker1'); 9 | const [isEditable, setIsEditable] = useState(false); 10 | const [tempValue, setTempValue] = useState(''); 11 | const handleShow=()=>{ 12 | setShow(!show); 13 | } 14 | 15 | console.log('dataofAccordion',data); 16 | if(data){ 17 | setFilterData(data); 18 | } 19 | const handleDoubleClick = () => { 20 | setTempValue(value); 21 | setIsEditable(true); 22 | }; 23 | 24 | const handleSave = () => { 25 | setValue(tempValue); 26 | setIsEditable(false); 27 | }; 28 | 29 | const handleCancel = () => { 30 | setIsEditable(false); 31 | setTempValue(value); 32 | }; 33 | 34 | const handleTempValueChange = (event) => { 35 | setTempValue(event.target.value); 36 | }; 37 | // LATER ON: 38 | 39 | // let curElem; 40 | // data.map((element,index)=>{ 41 | // console.log('eleemnet',element.main); 42 | // speakersObj[`speaker${index+1}`] = element.main; 43 | // }) 44 | 45 | 46 | 47 | // console.log('speakerDATA',speakersObj); 48 | 49 | 50 | // console.log('speaker1111',speakersObj.speaker1); 51 | 52 | 53 | 54 | return ( 55 | <> 56 | { 57 | <> 58 |
59 |

{title}

60 | { 61 | show ? ( 62 | <> 63 | 64 | 65 | ):( 66 | 67 | ) 68 | } 69 | 70 |
71 | { 72 | show ? ( 73 | <> 74 |
75 | { 76 | filterdata.map((curelem)=>{ 77 | return( 78 | <> 79 | { 80 | title === 'Talktime'? ( 81 | <> 82 |
83 | 84 | {/* */} 85 | 86 | 87 |

{curelem.value}

88 |
89 | 90 | ) : ( 91 | <> 92 |
93 | {/*

{curelem.main}

*/} 94 |

{curelem.value}

95 |
96 | 97 | ) 98 | 99 | 100 | } 101 | 102 | 103 | ) 104 | }) 105 | } 106 | {/* { 107 | data.map((curelem)=>{ 108 | return( 109 | <> 110 | { 111 | title === 'Talktime'? ( 112 | <> 113 |
114 | 115 | 116 | 117 |

{curelem.value}

118 |
119 | 120 | ) : ( 121 | <> 122 |
123 |

{curelem.main}

124 |

{curelem.value}

125 |
126 | 127 | ) 128 | 129 | 130 | } 131 | 132 | 133 | ) 134 | }) 135 | } */} 136 | {/* <> 137 | { 138 | title === 'Talktime' ? ( 139 |
140 |

{curelem.main}

141 |

{curelem.value}

142 |
143 | ) : ( 144 |
145 |

{curelem.main}

146 |

{curelem.value}

147 |
148 | ) 149 | } 150 | 151 | */} 152 | 153 | 154 | 155 | {/*
156 | <> 157 |
158 | 159 | 160 |
161 | 162 | ) : ( 163 | <> 164 |

{curelem.main}

165 |

{curelem.value}

166 | 167 | ) 168 | 169 |
170 | ) : ( 171 |
172 |

{curelem.main}

173 |

{curelem.value}

174 |
} */} 175 |
176 | 177 | ) : null 178 | } 179 | 180 | } 181 | 182 | {/*
183 |

184 | { 185 | data.map((curelem)=>{ 186 | return( 187 | <> 188 | {curelem.value} 189 | 190 | ) 191 | }) 192 | 193 | } 194 | 195 |

196 |
*/} 197 | 198 | {/* { 199 | type ? ( 200 | <> 201 |
202 |

Type

203 | { 204 | show ? ( 205 | <> 206 | 207 | 208 | ):( 209 | 210 | ) 211 | } 212 | 213 |
214 | { 215 | show ? ( 216 | <> 217 |
218 | 219 |

{type}

220 |
221 | 222 | ) : null 223 | } 224 | 225 | ) : null 226 | } 227 | */} 228 | 229 | 230 | 231 | ) 232 | } 233 | 234 | export default Accordion; -------------------------------------------------------------------------------- /website/src/components/Account.js: -------------------------------------------------------------------------------- 1 | import React, { useRef } from 'react' 2 | import { UserAuth } from '../context/AuthContext' 3 | import { useNavigate } from 'react-router'; 4 | import userLogo from '../assets/user-pfp.jpg' 5 | import {VscAccount } from 'react-icons/vsc' 6 | import {CgLogOut } from 'react-icons/cg' 7 | {/* */} 8 | const Account = () => { 9 | 10 | const dropDownData = [ 11 | // 'Profile' ,'Checkout','My Account','Logout' 12 | { 13 | id:1, 14 | name:'Logout', 15 | image:'CgLogOut', 16 | }, 17 | // { 18 | // id:2, 19 | // name:'Logout', 20 | // image:'VscAccount', 21 | // }, 22 | 23 | ]; 24 | const imgRef = useRef(); 25 | const menuRef = useRef(); 26 | const {user , logout,username } = UserAuth(); 27 | const navigate = useNavigate(); 28 | const handleLogout=async(e)=>{ 29 | try { 30 | await logout(); 31 | navigate('/signup') 32 | console.log('you are logged out'); 33 | } catch (error) { 34 | console.log(error.message); 35 | } 36 | } 37 | return ( 38 | <> 39 |
40 | 82 |
83 | 84 | ) 85 | } 86 | 87 | export default Account -------------------------------------------------------------------------------- /website/src/components/AddSpeaker.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react' 2 | import tickmark from '../assets/tickmark.png' 3 | const AddSpeaker = ({onclick,count}) => { 4 | 5 | return ( 6 | <> 7 |
8 | 9 | 10 |
11 | 12 | ) 13 | } 14 | 15 | export default AddSpeaker -------------------------------------------------------------------------------- /website/src/components/BodySection.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Navbar from './Navbar' 3 | import homeContent from '../assets/HomeContent.jpg' 4 | const BodySection = () => { 5 | return ( 6 | <> 7 | 8 |
9 | {/* main title */} 10 |
11 |

Get your Meeting Summary
in Minutes.

12 |
13 | {/*
*/} 14 |
15 | {/*
*/} 16 |
17 |

MeetMinute provides accurate and concise summaries of important meetings,
lectures, and debates. Our experienced team delivers essential information in just a few minutes, saving you time and keeping you informed.

18 | 19 |
20 | {/* 2nd Content */} 21 |
22 |
23 |
24 | 25 |
26 |
27 | 28 | ) 29 | } 30 | 31 | export default BodySection -------------------------------------------------------------------------------- /website/src/components/ButtonSection.jsx: -------------------------------------------------------------------------------- 1 | import { getDownloadURL, listAll, ref , uploadBytes } from 'firebase/storage'; 2 | import { redirect } from 'react-router-dom' 3 | import React, { useEffect, useState } from 'react' 4 | import {storage} from '../config/firebaseapp' 5 | import NextPage from '../NextPage'; 6 | import ImageViewer from './ImageViewer'; 7 | import { useNavigate } from 'react-router-dom'; 8 | const ButtonSection = () => { 9 | const navigate = useNavigate(); 10 | // fileupload to storage 11 | const [fileupload , setFileUpload] = useState(null); 12 | const [listData , setListData ] = useState([]); 13 | const random = Math.random(); 14 | const filesRef = ref(storage,`projectfiles/`) 15 | const uploadFile = async (e)=>{ 16 | e.preventDefault() 17 | if(!fileupload) return; // means if nothing is in the fileupload state , just simply return 18 | 19 | // creating folder in firebase/storage 20 | // here we are creating a folder projectfiles and then its filename 21 | const filesfolderRef = ref(storage ,`projectfiles/${fileupload.name+random}`); 22 | // here we are passsing folder and the file to uploadbytes(folder , file) 23 | try{ 24 | await uploadBytes(filesfolderRef , fileupload) 25 | }catch(err){ 26 | console.log('error',err); 27 | } 28 | 29 | 30 | } 31 | useEffect(()=>{ 32 | listAll(filesRef).then((response)=>{ 33 | response.items.forEach((item)=>{ 34 | getDownloadURL(item).then((url)=>{ 35 | setListData((prev)=>[...prev , url]) 36 | console.log('URL DATA:' , url); 37 | }) 38 | }) 39 | }).catch((err)=>{ 40 | console.log(err); 41 | }) 42 | 43 | },[]) 44 | // const goToLibrary =()=>{ 45 | // navigate('/images', { state: { myProp: listData } }); 46 | // } 47 | console.log('LIST DATA :' , listData); 48 | return ( 49 | <> 50 |
51 |
52 | setFileUpload(e.target.files[0])} /> 53 | 54 | 55 | {/* onClick={goToLibrary} */} 56 |
57 | {/* { 58 | listData.map((url)=>{ 59 | return( 60 | <> 61 |
69 | 70 | ) 71 | } 72 | 73 | export default ButtonSection -------------------------------------------------------------------------------- /website/src/components/ImageViewer.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const ImageViewer = ({url}) => { 4 | console.log('NextPageURL',url); 5 | return ( 6 | <> 7 | 8 | 9 | ) 10 | } 11 | 12 | export default ImageViewer -------------------------------------------------------------------------------- /website/src/components/Navbar.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react' 2 | import sitelogo from "../assets/Netflix_2015_logo.svg"; 3 | import menu from "../assets/menu.png"; 4 | import close from "../assets/close.png"; 5 | import { Link, useNavigate } from 'react-router-dom'; 6 | const Navbar = () => { 7 | const navigate = useNavigate(); 8 | const [show, setShow] = useState(false); 9 | return ( 10 | <> 11 |
12 | {/* m-3 lg:m-5 */} 13 | {/* */} 14 |

MeetMinute.

15 | 46 |
47 | 48 | ) 49 | } 50 | 51 | export default Navbar -------------------------------------------------------------------------------- /website/src/components/ProtectedRoutes.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { Navigate } from 'react-router' 3 | import { UserAuth } from '../context/AuthContext' 4 | 5 | const ProtectedRoutes = ({children}) => { 6 | const {user} = UserAuth(); 7 | if(!user){ 8 | return 9 | } 10 | return children; 11 | } 12 | 13 | export default ProtectedRoutes -------------------------------------------------------------------------------- /website/src/components/Sidebar.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useRef, useState } from 'react' 2 | import { useMediaQuery } from 'react-responsive'; 3 | import { useLocation, useNavigate } from 'react-router'; 4 | import { HiOutlineHome } from "react-icons/hi"; 5 | import { CgLogOut } from "react-icons/cg"; 6 | import { RiUploadCloud2Line } from "react-icons/ri"; 7 | import { BsTextRight } from "react-icons/bs"; 8 | import { SlNotebook } from "react-icons/sl"; 9 | import { BsCreditCard } from "react-icons/bs"; 10 | import { TbPuzzle } from "react-icons/tb"; 11 | import { FiHelpCircle } from "react-icons/fi"; 12 | import { IoIosArrowBack } from "react-icons/io"; 13 | import { MdMenu } from "react-icons/md"; 14 | import { NavLink} from "react-router-dom"; 15 | import { motion } from 'framer-motion'; 16 | import SubMenu from '../components/SubMenu'; 17 | import userLogo from '../assets/user-pfp.jpg' 18 | import { UserAuth } from '../context/AuthContext'; 19 | const Sidebar = ({squeeze}) => { 20 | 21 | let isTabletMid = useMediaQuery({ query: "(max-width: 768px)" }); 22 | const [open, setOpen] = useState(isTabletMid ? false : true); 23 | const sidebarRef = useRef(); 24 | const { pathname } = useLocation(); 25 | const {user , logout,username } = UserAuth(); 26 | const navigate = useNavigate(); 27 | const handleLogout=async(e)=>{ 28 | try { 29 | await logout(); 30 | navigate('/signup') 31 | console.log('you are logged out'); 32 | } catch (error) { 33 | console.log(error.message); 34 | } 35 | } 36 | useEffect(() => { 37 | if (isTabletMid) { 38 | setOpen(false); 39 | } else { 40 | setOpen(true); 41 | } 42 | }, [isTabletMid]); 43 | 44 | useEffect(() => { 45 | isTabletMid && setOpen(false); 46 | }, [pathname]); 47 | 48 | const Nav_animation = isTabletMid 49 | ? { 50 | open: { 51 | x: 0, 52 | width: "16rem", 53 | transition: { 54 | damping: 40, 55 | }, 56 | }, 57 | closed: { 58 | x: -250, 59 | width: 0, 60 | transition: { 61 | damping: 40, 62 | delay: 0.15, 63 | }, 64 | }, 65 | } 66 | : { 67 | open: { 68 | width: "16rem", 69 | transition: { 70 | damping: 40, 71 | }, 72 | }, 73 | closed: { 74 | width: "4rem", 75 | transition: { 76 | damping: 40, 77 | }, 78 | }, 79 | }; 80 | 81 | const subMenusList = [ 82 | { 83 | name: "NoteBook", 84 | icon: SlNotebook, 85 | menus: ["All Summary", "Shared with me", "My Summary"], 86 | route: [ 87 | { 88 | id:1, 89 | location:'/notebook/allsummary', 90 | }, 91 | { 92 | id:2, 93 | location:'/notebook/shared', 94 | }, 95 | { 96 | id:3, 97 | location:'/notebook/mysummary', 98 | }, 99 | ] 100 | }, 101 | ]; 102 | const routes = [ 103 | { 104 | id:1, 105 | location:'/notebook/allsummary', 106 | }, 107 | { 108 | id:2, 109 | location:'/notebook/shared', 110 | }, 111 | { 112 | id:3, 113 | location:'/notebook/mysummary', 114 | }, 115 | 116 | ] 117 | 118 | const handleMouseEnter=()=>{ 119 | setOpen(true) 120 | } 121 | 122 | const handleMouseLeave=()=>{ 123 | setOpen(false) 124 | } 125 | return ( 126 | <> 127 | 128 |
130 |
setOpen(false)} 132 | className={`md:hidden fixed inset-0 max-h-screen z-[998] bg-black/50 ${ 133 | open ? "block" : "hidden" 134 | } `} 135 | >
136 | 145 |
146 | 151 | MeetMinute. 152 |
153 | 154 |
155 |
    156 |
  • 157 | 158 | 159 | Home 160 | 161 |
  • 162 |
  • 163 | 164 | 165 | Upload 166 | 167 |
  • 168 |
  • 169 | 170 | 171 | Summary 172 | 173 |
  • 174 | {(open || isTabletMid) ? ( 175 |
    176 | {subMenusList?.map((menu) => ( 177 |
    178 | {/* */} 179 | 180 |
    181 | ))} 182 |
    183 | ):( 184 | <> 185 | 186 | 187 | NoteBook 188 | 189 | 190 | )} 191 | {/*
    192 |
  • All summary
  • 193 |
    */} 194 |
195 |
    196 |
  • 197 | 198 | 199 | { 200 | open ? 'Extension' : '' 201 | } 202 | 203 | 204 |
  • 205 |
  • 206 | 207 | 208 | { 209 | open ? 'Pricing' : '' 210 | } 211 | 212 |
  • 213 |
  • 214 | 215 | 216 | { 217 | open ? 'Rules' : '' 218 | } 219 | 220 |
  • 221 |
  • 222 | 223 | 224 | { 225 | open ? 'Log out' : '' 226 | } 227 | 228 |
  • 229 |
230 |
231 | { 233 | setOpen(!open); 234 | }} 235 | animate={ 236 | open 237 | ? { 238 | x: 0, 239 | y: 0, 240 | rotate: 0, 241 | } 242 | : { 243 | x: -10, 244 | y: -200, 245 | rotate: 180, 246 | } 247 | } 248 | transition={{ duration: 0 }} 249 | className="absolute w-fit h-fit md:block z-50 hidden right-2 bottom-3 cursor-pointer" 250 | > 251 | 252 | 253 |
254 | 255 | {/* HAMBURGUR MENUU HAINNN */} 256 | {/* bg-[#635BFF] */} 257 | {/* onClick={() => setOpen(true)} */} 258 |
259 |
260 | 261 |
262 | 263 |
264 |
265 |
266 |
267 | 268 | ) 269 | } 270 | 271 | export default Sidebar -------------------------------------------------------------------------------- /website/src/components/Signin.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react' 2 | import { Link, useNavigate } from 'react-router-dom' 3 | import { UserAuth } from '../context/AuthContext' 4 | import { auth } from '../firebase'; 5 | const Signin = () => { 6 | const [name ,setName] = useState(''); 7 | const [email ,setEmail ] = useState(''); 8 | const [password ,setPassword ] = useState(''); 9 | const [error ,setError] = useState(''); 10 | const navigate = useNavigate(); 11 | 12 | const {signInUser,getUserName,username} = UserAuth(); 13 | 14 | const handleSignin=async(e)=>{ 15 | e.preventDefault() 16 | try { 17 | await signInUser(email , password); 18 | const username = await getUserName(name); 19 | console.log('username is : ', username); 20 | navigate('/analytics') 21 | } catch (error) { 22 | setError(error.message) 23 | } 24 | } 25 | return ( 26 | <> 27 |
28 |
29 |

Signin to your account

30 |

31 | Don't have an account ? Signup 32 |

33 |
34 |
35 |
36 | 37 | setName(e.target.value)}/> 38 |
39 |
40 | 41 | setEmail(e.target.value)}/> 42 |
43 |
44 | 45 | setPassword(e.target.value)}/> 46 |
47 | 48 |
49 |
50 | 51 | ) 52 | } 53 | 54 | export default Signin -------------------------------------------------------------------------------- /website/src/components/Signup.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react' 2 | import { Link, useNavigate } from 'react-router-dom' 3 | import {UserAuth} from '../context/AuthContext' 4 | import { GoogleAuthProvider } from 'firebase/auth'; 5 | 6 | const Signup = () => { 7 | const [name ,setName] = useState(''); 8 | const [email ,setEmail ] = useState(''); 9 | const [password ,setPassword ] = useState(''); 10 | const [error ,setError] = useState(''); 11 | const navigate = useNavigate(); 12 | 13 | const {createUser,getUserName , signUpPopup , user} = UserAuth(); 14 | const provider = new GoogleAuthProvider(); 15 | 16 | const handleSubmit = async(e)=>{ 17 | e.preventDefault(); 18 | setError(''); 19 | try { 20 | await createUser(email , password); 21 | const username = await getUserName(name); 22 | console.log('username is : ', username); 23 | navigate('/analytics') 24 | } catch (error) { 25 | setError(error.message); 26 | console.log(error.message); 27 | } 28 | } 29 | const handleGoogleSignup=async(e)=>{ 30 | e.preventDefault(); 31 | try { 32 | await signUpPopup(provider); 33 | navigate('/analytics') 34 | } catch (error) { 35 | console.log('googleSignupError',error.message); 36 | } 37 | } 38 | return ( 39 | <> 40 |
41 |
42 |

Create a new Account

43 |

44 | Already have an account ? Signin 45 |

46 |
47 |
48 |
49 | 50 | setName(e.target.value)}/> 51 |
52 |
53 | 54 | setEmail(e.target.value)}/> 55 |
56 |
57 | 58 | setPassword(e.target.value)}/> 59 |
60 | 61 | 62 |
63 |
64 | 65 | ) 66 | } 67 | 68 | export default Signup -------------------------------------------------------------------------------- /website/src/components/SubMenu.jsx: -------------------------------------------------------------------------------- 1 | import { useState } from "react"; 2 | import { motion } from "framer-motion"; 3 | import { IoIosArrowDown } from "react-icons/io"; 4 | import { NavLink, useLocation } from "react-router-dom"; 5 | 6 | const SubMenu = ({ data , routes ,route}) => { 7 | const { pathname } = useLocation(); 8 | const [subMenuOpen, setSubMenuOpen] = useState(false); 9 | return ( 10 | <> 11 | {/* {console.log('ROUTE',data.route)} */} 12 |
  • setSubMenuOpen(!subMenuOpen)} 15 | > 16 | 17 |

    {data.name}

    18 | 21 |
  • 22 | 34 | {/* { 35 | routes.route?.map((curElem)=>{ 36 | console.log('CURELEM',curElem); 37 | return( 38 | <> 39 |
  • 40 | 44 | 45 |
  • 46 | 47 | ) 48 | }) 49 | } */} 50 | {data.menus?.map((menu) => ( 51 | 52 |
  • 53 | 57 | {menu} 58 | 59 |
  • 60 | ))} 61 | {/* { 62 | routes.map((curElem)=>{ 63 | return( 64 |
  • 65 | 69 | {menu} 70 | 71 |
  • 72 | ) 73 | }) 74 | } */} 75 |
    76 | 77 | ); 78 | }; 79 | 80 | export default SubMenu; 81 | -------------------------------------------------------------------------------- /website/src/components/Transcript.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import {BiUserCircle} from 'react-icons/bi' 3 | import {FaRegUserCircle, FaUserAlt} from 'react-icons/fa' 4 | const Transcript = ({speaker,dialogue,time}) => { 5 | 6 | return ( 7 | <> 8 |
    9 |
    10 | 11 |

    {speaker.charAt(0).toUpperCase() + speaker.slice(1).toLowerCase()}

    12 |
    13 |
    14 |
    15 |

    {time}

    16 |

    {dialogue}

    17 |
    18 | {/*
    19 |
    20 | 21 |

    {speaker}

    22 |
    23 |
    24 |

    {time}

    25 |

    {dialogue}

    26 |
    27 |
    */} 28 | 29 | ) 30 | } 31 | 32 | export default Transcript -------------------------------------------------------------------------------- /website/src/components/Uploader.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useRef, useState } from 'react' 2 | import {MdCloudUpload , MdDelete} from 'react-icons/md' 3 | import {AiFillFile, AiFillFileImage} from 'react-icons/ai' 4 | import {FiUser} from 'react-icons/fi' 5 | import SummaryPage from '../pages/SummaryPage'; 6 | import { Navigate, useNavigate } from 'react-router'; 7 | import {BsFillFileEarmarkTextFill, BsUpload} from 'react-icons/bs' 8 | import img from '../assets/menu.png' 9 | import macicon from '../assets/close-minimiz-max.webp' 10 | import axios from 'axios' 11 | const Uploader = () => { 12 | 13 | const [isData, setIsData] = useState(false); 14 | const [placeholder,setPlaceholder] = useState(false) 15 | const [uploadSelect , setUploadSelect] = useState(true) 16 | const videoRef = useRef(null); 17 | const navigate = useNavigate(); 18 | 19 | const [download,setDownload] = useState(null) 20 | const [change , setChange] = useState(false); 21 | 22 | const [image ,setImage ] = useState(null); 23 | const [fileName , setFileName] = useState('No selected File') 24 | // Redirect part : 25 | // useEffect(()=>{ 26 | // setTimeout(()=>{ 27 | // navigate('/summarypage') 28 | // },3000) 29 | // },[transcriptTextbar]) 30 | 31 | 32 | // API Calls starts here; 33 | const [videoFile, setVideoFile] = useState(null); 34 | const [apiData,setApiData] = useState('Your Transcript will appear here.'); 35 | const [loading,setLoading]= useState(false); 36 | 37 | // download transcript from React: 38 | const downloadTranscriptFunction=(e)=>{ 39 | e.preventDefault(); 40 | var res = "Thank you so much for being here. Google Developer Student Clubs presents the third session of the Solution Challenge. Welcome, everyone, to UX "; 41 | var data = new Blob([res], {type: 'text/txt'}), 42 | textURL = window.URL.createObjectURL(data), 43 | tempLink = document.createElement('a'); 44 | tempLink.href = textURL; 45 | tempLink.setAttribute('download','Transcript.txt'); 46 | tempLink.click(); 47 | } 48 | const downloadTranscript= async(e)=>{ 49 | e.preventDefault(); 50 | setDownload() 51 | // const formData = new FormData(); 52 | // formData.append("file", videoFile); 53 | // try { 54 | // const response = await axios.get("http://1990-34-91-242-141.ngrok.io/transcript", formData); 55 | // } catch (error) { 56 | // console.error(error); 57 | // } 58 | } 59 | const handleFileChange = (event) => { 60 | event.preventDefault(); 61 | setVideoFile(event.target.files[0]); 62 | setUploadSelect(false); 63 | setImage(URL.createObjectURL(event.target.files[0])) 64 | }; 65 | console.log('VIDEOFILE:',videoFile); 66 | const handleFormats=(event)=>{ 67 | event.preventDefault(); 68 | document.querySelector('.input-field').click() 69 | 70 | } 71 | const handleUpload = async (e) => { 72 | e.preventDefault(); 73 | setLoading(true); 74 | const formData = new FormData(); 75 | formData.append("file", videoFile); 76 | try { 77 | const response = await axios.post("http://9e52-34-86-191-32.ngrok.io/video", formData); 78 | // console.log(response.data); 79 | let data = await response.data; 80 | console.log('DATA AAYA RE',data); 81 | setApiData(data) 82 | setIsData(true) 83 | } catch (error) { 84 | console.error(error); 85 | } 86 | setLoading(false) 87 | setPlaceholder(true) 88 | }; 89 | console.log(isData); 90 | console.log('APIDATA SE ayaa huu : ',apiData); 91 | return ( 92 | <> 93 | {/* Border Layouts */} 94 |
    95 |
    96 | 97 |
    98 |
    99 |
    100 |
    101 |

    No Files has been Selected

    102 |
    103 | 106 | 107 | 108 |
    109 |
    110 |
    111 |
    112 |

    Transcript

    113 | { 114 | placeholder ? ( 115 |
    116 | { 117 | isData ? ( 118 | apiData.user_language.speaker.map((curElem)=>{ 119 | 120 | return( 121 | <> 122 |
    123 |
    124 | 125 |

    {curElem.speaker}

    126 |
    127 |

    {curElem.time}

    128 |
    129 |
    130 |

    {curElem.dialogue}

    131 |
    132 | 133 | ) 134 | }) 135 | ):( 136 | null 137 | ) 138 | } 139 |
    140 | ) :( 141 |
    142 |

    'Transcript will appear here.'

    143 |
    144 | ) 145 | } 146 | 147 | {/* { 148 | placeholder ? ( 149 |
    150 | { 151 | isData ? ( 152 | apiData.speaker.map((curElem)=>{ 153 | 154 | return( 155 | <> 156 |
    157 |
    158 | 159 |

    {curElem.speaker}

    160 |
    161 |

    {curElem.time}

    162 |
    163 |
    164 |

    {curElem.dialogue}

    165 |
    166 | 167 | ) 168 | }) 169 | ):( 170 | null 171 | ) 172 | } 173 |
    174 | ) :( 175 |
    176 |

    'Transcript will appear here.'

    177 |
    178 | ) 179 | } 180 | */} 181 |
    182 |
    183 |
    184 | 185 | ) 186 | } 187 | 188 | export default Uploader -------------------------------------------------------------------------------- /website/src/config/firebaseapp.js: -------------------------------------------------------------------------------- 1 | import { initializeApp } from "firebase/app"; 2 | import {getAuth} from 'firebase/auth' 3 | import {getStorage} from 'firebase/storage' 4 | const firebaseConfig = { 5 | apiKey: "AIzaSyAyQGXRqPZJWSVa-PQ_P0PWi8XgWNZZixQ", 6 | authDomain: "transcriptweb-24df2.firebaseapp.com", 7 | projectId: "transcriptweb-24df2", 8 | storageBucket: "transcriptweb-24df2.appspot.com", 9 | messagingSenderId: "944262835563", 10 | appId: "1:944262835563:web:a7718120782d70a2a4b02e" 11 | }; 12 | 13 | // Initialize Firebase 14 | const app = initializeApp(firebaseConfig); 15 | 16 | export const auth = getAuth(app); 17 | export const storage = getStorage(app); -------------------------------------------------------------------------------- /website/src/context.js: -------------------------------------------------------------------------------- 1 | // create a context (Warehouse) which contain .provider and .consumer 2 | // provider 3 | // consumer /useContext() 4 | // children means our full application lies here. 5 | import axios from 'axios'; 6 | import React, { createContext, useContext, useEffect, useReducer } from 'react' 7 | import reducer from './reducer'; 8 | 9 | const AppContext = createContext(); 10 | 11 | // const TranscriptAPI = "https://jsonplaceholder.typicode.com/todos/" 12 | 13 | const initialState = { 14 | transcript : {}, 15 | } 16 | 17 | const AppProvider = ({children})=>{ 18 | 19 | const [ state , dispatch]= useReducer(reducer , initialState); 20 | 21 | // const getTranscript= async(url,formData)=>{ 22 | const getTranscript= async(formData)=>{ 23 | try { 24 | const response = await axios.post("http://7bfa-35-245-95-245.ngrok.io/video", formData); 25 | let data = await response.data; 26 | // console.log('DATA AAYA RE',data); 27 | dispatch({type : "GET_TRANSCRIPT",payload: data}) 28 | } catch (error) { 29 | console.error(error); 30 | } 31 | // now after apicall and data fetching 32 | // dispatch({type , payload:data}) payload contains the data. and type tells what the dataAction is . 33 | 34 | 35 | } 36 | 37 | 38 | useEffect(()=>{ 39 | // getTranscript(TranscriptAPI) 40 | getTranscript() 41 | },[]) 42 | 43 | 44 | 45 | 46 | 47 | 48 | return ( 49 | { children } 50 | ) 51 | }; 52 | 53 | // Custom Global Hook creation. 54 | 55 | // const useGlobalContext = ()=>{ 56 | // return useContext(AppContext); 57 | // } 58 | 59 | 60 | export {AppProvider , AppContext}; 61 | // export {AppProvider , AppContext ,useGlobalContext }; -------------------------------------------------------------------------------- /website/src/context/AuthContext.js: -------------------------------------------------------------------------------- 1 | import { createContext, useContext, useEffect, useState } from "react"; 2 | import { 3 | createUserWithEmailAndPassword , 4 | signInWithEmailAndPassword , 5 | signInWithPopup , 6 | GoogleAuthProvider, 7 | signOut , 8 | onAuthStateChanged 9 | } from 'firebase/auth' 10 | import {auth} from '../firebase' 11 | const UserContext = createContext(); 12 | 13 | export const AuthContextProvider = ({children})=>{ 14 | const [user,setUser] = useState({}); 15 | const [meetTitle , setMeetTitle ] = useState(''); 16 | const [meetDate , setMeetDate] = useState('Date will appear here') 17 | const [username , setUsername] = useState('') 18 | 19 | const createUser = (email,password)=>{ 20 | return createUserWithEmailAndPassword(auth , email , password) 21 | } 22 | 23 | const signInUser = (email,password)=>{ 24 | return signInWithEmailAndPassword(auth , email , password) 25 | } 26 | // const signInPopup = (email,password)=>{ 27 | // return signInWithEmailAndPassword(auth , email , password) 28 | // } 29 | const getUserName = (username)=>{ 30 | setUsername(username); 31 | } 32 | const signUpPopup=(provider)=>{ 33 | return signInWithPopup(auth, provider) 34 | } 35 | const logout = ()=>{ 36 | return signOut(auth); 37 | } 38 | 39 | const getTitle=(title)=>{ 40 | setMeetTitle(title); 41 | } 42 | const getDate=(date)=>{ 43 | setMeetDate(date) 44 | } 45 | 46 | useEffect(()=>{ 47 | const unsubscribe = onAuthStateChanged(auth , (currentUser)=>{ 48 | console.log('userDetails',currentUser); 49 | setUser(currentUser) 50 | }) 51 | // useEffect's cleanup code 52 | return ()=>{ 53 | unsubscribe(); 54 | } 55 | },[]) 56 | 57 | 58 | 59 | 60 | return ( 61 | { children } 62 | ) 63 | } 64 | 65 | // global context 66 | export const UserAuth = ()=>{ 67 | return useContext(UserContext) 68 | } 69 | 70 | -------------------------------------------------------------------------------- /website/src/data.js: -------------------------------------------------------------------------------- 1 | export const data = 2 | { 3 | 'keywords':[ 4 | { 5 | id:0, 6 | data: 'ux challenge', 7 | }, 8 | { 9 | id:1, 10 | data : 'speaker evening renowned', 11 | }, 12 | { id:2, 13 | data: 'design speaker thank ishita', 14 | }, 15 | ], 16 | } 17 | 18 | // [ 19 | // { 20 | // keywords: [ 21 | // [ 22 | // 'ux challenge' 23 | // ], 24 | // [ 25 | // 'speaker evening renowned', 26 | // ], 27 | 28 | // [ 29 | // 'design speaker thank ishita' 30 | // ] 31 | 32 | // ], 33 | // num_speaker:2, 34 | // talktime:[ 35 | // { 36 | // speaker: 'SPEAKER 1', 37 | // value : '49.543432', 38 | // }, 39 | // { 40 | // speaker: 'SPEAKER 2', 41 | // value : '63.543432', 42 | // }, 43 | // { 44 | // speaker: 'SPEAKER 3', 45 | // value : '12.543432', 46 | // }, 47 | 48 | // ] 49 | // } 50 | // ] -------------------------------------------------------------------------------- /website/src/firebase.js: -------------------------------------------------------------------------------- 1 | import { initializeApp } from "firebase/app"; 2 | import {getAuth } from "firebase/auth"; 3 | import { GoogleAuthProvider } from "firebase/auth"; 4 | 5 | 6 | const firebaseConfig = { 7 | apiKey: "AIzaSyAyQGXRqPZJWSVa-PQ_P0PWi8XgWNZZixQ", 8 | authDomain: "transcriptweb-24df2.firebaseapp.com", 9 | projectId: "transcriptweb-24df2", 10 | storageBucket: "transcriptweb-24df2.appspot.com", 11 | messagingSenderId: "944262835563", 12 | appId: "1:944262835563:web:a7718120782d70a2a4b02e" 13 | }; 14 | 15 | const app = initializeApp(firebaseConfig); 16 | export const auth = getAuth(app); 17 | export const provider = new GoogleAuthProvider(); -------------------------------------------------------------------------------- /website/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import './index.css'; 4 | import App from './App'; 5 | import {BrowserRouter as Router , Route , Routes} from 'react-router-dom' 6 | import { AppProvider } from './context'; 7 | import { AuthContextProvider } from './context/AuthContext'; 8 | const root = ReactDOM.createRoot(document.getElementById('root')); 9 | root.render( 10 | <> 11 | 12 | 13 | 14 | 15 | 16 | 17 | ); 18 | -------------------------------------------------------------------------------- /website/src/pages/Analytics.js: -------------------------------------------------------------------------------- 1 | import React, { useRef, useState } from 'react' 2 | import Sidebar from '../components/Sidebar' 3 | import userLogo from '../assets/user-pfp.jpg' 4 | import { IoIosArrowDown } from 'react-icons/io' 5 | import { Link } from 'react-router-dom' 6 | import { FiArrowUpRight } from 'react-icons/fi' 7 | import { RxNotionLogo } from 'react-icons/rx' 8 | import Account from '../components/Account' 9 | 10 | 11 | const Analytics = () => { 12 | const [showDropDown , setShowDropDown] = useState(false); 13 | const imgRef = useRef(); 14 | const menuRef = useRef(); 15 | const dropDownData = ['Profile' ,'Checkout','My Account','Logout'] 16 | 17 | window.addEventListener("click",(e)=>{ 18 | console.log('Haa bhai', e.target === menuRef.current); 19 | // if(e.target !== menuRef.current){ 20 | // setShowDropDown(false); 21 | // } 22 | }) 23 | return ( 24 | <> 25 |
    26 | 27 | {/* bg-[#F2F3F7] => greyish */} 28 | {/* bg-[#fdfdfd] => White */} 29 |
    30 | 31 |
    32 |
    33 |
    34 | {/*
    35 |

    Try our new Extension !

    36 |
    */} 37 |
    38 | 39 |
    40 |
    41 | setShowDropDown(!showDropDown)}/> 42 |
    43 | 44 | {/* DropDown Profile */} 45 | { 46 | showDropDown ? ( 47 | <> 48 | 49 | 50 | ) : null 51 | } 52 |
    53 |
    54 |
    55 | {/* text-[#7465d5] */} 56 |
    57 |
    58 |
    59 |

    Try out our extension

    60 | 61 |
    62 |
    63 |

    Welcome User,

    64 |

    Effortlessly Summarize Your
    Online Meetings with Our Tool.

    65 |
    66 |
    67 |
    68 |
    69 |
    70 |
    71 |
    72 |

    1

    73 |
    74 |
    75 |

    My Meetings

    76 |
    77 |
    78 |
    79 |
    80 |

    1

    81 |
    82 |
    83 |

    Shared with me

    84 |
    85 |
    86 |
    87 |
    88 |
    89 | 90 |

    New Feature ! Now, you can add summary to Notion.

    91 |
    92 |
    93 |
    94 | 95 |
    96 |
    97 |
    98 |

    Meet

    99 |
    100 | 101 |
    102 |
    103 |
    104 |

    Zoom

    105 |
    106 | 107 |
    108 |
    109 |
    110 |

    Teams

    111 |
    112 | 113 |
    114 |
    115 |
    116 |
    117 |
    118 |
    119 | 120 |
    121 |
    122 | 123 | ) 124 | } 125 | 126 | export default Analytics -------------------------------------------------------------------------------- /website/src/pages/EditableTextField.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | 3 | function EditableTextField() { 4 | const [value, setValue] = useState('Speaker1'); 5 | const [isEditable, setIsEditable] = useState(false); 6 | const [tempValue, setTempValue] = useState(''); 7 | 8 | const handleDoubleClick = () => { 9 | setTempValue(value); 10 | setIsEditable(true); 11 | }; 12 | 13 | const handleSave = () => { 14 | setValue(tempValue); 15 | setIsEditable(false); 16 | }; 17 | 18 | const handleCancel = () => { 19 | setIsEditable(false); 20 | setTempValue(value); 21 | }; 22 | 23 | const handleTempValueChange = (event) => { 24 | setTempValue(event.target.value); 25 | }; 26 | 27 | return ( 28 |
    29 | {isEditable ? ( 30 |
    31 | 36 | 37 | 38 |
    39 | ) : ( 40 | {value} 41 | )} 42 |
    43 | ); 44 | } 45 | 46 | export default EditableTextField -------------------------------------------------------------------------------- /website/src/pages/GotoSummary.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const GotoSummary = () => { 4 | return ( 5 | <> 6 |
    7 | 8 |
    9 | 10 | ) 11 | } 12 | 13 | export default GotoSummary -------------------------------------------------------------------------------- /website/src/pages/Home.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import BodySection from "../components/BodySection"; 3 | import Navbar from "../components/Navbar"; 4 | import { useNavigate } from "react-router"; 5 | const Home = () => { 6 | 7 | return ( 8 | <> 9 |
    10 | {/* navigation bar */} 11 | 12 | {/* body */} 13 | 14 |
    15 | 16 | 17 | ); 18 | }; 19 | 20 | export default Home; 21 | -------------------------------------------------------------------------------- /website/src/pages/MySummary.js: -------------------------------------------------------------------------------- 1 | import React , {useEffect , useState} from 'react' 2 | import axios from 'axios'; 3 | 4 | import Sidebar from '../components/Sidebar' 5 | import { BsArrowRight } from 'react-icons/bs' 6 | 7 | const MySummary = () => { 8 | const [data , setData ] = useState({}); 9 | const [isData , setIsData] = useState(false); 10 | // const handleFetch = async()=>{ 11 | // const formData = new FormData(); 12 | // formData.append("email", 'ykamble20comp@student.mes.ac.in'); 13 | // formData.append("id", "642fe497f01cf44e4442ac45"); 14 | // try { 15 | // const response = await axios.post(`${URL}`, formData); 16 | // const fetchedData = await response.data; 17 | // console.log(fetchedData); 18 | // } catch (error) { 19 | // console.error(error); 20 | // } 21 | // } 22 | useEffect(() => { 23 | const fetchData = async () => { 24 | const formData = new FormData(); 25 | formData.append("email", 'ykamble20comp@student.mes.ac.in'); 26 | // formData.append("id", "642fe497f01cf44e4442ac45"); 27 | const result = await axios.post('http://3238-34-91-228-183.ngrok-free.app/fetch_summaries',formData); 28 | setData(result.data); 29 | }; 30 | setIsData(true); 31 | fetchData(); 32 | }, []); 33 | console.log('Data aaya re Fetch hokr',data); 34 | console.log('isData',isData); 35 | return ( 36 | <> 37 |
    38 | 39 |
    40 |
    41 | 42 |
    43 |
    44 | {/* map the cardItem */} 45 | { 46 | data ? ( 47 | <> 48 | { 49 | data?.all_summaries?.map((item)=>{ 50 | return( 51 | <> 52 |
    53 | 54 | 55 |
    56 |

    {item.title}

    57 |
    58 |
    59 |

    Go to summary

    60 | 61 |
    62 |
    63 | 64 | ) 65 | }) 66 | } 67 | 68 | ):( 69 | <> 70 |

    no data

    71 | 72 | ) 73 | } 74 | 75 | 76 | {/* { 77 | isData ? ( 78 | data.map((curElem)=>{ 79 | console.log('curElem',curElem); 80 | }) 81 | ):( 82 | <> 83 |

    iiidsa

    84 | 85 | ) 86 | 87 | } */} 88 | {/*
    89 |
    90 |

    Presentation Meeting on UI UX

    91 |
    92 |
    93 |

    Go to summary

    94 | 95 |
    96 |
    97 |
    98 |
    99 |

    Presentation Meeting on UI UX

    100 |
    101 |
    102 |

    Go to summary

    103 | 104 |
    105 |
    106 |
    107 |
    108 |

    Presentation Meeting on UI UX

    109 |
    110 |
    111 |

    Go to summary

    112 | 113 |
    114 |
    115 |
    116 |
    117 |

    Presentation Meeting on UI UX

    118 |
    119 |
    120 |

    Go to summary

    121 | 122 |
    123 |
    124 |
    125 |
    126 |

    Presentation Meeting on UI UX

    127 |
    128 |
    129 |

    Go to summary

    130 | 131 |
    132 |
    */} 133 | 134 | 135 |
    136 |
    137 |
    138 | 139 | ) 140 | } 141 | 142 | export default MySummary -------------------------------------------------------------------------------- /website/src/pages/Notebook.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import Sidebar from '../components/Sidebar' 3 | 4 | const Notebook = () => { 5 | return ( 6 | <> 7 |
    8 | 9 |

    SUMMARY PAGE HU

    10 |
    11 | 12 | ) 13 | } 14 | 15 | export default Notebook -------------------------------------------------------------------------------- /website/src/pages/SharedMe.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const SharedMe = () => { 4 | return ( 5 | <> 6 |

    Sharedwithme

    7 | 8 | ) 9 | } 10 | 11 | export default SharedMe -------------------------------------------------------------------------------- /website/src/pages/Test.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import axios from "axios"; 3 | import { data } from "../data"; 4 | const Test = () => { 5 | const api = 6 | 7 | // yusuf api 8 | { 9 | 'user_language': { 10 | 'speakers':[ 11 | { 12 | id:1, 13 | speaker: 'SPEAKER1', 14 | time: '0:01:55', 15 | dialogue: "DIALOGE1 dsad132" 16 | }, 17 | { 18 | id:2, 19 | speaker: 'SPEAKER2', 20 | time: '0:11:55', 21 | dialoge: "DIALOGE2 hhuiad" 22 | }, 23 | { 24 | id:3, 25 | speaker: 'SPEAKER3', 26 | time: '0:53:55', 27 | dialoge: "DIALOGE3 sdadsadas" 28 | }, 29 | ] 30 | }, 31 | 'english': { 32 | 'speakers':[ 33 | { 34 | id:1, 35 | speaker: 'SPEAKER1', 36 | time: '0:01:55', 37 | dialogue: "DIALOGE1 dsad132" 38 | }, 39 | { 40 | id:2, 41 | speaker: 'SPEAKER2', 42 | time: '0:11:55', 43 | dialoge: "DIALOGE2 hhuiad" 44 | }, 45 | { 46 | id:3, 47 | speaker: 'SPEAKER3', 48 | time: '0:53:55', 49 | dialoge: "DIALOGE3 sdadsadas" 50 | }, 51 | ] 52 | }, 53 | 'user_language_code': 'hi', 54 | } 55 | 56 | 57 | 58 | // vrushali api 59 | const api2 = 60 | { 61 | 'keywords':[ 62 | { 63 | id:0, 64 | data: 'ux challenge', 65 | }, 66 | { 67 | id:1, 68 | data : 'speaker evening renowned', 69 | }, 70 | { id:2, 71 | data: 'design speaker thank ishita', 72 | }, 73 | ], 74 | num_speaker:2, 75 | talktime:[ 76 | { 77 | speaker: 'SPEAKER 1', 78 | value : '49.543432', 79 | }, 80 | { 81 | speaker: 'SPEAKER 2', 82 | value : '63.543432', 83 | }, 84 | { 85 | speaker: 'SPEAKER 3', 86 | value : '12.543432', 87 | }, 88 | ] 89 | } 90 | 91 | 92 | 93 | 94 | 95 | // yusuf api call handling 96 | const [videoFile, setVideoFile] = useState(null); 97 | const [apiData,setApiData] = useState(''); 98 | const handleFileChange = (event) => { 99 | setVideoFile(event.target.files[0]); 100 | }; 101 | 102 | console.log('VIDEOFILE:',videoFile); 103 | 104 | // const handleUpload = async () => { 105 | // const formData = new FormData(); 106 | // formData.append("file", videoFile); 107 | // try { 108 | // const response = await axios.post("http://66ca-34-141-198-78.ngrok.io/video", formData); 109 | // console.log(response.data); 110 | // setApiData(response.data) 111 | // } catch (error) { 112 | // console.error(error); 113 | // } 114 | // }; 115 | 116 | // console.log(apiData); 117 | //download the transcript.txt 118 | // const downloadTextFile = async () => { 119 | // const formData = new FormData(); 120 | // formData.append("file", videoFile); 121 | // try { 122 | // const response = await axios.get("http://16cf-34-142-161-40.ngrok.io/transcript", formData); 123 | // console.log(response.data); 124 | // }catch (error) { 125 | // console.error(error); 126 | // } 127 | // }; 128 | return ( 129 | <> 130 |
    131 |

    Testinggggg

    132 |
    133 | {/* */} 134 | 135 |
    136 | {/* { 137 | api.speakers.map((curr)=>{ 138 | return( 139 | <> 140 |
    141 |
    142 | {curr.speaker} {curr.time} 143 | {curr.dialoge} 144 |
    145 |
    146 | 147 | ) 148 | }) 149 | } */} 150 | {/* {'Number of Speakers '}{api.num_speaker} 151 | { 152 | api.talktime.map((curr)=>{ 153 | return( 154 |
    155 | {curr.speaker}{' '} 156 | {curr.value} 157 |
    158 | ) 159 | }) 160 | } */} 161 |
    162 |
    163 |
    164 | 165 | ) 166 | } 167 | 168 | export default Test -------------------------------------------------------------------------------- /website/src/pages/Testing.js: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react' 2 | 3 | const Testing = () => { 4 | const [name , setName] = useState(""); 5 | const [data,setData] = useState(""); 6 | // const [mobile , setMobile] = useState(""); 7 | const handleUpload = (e)=>{ 8 | let dataItem = {name , data}; 9 | e.preventDefault(); 10 | fetch("https://api.restful-api.dev/objects",{ 11 | method:'POST', 12 | headers:{ 13 | 'Accept':'application/json', 14 | 'Content-Type':'application/json' 15 | }, 16 | body:JSON.stringify(dataItem) 17 | }).then((result)=>{ 18 | console.warn('Result',result) 19 | }) 20 | } 21 | return ( 22 | <> 23 |

    Testing

    24 |
    25 | setName(e.target.value)}/> 26 | setData(e.target.value)}/> 27 | 28 |
    29 | 30 | ) 31 | } 32 | 33 | export default Testing -------------------------------------------------------------------------------- /website/src/pages/UploadPage.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useRef, useState } from 'react' 2 | import { Route, Router, Routes, useLocation, useNavigate } from "react-router"; 3 | 4 | import axios from "axios"; 5 | import Sidebar from '../components/Sidebar'; 6 | import userLogo from '../assets/user-pfp.jpg' 7 | import { FiUser } from 'react-icons/fi'; 8 | import { IoIosArrowDown } from "react-icons/io"; 9 | import { AiFillFileImage } from "react-icons/ai"; 10 | import { MdCloudUpload, MdDelete, MdOutlineChat, MdOutlineFileDownload, MdOutlineFileDownloadOff } from 'react-icons/md'; 11 | // import video from '../assets/RECORDING.mp4' 12 | import video from '../assets/testingvideo.mp4' 13 | import Transcript from '../components/Transcript'; 14 | import { BiVideo } from 'react-icons/bi'; 15 | import { HiDownload } from 'react-icons/hi'; 16 | import Account from '../components/Account'; 17 | // import sitelogo from "../assets/Netflix_2015_logo.svg"; 18 | // import menu from "../assets/menu.png"; 19 | // import close from "../assets/close.png"; 20 | // import { Link } from 'react-router-dom'; 21 | // import Navbar from '../components/Navbar' 22 | // import Uploader from '../components/Uploader' 23 | 24 | const UploadPage = () => { 25 | const [showDropDown , setShowDropDown] = useState(false); 26 | const [uploadFile , setUploadFile] = useState(false); 27 | // const [inactive, setInactive] = useState(true); 28 | // const [mobileInactive, setMobileInactive] = useState(true); 29 | // const [mobileIsOpen, setMobileIsOpen] = useState(false); 30 | // const [on, setOn] = useState(false); 31 | // const [expand, setExpand] = useState(false); 32 | const [isData, setIsData] = useState(false); 33 | const [placeholder, setPlaceholder] = useState(false); 34 | const [uploadSelect, setUploadSelect] = useState(true); 35 | const [gridLayout,setGridLayout] = useState('transcript'); 36 | const [isGridLayout , setIsGridLayout] = useState(false); 37 | const videoRef = useRef(null); 38 | const navigate = useNavigate(); 39 | const imgRef = useRef(); 40 | const menuRef = useRef(); 41 | const dropDownData = ['Profile' ,'Checkout','My Account','Logout'] 42 | 43 | window.addEventListener("click",(e)=>{ 44 | console.log('Haa bhai', e.target === menuRef.current); 45 | // if(e.target !== menuRef.current){ 46 | // setShowDropDown(false); 47 | // } 48 | }) 49 | const [download, setDownload] = useState(null); 50 | const [change, setChange] = useState(false); 51 | 52 | const [image, setImage] = useState(null); 53 | const [fileName, setFileName] = useState(

    No recording selected

    ); 54 | const [videoFile, setVideoFile] = useState(null); 55 | const [apiData, setApiData] = useState("Your Transcript will appear here."); 56 | const [loading, setLoading] = useState(false); 57 | 58 | const handleDone =()=>{ 59 | setLoading(true); 60 | setUploadFile(true); 61 | setLoading(false); 62 | } 63 | 64 | const goToSummary=()=>{ 65 | const data = "YASHKAMBLE"; 66 | navigate('/summary', { state: { data } }); 67 | } 68 | const downloadTranscript = async (e) => { 69 | e.preventDefault(); 70 | setDownload(); 71 | // const formData = new FormData(); 72 | // formData.append("file", videoFile); 73 | // try { 74 | // const response = await axios.get("http://1990-34-91-242-141.ngrok.io/transcript", formData); 75 | // } catch (error) { 76 | // console.error(error); 77 | // } 78 | }; 79 | const handleFileChange = (event) => { 80 | event.preventDefault(); 81 | setVideoFile(event.target.files[0]); 82 | setImage(URL.createObjectURL(event.target.files[0])); 83 | setFileName(event.target.files[0].name) 84 | }; 85 | console.log("VIDEOFILE:", videoFile); 86 | const handleFormats = (event) => { 87 | event.preventDefault(); 88 | document.querySelector(".input-field").click(); 89 | }; 90 | const handleUpload = async (e) => { 91 | e.preventDefault(); 92 | setUploadFile(true); 93 | setIsGridLayout(true); 94 | setLoading(true); 95 | const formData = new FormData(); 96 | formData.append("file", videoFile); 97 | try { 98 | const response = await axios.post("http://b555-34-68-104-182.ngrok.io/video", formData); 99 | // console.log(response.data); 100 | let data = await response.data; 101 | console.log('DATA AAYA RE',data); 102 | setApiData(data) 103 | setIsData(true) 104 | } catch (error) { 105 | console.error(error); 106 | } 107 | setLoading(false) 108 | setPlaceholder(true) 109 | }; 110 | console.log(isData); 111 | console.log('APIDATA SE ayaa huu : ',apiData); 112 | 113 | // download transcript from React: 114 | const downloadTranscriptFunction = (e) => { 115 | let newVar; 116 | e.preventDefault(); 117 | let res = apiData ? (apiData.user_language.speaker.map((curelem)=>{ 118 | return newVar = curelem.dialogue; 119 | })) : ""; 120 | // let res = apiData ? apiData : ""; 121 | // var res = 122 | // "Thank you so much for being here. Google Developer Student Clubs presents the third session of the Solution Challenge. Welcome, everyone, to UX "; 123 | var data = new Blob([newVar], { type: "text/txt" }), 124 | textURL = window.URL.createObjectURL(data), 125 | tempLink = document.createElement("a"); 126 | tempLink.href = textURL; 127 | tempLink.setAttribute("download", "Transcript.txt"); 128 | tempLink.click(); 129 | }; 130 | 131 | // const speakersObj = {}; 132 | // data.map((element,index)=>{ 133 | // // console.log('eleemnet',element); 134 | // console.log('eleemnet',element.main); 135 | // speakersObj[`element${index+1}`] = element.main; 136 | // }) 137 | // console.log('speakerDATA',speakersObj); 138 | 139 | 140 | 141 | 142 | const api = 143 | 144 | // yusuf api 145 | { 146 | 'user_language': { 147 | 'speakers':[ 148 | { 149 | id:1, 150 | speaker: 'Speaker 1', 151 | time: '0:01:55', 152 | dialogue: "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Pariatur in suscipit repellat voluptatum, omnis odio quo. Deleniti eveniet impedit nam a laudantium quos officia rerum earum asperiores quaerat modi est tempora corporis repellat ipsa, dolorem, excepturi eos neque id hic sequi minima illum beatae! Debitis, placeat. Eius, enim. Ducimus suscipit quia quae eos, nobis explicabo." 153 | }, 154 | { 155 | id:2, 156 | speaker: 'Speaker 2', 157 | time: '0:11:55', 158 | dialogue: "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Pariatur in suscipit repellat voluptatum, omnis odio quo. Deleniti eveniet impedit nam a laudantium quos officia rerum earum asperiores quaerat modi est tempora corporis repellat ipsa, dolorem, excepturi eos neque id hic sequi minima illum beatae! Debitis, placeat. Eius, enim. Ducimus suscipit quia quae eos, nobis explicabo." 159 | }, 160 | { 161 | id:3, 162 | speaker: 'Speaker 3', 163 | time: '0:53:55', 164 | dialogue: "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Pariatur in suscipit repellat voluptatum, omnis odio quo. Deleniti eveniet impedit nam a laudantium quos officia rerum earum asperiores quaerat modi est tempora corporis repellat ipsa, dolorem, excepturi eos neque id hic sequi minima illum beatae! Debitis, placeat. Eius, enim. Ducimus suscipit quia quae eos, nobis explicabo." 165 | }, 166 | ] 167 | }, 168 | 'english': { 169 | 'speakers':[ 170 | { 171 | id:1, 172 | speaker: 'SPEAKER1', 173 | time: '0:01:55', 174 | dialogue: "DIALOGE1 dsad132" 175 | }, 176 | { 177 | id:2, 178 | speaker: 'SPEAKER2', 179 | time: '0:11:55', 180 | dialogue: "DIALOGE2 hhuiad" 181 | }, 182 | { 183 | id:3, 184 | speaker: 'SPEAKER3', 185 | time: '0:53:55', 186 | dialogue: "DIALOGE3 sdadsadas" 187 | }, 188 | ] 189 | }, 190 | 'user_language_code': 'hi', 191 | } 192 | 193 | return ( 194 | 195 | <> 196 | {/* bg-[#F2F3F7] */} 197 |
    198 | 199 | {/* bg-[#F2F3F7] => greyish */} 200 | {/* bg-[#fdfdfd] => White */} 201 |
    202 | {/* header */} 203 |
    204 |
    205 | 206 |

    Transcript

    207 | {/* */} 208 |
    209 |
    210 |
    211 | {/*
    212 | 213 |

    Transcript

    214 |
    */} 215 |
    216 | 217 |
    218 |
    219 | setShowDropDown(!showDropDown)}/> 220 |
    221 | 222 | {/* DropDown Profile */} 223 | { 224 | showDropDown ? ( 225 | <> 226 | 227 | 228 | ) : null 229 | } 230 |
    231 |
    232 |
    233 | 234 | {/* MainSection */} 235 | { 236 | uploadFile ? ( 237 | <> 238 |
    239 |
    240 | 249 |
    250 |
    251 | { 252 | isData ? ( 253 |
    254 | 255 |
    256 | ) : ( 257 |
    258 | 259 |
    260 | ) 261 | } 262 | {/*

    DOWNLOAD

    */} 263 |
    264 | { 265 | isData ? ( 266 | apiData.user_language.speaker.map((curelem)=>{ 267 | return 268 | }) 269 | 270 | ):( 271 | null 272 | ) 273 | } 274 |
    275 |
    276 |
    277 | 278 | ) : ( 279 | <> 280 |
    281 |
    282 |
    283 |

    Add recording

    284 |
    document.querySelector(".input-field").click()}> 285 | 286 | {image ? 287 | 290 | : 291 | <> 292 | 293 |

    Browse Files to upload

    294 | 295 | } 296 | 297 | 298 |
    299 | 300 | 301 |

    {fileName}

    - 302 | { 305 | setFileName(

    No recording selected

    ) 306 | setImage(null) 307 | }} 308 | /> 309 |
    310 |
    311 | { 312 | image ? ( 313 | 314 | ) : ( 315 | 316 | ) 317 | } 318 | 319 |
    320 |
    321 |
    322 | 323 | ) 324 | } 325 | 326 |
    327 |
    328 | 329 | ) 330 | 331 | }; 332 | 333 | export default UploadPage; 334 | -------------------------------------------------------------------------------- /website/src/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /website/src/reducer.js: -------------------------------------------------------------------------------- 1 | import { useReducer } from "react"; 2 | 3 | const initialState = 0; 4 | const reducer = (state , action)=>{ 5 | // always return something in this function 6 | // ALWAYYYYYYYYYYYYYS RETURN IN ANY FUNCTION , IF's statements and etc. 7 | console.log(state , action); 8 | if(action.type === "GET_TRANSCRIPT"){ 9 | return{ 10 | ...state, 11 | transcript : action.payload // this transcript we hve accessed from context.js initialState 12 | } 13 | } 14 | 15 | else{ 16 | 17 | return state; 18 | } 19 | 20 | } 21 | 22 | export default reducer; -------------------------------------------------------------------------------- /website/src/server/API-main.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/server/API-main.zip -------------------------------------------------------------------------------- /website/src/server/API-main/02_06_39_mask.flac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/server/API-main/02_06_39_mask.flac -------------------------------------------------------------------------------- /website/src/server/API-main/G015_S021.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/server/API-main/G015_S021.wav -------------------------------------------------------------------------------- /website/src/server/API-main/README.md: -------------------------------------------------------------------------------- 1 | # API 2 | 3 | This is the API Folder 4 | -------------------------------------------------------------------------------- /website/src/server/API-main/api.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, request, jsonify,abort 2 | import pandas as pd 3 | import whisper 4 | import ffmpeg 5 | import os 6 | from tempfile import NamedTemporaryFile 7 | model = whisper.load_model('medium') 8 | # Your API definition 9 | app = Flask(__name__) 10 | 11 | 12 | @app.route('/test',methods=["GET"]) 13 | def helloworld(): 14 | temp = [] 15 | temp.append({'hello' :'I get accessed'}) 16 | return jsonify(temp) 17 | 18 | @app.route('/upload', methods=["POST"]) 19 | def predict(): 20 | if not request.files: 21 | abort(400) 22 | 23 | results = [] 24 | transcribed = [] 25 | 26 | for filename,handle in request.files.items(): 27 | temp = NamedTemporaryFile() 28 | handle.save(temp) 29 | result = model.transcribe(temp.name) 30 | results.append({ 31 | 'filename': filename, 32 | 'transcript': result['text'], 33 | }) 34 | # return {'results' : results} 35 | return jsonify({'results' : results}) 36 | 37 | 38 | 39 | 40 | if __name__ == '__main__': 41 | app.run(debug=True) 42 | 43 | -------------------------------------------------------------------------------- /website/src/server/API-main/recordings/02_06_39_mask.flac: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/server/API-main/recordings/02_06_39_mask.flac -------------------------------------------------------------------------------- /website/src/server/API-main/transcriptions/p.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Yusuf80216/Meet---Transcriptor-Summarizer/8276fd4ae0cb947abb8e81d5509c6a9f088b9268/website/src/server/API-main/transcriptions/p.txt -------------------------------------------------------------------------------- /website/src/server/API-main/transcriptions/transcript.txt: -------------------------------------------------------------------------------- 1 | 2 | vrush: Amazing! Top 10 Telugu April Playlist for you. Best of Telugu Music in one playlist. Music playing.vrush: I'm going to be singing a song. 3 | vrush: Maskvrush: Hi 4 | vrush: Ringing out from our blue heavens, from our deep seas breaking round, over everlasting mountains where the echoing crags resound, from our planes where creaking wagons cut their trails into the earth, calls the spirit of our country, of the land that gave us birth. At thy call we shall not falter, firm and 5 | vrush: Maskvrush: Hi. Hello. 6 | vrush: Hi 7 | vrush: Ringing out from our blue heavens, from our deep seas breaking round, over everlasting mountains where the echoing crags resound, from our planes where creaking wagons cut their trails into the earth, calls the spirit of our country, of the land that gave us birth. At thy call we shall not falter, firm and 8 | vrush: Mask -------------------------------------------------------------------------------- /website/src/server/API-main/upload_audio.py: -------------------------------------------------------------------------------- 1 | from flask import Flask, request 2 | from pydub import AudioSegment 3 | import os 4 | # import ffmpeg 5 | 6 | app = Flask(__name__) 7 | 8 | @app.route('/upload-audio', methods=['POST']) 9 | def upload_file(): 10 | file = request.files['file'] 11 | file.save('temp.wav') # save to a temporary location 12 | 13 | audio_segment = AudioSegment.from_file('temp.wav', format='wav') 14 | duration = audio_segment.duration_seconds 15 | chunk_duration = 15 # seconds 16 | 17 | for i in range(0, int(duration), chunk_duration): 18 | start = i * 1000 # milliseconds 19 | end = (i + chunk_duration) * 1000 # milliseconds 20 | chunk = audio_segment[start:end] 21 | chunk.export(f'chunk_{i}.wav', format='wav') 22 | 23 | os.remove('temp.wav') # delete the temporary file 24 | 25 | return 'OK' 26 | 27 | if __name__ == '__main__': 28 | 29 | # run() method of Flask class runs the application 30 | # on the local development server. 31 | app.run() -------------------------------------------------------------------------------- /website/src/server/DB/conn.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const db = 'mongodb+srv://deepblue:deepblue@cluster0.vvisee8.mongodb.net/meetminute?retryWrites=true&w=majority' 3 | 4 | mongoose.connect(db).then(()=>{ 5 | console.log('connection successful'); 6 | }).catch((error)=>{ 7 | console.log('errorDB',error); 8 | }) -------------------------------------------------------------------------------- /website/src/server/appServer.js: -------------------------------------------------------------------------------- 1 | // import express from 'express'; 2 | const express = require('express'); 3 | const app = express(); 4 | const mongoose = require('mongoose'); 5 | const db = "mongodb+srv://vrushali:vrush@cluster0.ekqdwct.mongodb.net/test"; 6 | 7 | mongoose.connect(db,{ 8 | useNewUrlParser:true 9 | }).then(()=>{ 10 | console.log('Connected to database'); 11 | }).catch((error)=>console.log('Error',error)) 12 | 13 | app.use(express.json()) 14 | // instead of doing app.get here, we used express routers and imported here. 15 | // app.use(require('../server/router/router')); 16 | 17 | // require('./DB/conn') 18 | 19 | 20 | // app.get('/',(req,res)=>{ 21 | // res.send('Server Connected to FRONTEND app.js'); 22 | // }); 23 | // app.post('/register',(req,res)=>{ 24 | // console.log(req.body); 25 | // res.json({message : req.body}) 26 | // }); 27 | 28 | 29 | app.listen(3001,()=>{ 30 | console.log('server is running...'); 31 | }) 32 | 33 | 34 | -------------------------------------------------------------------------------- /website/src/server/models/UserSchema.js: -------------------------------------------------------------------------------- 1 | // const express = require('express'); 2 | const mongoose = require('mongoose'); 3 | const UserSchema = new mongoose.Schema({ 4 | name:{ 5 | type: String, 6 | required:true 7 | }, 8 | }) 9 | 10 | // const User = mongoose.model('collectionName',UserSchema) 11 | const User = mongoose.model('transcript',UserSchema) 12 | 13 | 14 | module.exports = User; -------------------------------------------------------------------------------- /website/src/server/readme.txt: -------------------------------------------------------------------------------- 1 | 1) create the schema 2 | 2) add the collection 3 | 3) then in the router.js , basically in this we define the EXPRESS ROUTES and what to do in that route. -------------------------------------------------------------------------------- /website/src/server/router/router.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | require('../DB/conn'); 5 | const User = require('../models/UserSchema') 6 | 7 | router.get('/',(req,res)=>{ 8 | res.send('Server Connected to FRONTEND router.js'); 9 | }); 10 | 11 | router.post('/register',async(req,res)=>{ 12 | const {name} = req.body; 13 | console.log(name); 14 | 15 | if(!name){ 16 | return res.status(422).json({error:"Pls fill the data"}) 17 | } 18 | // User.findOne({databaseVariable : UserVariable}) 19 | try { 20 | const userExist = await User.findOne({name:name}); 21 | if(userExist){ 22 | return res.status(422).json({error : "Name already exist"}); 23 | } 24 | const user = new User({name}); 25 | user.save().then(()=>{ 26 | res.status(201).json({message:"SUCCESSFULL"}) 27 | }).catch((err)=>res.status(500).json({error : "Error occured"})) 28 | } catch (error) { 29 | console.log(error); 30 | } 31 | 32 | }) 33 | 34 | 35 | // User.findOne({name:name}) 36 | // .then((userExist)=>{ 37 | // if(userExist){ 38 | // return res.status(422).json({error : "Name already exist"}); 39 | // } 40 | 41 | // const user = new User({name}); 42 | // user.save().then(()=>{ 43 | // res.status(201).json({message:"SUCCESSFULL"}) 44 | // }).catch((err)=>res.status(500).json({error : "Error occured"})) 45 | // }).catch((error)=>{ 46 | // console.log(error); 47 | // }) 48 | module.exports = router; -------------------------------------------------------------------------------- /website/src/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./src/**/*.{js,jsx,ts,tsx}", 5 | ], 6 | theme: { 7 | extend: {}, 8 | }, 9 | plugins: [], 10 | } -------------------------------------------------------------------------------- /website/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./src/**/*.{js,jsx,ts,tsx}", 5 | ], 6 | theme: { 7 | extend: {}, 8 | }, 9 | plugins: [], 10 | } --------------------------------------------------------------------------------