├── .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 | You need to enable JavaScript to run this app.
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 |
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 |
handleAdd(currentElem)} className='p-3 bg-yellow-200 rounded-md hover:bg-yellow-500'>Add to Cart
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 |
handleRemove(product.id)} className='btn'>Remove
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 |
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 |
X
86 |
ok
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 |
X
116 |
ok
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 |
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 |
Start for free
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 |
57 | {/* {
58 | listData.map((url)=>{
59 | return(
60 | <>
61 |
62 |
63 |
64 | >
65 | )
66 | })
67 | } */}
68 |
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 |
16 | {/* hidden lg:flex */}
17 |
18 | Log in
19 | Try for free
20 |
21 | {/*
22 | Home
23 | Summary
24 | Upload
25 | */}
26 | {!show ? (
27 |
28 |
setShow(!show)}
33 | />{" "}
34 |
35 | ) : (
36 |
37 |
setShow(!show)}
42 | />
43 |
44 | )}
45 |
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 |
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 |
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 |
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 | Generate
97 |
98 |
99 |
100 |
101 |
No Files has been Selected
102 |
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 | Save
37 | Cancel
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 |
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 |
Upload
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 |
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 | {/* Go to summary */}
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 |
241 | {image ?
242 |
243 | :
244 | <>
245 | LOADING...
246 | >
247 | }
248 |
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 |
297 |
298 |
299 |
300 |
301 | {fileName} -
302 | {
305 | setFileName(No recording selected )
306 | setImage(null)
307 | }}
308 | />
309 |
310 |
311 | {
312 | image ? (
313 |
Generate
314 | ) : (
315 |
Generate
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 | }
--------------------------------------------------------------------------------