HARISH20205 commited on
Commit
dfa9d54
·
1 Parent(s): 5e32811
Files changed (3) hide show
  1. __pycache__/app.cpython-310.pyc +0 -0
  2. app.py +188 -78
  3. cookies.txt +25 -0
__pycache__/app.cpython-310.pyc ADDED
Binary file (6.91 kB). View file
 
app.py CHANGED
@@ -17,16 +17,16 @@ import tempfile
17
  load_dotenv()
18
 
19
  # Create directories with proper permissions
20
- for directory in ['/tmp/transformers_cache', '/tmp/hf_home', '/tmp/cache']:
21
  os.makedirs(directory, exist_ok=True)
22
  # Ensure the directory is writeable
23
  os.chmod(directory, 0o777)
24
 
25
  # Set environment variables after creating directories
26
- os.environ['TRANSFORMERS_CACHE'] = '/tmp/transformers_cache'
27
- os.environ['HF_HOME'] = '/tmp/hf_home'
28
- os.environ['XDG_CACHE_HOME'] = '/tmp/cache'
29
- os.environ['PYTHONHTTPSVERIFY'] = '0' # Added to help with SSL issues
30
 
31
  app = Flask(__name__)
32
 
@@ -34,6 +34,7 @@ logging.basicConfig(level=logging.INFO)
34
 
35
  MODEL_NAME = "google/pegasus-xsum"
36
 
 
37
  def convert_audio_to_mp3(audio_bytes, original_format=None):
38
  try:
39
  logging.info(f"Converting audio from {original_format} to MP3 in memory...")
@@ -47,45 +48,51 @@ def convert_audio_to_mp3(audio_bytes, original_format=None):
47
  logging.error(f"Error converting audio to MP3: {e}")
48
  raise ValueError(f"Error converting audio to MP3: {e}")
49
 
 
50
  @lru_cache(maxsize=1)
51
  def load_whisper_model():
52
  return whisper.load_model("base")
53
 
 
54
  @lru_cache(maxsize=1)
55
  def load_pegasus_model():
56
  tokenizer = PegasusTokenizer.from_pretrained(MODEL_NAME)
57
  model = PegasusForConditionalGeneration.from_pretrained(MODEL_NAME)
58
  return tokenizer, model
59
 
 
60
  def transcribe_audio_with_whisper(audio_data, timeout=180): # 3 minute timeout
61
  try:
62
  logging.info("Transcribing audio data")
63
  start_time = time.time()
64
  model = load_whisper_model()
65
-
66
  with tempfile.NamedTemporaryFile(suffix=".mp3", delete=True) as temp_file:
67
  if isinstance(audio_data, io.BytesIO):
68
  temp_file.write(audio_data.getvalue())
69
  else:
70
  temp_file.write(audio_data)
71
  temp_file.flush()
72
-
73
  # Add timeout monitoring
74
  result = model.transcribe(temp_file.name)
75
  elapsed = time.time() - start_time
76
  logging.info(f"Transcription completed in {elapsed:.2f} seconds")
77
-
78
  return result["text"]
79
  except Exception as e:
80
  logging.error(f"Error in audio transcription: {e}")
81
  raise ValueError(f"Error in audio transcription: {e}")
82
 
 
83
  def summarize_text_with_pegasus(text, tokenizer, model):
84
  try:
85
- inputs = tokenizer(text, truncation=True, padding="longest", return_tensors="pt")
 
 
86
  total_tokens = len(inputs["input_ids"][0])
87
- min_summary_length = max(math.ceil(total_tokens / 4), 75)
88
- max_summary_length = max(math.ceil(total_tokens / 3), 200)
89
 
90
  if min_summary_length >= max_summary_length:
91
  min_summary_length = max_summary_length - 1
@@ -95,76 +102,166 @@ def summarize_text_with_pegasus(text, tokenizer, model):
95
  num_beams=5,
96
  min_length=min_summary_length,
97
  max_length=max_summary_length,
98
- early_stopping=True
99
  )
100
 
101
  summary = tokenizer.decode(summary_ids[0], skip_special_tokens=True)
102
- summary = remove_repeated_sentences(summary)
103
  return summary
104
  except Exception as e:
105
  logging.error(f"Error in text summarization: {e}")
106
  raise ValueError(f"Error in text summarization: {e}")
107
 
 
108
  def download_audio_from_youtube(url):
109
  buffer = io.BytesIO()
110
-
 
 
 
 
 
 
 
 
 
111
  ydl_opts = {
112
- 'format': 'bestaudio/best',
113
- 'postprocessors': [{
114
- 'key': 'FFmpegExtractAudio',
115
- 'preferredcodec': 'mp3',
116
- 'preferredquality': '192',
117
- }],
118
- 'outtmpl': '-',
119
- 'logtostderr': True,
120
- 'quiet': False,
121
- 'no_warnings': False,
122
- 'extract_audio': True,
123
- 'nocheckcertificate': True,
124
- 'ignoreerrors': True,
125
- 'no_color': True,
126
- 'geo_bypass': True,
127
- 'cookies': '/tmp/cookies.txt'
 
 
 
 
128
  }
129
-
130
  try:
131
  logging.info(f"Downloading audio from YouTube: {url}")
132
-
133
- cert_path = os.path.join(tempfile.gettempdir(), 'cacert.pem')
 
134
  import certifi
135
- with open(cert_path, 'wb') as f:
136
- f.write(certifi.where().encode())
137
-
138
- os.environ['SSL_CERT_FILE'] = cert_path
139
- os.environ['REQUESTS_CA_BUNDLE'] = cert_path
140
-
141
- with tempfile.NamedTemporaryFile(suffix=".%(ext)s") as temp_file:
142
- ydl_opts['outtmpl'] = temp_file.name
143
-
144
- with YoutubeDL(ydl_opts) as ydl:
145
- info = ydl.extract_info(url, download=True)
146
- if not info:
147
- raise ValueError("Could not fetch video information")
148
-
149
- audio_file_path = ydl.prepare_filename(info).replace('.webm', '.mp3').replace('.m4a', '.mp3')
150
-
151
- if not os.path.exists(audio_file_path):
152
- raise ValueError(f"Downloaded file {audio_file_path} does not exist")
153
- with open(audio_file_path, 'rb') as audio_file:
154
- buffer = io.BytesIO(audio_file.read())
155
- buffer.seek(0)
156
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
157
  return buffer
158
  except Exception as e:
159
- logging.error(f"Unexpected error downloading audio: {e}")
160
  raise ValueError(f"Error downloading audio from YouTube: {e}")
161
 
 
162
  def allowed_file(filename):
163
- ALLOWED_EXTENSIONS = {'mp3', 'aac', 'flac', 'm4a'}
164
- return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
 
165
 
166
  def remove_repeated_sentences(text):
167
- sentences = re.split(r'(?<=[.!?]) +', text)
168
  unique_sentences = []
169
  seen_sentences = set()
170
 
@@ -173,44 +270,56 @@ def remove_repeated_sentences(text):
173
  if normalized_sentence not in seen_sentences:
174
  unique_sentences.append(sentence)
175
  seen_sentences.add(normalized_sentence)
176
-
177
- return ' '.join(unique_sentences)
178
 
179
- @app.route('/')
 
 
 
180
  def index():
181
- return render_template('index.html')
 
182
 
183
- @app.route('/transcribe', methods=['POST'])
184
  def transcribe():
185
  try:
186
  audio_data = None
187
-
188
- if 'url' in request.form and request.form['url']:
189
- youtube_url = request.form['url']
190
  try:
191
  audio_data = download_audio_from_youtube(youtube_url)
192
  except ValueError as e:
193
  if "bot" in str(e).lower() or "sign in" in str(e).lower():
194
- return jsonify({
195
- "error": "YouTube bot protection is preventing download. Please try uploading an audio file directly instead."
196
- }), 400
 
 
 
 
 
197
  else:
198
  raise e
199
- elif 'file' in request.files:
200
- audio_file = request.files['file']
201
  if not audio_file.filename:
202
  return jsonify({"error": "No file selected."}), 400
203
  if not allowed_file(audio_file.filename):
204
- return jsonify({"error": "Invalid file type. Please upload an audio file."}), 400
205
-
 
 
 
 
 
206
  audio_bytes = audio_file.read()
207
- file_format = audio_file.filename.rsplit('.', 1)[1].lower()
208
  audio_data = convert_audio_to_mp3(audio_bytes, original_format=file_format)
209
  else:
210
  return jsonify({"error": "No audio file or URL provided."}), 400
211
-
212
  transcription = transcribe_audio_with_whisper(audio_data)
213
-
214
  if transcription:
215
  tokenizer, model = load_pegasus_model()
216
  summary = summarize_text_with_pegasus(transcription, tokenizer, model)
@@ -223,5 +332,6 @@ def transcribe():
223
  logging.error(f"An unexpected error occurred: {e}")
224
  return jsonify({"error": "An unexpected error occurred."}), 500
225
 
 
226
  if __name__ == "__main__":
227
- app.run(debug=False, port=7860)
 
17
  load_dotenv()
18
 
19
  # Create directories with proper permissions
20
+ for directory in ["/tmp/transformers_cache", "/tmp/hf_home", "/tmp/cache"]:
21
  os.makedirs(directory, exist_ok=True)
22
  # Ensure the directory is writeable
23
  os.chmod(directory, 0o777)
24
 
25
  # Set environment variables after creating directories
26
+ os.environ["TRANSFORMERS_CACHE"] = "/tmp/transformers_cache"
27
+ os.environ["HF_HOME"] = "/tmp/hf_home"
28
+ os.environ["XDG_CACHE_HOME"] = "/tmp/cache"
29
+ os.environ["PYTHONHTTPSVERIFY"] = "0" # Added to help with SSL issues
30
 
31
  app = Flask(__name__)
32
 
 
34
 
35
  MODEL_NAME = "google/pegasus-xsum"
36
 
37
+
38
  def convert_audio_to_mp3(audio_bytes, original_format=None):
39
  try:
40
  logging.info(f"Converting audio from {original_format} to MP3 in memory...")
 
48
  logging.error(f"Error converting audio to MP3: {e}")
49
  raise ValueError(f"Error converting audio to MP3: {e}")
50
 
51
+
52
  @lru_cache(maxsize=1)
53
  def load_whisper_model():
54
  return whisper.load_model("base")
55
 
56
+
57
  @lru_cache(maxsize=1)
58
  def load_pegasus_model():
59
  tokenizer = PegasusTokenizer.from_pretrained(MODEL_NAME)
60
  model = PegasusForConditionalGeneration.from_pretrained(MODEL_NAME)
61
  return tokenizer, model
62
 
63
+
64
  def transcribe_audio_with_whisper(audio_data, timeout=180): # 3 minute timeout
65
  try:
66
  logging.info("Transcribing audio data")
67
  start_time = time.time()
68
  model = load_whisper_model()
69
+
70
  with tempfile.NamedTemporaryFile(suffix=".mp3", delete=True) as temp_file:
71
  if isinstance(audio_data, io.BytesIO):
72
  temp_file.write(audio_data.getvalue())
73
  else:
74
  temp_file.write(audio_data)
75
  temp_file.flush()
76
+
77
  # Add timeout monitoring
78
  result = model.transcribe(temp_file.name)
79
  elapsed = time.time() - start_time
80
  logging.info(f"Transcription completed in {elapsed:.2f} seconds")
81
+
82
  return result["text"]
83
  except Exception as e:
84
  logging.error(f"Error in audio transcription: {e}")
85
  raise ValueError(f"Error in audio transcription: {e}")
86
 
87
+
88
  def summarize_text_with_pegasus(text, tokenizer, model):
89
  try:
90
+ inputs = tokenizer(
91
+ text, truncation=True, padding="longest", return_tensors="pt"
92
+ )
93
  total_tokens = len(inputs["input_ids"][0])
94
+ min_summary_length = max(math.ceil(total_tokens / 4), 75)
95
+ max_summary_length = max(math.ceil(total_tokens / 3), 200)
96
 
97
  if min_summary_length >= max_summary_length:
98
  min_summary_length = max_summary_length - 1
 
102
  num_beams=5,
103
  min_length=min_summary_length,
104
  max_length=max_summary_length,
105
+ early_stopping=True,
106
  )
107
 
108
  summary = tokenizer.decode(summary_ids[0], skip_special_tokens=True)
109
+ summary = remove_repeated_sentences(summary)
110
  return summary
111
  except Exception as e:
112
  logging.error(f"Error in text summarization: {e}")
113
  raise ValueError(f"Error in text summarization: {e}")
114
 
115
+
116
  def download_audio_from_youtube(url):
117
  buffer = io.BytesIO()
118
+
119
+ # Create a temp directory for cookies with correct permissions
120
+ cookie_dir = tempfile.mkdtemp()
121
+ cookies_path = os.path.join(cookie_dir, "cookies.txt")
122
+
123
+ # Create an empty cookies file with appropriate permissions
124
+ with open(cookies_path, "w") as f:
125
+ f.write("")
126
+ os.chmod(cookies_path, 0o666)
127
+
128
  ydl_opts = {
129
+ "format": "bestaudio/best",
130
+ "postprocessors": [
131
+ {
132
+ "key": "FFmpegExtractAudio",
133
+ "preferredcodec": "mp3",
134
+ "preferredquality": "192",
135
+ }
136
+ ],
137
+ "outtmpl": "-",
138
+ "logtostderr": True,
139
+ "quiet": False,
140
+ "no_warnings": False,
141
+ "extract_audio": True,
142
+ "nocheckcertificate": True,
143
+ "ignoreerrors": True,
144
+ "no_color": True,
145
+ "geo_bypass": True,
146
+ "cookies": cookies_path, # Use our temp cookies file
147
+ "socket_timeout": 30,
148
+ "retries": 3,
149
  }
150
+
151
  try:
152
  logging.info(f"Downloading audio from YouTube: {url}")
153
+
154
+ # Handle SSL certificate issues
155
+ cert_path = os.path.join(tempfile.gettempdir(), "cacert.pem")
156
  import certifi
157
+
158
+ with open(cert_path, "wb") as f:
159
+ f.write(open(certifi.where(), "rb").read())
160
+
161
+ os.environ["SSL_CERT_FILE"] = cert_path
162
+ os.environ["REQUESTS_CA_BUNDLE"] = cert_path
163
+
164
+ # Create a proper temporary file for the download
165
+ with tempfile.NamedTemporaryFile(suffix=".%(ext)s", delete=False) as temp_file:
166
+ output_path = temp_file.name
167
+ ydl_opts["outtmpl"] = output_path
168
+
169
+ try:
170
+ with YoutubeDL(ydl_opts) as ydl:
171
+ # Add more info messages for debugging
172
+ logging.info(f"Starting YouTube download with options: {ydl_opts}")
173
+ info = ydl.extract_info(url, download=True)
174
+
175
+ if not info:
176
+ raise ValueError("Could not fetch video information")
177
+
178
+ # Construct the output filename based on yt-dlp's naming pattern
179
+ audio_file_path = ydl.prepare_filename(info)
180
+
181
+ # Handle different possible extensions
182
+ for ext in [".mp3", ".webm.mp3", ".m4a.mp3"]:
183
+ possible_path = audio_file_path.replace(".webm", ext).replace(
184
+ ".m4a", ext
185
+ )
186
+ if os.path.exists(possible_path):
187
+ audio_file_path = possible_path
188
+ break
189
+
190
+ logging.info(f"Audio downloaded to: {audio_file_path}")
191
+
192
+ if not os.path.exists(audio_file_path):
193
+ raise ValueError(
194
+ f"Downloaded file {audio_file_path} does not exist"
195
+ )
196
+
197
+ # Read the file and clean up
198
+ with open(audio_file_path, "rb") as audio_file:
199
+ buffer = io.BytesIO(audio_file.read())
200
+ buffer.seek(0)
201
+
202
+ # Remove the temporary file
203
+ try:
204
+ os.unlink(audio_file_path)
205
+ except Exception as cleanup_err:
206
+ logging.warning(f"Could not remove temp file: {cleanup_err}")
207
+ except Exception as ydl_err:
208
+ logging.error(f"YoutubeDL error: {ydl_err}")
209
+ # Try alternative download method - direct URL only, no fancy features
210
+ logging.info("Attempting alternative download method...")
211
+
212
+ simple_opts = {
213
+ "format": "bestaudio",
214
+ "outtmpl": output_path,
215
+ "nocheckcertificate": True,
216
+ "quiet": True,
217
+ "no_warnings": True,
218
+ "geo_bypass": True,
219
+ }
220
+
221
+ with YoutubeDL(simple_opts) as ydl:
222
+ info = ydl.extract_info(url, download=True)
223
+ if not info:
224
+ raise ValueError("Could not fetch video information")
225
+
226
+ audio_file_path = ydl.prepare_filename(info)
227
+
228
+ if not os.path.exists(audio_file_path):
229
+ raise ValueError(
230
+ f"Downloaded file {audio_file_path} does not exist"
231
+ )
232
+
233
+ # Read the file
234
+ with open(audio_file_path, "rb") as audio_file:
235
+ buffer = io.BytesIO(audio_file.read())
236
+ buffer.seek(0)
237
+
238
+ # Convert to MP3 if needed
239
+ if not audio_file_path.endswith(".mp3"):
240
+ buffer = convert_audio_to_mp3(
241
+ buffer.getvalue(),
242
+ original_format=audio_file_path.split(".")[-1],
243
+ )
244
+
245
+ # Clean up the temp directory
246
+ try:
247
+ os.unlink(cookies_path)
248
+ os.rmdir(cookie_dir)
249
+ except:
250
+ pass
251
+
252
  return buffer
253
  except Exception as e:
254
+ logging.error(f"Unexpected error downloading audio: {e}", exc_info=True)
255
  raise ValueError(f"Error downloading audio from YouTube: {e}")
256
 
257
+
258
  def allowed_file(filename):
259
+ ALLOWED_EXTENSIONS = {"mp3", "aac", "flac", "m4a"}
260
+ return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS
261
+
262
 
263
  def remove_repeated_sentences(text):
264
+ sentences = re.split(r"(?<=[.!?]) +", text)
265
  unique_sentences = []
266
  seen_sentences = set()
267
 
 
270
  if normalized_sentence not in seen_sentences:
271
  unique_sentences.append(sentence)
272
  seen_sentences.add(normalized_sentence)
 
 
273
 
274
+ return " ".join(unique_sentences)
275
+
276
+
277
+ @app.route("/")
278
  def index():
279
+ return render_template("index.html")
280
+
281
 
282
+ @app.route("/transcribe", methods=["POST"])
283
  def transcribe():
284
  try:
285
  audio_data = None
286
+
287
+ if "url" in request.form and request.form["url"]:
288
+ youtube_url = request.form["url"]
289
  try:
290
  audio_data = download_audio_from_youtube(youtube_url)
291
  except ValueError as e:
292
  if "bot" in str(e).lower() or "sign in" in str(e).lower():
293
+ return (
294
+ jsonify(
295
+ {
296
+ "error": "YouTube bot protection is preventing download. Please try uploading an audio file directly instead."
297
+ }
298
+ ),
299
+ 400,
300
+ )
301
  else:
302
  raise e
303
+ elif "file" in request.files:
304
+ audio_file = request.files["file"]
305
  if not audio_file.filename:
306
  return jsonify({"error": "No file selected."}), 400
307
  if not allowed_file(audio_file.filename):
308
+ return (
309
+ jsonify(
310
+ {"error": "Invalid file type. Please upload an audio file."}
311
+ ),
312
+ 400,
313
+ )
314
+
315
  audio_bytes = audio_file.read()
316
+ file_format = audio_file.filename.rsplit(".", 1)[1].lower()
317
  audio_data = convert_audio_to_mp3(audio_bytes, original_format=file_format)
318
  else:
319
  return jsonify({"error": "No audio file or URL provided."}), 400
320
+
321
  transcription = transcribe_audio_with_whisper(audio_data)
322
+
323
  if transcription:
324
  tokenizer, model = load_pegasus_model()
325
  summary = summarize_text_with_pegasus(transcription, tokenizer, model)
 
332
  logging.error(f"An unexpected error occurred: {e}")
333
  return jsonify({"error": "An unexpected error occurred."}), 500
334
 
335
+
336
  if __name__ == "__main__":
337
+ app.run(debug=False, port=7860)
cookies.txt ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Netscape HTTP Cookie File
2
+ # http://curl.haxx.se/rfc/cookie_spec.html
3
+ # This is a generated file! Do not edit.
4
+
5
+ .youtube.com TRUE / TRUE 1757583616 LOGIN_INFO AFmmF2swRQIgF5soRcTt7lXEUwtEb9FQ03f3Zne-yFkluBcpRitRS0cCIQDHcRE8XvCDS5zB4ePxdQXqh00tGRM9ezMV4nxLLjwbSQ:QUQ3MjNmeC1pYTRYWk9LS3puUHNkcnFmNHo0TlZzLXNlZjFjR0hxbEQ5V1RxS01ZWi1sdFg1YmtZV2l3VWhZamVnWEVTSFl0aThHdzZpLUFPblo2OUV3R1FQRUQ1bk9MdjIyOTBNTGdzV2c5UHZFZF8yLUhndzRjSGlaY0FWUGZhSUFDWTdXVjBiSFBiOWhreVBpeDQwSmF2ZW41MEdKa3lB
6
+ .youtube.com TRUE / TRUE 1743453779 PREF f6=40000000&tz=Asia.Calcutta&f7=100&f4=4000000&f5=20000
7
+ .youtube.com TRUE / FALSE 1758370753 SID g.a000vAjBDLZiKTwFsr7nRci5AJ3PYlXIk521CwbzSfsgcm0CTGlm9jbO5NwfjuH5H1Qr5z0HXQACgYKAR8SARQSFQHGX2MiJqDM__zo-eqJfVihPqytixoVAUF8yKrKi8L6mcfaoWGoI6WPxzE00076
8
+ .youtube.com TRUE / TRUE 1758370753 __Secure-1PSID g.a000vAjBDLZiKTwFsr7nRci5AJ3PYlXIk521CwbzSfsgcm0CTGlm6JC1od1z-48MA6Sv28P7VAACgYKARwSARQSFQHGX2MiySMQYDZvaNIE-EzqdtCY4xoVAUF8yKoE8ZajtSE3-Rqj1mAgPd0n0076
9
+ .youtube.com TRUE / TRUE 1758370753 __Secure-3PSID g.a000vAjBDLZiKTwFsr7nRci5AJ3PYlXIk521CwbzSfsgcm0CTGlmm5FMAoD2WmQf548Ici8uggACgYKAeUSARQSFQHGX2MisjOIaF3Qbnkqtng4E0OKpxoVAUF8yKqKOH2WNAkTP-D0GJU1BOJQ0076
10
+ .youtube.com TRUE / FALSE 1758370753 HSID AQcV7hFsmKBsEpVkg
11
+ .youtube.com TRUE / TRUE 1758370753 SSID A4XuUoqh-YH4zEXtj
12
+ .youtube.com TRUE / FALSE 1758370753 APISID 35X1TXslDGOfvkls/AqaxLrfKzyD0r6kIf
13
+ .youtube.com TRUE / TRUE 1758370753 SAPISID GBBt8GIdptNKShZG/AlcodBpo3nf7ZTgQl
14
+ .youtube.com TRUE / TRUE 1758370753 __Secure-1PAPISID GBBt8GIdptNKShZG/AlcodBpo3nf7ZTgQl
15
+ .youtube.com TRUE / TRUE 1758370753 __Secure-3PAPISID GBBt8GIdptNKShZG/AlcodBpo3nf7ZTgQl
16
+ .youtube.com TRUE / TRUE 0 wide 0
17
+ .youtube.com TRUE / TRUE 1758400964 __Secure-1PSIDTS sidts-CjIB7pHptY0gCyLdqftBIBXJTy7bBUtmmovoL9p9TI3uoJasEmwAlzpVO49C3Eapsb6yBBAA
18
+ .youtube.com TRUE / TRUE 1758400964 __Secure-3PSIDTS sidts-CjIB7pHptY0gCyLdqftBIBXJTy7bBUtmmovoL9p9TI3uoJasEmwAlzpVO49C3Eapsb6yBBAA
19
+ .youtube.com TRUE / FALSE 1758400981 SIDCC AKEyXzUWhRPhQu0yzPaM9FKj-Qa8MePFc5ETqbUvRnvJIBxOm8P5IFTk0YpIuA3tEGjkyX_GCw
20
+ .youtube.com TRUE / TRUE 1758400981 __Secure-1PSIDCC AKEyXzUjf4BOyFFV20k_f4BqobIoTYoUzehByNXxjrlY-DoO_ej73h6h7SGhscYvR09iiF1WOA
21
+ .youtube.com TRUE / TRUE 1758400981 __Secure-3PSIDCC AKEyXzXvgXjidduS-LM-pE5IhSUSxWRv9sS0MOuTpwqwAd3duFZsxnDjdjot864-04kzzdpUSzg
22
+ .youtube.com TRUE / TRUE 1758400977 VISITOR_INFO1_LIVE Xbmcd6Kbxkc
23
+ .youtube.com TRUE / TRUE 1758400977 VISITOR_PRIVACY_METADATA CgJJThIEGgAgJw%3D%3D
24
+ .youtube.com TRUE / TRUE 0 YSC CEEJWnuAkNs
25
+ .youtube.com TRUE / TRUE 1758369465 __Secure-ROLLOUT_TOKEN CJWHp_C1vvL0iQEQ0serveWLjAMYp4mH_9SijAM%3D