Spaces:
Sleeping
Sleeping
Commit
·
dfa9d54
1
Parent(s):
5e32811
cookies
Browse files- __pycache__/app.cpython-310.pyc +0 -0
- app.py +188 -78
- 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 [
|
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[
|
27 |
-
os.environ[
|
28 |
-
os.environ[
|
29 |
-
os.environ[
|
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(
|
|
|
|
|
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 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
|
|
|
|
|
|
|
|
128 |
}
|
129 |
-
|
130 |
try:
|
131 |
logging.info(f"Downloading audio from YouTube: {url}")
|
132 |
-
|
133 |
-
|
|
|
134 |
import certifi
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
os.environ[
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
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 = {
|
164 |
-
return
|
|
|
165 |
|
166 |
def remove_repeated_sentences(text):
|
167 |
-
sentences = re.split(r
|
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 |
-
|
|
|
|
|
|
|
180 |
def index():
|
181 |
-
return render_template(
|
|
|
182 |
|
183 |
-
@app.route(
|
184 |
def transcribe():
|
185 |
try:
|
186 |
audio_data = None
|
187 |
-
|
188 |
-
if
|
189 |
-
youtube_url = request.form[
|
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
|
195 |
-
|
196 |
-
|
|
|
|
|
|
|
|
|
|
|
197 |
else:
|
198 |
raise e
|
199 |
-
elif
|
200 |
-
audio_file = request.files[
|
201 |
if not audio_file.filename:
|
202 |
return jsonify({"error": "No file selected."}), 400
|
203 |
if not allowed_file(audio_file.filename):
|
204 |
-
return
|
205 |
-
|
|
|
|
|
|
|
|
|
|
|
206 |
audio_bytes = audio_file.read()
|
207 |
-
file_format = audio_file.filename.rsplit(
|
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
|