diff --git a/API.md b/API.md index f05b98a..b7212ef 100644 --- a/API.md +++ b/API.md @@ -16,18 +16,28 @@ Production için base URL değişebilir. API key'i iki şekilde gönderebilirsiniz: -### 1. HTTP Header (Önerilen) +### 1. HTTP Header (Programatik kullanım için önerilen) ```http X-API-Key: your_api_key_here ``` -### 2. Query Parameter +**Not:** RSS okuyucular HTTP header gönderemediği için bu yöntem sadece programatik kullanım için uygundur. + +### 2. Query Parameter (RSS okuyucular ve tarayıcılar için zorunlu) ``` ?api_key=your_api_key_here ``` +**Önemli:** RSS okuyucular, tarayıcılar ve feed aggregator'lar için **mutlaka query parameter** kullanılmalıdır çünkü bu uygulamalar HTTP header gönderemez. + +**Güvenlik Notu:** API key'i URL'de kullanmak güvenlik açısından ideal değildir çünkü: +- URL'ler log dosyalarında, tarayıcı geçmişinde ve referrer header'larında görünebilir +- Ancak RSS okuyucular için bu tek seçenektir +- Production'da farklı API key'ler kullanarak riski azaltabilirsiniz +- API key'lerinizi düzenli olarak rotate edin + ### API Key Alma API key'ler `config/security.yaml` dosyasından yönetilir. Yeni bir API key eklemek için: @@ -93,21 +103,46 @@ YouTube kanalı için transcript feed'i oluşturur. **Örnek İstekler:** +**URL-Based Sorgular (RSS Okuyucular ve Tarayıcılar için):** + ```bash -# Channel ID ile +# Channel ID ile (API key URL'de) +http://localhost:5000/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA&api_key=demo_key_12345&format=Atom + +# Channel handle ile (API key URL'de) +http://localhost:5000/?channel=@tavakfi&api_key=demo_key_12345&format=Atom&max_items=10 + +# Channel URL ile (API key URL'de) - ÖNERİLEN +http://localhost:5000/?channel_url=https://www.youtube.com/@tavakfi&api_key=demo_key_12345&format=Atom&max_items=50 + +# RSS format ile +http://localhost:5000/?channel_url=https://www.youtube.com/@politicalfronts&api_key=demo_key_12345&format=Rss&max_items=20 +``` + +**Programatik Kullanım (HTTP Header ile):** + +```bash +# Channel ID ile (Header'da API key) curl -H "X-API-Key: demo_key_12345" \ "http://localhost:5000/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA&format=Atom" -# Channel handle ile +# Channel handle ile (Header'da API key) curl -H "X-API-Key: demo_key_12345" \ "http://localhost:5000/?channel=@tavakfi&format=Atom" -# Channel URL ile +# Channel URL ile (Header'da API key) curl -H "X-API-Key: demo_key_12345" \ "http://localhost:5000/?channel_url=https://www.youtube.com/@tavakfi&format=Atom&max_items=50" +``` -# Query parametresi ile API key -curl "http://localhost:5000/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA&api_key=demo_key_12345&format=Rss" +**Production URL Örnekleri:** + +``` +# Production URL ile Channel URL kullanımı +https://yt2feed.aligundogar.com.tr/?channel_url=https://www.youtube.com/@politicalfronts&api_key=your_api_key&format=Atom + +# Production URL ile Channel ID kullanımı +https://yt2feed.aligundogar.com.tr/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA&api_key=your_api_key&format=Rss&max_items=50 ``` **Başarılı Yanıt:** @@ -332,10 +367,60 @@ API CORS desteği sağlar. Preflight request'ler için `OPTIONS` metodu kullanı RSS reader uygulamanızda feed URL'si olarak kullanın: +**Önemli:** RSS okuyucular HTTP header gönderemediği için API key'i **mutlaka query parametresi** olarak eklemeniz gerekir. + +**URL Formatı:** ``` -http://your-api.com/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA&format=Rss&api_key=your_api_key +BASE_URL/?channel_url=YOUTUBE_CHANNEL_URL&api_key=YOUR_API_KEY&format=Atom&max_items=10 ``` +**Örnek URL'ler (Production):** + +``` +# Channel URL ile (ÖNERİLEN - En kolay ve güvenilir) +https://yt2feed.aligundogar.com.tr/?channel_url=https://www.youtube.com/@politicalfronts&api_key=your_api_key&format=Atom + +# Channel URL ile RSS format +https://yt2feed.aligundogar.com.tr/?channel_url=https://www.youtube.com/@politicalfronts&api_key=your_api_key&format=Rss&max_items=50 + +# Channel ID ile +https://yt2feed.aligundogar.com.tr/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA&api_key=your_api_key&format=Atom&max_items=20 + +# Channel Handle ile +https://yt2feed.aligundogar.com.tr/?channel=@tavakfi&api_key=your_api_key&format=Atom&max_items=50 + +# Channel URL ile (Channel ID formatında) +https://yt2feed.aligundogar.com.tr/?channel_url=https://www.youtube.com/channel/UC9h8BDcXwkhZtnqoQJ7PggA&api_key=your_api_key&format=Rss +``` + +**Örnek URL'ler (Localhost - Test için):** + +``` +# Localhost test URL'i +http://localhost:5000/?channel_url=https://www.youtube.com/@politicalfronts&api_key=demo_key_12345&format=Atom + +# Localhost ile Channel ID +http://localhost:5000/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA&api_key=demo_key_12345&format=Rss&max_items=10 +``` + +**RSS Okuyucu Adımları:** + +1. RSS okuyucunuzda "Feed Ekle", "Subscribe" veya "Add Feed" seçeneğini açın +2. Feed URL alanına yukarıdaki formatlardan birini yapıştırın +3. `your_api_key` kısmını kendi API key'inizle değiştirin +4. Feed'i ekleyin ve kaydedin + +**Popüler RSS Okuyucular:** +- **Feedly**: Feed URL'sini direkt yapıştırın +- **Inoreader**: "Add New" > "Feed" > URL yapıştırın +- **NewsBlur**: "Add Site" > URL yapıştırın +- **The Old Reader**: "Add Subscription" > URL yapıştırın +- **NetNewsWire**: "File" > "Add Feed" > URL yapıştırın + +**Not:** +- İlk istekte transcript'ler henüz işlenmemiş olabilir. Birkaç dakika bekleyip tekrar deneyin. +- API key'inizi URL'de paylaşmayın, sadece kendi RSS okuyucunuzda kullanın. + ### 2. Programatik Kullanım (Python) ```python @@ -363,6 +448,31 @@ else: ### 3. Programatik Kullanım (JavaScript) +**URL-Based (Tarayıcı için):** + +```javascript +// Tarayıcıdan kullanım - API key URL'de +const apiKey = "your_api_key_here"; +const channelUrl = "https://www.youtube.com/@politicalfronts"; +const feedUrl = `https://yt2feed.aligundogar.com.tr/?channel_url=${encodeURIComponent(channelUrl)}&api_key=${apiKey}&format=Atom`; + +fetch(feedUrl) + .then(response => { + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return response.text(); + }) + .then(feedContent => { + console.log(feedContent); + }) + .catch(error => { + console.error("Error:", error); + }); +``` + +**Header-Based (Node.js/Backend için):** + ```javascript const apiKey = "your_api_key_here"; const channelId = "UC9h8BDcXwkhZtnqoQJ7PggA"; @@ -388,13 +498,37 @@ fetch(`http://localhost:5000/?channel_id=${channelId}&format=Atom`, { ### 4. cURL ile Test +**URL-Based Sorgular (RSS Okuyucular ve Tarayıcılar için):** + ```bash -# API key ile test +# API key URL'de - Channel URL ile (ÖNERİLEN) +API_KEY="demo_key_12345" +CHANNEL_URL="https://www.youtube.com/@politicalfronts" + +curl "http://localhost:5000/?channel_url=${CHANNEL_URL}&api_key=${API_KEY}&format=Atom&max_items=50" + +# API key URL'de - Channel ID ile +CHANNEL_ID="UC9h8BDcXwkhZtnqoQJ7PggA" +curl "http://localhost:5000/?channel_id=${CHANNEL_ID}&api_key=${API_KEY}&format=Rss&max_items=20" + +# Production URL ile +curl "https://yt2feed.aligundogar.com.tr/?channel_url=https://www.youtube.com/@politicalfronts&api_key=${API_KEY}&format=Atom" +``` + +**Header-Based Sorgular (Programatik Kullanım için):** + +```bash +# API key header'da - Channel ID ile API_KEY="demo_key_12345" CHANNEL_ID="UC9h8BDcXwkhZtnqoQJ7PggA" curl -H "X-API-Key: $API_KEY" \ "http://localhost:5000/?channel_id=$CHANNEL_ID&format=Atom&max_items=50" + +# API key header'da - Channel URL ile +CHANNEL_URL="https://www.youtube.com/@tavakfi" +curl -H "X-API-Key: $API_KEY" \ + "http://localhost:5000/?channel_url=${CHANNEL_URL}&format=Atom&max_items=50" ``` ## Notlar diff --git a/output/flaresolverr_debug/flaresolverr_response_Brm71uCWr-I_1763010487.html b/output/flaresolverr_debug/flaresolverr_response_Brm71uCWr-I_1763010487.html new file mode 100644 index 0000000..2f1e593 --- /dev/null +++ b/output/flaresolverr_debug/flaresolverr_response_Brm71uCWr-I_1763010487.html @@ -0,0 +1,2585 @@ +You Need To Quit Weed. - YouTube + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+
+
+ +
+
+
+
+
+
+ + Back + +
+ + +
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+ + + +
+ + + + + + + +
+ +
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+
+ + +
+
+ + +
+ +
+
+
+ +
+
+
+ + + + + +
+ + + +
+
+
+
12,026 Human Era Calendar
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
The 10th edition of our Human Era Calendar is finally here, and this year: it's more epic than ever. In 12,026, join us on an inspiring journey through space and time to discover humanity's special connection with the stars. Made entirely by humans and crafted with love to bring you a year's worth of kurzgesagt for your walls. Get it now and support another year of free science content for millions. Thank you for being a special part of our mission.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
12,026 Human Era Calendar
+ +
+ + +
TRY 1,310.94
+
+ +
+ +
+ + +
+
+ +
The 10th edition of our Human Era Calendar is finally here, and this year: it's more epic than ever. In 12,026, join us on an inspiring journey through space and time to discover humanity's special connection with the stars. Made entirely by humans and crafted with love to bring you a year's worth of kurzgesagt for your walls. Get it now and support another year of free science content for millions. Thank you for being a special part of our mission.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
The Human Era Calendar Artbook
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
PRE-ORDER ONLY! Orders placed after October 7th are estimated to start shipping in January 2026 and unfortunately will not arrive before Christmas. Note: We are only able to ship your order once all items are in stock, meaning your entire order will ship together. To avoid this, please place two separate orders. If you placed your order on or before October 7th, your artbook is still on track to ship in November. Thank you so much for your incredible support and patience, it means the world to us. We can assure you that it's worth the wait! Discover never seen before kurzgesagt content with 10 years of calendar illustrations, stories, rare concept art, and behind-the-scenes insights from the kurzgesagt team. It's a physical tribute to how far we've come together and a must-have for kurzgesagt fans who've been with us along the way.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
The Human Era Calendar Artbook
+ +
+ + +
TRY 2,431.81
+
+ +
+ +
+ + +
+
+ +
PRE-ORDER ONLY! Orders placed on October 21st or later will ship in late January 2026 and unfortunately will not arrive before Christmas. Note: We are only able to ship your order once all items are in stock, meaning your entire order will ship together. To avoid this, please place two seperate orders. If you placed your order before October 21st, your artbook is still on track to ship in December. Thank you so much for your incredible support and patience, it means the world to us. We can assure you that it's worth the wait! Discover never seen before kurzgesagt content with 10 years of calendar illustrations, stories, rare concept art, and behind-the-scenes insights from the kurzgesagt team. It's a physical tribute to how far we've come together and a must-have for kurzgesagt fans who've been with us along the way.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Cosmic Planner Bundle
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
Bundle up your 12,026 Human Era Calendar with a Weekly Desk Planner, helping you stay grounded in cosmic time while organizing the everyday. Functional, beautiful, and proudly human-made.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Cosmic Besties Bundle
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
Share a journey through time and stars with someone special. Complete with a 12,026 Calendar for both, and matching Friendship Wormhole Pins that connect you – no matter the distance.
+
+
+
+ + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+ + +
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+ + +
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+ +
+ + + + + + + + + +
+
+
+ You Need To Quit Weed. +
+ + +
159KLikes
3,096,873Views
Nov 42025
+
+ +
+
+
+ +
+
+
+ + + + + +
+ + + +
+
+
+
12,026 Human Era Calendar
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
shop-us.kurzgesagt.org/products/12-026-human-era-calendar?variant=42164773257264&country=CA&currency=CAD&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOoqYzv-yuFqyNnGO9zcZVV1HRL_qu1m0lLAgFxJHotYVfrUmbKpG4wo
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
12,026 Human Era Calendar
+ +
+ + +
TRY 1,310.94
+
+ +
+ +
+ + +
+
+ +
shop-eu.kurzgesagt.org/products/12-026-human-era-calendar?variant=55341282656633&country=AE&currency=EUR&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOorOZAJm2yfxr1VIiXItxmuAGjcBE1HdzDYL8SXJRE6WiPiTAi-vsto
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
The Human Era Calendar Artbook
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
shop-us.kurzgesagt.org/products/human-era-calendar-artbook?variant=42164793016368&country=US&currency=USD&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOoruLfZdmSlFWBfAlW3KtIjWZlfElxsNKFGLeehEIXeTkrbqgcd6N7E
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
The Human Era Calendar Artbook
+ +
+ + +
TRY 2,431.81
+
+ +
+ +
+ + +
+
+ +
shop-eu.kurzgesagt.org/products/human-era-calendar-artbook?variant=55341280493945&country=AE&currency=EUR&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOoqJSB42Z7uPWaHS4Vn6tciHlnhdKpb7qKWDjSOQ-OaBfjglFXWrU_Q
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Cosmic Planner Bundle
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
shop-us.kurzgesagt.org/products/cosmic-planner-bundle?variant=42440587411504&country=AU&currency=AUD&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOopWf-eNVCVaYh_9HeCyr4HbPdG3Ko9Q1peqy9B4k-v0iKVn4Zty6ns
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Cosmic Besties Bundle
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
shop-us.kurzgesagt.org/products/cosmic-besties-bundle?variant=42429255680048&country=AU&currency=AUD&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOooZ6zrfDddNe1LG3B8yNAQXBXQrdEZzlvjVYFRn6RKZtI9G8CI5Jog
+
+
+
+ + +
+
+
+ +
+
+
+
+
+
+
+
+
+
Take back your personal data with Incogni! Use code "kurzgesagt" at the link https://incogni.com/kurzgesagt and get 60% off annual plans. + +A new year, a new chance to grow! Get your 12,026 Human Era Calendar now, only on the kurzgesagt shop: https://shop.kgs.link/12-026 +Thank you for supporting another year of kurzgesagt ❤️ + +Thanks to Dr Will Lawn for helping with academic content and fact-checking. If you live in England, are aged 12-15 years old, are interested in participating in online research about mental health, please contact Will: c.res@kcl.ac.uk + +Sources & further reading: +https://sites.google.com/view/sources... + +Weed is often seen as harmless, and in some cases, even helpful. But for many people, it can slowly become a serious problem, especially as they approach their twenties or thirties. Today, we take a closer look at how long-term daily use can affect your relationships, motivation, mental health, and life in general. Can it really be used safely? How easy is it for weed to turn into an addiction? + + +OUR CHANNELS +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +German: https://kgs.link/youtubeDE +Spanish: https://kgs.link/youtubeES +French: https://kgs.link/youtubeFR +Portuguese: https://kgs.link/youtubePT +Arabic: https://kgs.link/youtubeAR +Hindi: https://kgs.link/youtubeHI +Japanese: https://kgs.link/youtubeJA +Korean: https://kgs.link/youtubeKO + + +HOW CAN YOU SUPPORT US? +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +This is how we make our living and it would be a pleasure if you support us! + +Get Products designed with ❤️ https://shop.kgs.link +Join the Patreon Bird Army 🐧 https://kgs.link/patreon + + +DISCUSSIONS & SOCIAL MEDIA +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +Instagram: https://kgs.link/instagram +TikTok: https://kgs.link/tiktok +Reddit: https://kgs.link/reddit +Discord: https://kgs.link/discord +Twitter: https://kgs.link/twitter +Bluesky: https://kgs.link/bluesky +Facebook: https://kgs.link/facebook +Newsletter: https://kgs.link/newsletter + + +OUR VOICE +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +The kurzgesagt voice is from +Steve Taylor: https://kgs.link/youtube-voice + + +OUR MUSIC ♬♪ +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +700+ minutes of kurzgesagt soundtracks by Epic Mountain: + +Spotify: https://kgs.link/music-spotify +Soundcloud: https://kgs.link/music-soundcloud +Bandcamp: https://kgs.link/music-bandcamp +Youtube: https://kgs.link/music-youtube +Facebook: https://kgs.link/music-facebook + +The soundtrack of this video: +SoundCloud: https://bit.ly/4on2dog +Bandcamp: https://bit.ly/43b6anz + +If you want to help us caption this video, please send subtitles to subtitle@kurzgesagt.org +You can find info on what subtitle files work on YouTube here: +https://support.google.com/youtube/an... +Thank you! + + +🐦🐧🐤 PATREON BIRD ARMY 🐤🐧🐦 +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +Many thanks to our wonderful Patreons (from http://kgs.link/patreon) who support us every month and made this video possible: +Acácio Correia, AeryaRia, aforsberg, Ahmad Seet, Alexander, Alexander Devlin, amia, Andres Ramos, Anna Duwenig, Anthony Hanson, Anton Abrahamsson, AonReo, Armond Aghanian, Asaf Yishai, Benjamin R., Bharath Ron, Brendan Ryan-Lewis, Christoph Lurz, Christoph Rau, Clay, Cliff Hudson, ConsterCoaster, Corbin Meier, Dale Kipple, Delano Stijns, dotvhs, Dylan Gafner, eddie k, Ela Yohannan, Enigma66, Eran Aviram, Erwin Heckler, Eva Markiewicz, Evil Cookie, FeelinaraIRL, Frankie Ennis, G, Geoff Evans, George Hutter, hazardx, Hugh Mungus, Inigo vd, Ireleigh, Isabelll, Ishaan Varma, Jack Sparrow, James Emmitt Zugar, James Pinkerton, james trotta, Jason Desrosiers, Jason Murley, Jens Begemann, Jesse, Jesus Mayo, Joann Taijala, Joseph Gauthier, jurd, Justin, KawasakiDragonno, Keddan, KekzL, Lauren Woolsey LeGrandAnanas, Lulidine, LumpyMammot, manchicken, Mark A Vargas, MasterOfTree, Matthew Brady, Matthew Brodeur, Maximilian Schons, Mead Landis, Ms. Ewing, Mykola Balakin, Nathaniel Bauernfeind, Nicholas McCalla, Ovidiu Nita, Owen, PaladinSpartac, Phoenix_Flames, Primalis, Quinn Wilson, Rath Robin, Robert Cudinski, Robin Hockett, Ryan Snead, Ryan Staunch, Ryan Thompson, SentinelD20, Siddharth Chaini, Sindre Nistad, Soko Divanovic, Spleens, Stacey Nicholson, Stephen Conlon, Strudy, Syi, Sérgio P., Thomas Mitchell, Thomas Stokes, Thomas Toombes, Tom Kocmi, Warren MacEvoy, William Lingenfelter
+
+ +
+ +
+

Follow along using the transcript.

+
+
+
+
+ +
+ +
+

Kurzgesagt – In a Nutshell

+
+ 24.8M subscribers +
+
+
+ + + +
+
+ +
+
+
+ + +
+ +
+ + +
+ + + + + +
+
+
+ + +
+ + + + + + +
+
+ + Join this channel and unlock members-only perks +
+ +
+
+
+ + +
+ + + + +
\ No newline at end of file diff --git a/output/flaresolverr_debug/flaresolverr_response_Mo1A45ShcMo_1763010127.html b/output/flaresolverr_debug/flaresolverr_response_Mo1A45ShcMo_1763010127.html new file mode 100644 index 0000000..5eb5f42 --- /dev/null +++ b/output/flaresolverr_debug/flaresolverr_response_Mo1A45ShcMo_1763010127.html @@ -0,0 +1,2538 @@ +You're More Stressed Than Ever - Let's Change That - YouTube + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+
+
+ +
+
+
+
+
+
+ + Back + +
+ + +
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+ + + +
+ + + + + + + +
+ +
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+
+ + +
+
+ + +
+ +
+
+
+ +
+
+
+ + + + + +
+ + + +
+
+
+
Health Journal
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
Build your very own custom health journey and take a big step towards a healthier life. This journal will help you to find out how to effectively improve your fitness, nutrition, and mental health. Step-by-step, we'll guide you to build a routine that works for you and your individual needs and goals. Backed by science, developed by experts, and illustrated with love to keep you curious and motivated.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Journal
+ +
+ + +
TRY 1,408.40
+
+ +
+ +
+ + +
+
+ +
Build your very own custom health journey and take a big step towards a healthier life. This journal will help you to find out how to effectively improve your fitness, nutrition, and mental health. Step-by-step, we'll guide you to build a routine that works for you and your individual needs and goals. Backed by science, developed by experts, and illustrated with love to keep you curious and motivated.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Sweatshirt L
+ +
+ + +
TRY 2,675.48
+
+ +
+ +
+ + +
+
+ +
The freshest, softest, confidence-boosting sweatshirt for anyone on their own health journey. Perfect for layering over sports clothes or for a cozy rest day at home.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Sweatshirt L
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
The freshest, softest, confidence-boosting sweater for anyone on their own health journey. Perfect for layering over sports clothes or for a cozy rest day at home.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Shirt L
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
This vibrant tee perfectly matches your health journey. Because it's all about balance: science and snacks, rest and movement – and feeling good while you're at it.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Shirt L
+ +
+ + +
TRY 1,700.81
+
+ +
+ +
+ + +
+
+ +
This vibrant tee perfectly matches your health journey. Because it's all about balance: science and snacks, rest and movement – and feeling good while you're at it.
+
+
+
+ + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+ + +
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+ + +
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+ +
+ + + + + + + + + +
+
+
+ You're More Stressed Than Ever - Let's Change That +
+ + +
129KLikes
1,855,100Views
Nov 112025
+
+ +
+
+
+ +
+
+
+ + + + + +
+ + + +
+
+
+
Health Journal
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
shop-us.kurzgesagt.org/products/health-journal?variant=42091757174832&country=CA&currency=CAD&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOoq92qvEVLA1wN5ooeKXLoRLiuUL4igiiCpYR7c1rAhjp7Z2qLxUp7w
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Journal
+ +
+ + +
TRY 1,408.40
+
+ +
+ +
+ + +
+
+ +
shop-eu.kurzgesagt.org/products/health-journal?variant=55019823137145&country=AE&currency=EUR&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOop04QM63fSrFBayld1SDIh2xAOJaBjLOspvrYp04KhKFVMvrPnhkHY
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Sweatshirt L
+ +
+ + +
TRY 2,675.48
+
+ +
+ +
+ + +
+
+ +
shop-eu.kurzgesagt.org/products/health-sweatshirt?variant=55467788730745&country=AE&currency=EUR&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOookP0gaUfnm8vDEn-LMb5OSQgkFkk85zl6lYThVslBVg8LY9GVNP9o
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Sweatshirt L
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
shop-us.kurzgesagt.org/products/health-sweater?variant=42216775909424&country=US&currency=USD&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOorgyLTIxxH78yxUZcksjPh19wbxLq18c6i9NjdVCR-pVvyVjKnho8k
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Shirt L
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
shop-us.kurzgesagt.org/products/health-shirt?variant=42216768077872&country=CA&currency=CAD&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOoqa94qjKieLZ3Srv4XQmobZtCczFYlhTHxox0_wdRiHMAWRDB1Q-HU
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Shirt L
+ +
+ + +
TRY 1,700.81
+
+ +
+ +
+ + +
+
+ +
shop-eu.kurzgesagt.org/products/health-club-shirt?variant=55708450128249&country=AE&currency=EUR&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOoowIOtUXug1TQ9_wzexO9vQ8urBcwnRVDP5yeT9imViV9n04Hfu7HI
+
+
+
+ + +
+
+
+ +
+
+
+
+
+
+
+
+
+
Our brand-new Health Journal is here to help you take care of your physical and mental health, using real science and no guilt: https://shop.kgs.link/early-access-he... +Learn what works for you, and build a routine that actually fits into your life. + +Sources & further reading: +https://sites.google.com/view/sources... + +Stress is a biological superpower that helped your ancestors outrun predators, fight off enemies, and survive extreme situations. In the past, it helped us survive, but today, it’s quietly damaging millions of lives. +What exactly is stress, how did it evolve, and is it even possible to use it in a healthy way? + + +OUR CHANNELS +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +German: https://kgs.link/youtubeDE +Spanish: https://kgs.link/youtubeES +French: https://kgs.link/youtubeFR +Portuguese: https://kgs.link/youtubePT +Arabic: https://kgs.link/youtubeAR +Hindi: https://kgs.link/youtubeHI +Japanese: https://kgs.link/youtubeJA +Korean: https://kgs.link/youtubeKO + + +HOW CAN YOU SUPPORT US? +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +This is how we make our living and it would be a pleasure if you support us! + +Get Products designed with ❤️ https://shop.kgs.link +Join the Patreon Bird Army 🐧 https://kgs.link/patreon + + +DISCUSSIONS & SOCIAL MEDIA +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +Instagram: https://kgs.link/instagram +TikTok: https://kgs.link/tiktok +Reddit: https://kgs.link/reddit +Discord: https://kgs.link/discord +Twitter: https://kgs.link/twitter +Bluesky: https://kgs.link/bluesky +Facebook: https://kgs.link/facebook +Newsletter: https://kgs.link/newsletter + + +OUR VOICE +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +The kurzgesagt voice is from +Steve Taylor: https://kgs.link/youtube-voice + + +OUR MUSIC ♬♪ +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +700+ minutes of kurzgesagt soundtracks by Epic Mountain: + +Spotify: https://kgs.link/music-spotify +Soundcloud: https://kgs.link/music-soundcloud +Bandcamp: https://kgs.link/music-bandcamp +Youtube: https://kgs.link/music-youtube +Facebook: https://kgs.link/music-facebook + +The soundtrack of this video: +SoundCloud: https://bit.ly/3WJYaWW +BandCamp: https://bit.ly/49LoU0N + +If you want to help us caption this video, please send subtitles to subtitle@kurzgesagt.org +You can find info on what subtitle files work on YouTube here: +https://support.google.com/youtube/an... +Thank you! + + +🐦🐧🐤 PATREON BIRD ARMY 🐤🐧🐦 +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +Many thanks to our wonderful Patreons (from http://kgs.link/patreon) who support us every month and made this video possible: +Acácio Correia, AeryaRia, aforsberg, Ahmad Seet, Alexander, Alexander Devlin, amia, Andres Ramos, Anna Duwenig, Anthony Hanson, Anton Abrahamsson, AonReo, Armond Aghanian, Asaf Yishai, Benjamin R., Bharath Ron, Brendan Ryan-Lewis, Christoph Lurz, Christoph Rau, Clay, Cliff Hudson, ConsterCoaster, Corbin Meier, Dale Kipple, Delano Stijns, dotvhs, Dylan Gafner, eddie k, Ela Yohannan, Enigma66, Eran Aviram, Erwin Heckler, Eva Markiewicz, Evil Cookie, FeelinaraIRL, Frankie Ennis, G, Geoff Evans, George Hutter, hazardx, Hugh Mungus, Inigo vd, Ireleigh, Isabelll, Ishaan Varma, Jack Sparrow, James Emmitt Zugar, James Pinkerton, james trotta, Jason Desrosiers, Jason Murley, Jens Begemann, Jesse, Jesus Mayo, Joann Taijala, Joseph Gauthier, jurd, Justin, KawasakiDragonno, Keddan, KekzL, Lauren Woolsey LeGrandAnanas, Lulidine, LumpyMammot, manchicken, Mark A Vargas, MasterOfTree, Matthew Brady, Matthew Brodeur, Maximilian Schons, Mead Landis, Ms. Ewing, Mykola Balakin, Nathaniel Bauernfeind, Nicholas McCalla, Ovidiu Nita, Owen, PaladinSpartac, Phoenix_Flames, Primalis, Quinn Wilson, Rath Robin, Robert Cudinski, Robin Hockett, Ryan Snead, Ryan Staunch, Ryan Thompson, SentinelD20, Siddharth Chaini, Sindre Nistad, Soko Divanovic, Spleens, Stacey Nicholson, Stephen Conlon, Strudy, Syi, Sérgio P., Thomas Mitchell, Thomas Stokes, Thomas Toombes, Tom Kocmi, Warren MacEvoy, William Lingenfelter
+
+ +
+ +
+

Follow along using the transcript.

+
+
+
+
+ +
+ +
+

Kurzgesagt – In a Nutshell

+
+ 24.8M subscribers +
+
+
+ + +
+
+
+ +
+
+
+ + +
+ +
+ + +
+ + + + + +
+
+
+ + +
+ + + + + + + + + +
+ + + + +
\ No newline at end of file diff --git a/output/flaresolverr_debug/flaresolverr_response_Mo1A45ShcMo_1763010190.html b/output/flaresolverr_debug/flaresolverr_response_Mo1A45ShcMo_1763010190.html new file mode 100644 index 0000000..2b3c88c --- /dev/null +++ b/output/flaresolverr_debug/flaresolverr_response_Mo1A45ShcMo_1763010190.html @@ -0,0 +1,2549 @@ +You're More Stressed Than Ever - Let's Change That - YouTube + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+
+
+ +
+
+
+
+
+
+ + Back + +
+ + +
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+ + + +
+ + + + + + + +
+ +
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+
+ + +
+
+ + +
+ +
+
+
+ +
+
+
+ + + + + +
+ + + +
+
+
+
Health Journal
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
Build your very own custom health journey and take a big step towards a healthier life. This journal will help you to find out how to effectively improve your fitness, nutrition, and mental health. Step-by-step, we'll guide you to build a routine that works for you and your individual needs and goals. Backed by science, developed by experts, and illustrated with love to keep you curious and motivated.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Journal
+ +
+ + +
TRY 1,408.40
+
+ +
+ +
+ + +
+
+ +
Build your very own custom health journey and take a big step towards a healthier life. This journal will help you to find out how to effectively improve your fitness, nutrition, and mental health. Step-by-step, we'll guide you to build a routine that works for you and your individual needs and goals. Backed by science, developed by experts, and illustrated with love to keep you curious and motivated.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Sweatshirt L
+ +
+ + +
TRY 2,675.48
+
+ +
+ +
+ + +
+
+ +
The freshest, softest, confidence-boosting sweatshirt for anyone on their own health journey. Perfect for layering over sports clothes or for a cozy rest day at home.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Sweatshirt L
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
The freshest, softest, confidence-boosting sweater for anyone on their own health journey. Perfect for layering over sports clothes or for a cozy rest day at home.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Shirt L
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
This vibrant tee perfectly matches your health journey. Because it's all about balance: science and snacks, rest and movement – and feeling good while you're at it.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Shirt L
+ +
+ + +
TRY 1,700.81
+
+ +
+ +
+ + +
+
+ +
This vibrant tee perfectly matches your health journey. Because it's all about balance: science and snacks, rest and movement – and feeling good while you're at it.
+
+
+
+ + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+ + +
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+ + +
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+ +
+ + + + + + + + + +
+
+
+ You're More Stressed Than Ever - Let's Change That +
+ + +
129KLikes
1,855,100Views
Nov 112025
+
+ +
+
+
+ +
+
+
+ + + + + +
+ + + +
+
+
+
Health Journal
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
shop-us.kurzgesagt.org/products/health-journal?variant=42091757174832&country=CA&currency=CAD&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOooWNSAvrCLxf1NDPd-d4fd0pj7f8Arfms86zWemBVdPdOjOiFXY9gc
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Journal
+ +
+ + +
TRY 1,408.40
+
+ +
+ +
+ + +
+
+ +
shop-eu.kurzgesagt.org/products/health-journal?variant=55019823137145&country=AE&currency=EUR&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOoqFtcnVouJ7DbTvW9MgWCC5BFsPYEDDK0og7zuWLYZuc1rOVDFHTE8
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Sweatshirt L
+ +
+ + +
TRY 2,675.48
+
+ +
+ +
+ + +
+
+ +
shop-eu.kurzgesagt.org/products/health-sweatshirt?variant=55467788730745&country=AE&currency=EUR&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOopDQNuEuyEVooyCL4laQLjxqvi5elR7bw0uCuCNuwdO3Pb-yCEkVfo
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Sweatshirt L
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
shop-us.kurzgesagt.org/products/health-sweater?variant=42216775909424&country=US&currency=USD&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOor0bomapGcFxMSnOj6THMmaZ_XzzFWg9XEhMvJRJFZB_CYLRc-Bngg
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Shirt L
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
shop-us.kurzgesagt.org/products/health-shirt?variant=42216768077872&country=CA&currency=CAD&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOoppeZn8qx4LSkOwzpESpM7u9G9DC9IORx3qqQfnUqUl4qehEIbgqK4
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Shirt L
+ +
+ + +
TRY 1,700.81
+
+ +
+ +
+ + +
+
+ +
shop-eu.kurzgesagt.org/products/health-club-shirt?variant=55708450128249&country=AE&currency=EUR&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOorlfXWTDIjlU1XYdh2ql94K-PT1TcT4p3AKEMQN9Suga9u_Kf7lrc0
+
+
+
+ + +
+
+
+ +
+
+
+
+
+
+
+
+
+
Our brand-new Health Journal is here to help you take care of your physical and mental health, using real science and no guilt: https://shop.kgs.link/early-access-he... +Learn what works for you, and build a routine that actually fits into your life. + +Sources & further reading: +https://sites.google.com/view/sources... + +Stress is a biological superpower that helped your ancestors outrun predators, fight off enemies, and survive extreme situations. In the past, it helped us survive, but today, it’s quietly damaging millions of lives. +What exactly is stress, how did it evolve, and is it even possible to use it in a healthy way? + + +OUR CHANNELS +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +German: https://kgs.link/youtubeDE +Spanish: https://kgs.link/youtubeES +French: https://kgs.link/youtubeFR +Portuguese: https://kgs.link/youtubePT +Arabic: https://kgs.link/youtubeAR +Hindi: https://kgs.link/youtubeHI +Japanese: https://kgs.link/youtubeJA +Korean: https://kgs.link/youtubeKO + + +HOW CAN YOU SUPPORT US? +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +This is how we make our living and it would be a pleasure if you support us! + +Get Products designed with ❤️ https://shop.kgs.link +Join the Patreon Bird Army 🐧 https://kgs.link/patreon + + +DISCUSSIONS & SOCIAL MEDIA +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +Instagram: https://kgs.link/instagram +TikTok: https://kgs.link/tiktok +Reddit: https://kgs.link/reddit +Discord: https://kgs.link/discord +Twitter: https://kgs.link/twitter +Bluesky: https://kgs.link/bluesky +Facebook: https://kgs.link/facebook +Newsletter: https://kgs.link/newsletter + + +OUR VOICE +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +The kurzgesagt voice is from +Steve Taylor: https://kgs.link/youtube-voice + + +OUR MUSIC ♬♪ +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +700+ minutes of kurzgesagt soundtracks by Epic Mountain: + +Spotify: https://kgs.link/music-spotify +Soundcloud: https://kgs.link/music-soundcloud +Bandcamp: https://kgs.link/music-bandcamp +Youtube: https://kgs.link/music-youtube +Facebook: https://kgs.link/music-facebook + +The soundtrack of this video: +SoundCloud: https://bit.ly/3WJYaWW +BandCamp: https://bit.ly/49LoU0N + +If you want to help us caption this video, please send subtitles to subtitle@kurzgesagt.org +You can find info on what subtitle files work on YouTube here: +https://support.google.com/youtube/an... +Thank you! + + +🐦🐧🐤 PATREON BIRD ARMY 🐤🐧🐦 +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +Many thanks to our wonderful Patreons (from http://kgs.link/patreon) who support us every month and made this video possible: +Acácio Correia, AeryaRia, aforsberg, Ahmad Seet, Alexander, Alexander Devlin, amia, Andres Ramos, Anna Duwenig, Anthony Hanson, Anton Abrahamsson, AonReo, Armond Aghanian, Asaf Yishai, Benjamin R., Bharath Ron, Brendan Ryan-Lewis, Christoph Lurz, Christoph Rau, Clay, Cliff Hudson, ConsterCoaster, Corbin Meier, Dale Kipple, Delano Stijns, dotvhs, Dylan Gafner, eddie k, Ela Yohannan, Enigma66, Eran Aviram, Erwin Heckler, Eva Markiewicz, Evil Cookie, FeelinaraIRL, Frankie Ennis, G, Geoff Evans, George Hutter, hazardx, Hugh Mungus, Inigo vd, Ireleigh, Isabelll, Ishaan Varma, Jack Sparrow, James Emmitt Zugar, James Pinkerton, james trotta, Jason Desrosiers, Jason Murley, Jens Begemann, Jesse, Jesus Mayo, Joann Taijala, Joseph Gauthier, jurd, Justin, KawasakiDragonno, Keddan, KekzL, Lauren Woolsey LeGrandAnanas, Lulidine, LumpyMammot, manchicken, Mark A Vargas, MasterOfTree, Matthew Brady, Matthew Brodeur, Maximilian Schons, Mead Landis, Ms. Ewing, Mykola Balakin, Nathaniel Bauernfeind, Nicholas McCalla, Ovidiu Nita, Owen, PaladinSpartac, Phoenix_Flames, Primalis, Quinn Wilson, Rath Robin, Robert Cudinski, Robin Hockett, Ryan Snead, Ryan Staunch, Ryan Thompson, SentinelD20, Siddharth Chaini, Sindre Nistad, Soko Divanovic, Spleens, Stacey Nicholson, Stephen Conlon, Strudy, Syi, Sérgio P., Thomas Mitchell, Thomas Stokes, Thomas Toombes, Tom Kocmi, Warren MacEvoy, William Lingenfelter
+
+ +
+ +
+

Follow along using the transcript.

+
+
+
+
+ +
+ +
+

Kurzgesagt – In a Nutshell

+
+ 24.8M subscribers +
+
+
+ + +
+
+
+ +
+
+
+ + +
+ +
+ + +
+ + + + + +
+
+
+ + +
+ + + + + + +
+
+ + Join this channel and unlock members-only perks +
+ +
+
+
+ + +
+ + + + +
\ No newline at end of file diff --git a/output/flaresolverr_debug/flaresolverr_response_Mo1A45ShcMo_1763010246.html b/output/flaresolverr_debug/flaresolverr_response_Mo1A45ShcMo_1763010246.html new file mode 100644 index 0000000..db2e5a7 --- /dev/null +++ b/output/flaresolverr_debug/flaresolverr_response_Mo1A45ShcMo_1763010246.html @@ -0,0 +1,2538 @@ +You're More Stressed Than Ever - Let's Change That - YouTube + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+
+
+ +
+
+
+
+
+
+ + Back + +
+ + +
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+ + + +
+ + + + + + + +
+ +
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+
+ + +
+
+ + +
+ +
+
+
+ +
+
+
+ + + + + +
+ + + +
+
+
+
Health Journal
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
Build your very own custom health journey and take a big step towards a healthier life. This journal will help you to find out how to effectively improve your fitness, nutrition, and mental health. Step-by-step, we'll guide you to build a routine that works for you and your individual needs and goals. Backed by science, developed by experts, and illustrated with love to keep you curious and motivated.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Journal
+ +
+ + +
TRY 1,408.40
+
+ +
+ +
+ + +
+
+ +
Build your very own custom health journey and take a big step towards a healthier life. This journal will help you to find out how to effectively improve your fitness, nutrition, and mental health. Step-by-step, we'll guide you to build a routine that works for you and your individual needs and goals. Backed by science, developed by experts, and illustrated with love to keep you curious and motivated.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Sweatshirt L
+ +
+ + +
TRY 2,675.48
+
+ +
+ +
+ + +
+
+ +
The freshest, softest, confidence-boosting sweatshirt for anyone on their own health journey. Perfect for layering over sports clothes or for a cozy rest day at home.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Sweatshirt L
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
The freshest, softest, confidence-boosting sweater for anyone on their own health journey. Perfect for layering over sports clothes or for a cozy rest day at home.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Shirt L
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
This vibrant tee perfectly matches your health journey. Because it's all about balance: science and snacks, rest and movement – and feeling good while you're at it.
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Shirt L
+ +
+ + +
TRY 1,700.81
+
+ +
+ +
+ + +
+
+ +
This vibrant tee perfectly matches your health journey. Because it's all about balance: science and snacks, rest and movement – and feeling good while you're at it.
+
+
+
+ + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+ + +
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+ + +
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+ +
+ + + + + + + + + +
+
+
+ You're More Stressed Than Ever - Let's Change That +
+ + +
129KLikes
1,855,100Views
Nov 112025
+
+ +
+
+
+ +
+
+
+ + + + + +
+ + + +
+
+
+
Health Journal
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
shop-us.kurzgesagt.org/products/health-journal?variant=42091757174832&country=CA&currency=CAD&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOopqN5iiwFaEfeqUOo46abbBKdvneOJFt_-rawIvYzPpBy-AFy8nheI
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Journal
+ +
+ + +
TRY 1,408.40
+
+ +
+ +
+ + +
+
+ +
shop-eu.kurzgesagt.org/products/health-journal?variant=55019823137145&country=AE&currency=EUR&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOooKAVJxHI5kiUGpjgIORCjlYLqlVIZrTMd8hPfxOFQk0i_y5PLx3F0
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Sweatshirt L
+ +
+ + +
TRY 2,675.48
+
+ +
+ +
+ + +
+
+ +
shop-eu.kurzgesagt.org/products/health-sweatshirt?variant=55467788730745&country=AE&currency=EUR&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOoq61ooTdXn8cYFZwA0qmTwJcgdx9SMN_NTsJFU4QlCgb_uI1cTVIg8
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Sweatshirt L
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
shop-us.kurzgesagt.org/products/health-sweater?variant=42216775909424&country=US&currency=USD&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOooev0r2zlKpsh3SCsxePwo2u-q41asxINeV_WciRkuvGGscS-Kmhzo
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Shirt L
+ +
+ +
Limited shipping areas
+ + +
+ + +
+
+ +
shop-us.kurzgesagt.org/products/health-shirt?variant=42216768077872&country=CA&currency=CAD&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOorFyj35Wt91x_Rogw59tjrh-dIiRkYDKz8PQN9n7ugSK0XJW01xUdA
+
+
+
+ + +
+
+
+ + + + +
+ + + +
+
+
+
Health Club Shirt L
+ +
+ + +
TRY 1,700.81
+
+ +
+ +
+ + +
+
+ +
shop-eu.kurzgesagt.org/products/health-club-shirt?variant=55708450128249&country=AE&currency=EUR&utm_medium=product_sync&utm_source=google&utm_content=sag_organic&utm_campaign=sag_organic&srsltid=AfmBOooHOhwCqgPc6_dwFFUxsW0Ze2MPr9PzTIie35NMPYM29IwirWRB0QQ
+
+
+
+ + +
+
+
+ +
+
+
+
+
+
+
+
+
+
Our brand-new Health Journal is here to help you take care of your physical and mental health, using real science and no guilt: https://shop.kgs.link/early-access-he... +Learn what works for you, and build a routine that actually fits into your life. + +Sources & further reading: +https://sites.google.com/view/sources... + +Stress is a biological superpower that helped your ancestors outrun predators, fight off enemies, and survive extreme situations. In the past, it helped us survive, but today, it’s quietly damaging millions of lives. +What exactly is stress, how did it evolve, and is it even possible to use it in a healthy way? + + +OUR CHANNELS +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +German: https://kgs.link/youtubeDE +Spanish: https://kgs.link/youtubeES +French: https://kgs.link/youtubeFR +Portuguese: https://kgs.link/youtubePT +Arabic: https://kgs.link/youtubeAR +Hindi: https://kgs.link/youtubeHI +Japanese: https://kgs.link/youtubeJA +Korean: https://kgs.link/youtubeKO + + +HOW CAN YOU SUPPORT US? +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +This is how we make our living and it would be a pleasure if you support us! + +Get Products designed with ❤️ https://shop.kgs.link +Join the Patreon Bird Army 🐧 https://kgs.link/patreon + + +DISCUSSIONS & SOCIAL MEDIA +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +Instagram: https://kgs.link/instagram +TikTok: https://kgs.link/tiktok +Reddit: https://kgs.link/reddit +Discord: https://kgs.link/discord +Twitter: https://kgs.link/twitter +Bluesky: https://kgs.link/bluesky +Facebook: https://kgs.link/facebook +Newsletter: https://kgs.link/newsletter + + +OUR VOICE +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +The kurzgesagt voice is from +Steve Taylor: https://kgs.link/youtube-voice + + +OUR MUSIC ♬♪ +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +700+ minutes of kurzgesagt soundtracks by Epic Mountain: + +Spotify: https://kgs.link/music-spotify +Soundcloud: https://kgs.link/music-soundcloud +Bandcamp: https://kgs.link/music-bandcamp +Youtube: https://kgs.link/music-youtube +Facebook: https://kgs.link/music-facebook + +The soundtrack of this video: +SoundCloud: https://bit.ly/3WJYaWW +BandCamp: https://bit.ly/49LoU0N + +If you want to help us caption this video, please send subtitles to subtitle@kurzgesagt.org +You can find info on what subtitle files work on YouTube here: +https://support.google.com/youtube/an... +Thank you! + + +🐦🐧🐤 PATREON BIRD ARMY 🐤🐧🐦 +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +Many thanks to our wonderful Patreons (from http://kgs.link/patreon) who support us every month and made this video possible: +Acácio Correia, AeryaRia, aforsberg, Ahmad Seet, Alexander, Alexander Devlin, amia, Andres Ramos, Anna Duwenig, Anthony Hanson, Anton Abrahamsson, AonReo, Armond Aghanian, Asaf Yishai, Benjamin R., Bharath Ron, Brendan Ryan-Lewis, Christoph Lurz, Christoph Rau, Clay, Cliff Hudson, ConsterCoaster, Corbin Meier, Dale Kipple, Delano Stijns, dotvhs, Dylan Gafner, eddie k, Ela Yohannan, Enigma66, Eran Aviram, Erwin Heckler, Eva Markiewicz, Evil Cookie, FeelinaraIRL, Frankie Ennis, G, Geoff Evans, George Hutter, hazardx, Hugh Mungus, Inigo vd, Ireleigh, Isabelll, Ishaan Varma, Jack Sparrow, James Emmitt Zugar, James Pinkerton, james trotta, Jason Desrosiers, Jason Murley, Jens Begemann, Jesse, Jesus Mayo, Joann Taijala, Joseph Gauthier, jurd, Justin, KawasakiDragonno, Keddan, KekzL, Lauren Woolsey LeGrandAnanas, Lulidine, LumpyMammot, manchicken, Mark A Vargas, MasterOfTree, Matthew Brady, Matthew Brodeur, Maximilian Schons, Mead Landis, Ms. Ewing, Mykola Balakin, Nathaniel Bauernfeind, Nicholas McCalla, Ovidiu Nita, Owen, PaladinSpartac, Phoenix_Flames, Primalis, Quinn Wilson, Rath Robin, Robert Cudinski, Robin Hockett, Ryan Snead, Ryan Staunch, Ryan Thompson, SentinelD20, Siddharth Chaini, Sindre Nistad, Soko Divanovic, Spleens, Stacey Nicholson, Stephen Conlon, Strudy, Syi, Sérgio P., Thomas Mitchell, Thomas Stokes, Thomas Toombes, Tom Kocmi, Warren MacEvoy, William Lingenfelter
+
+ +
+ +
+

Follow along using the transcript.

+
+
+
+
+ +
+ +
+

Kurzgesagt – In a Nutshell

+
+ 24.8M subscribers +
+
+
+ + +
+
+
+ +
+
+
+ + +
+ +
+ + +
+ + + + + +
+
+
+ + +
+ + + + + + + + + +
+ + + + +
\ No newline at end of file diff --git a/output/flaresolverr_debug/flaresolverr_response_nDKHvoo4f-8_1763010308.html b/output/flaresolverr_debug/flaresolverr_response_nDKHvoo4f-8_1763010308.html new file mode 100644 index 0000000..5fcd745 --- /dev/null +++ b/output/flaresolverr_debug/flaresolverr_response_nDKHvoo4f-8_1763010308.html @@ -0,0 +1,1505 @@ +You Are Everyone - YouTube + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+
+
+ +
+
+
+
+
+
+ + Back + +
+ + +
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+ + + +
+ + + + + + + +
+ +
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+
+ + +
+
+ + + +
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+ + +
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+ +
+
+ Kurzgesagt – In a Nutshell tagged products below. Learn more +
+
+
+ +
+
+
+
+ You Are Everyone +
+ + +
31KLikes
551,278Views
Nov 62025
+
We don't know the meaning of life, or how and why exactly it exists, which makes it all that more exciting to think about all the possible answers to those questions! Be kind to others, because you never know if by being kind to others, you're really being kind to yourself. + +#kurzgesagt +#inanutshell #kurzgesagt_inanutshell #learnwithshorts #science + +Sources & further reading: +https://sites.google.com/view/kgs-tik... + +Follow us for more sciencey content! 🦆 + +OUR CHANNELS +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +German: https://kgs.link/youtubeDE +Spanish: https://kgs.link/youtubeES +French: https://kgs.link/youtubeFR +Portuguese: https://kgs.link/youtubePT +Arabic: https://kgs.link/youtubeAR +Hindi: https://kgs.link/youtubeHI +Japanese: https://kgs.link/youtubeJA +Korean: https://kgs.link/youtubeKO + + +HOW CAN YOU SUPPORT US? +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +This is how we make our living and it would be a pleasure if you support us! + +Get Products designed with ❤ https://shop.kgs.link/shorts +Become a Part of kurzgesagt by joining the Patreon Bird Army 🐧 https://kgs.link/patreon + + +DISCUSSIONS & SOCIAL MEDIA +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +Instagram: https://kgs.link/instagram +TikTok: https://kgs.link/tiktok +Reddit: https://kgs.link/reddit +Discord: https://kgs.link/discord +Twitter: https://kgs.link/twitter +Bluesky: https://kgs.link/bluesky +Facebook: https://kgs.link/facebook +Newsletter: https://kgs.link/newsletter + + +OUR VOICE +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +The Kurzgesagt voice is from +Steve Taylor: https://kgs.link/youtube-voice + + +OUR MUSIC ♬♪ +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +700+ minutes of Kurzgesagt Soundtracks by Epic Mountain: + +Spotify: https://kgs.link/music-spotify +Soundcloud: https://kgs.link/music-soundcloud +Bandcamp: https://kgs.link/music-bandcamp +Youtube: https://kgs.link/music-youtube +Facebook: https://kgs.link/music-facebook
+
+ +
+ +
+

Follow along using the transcript.

+
+
+
+
+ +
+ +
+

Kurzgesagt – In a Nutshell

+
+ 24.8M subscribers +
+
+
+ + +
+
+
+ +
+
+
+ + +
+ +
+ + +
+ + + + + +
+
+
+ + +
+ + + + + + + + + +
+ + + + +
\ No newline at end of file diff --git a/output/flaresolverr_debug/flaresolverr_response_nDKHvoo4f-8_1763010366.html b/output/flaresolverr_debug/flaresolverr_response_nDKHvoo4f-8_1763010366.html new file mode 100644 index 0000000..09e71c0 --- /dev/null +++ b/output/flaresolverr_debug/flaresolverr_response_nDKHvoo4f-8_1763010366.html @@ -0,0 +1,1505 @@ +You Are Everyone - YouTube + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+
+
+ +
+
+
+
+
+
+ + Back + +
+ + +
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+ + + +
+ + + + + + + +
+ +
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+
+ + +
+
+ + + +
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+ + +
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+ +
+
+ Kurzgesagt – In a Nutshell tagged products below. Learn more +
+
+
+ +
+
+
+
+ You Are Everyone +
+ + +
31KLikes
551,278Views
Nov 62025
+
We don't know the meaning of life, or how and why exactly it exists, which makes it all that more exciting to think about all the possible answers to those questions! Be kind to others, because you never know if by being kind to others, you're really being kind to yourself. + +#kurzgesagt +#inanutshell #kurzgesagt_inanutshell #learnwithshorts #science + +Sources & further reading: +https://sites.google.com/view/kgs-tik... + +Follow us for more sciencey content! 🦆 + +OUR CHANNELS +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +German: https://kgs.link/youtubeDE +Spanish: https://kgs.link/youtubeES +French: https://kgs.link/youtubeFR +Portuguese: https://kgs.link/youtubePT +Arabic: https://kgs.link/youtubeAR +Hindi: https://kgs.link/youtubeHI +Japanese: https://kgs.link/youtubeJA +Korean: https://kgs.link/youtubeKO + + +HOW CAN YOU SUPPORT US? +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +This is how we make our living and it would be a pleasure if you support us! + +Get Products designed with ❤ https://shop.kgs.link/shorts +Become a Part of kurzgesagt by joining the Patreon Bird Army 🐧 https://kgs.link/patreon + + +DISCUSSIONS & SOCIAL MEDIA +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +Instagram: https://kgs.link/instagram +TikTok: https://kgs.link/tiktok +Reddit: https://kgs.link/reddit +Discord: https://kgs.link/discord +Twitter: https://kgs.link/twitter +Bluesky: https://kgs.link/bluesky +Facebook: https://kgs.link/facebook +Newsletter: https://kgs.link/newsletter + + +OUR VOICE +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +The Kurzgesagt voice is from +Steve Taylor: https://kgs.link/youtube-voice + + +OUR MUSIC ♬♪ +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +700+ minutes of Kurzgesagt Soundtracks by Epic Mountain: + +Spotify: https://kgs.link/music-spotify +Soundcloud: https://kgs.link/music-soundcloud +Bandcamp: https://kgs.link/music-bandcamp +Youtube: https://kgs.link/music-youtube +Facebook: https://kgs.link/music-facebook
+
+ +
+ +
+

Follow along using the transcript.

+
+
+
+
+ +
+ +
+

Kurzgesagt – In a Nutshell

+
+ 24.8M subscribers +
+
+
+ + +
+
+
+ +
+
+
+ + +
+ +
+ + +
+ + + + + +
+
+
+ + +
+ + + + + + + + + +
+ + + + +
\ No newline at end of file diff --git a/output/flaresolverr_debug/flaresolverr_response_nDKHvoo4f-8_1763010431.html b/output/flaresolverr_debug/flaresolverr_response_nDKHvoo4f-8_1763010431.html new file mode 100644 index 0000000..223e6fb --- /dev/null +++ b/output/flaresolverr_debug/flaresolverr_response_nDKHvoo4f-8_1763010431.html @@ -0,0 +1,1505 @@ +You Are Everyone - YouTube + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +

+
+
+ +
+
+
+
+
+
+ + Back + +
+ + +
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+
+ + + +
+ + + + + + + +
+ +
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+ +
+
+
+
+ +
+
+ + +
+
+ + + +
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+ + +
+ + +
+
+
+ +
+
+
+ + +
+
+
+
+
+
+
+ +
+
+
+ +
+
+ +
+
+ + +
+
+
+
+
+ +
+
+ Kurzgesagt – In a Nutshell tagged products below. Learn more +
+
+
+ +
+
+
+
+ You Are Everyone +
+ + +
31KLikes
551,278Views
Nov 62025
+
We don't know the meaning of life, or how and why exactly it exists, which makes it all that more exciting to think about all the possible answers to those questions! Be kind to others, because you never know if by being kind to others, you're really being kind to yourself. + +#kurzgesagt +#inanutshell #kurzgesagt_inanutshell #learnwithshorts #science + +Sources & further reading: +https://sites.google.com/view/kgs-tik... + +Follow us for more sciencey content! 🦆 + +OUR CHANNELS +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +German: https://kgs.link/youtubeDE +Spanish: https://kgs.link/youtubeES +French: https://kgs.link/youtubeFR +Portuguese: https://kgs.link/youtubePT +Arabic: https://kgs.link/youtubeAR +Hindi: https://kgs.link/youtubeHI +Japanese: https://kgs.link/youtubeJA +Korean: https://kgs.link/youtubeKO + + +HOW CAN YOU SUPPORT US? +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +This is how we make our living and it would be a pleasure if you support us! + +Get Products designed with ❤ https://shop.kgs.link/shorts +Become a Part of kurzgesagt by joining the Patreon Bird Army 🐧 https://kgs.link/patreon + + +DISCUSSIONS & SOCIAL MEDIA +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +Instagram: https://kgs.link/instagram +TikTok: https://kgs.link/tiktok +Reddit: https://kgs.link/reddit +Discord: https://kgs.link/discord +Twitter: https://kgs.link/twitter +Bluesky: https://kgs.link/bluesky +Facebook: https://kgs.link/facebook +Newsletter: https://kgs.link/newsletter + + +OUR VOICE +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +The Kurzgesagt voice is from +Steve Taylor: https://kgs.link/youtube-voice + + +OUR MUSIC ♬♪ +▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ +700+ minutes of Kurzgesagt Soundtracks by Epic Mountain: + +Spotify: https://kgs.link/music-spotify +Soundcloud: https://kgs.link/music-soundcloud +Bandcamp: https://kgs.link/music-bandcamp +Youtube: https://kgs.link/music-youtube +Facebook: https://kgs.link/music-facebook
+
+ +
+ +
+

Follow along using the transcript.

+
+
+
+
+ +
+ +
+

Kurzgesagt – In a Nutshell

+
+ 24.8M subscribers +
+
+
+ + +
+
+
+ +
+
+
+ + +
+ +
+ + +
+ + + + + +
+
+
+ + +
+ + + + + + + + + +
+ + + + +
\ No newline at end of file diff --git a/output/flaresolverr_debug/post_response_error_Brm71uCWr-I_1763010492.txt b/output/flaresolverr_debug/post_response_error_Brm71uCWr-I_1763010492.txt new file mode 100644 index 0000000..b7a82ad Binary files /dev/null and b/output/flaresolverr_debug/post_response_error_Brm71uCWr-I_1763010492.txt differ diff --git a/output/flaresolverr_debug/post_response_error_Mo1A45ShcMo_1763010132.txt b/output/flaresolverr_debug/post_response_error_Mo1A45ShcMo_1763010132.txt new file mode 100644 index 0000000..05db9ba Binary files /dev/null and b/output/flaresolverr_debug/post_response_error_Mo1A45ShcMo_1763010132.txt differ diff --git a/output/flaresolverr_debug/post_response_error_Mo1A45ShcMo_1763010195.txt b/output/flaresolverr_debug/post_response_error_Mo1A45ShcMo_1763010195.txt new file mode 100644 index 0000000..51bdd5d Binary files /dev/null and b/output/flaresolverr_debug/post_response_error_Mo1A45ShcMo_1763010195.txt differ diff --git a/output/flaresolverr_debug/post_response_error_Mo1A45ShcMo_1763010254.txt b/output/flaresolverr_debug/post_response_error_Mo1A45ShcMo_1763010254.txt new file mode 100644 index 0000000..c326dc2 Binary files /dev/null and b/output/flaresolverr_debug/post_response_error_Mo1A45ShcMo_1763010254.txt differ diff --git a/output/flaresolverr_debug/post_response_error_nDKHvoo4f-8_1763010313.txt b/output/flaresolverr_debug/post_response_error_nDKHvoo4f-8_1763010313.txt new file mode 100644 index 0000000..5258002 Binary files /dev/null and b/output/flaresolverr_debug/post_response_error_nDKHvoo4f-8_1763010313.txt differ diff --git a/output/flaresolverr_debug/post_response_error_nDKHvoo4f-8_1763010371.txt b/output/flaresolverr_debug/post_response_error_nDKHvoo4f-8_1763010371.txt new file mode 100644 index 0000000..bec1c4a Binary files /dev/null and b/output/flaresolverr_debug/post_response_error_nDKHvoo4f-8_1763010371.txt differ diff --git a/output/flaresolverr_debug/post_response_error_nDKHvoo4f-8_1763010437.txt b/output/flaresolverr_debug/post_response_error_nDKHvoo4f-8_1763010437.txt new file mode 100644 index 0000000..70db7d3 Binary files /dev/null and b/output/flaresolverr_debug/post_response_error_nDKHvoo4f-8_1763010437.txt differ diff --git a/output/flaresolverr_debug/post_response_player_1763010132.txt b/output/flaresolverr_debug/post_response_player_1763010132.txt new file mode 100644 index 0000000..6b21a0c Binary files /dev/null and b/output/flaresolverr_debug/post_response_player_1763010132.txt differ diff --git a/output/flaresolverr_debug/post_response_player_1763010195.txt b/output/flaresolverr_debug/post_response_player_1763010195.txt new file mode 100644 index 0000000..a019992 Binary files /dev/null and b/output/flaresolverr_debug/post_response_player_1763010195.txt differ diff --git a/output/flaresolverr_debug/post_response_player_1763010254.txt b/output/flaresolverr_debug/post_response_player_1763010254.txt new file mode 100644 index 0000000..215f7fe Binary files /dev/null and b/output/flaresolverr_debug/post_response_player_1763010254.txt differ diff --git a/output/flaresolverr_debug/post_response_player_1763010313.txt b/output/flaresolverr_debug/post_response_player_1763010313.txt new file mode 100644 index 0000000..c094075 Binary files /dev/null and b/output/flaresolverr_debug/post_response_player_1763010313.txt differ diff --git a/output/flaresolverr_debug/post_response_player_1763010371.txt b/output/flaresolverr_debug/post_response_player_1763010371.txt new file mode 100644 index 0000000..4775984 Binary files /dev/null and b/output/flaresolverr_debug/post_response_player_1763010371.txt differ diff --git a/output/flaresolverr_debug/post_response_player_1763010437.txt b/output/flaresolverr_debug/post_response_player_1763010437.txt new file mode 100644 index 0000000..ebc14a4 Binary files /dev/null and b/output/flaresolverr_debug/post_response_player_1763010437.txt differ diff --git a/output/flaresolverr_debug/post_response_player_1763010492.txt b/output/flaresolverr_debug/post_response_player_1763010492.txt new file mode 100644 index 0000000..1a93cc3 Binary files /dev/null and b/output/flaresolverr_debug/post_response_player_1763010492.txt differ diff --git a/src/security.py b/src/security.py index 2cb50aa..9c9e3c3 100644 --- a/src/security.py +++ b/src/security.py @@ -116,13 +116,21 @@ class SecurityManager: Returns: Geçerli mi? + + YouTube Channel ID formatı: + - UC ile başlamalı + - Toplam 24 karakter (UC + 22 karakter) + - Sadece alfanumerik karakterler ve alt çizgi (_) içermeli + - Tire (-) karakteri içermemeli """ if not channel_id: return False - # UC ile başlayan 24 karakter - if re.match(r'^UC[a-zA-Z0-9_-]{22}$', channel_id): - return True + # UC ile başlayan, 24 karakter, sadece alfanumerik ve alt çizgi (tire YOK) + if re.match(r'^UC[a-zA-Z0-9_]{22}$', channel_id): + # Double check: Tire karakteri içermemeli + if '-' not in channel_id: + return True return False @@ -212,7 +220,15 @@ def require_api_key(f): security = get_security_manager() # API key'i header'dan veya query'den al - api_key = request.headers.get('X-API-Key') or request.args.get('api_key') + api_key_header = request.headers.get('X-API-Key') + api_key_query = request.args.get('api_key') + api_key = api_key_header or api_key_query + + # Debug logging (sadece query parametresi varsa) + if api_key_query and not api_key_header: + import logging + logger = logging.getLogger(__name__) + logger.debug(f"[API_KEY] Query parametresinden API key alındı: {api_key_query[:10]}... (uzunluk: {len(api_key_query) if api_key_query else 0})") is_valid, key_info = security.validate_api_key(api_key) diff --git a/src/video_fetcher.py b/src/video_fetcher.py index 4d3ad8c..d5f11da 100644 --- a/src/video_fetcher.py +++ b/src/video_fetcher.py @@ -4,35 +4,59 @@ RSS-Bridge kullanarak video metadata çıkarımı import feedparser import re import requests +import logging from urllib.parse import urlencode from typing import List, Dict, Optional from datetime import datetime +logger = logging.getLogger(__name__) + def get_channel_id_from_handle(handle_url: str) -> Optional[str]: """ Channel handle URL'inden Channel ID'yi web scraping ile bulur. Örnek: https://www.youtube.com/@tavakfi -> UC... + + YouTube Channel ID formatı: UC ile başlayan, 24 karakter, sadece alfanumerik ve alt çizgi """ try: - response = requests.get(handle_url) + logger.info(f"[CHANNEL_ID] Channel ID çıkarılıyor: {handle_url}") + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' + } + response = requests.get(handle_url, headers=headers, timeout=10) response.raise_for_status() html_content = response.text - # İlk pattern: "externalId":"UC..." - match = re.search(r'"externalId":"(UC[a-zA-Z0-9_-]{22})"', html_content) - if match: - return match.group(1) + # YouTube Channel ID pattern: UC ile başlayan, 24 karakter, sadece alfanumerik ve alt çizgi (tire YOK) + # Pattern'ler: UC + 22 karakter = toplam 24 karakter + patterns = [ + (r'"externalId":"(UC[a-zA-Z0-9_]{22})"', 'externalId'), + (r'"channelId":"(UC[a-zA-Z0-9_]{22})"', 'channelId'), + (r'"browseEndpoint"\s*:\s*\{[^}]*"browseId"\s*:\s*"(UC[a-zA-Z0-9_]{22})"', 'browseEndpoint'), + (r'channelId["\']?\s*:\s*["\']?(UC[a-zA-Z0-9_]{22})', 'genel channelId'), + (r'/channel/(UC[a-zA-Z0-9_]{22})', 'URL pattern'), + ] - # Alternatif pattern: "channelId":"UC..." - match_alt = re.search(r'"channelId":"(UC[a-zA-Z0-9_-]{22})"', html_content) - if match_alt: - return match_alt.group(1) + for pattern, pattern_name in patterns: + match = re.search(pattern, html_content) + if match: + channel_id = match.group(1) + # Double check: UC ile başlamalı ve 24 karakter olmalı + if channel_id.startswith('UC') and len(channel_id) == 24: + # Tire karakteri içermemeli + if '-' not in channel_id: + logger.info(f"[CHANNEL_ID] ✅ Channel ID bulundu: {channel_id} (pattern: {pattern_name})") + return channel_id + else: + logger.warning(f"[CHANNEL_ID] ⚠️ Geçersiz channel ID (tire içeriyor): {channel_id}") + logger.warning(f"[CHANNEL_ID] ❌ Channel ID bulunamadı: {handle_url}") return None except requests.exceptions.RequestException as e: + logger.error(f"[CHANNEL_ID] ❌ Hata: {type(e).__name__} - {str(e)}") raise Exception(f"Error fetching channel page: {e}") diff --git a/src/web_server.py b/src/web_server.py index 940ff86..62de5a8 100644 --- a/src/web_server.py +++ b/src/web_server.py @@ -3,6 +3,7 @@ Flask web server - RSS-Bridge benzeri URL template sistemi """ from flask import Flask, request, Response, jsonify, g from typing import Optional +from urllib.parse import unquote, urlparse import sys import os import yaml @@ -58,8 +59,22 @@ def add_security_headers(response): config = load_security_config() headers = config.get('security_headers', {}) + # RSS feed'ler için Content-Security-Policy'yi daha esnek yap + # RSS okuyucular ve tarayıcılar için sorun çıkarmasın + is_feed_response = ( + 'application/atom+xml' in response.content_type or + 'application/rss+xml' in response.content_type or + 'application/xml' in response.content_type or + 'text/xml' in response.content_type + ) + for header, value in headers.items(): - response.headers[header] = value + # RSS feed'ler için CSP'yi atla veya daha esnek yap + if header == 'Content-Security-Policy' and is_feed_response: + # RSS feed'ler için CSP'yi daha esnek yap + response.headers[header] = "default-src 'self' 'unsafe-inline' data: blob: *" + else: + response.headers[header] = value # CORS headers cors_config = config.get('cors', {}) @@ -90,7 +105,29 @@ def add_security_headers(response): @app.route('/', methods=['OPTIONS']) def handle_options(path=None): """CORS preflight request handler""" - return Response(status=200) + config = load_security_config() + cors_config = config.get('cors', {}) + + response = Response(status=200) + + if cors_config.get('enabled', True): + origins = cors_config.get('allowed_origins', ['*']) + if '*' in origins: + response.headers['Access-Control-Allow-Origin'] = '*' + else: + origin = request.headers.get('Origin') + if origin in origins: + response.headers['Access-Control-Allow-Origin'] = origin + + response.headers['Access-Control-Allow-Methods'] = ', '.join( + cors_config.get('allowed_methods', ['GET', 'OPTIONS']) + ) + response.headers['Access-Control-Allow-Headers'] = ', '.join( + cors_config.get('allowed_headers', ['Content-Type', 'X-API-Key']) + ) + response.headers['Access-Control-Max-Age'] = '3600' + + return response # Uygulama başlangıcında security'yi initialize et init_app_security() @@ -130,7 +167,7 @@ def normalize_channel_id(channel_id: Optional[str] = None, channel: Optional[str] = None, channel_url: Optional[str] = None) -> Optional[str]: """ - Farklı formatlardan channel ID'yi normalize et + Farklı formatlardan channel ID'yi normalize et ve validate et Args: channel_id: Direkt Channel ID (UC...) @@ -138,36 +175,74 @@ def normalize_channel_id(channel_id: Optional[str] = None, channel_url: Full YouTube channel URL Returns: - Normalize edilmiş Channel ID veya None + Normalize edilmiş ve validate edilmiş Channel ID veya None """ + security = get_security_manager() + normalized_id = None + # Direkt Channel ID varsa if channel_id: if channel_id.startswith('UC') and len(channel_id) == 24: - return channel_id + normalized_id = channel_id # Eğer URL formatında ise parse et - if 'youtube.com/channel/' in channel_id: + elif 'youtube.com/channel/' in channel_id: parts = channel_id.split('/channel/') if len(parts) > 1: - return parts[-1].split('?')[0].split('/')[0] + normalized_id = parts[-1].split('?')[0].split('/')[0] # Channel handle (@username) - if channel: + if not normalized_id and channel: + # Channel parametresini normalize et (@ işareti olabilir veya olmayabilir) + channel = channel.strip() if not channel.startswith('@'): channel = f"@{channel}" handle_url = f"https://www.youtube.com/{channel}" - return get_channel_id_from_handle(handle_url) + logger.info(f"[NORMALIZE] Channel handle URL oluşturuldu: {handle_url}") + normalized_id = get_channel_id_from_handle(handle_url) # Channel URL - if channel_url: - # Handle URL + if not normalized_id and channel_url: + # URL'yi temizle ve normalize et + channel_url = channel_url.strip() + + # Handle URL (@username formatı) if '/@' in channel_url: - return get_channel_id_from_handle(channel_url) + # URL'den handle'ı çıkar + if '/@' in channel_url: + # https://www.youtube.com/@username formatı + normalized_id = get_channel_id_from_handle(channel_url) + else: + # Sadece @username formatı + handle = channel_url.replace('@', '').strip() + if handle: + handle_url = f"https://www.youtube.com/@{handle}" + normalized_id = get_channel_id_from_handle(handle_url) # Channel ID URL elif '/channel/' in channel_url: parts = channel_url.split('/channel/') if len(parts) > 1: - return parts[-1].split('?')[0].split('/')[0] + channel_id_part = parts[-1].split('?')[0].split('/')[0].split('&')[0] + # Eğer UC ile başlıyorsa ve 24 karakter ise, direkt kullan + if channel_id_part.startswith('UC') and len(channel_id_part) == 24: + normalized_id = channel_id_part + else: + # Parse etmeye çalış + normalized_id = channel_id_part + # Sadece handle (@username) formatı + elif channel_url.startswith('@'): + handle = channel_url.replace('@', '').strip() + if handle: + handle_url = f"https://www.youtube.com/@{handle}" + normalized_id = get_channel_id_from_handle(handle_url) + # Direkt channel ID formatı (UC...) + elif channel_url.startswith('UC') and len(channel_url) == 24: + normalized_id = channel_url + # Validate: Channel ID formatını kontrol et + if normalized_id and security.validate_channel_id(normalized_id): + return normalized_id + + # Geçersiz format return None @@ -182,6 +257,28 @@ def process_channel(channel_id: str, max_items: int = 50) -> dict: extractor = get_extractor() cleaner = get_cleaner() + # ÖNCE: Mevcut işlenmiş videoları kontrol et + existing_processed = db.get_processed_videos(limit=max_items, channel_id=channel_id) + logger.info(f"[PROCESS] Channel {channel_id} için {len(existing_processed)} mevcut işlenmiş video bulundu") + + # Eğer yeterli sayıda işlenmiş video varsa, onları hemen döndür + if len(existing_processed) >= max_items: + logger.info(f"[PROCESS] ✅ Yeterli işlenmiş video var ({len(existing_processed)}), yeni işleme başlatılmıyor") + return { + 'videos': existing_processed[:max_items], + 'channel_id': channel_id, + 'count': len(existing_processed[:max_items]) + } + + # Eğer mevcut işlenmiş videolar varsa ama yeterli değilse, onları döndür ve yeni işlemeleri başlat + # Ancak sadece ilk batch'i işle (hızlı yanıt için) + if len(existing_processed) > 0: + logger.info(f"[PROCESS] ⚠️ Mevcut işlenmiş video var ama yeterli değil ({len(existing_processed)}/{max_items}), yeni işleme başlatılıyor") + # Mevcut videoları döndürmek için sakla + videos_to_return = existing_processed.copy() + else: + videos_to_return = [] + # RSS-Bridge'den videoları çek (max_items'ın 2 katı kadar çek, böylece yeterli video olur) # RSS-Bridge'den daha fazla video çekiyoruz çünkü bazıları transcript'siz olabilir rss_bridge_limit = max(max_items * 2, 50) # En az 50 video çek @@ -222,13 +319,24 @@ def process_channel(channel_id: str, max_items: int = 50) -> dict: all_pending_videos = [v for v in db.get_pending_videos() if v['channel_id'] == channel_id] logger.info(f"[PROCESS] Channel {channel_id} için {len(all_pending_videos)} bekleyen video bulundu (max_items: {max_items})") + # Eğer mevcut işlenmiş videolar varsa, sadece eksik kadar işle + remaining_needed = max_items - len(videos_to_return) + # max_items kadar transcript işlenene kadar batch'ler halinde işle total_batches = (len(all_pending_videos) + batch_size - 1) // batch_size current_batch = 0 + # İlk istek için sadece ilk batch'i işle (hızlı yanıt için) + # Sonraki isteklerde daha fazla işlenmiş video olacak + max_batches_to_process = 1 if len(videos_to_return) == 0 else min(3, total_batches) # İlk istekte 1 batch, sonra 3 batch + for batch_start in range(0, len(all_pending_videos), batch_size): - if processed_count >= max_items: - logger.info(f"[PROCESS] Maksimum transcript sayısına ulaşıldı ({processed_count}/{max_items})") + if processed_count >= remaining_needed: + logger.info(f"[PROCESS] Yeterli transcript işlendi ({processed_count}/{remaining_needed})") + break + + if current_batch >= max_batches_to_process: + logger.info(f"[PROCESS] İlk batch'ler işlendi ({current_batch}/{max_batches_to_process}), kalan işlemeler sonraki isteklerde yapılacak") break current_batch += 1 @@ -292,24 +400,44 @@ def process_channel(channel_id: str, max_items: int = 50) -> dict: logger.info(f"[BATCH] Batch {current_batch}/{total_batches} tamamlandı - İşlenen: {batch_processed}, Cache: {batch_cached}, Başarısız: {batch_failed}") # Batch tamamlandı, uzun bekleme (YouTube IP blocking önleme için) - if processed_count < max_items and batch_start + batch_size < len(all_pending_videos): - # Blocking varsa daha uzun bekle - wait_time = 60 + random.uniform(0, 30) # 60-90 saniye random (human-like) - logger.info(f"[BATCH] Batch'ler arası bekleme: {wait_time:.1f} saniye ({wait_time/60:.1f} dakika) - YouTube IP blocking önleme") + # İlk batch'ler için daha kısa bekleme (hızlı yanıt için), sonraki batch'ler için uzun bekleme + if processed_count < remaining_needed and batch_start + batch_size < len(all_pending_videos): + # İlk batch'ler için kısa bekleme (2-5 saniye), sonraki batch'ler için uzun bekleme (60-90 saniye) + if current_batch <= max_batches_to_process: + wait_time = 2 + random.uniform(0, 3) # 2-5 saniye (hızlı yanıt için) + logger.info(f"[BATCH] Batch'ler arası kısa bekleme: {wait_time:.1f} saniye (hızlı yanıt için)") + else: + wait_time = 60 + random.uniform(0, 30) # 60-90 saniye random (human-like) + logger.info(f"[BATCH] Batch'ler arası uzun bekleme: {wait_time:.1f} saniye ({wait_time/60:.1f} dakika) - YouTube IP blocking önleme") time.sleep(wait_time) - # İşlenmiş videoları getir - processed_videos = db.get_processed_videos( + # İşlenmiş videoları getir (yeni işlenenler) + newly_processed = db.get_processed_videos( limit=max_items, channel_id=channel_id ) - logger.info(f"[PROCESS] ✅ Channel {channel_id} işleme tamamlandı - {len(processed_videos)} işlenmiş video döndürülüyor") + # Mevcut videoları ve yeni işlenen videoları birleştir (duplicate kontrolü ile) + all_processed_videos = videos_to_return.copy() # Önce mevcut videoları ekle + existing_ids = {v['video_id'] for v in all_processed_videos} + + # Yeni işlenen videoları ekle + for video in newly_processed: + if video['video_id'] not in existing_ids and len(all_processed_videos) < max_items: + all_processed_videos.append(video) + + # Tarihe göre sırala (en yeni önce) + all_processed_videos.sort( + key=lambda x: x.get('published_at_utc', '') or '', + reverse=True + ) + + logger.info(f"[PROCESS] ✅ Channel {channel_id} işleme tamamlandı - {len(all_processed_videos)} işlenmiş video döndürülüyor (Mevcut: {len(videos_to_return)}, Yeni işlenen: {len(newly_processed)})") return { - 'videos': processed_videos, + 'videos': all_processed_videos[:max_items], 'channel_id': channel_id, - 'count': len(processed_videos) + 'count': len(all_processed_videos[:max_items]) } @@ -325,10 +453,58 @@ def generate_feed(): - /?channel=@tavakfi&format=Atom - /?channel_url=https://www.youtube.com/@tavakfi&format=Atom """ + # User-Agent kontrolü (RSS okuyucu tespiti için) + user_agent = request.headers.get('User-Agent', '') + is_rss_reader = any(keyword in user_agent.lower() for keyword in [ + 'rss', 'feed', 'reader', 'aggregator', 'feedly', 'newsblur', + 'inoreader', 'theoldreader', 'netnewswire', 'reeder' + ]) + # Query parametrelerini al (validate_input decorator zaten sanitize etti) - channel_id = request.args.get('channel_id') - channel = request.args.get('channel') # @username veya username - channel_url = request.args.get('channel_url') + # URL decode işlemi (tarayıcılar URL'leri encode edebilir, özellikle channel_url içinde başka URL varsa) + channel_id_raw = request.args.get('channel_id') + channel_raw = request.args.get('channel') # @username veya username + channel_url_raw = request.args.get('channel_url') + + # Channel ID'yi decode et + channel_id = None + if channel_id_raw: + channel_id = unquote(channel_id_raw) if '%' in channel_id_raw else channel_id_raw + + # Channel handle'ı decode et + channel = None + if channel_raw: + channel = unquote(channel_raw) if '%' in channel_raw else channel_raw + # @ işaretini temizle ve normalize et + channel = channel.strip().lstrip('@') + + # Channel URL'yi decode et (eğer encode edilmişse) + # Flask request.args zaten decode eder ama channel_url içinde başka URL olduğu için double encoding olabilir + channel_url = None + if channel_url_raw: + # Önce raw değeri al (Flask'ın decode ettiği değer) + channel_url = channel_url_raw + + # Eğer hala encode edilmiş görünüyorsa (%, + gibi karakterler varsa), decode et + if '%' in channel_url or '+' in channel_url: + # Birden fazla kez encode edilmiş olabilir, güvenli decode + max_decode_attempts = 3 + for _ in range(max_decode_attempts): + decoded = unquote(channel_url) + if decoded == channel_url: # Artık decode edilecek bir şey yok + break + channel_url = decoded + if '%' not in channel_url: # Tamamen decode edildi + break + + # URL formatını kontrol et ve düzelt + if channel_url and not channel_url.startswith(('http://', 'https://')): + # Eğer protocol yoksa, https ekle + if channel_url.startswith('www.youtube.com') or channel_url.startswith('youtube.com'): + channel_url = 'https://' + channel_url + elif channel_url.startswith('@'): + channel_url = 'https://www.youtube.com/' + channel_url + format_type = request.args.get('format', 'Atom').lower() # Atom veya Rss try: max_items = int(request.args.get('max_items', 10)) # Default: 10 transcript @@ -337,18 +513,74 @@ def generate_feed(): except (ValueError, TypeError): max_items = 10 + # Debug logging (tarayıcı istekleri için) + logger.info(f"[REQUEST] Tarayıcı isteği - Raw params: channel_id={channel_id_raw}, channel={channel_raw}, channel_url={channel_url_raw[:100] if channel_url_raw else None}") + logger.info(f"[REQUEST] Processed params: channel_id={channel_id}, channel={channel}, channel_url={channel_url[:100] if channel_url else None}") + logger.info(f"[REQUEST] Full URL: {request.url}") + logger.info(f"[REQUEST] Query string: {request.query_string.decode('utf-8') if request.query_string else None}") + + # RSS okuyucu tespiti için log + if is_rss_reader: + logger.info(f"[RSS_READER] RSS okuyucu tespit edildi: {user_agent[:100]}") + # Channel ID'yi normalize et - normalized_channel_id = normalize_channel_id( - channel_id=channel_id, - channel=channel, - channel_url=channel_url - ) + try: + normalized_channel_id = normalize_channel_id( + channel_id=channel_id, + channel=channel, + channel_url=channel_url + ) + logger.info(f"[REQUEST] Normalized channel_id: {normalized_channel_id}") + except Exception as e: + logger.error(f"[REQUEST] ❌ Channel ID normalize hatası: {type(e).__name__} - {str(e)}") + normalized_channel_id = None if not normalized_channel_id: - return jsonify({ - 'error': 'Channel ID bulunamadı', + error_msg = 'Channel ID bulunamadı veya geçersiz format' + if channel_url: + error_msg += f'. URL: {channel_url}' + elif channel: + error_msg += f'. Handle: {channel}' + elif channel_id: + error_msg += f'. Channel ID: {channel_id}' + + logger.warning(f"[REQUEST] ❌ Channel ID bulunamadı - Raw: channel_id={channel_id_raw}, channel={channel_raw}, channel_url={channel_url_raw}") + logger.warning(f"[REQUEST] ❌ Processed: channel_id={channel_id}, channel={channel}, channel_url={channel_url}") + + # RSS okuyucular için daha açıklayıcı hata mesajı + if is_rss_reader: + logger.warning(f"[RSS_READER] Channel ID bulunamadı - URL: {channel_url or channel or channel_id}") + return jsonify({ + 'error': error_msg, + 'message': 'RSS okuyucunuzdan feed eklerken lütfen geçerli bir YouTube kanal URL\'si kullanın', + 'received_params': { + 'channel_id': channel_id_raw, + 'channel': channel_raw, + 'channel_url': channel_url_raw, + 'decoded_channel_url': channel_url + }, + 'example_url': f'{request.url_root}?channel_url=https://www.youtube.com/@username&api_key=YOUR_API_KEY&format=Atom', 'usage': { - 'channel_id': 'UC... (YouTube Channel ID)', + 'channel_id': 'UC... (YouTube Channel ID, 24 karakter)', + 'channel': '@username veya username', + 'channel_url': 'https://www.youtube.com/@username veya https://www.youtube.com/channel/UC...', + 'format': 'Atom veya Rss (varsayılan: Atom)', + 'max_items': 'Maksimum transcript sayısı (varsayılan: 10, maksimum: 100)', + 'api_key': 'API key query parametresi olarak eklenmelidir (RSS okuyucular header gönderemez)' + } + }), 400 + + return jsonify({ + 'error': error_msg, + 'received_params': { + 'channel_id': channel_id_raw, + 'channel': channel_raw, + 'channel_url': channel_url_raw, + 'decoded_channel_url': channel_url + }, + 'message': 'YouTube Channel ID UC ile başlayan 24 karakter olmalı (sadece alfanumerik ve alt çizgi)', + 'usage': { + 'channel_id': 'UC... (YouTube Channel ID, 24 karakter)', 'channel': '@username veya username', 'channel_url': 'https://www.youtube.com/@username veya https://www.youtube.com/channel/UC...', 'format': 'Atom veya Rss (varsayılan: Atom)', diff --git a/test_curl.sh b/test_curl.sh new file mode 100755 index 0000000..e678e5e --- /dev/null +++ b/test_curl.sh @@ -0,0 +1,96 @@ +#!/bin/bash + +# Test curl komutları - POST response debug için +# API key: demo_key_12345 (config/security.yaml'dan) + +BASE_URL="http://localhost:5000" +API_KEY="demo_key_12345" + +echo "==========================================" +echo "1. Health Check (API key gerekmez)" +echo "==========================================" +curl -X GET "${BASE_URL}/health" -v + +echo -e "\n\n==========================================" +echo "2. Info Endpoint (API key gerekir)" +echo "==========================================" +curl -X GET "${BASE_URL}/info" \ + -H "X-API-Key: ${API_KEY}" \ + -v + +echo -e "\n\n==========================================" +echo "3. Channel ID ile Feed (Atom format)" +echo "==========================================" +curl -X GET "${BASE_URL}/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA&format=Atom&max_items=5" \ + -H "X-API-Key: ${API_KEY}" \ + -v + +echo -e "\n\n==========================================" +echo "4. Channel Handle ile Feed (@kurzgesagt)" +echo " Not: İlk istekte 404 alınabilir (transcript henüz işlenmemiş)" +echo "==========================================" +curl -X GET "${BASE_URL}/?channel=@kurzgesagt&format=Atom&max_items=5" \ + -H "X-API-Key: ${API_KEY}" \ + -v + +echo -e "\n\n==========================================" +echo "5. Channel URL ile Feed" +echo " Not: İlk istekte 404 alınabilir (transcript henüz işlenmemiş)" +echo "==========================================" +curl -X GET "${BASE_URL}/?channel_url=https://www.youtube.com/@kurzgesagt&format=Atom&max_items=5" \ + -H "X-API-Key: ${API_KEY}" \ + -v + +echo -e "\n\n==========================================" +echo "6. RSS Format ile Feed" +echo "==========================================" +curl -X GET "${BASE_URL}/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA&format=Rss&max_items=5" \ + -H "X-API-Key: ${API_KEY}" \ + -v + +echo -e "\n\n==========================================" +echo "7. API Key olmadan (401 hatası beklenir)" +echo "==========================================" +curl -X GET "${BASE_URL}/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA&format=Atom" \ + -v + +echo -e "\n\n==========================================" +echo "8. Geçersiz API Key ile (401 hatası beklenir)" +echo "==========================================" +curl -X GET "${BASE_URL}/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA&format=Atom" \ + -H "X-API-Key: invalid_key" \ + -v + +echo -e "\n\n==========================================" +echo "9. POST Response Debug Test (max_items=1, hızlı test)" +echo " Not: İlk istekte 404 alınabilir (transcript henüz işlenmemiş)" +echo "==========================================" +curl -X GET "${BASE_URL}/?channel_id=UCsXVk37bltHxD1rDPwtNM8Q&format=Atom&max_items=1" \ + -H "X-API-Key: ${API_KEY}" \ + -v \ + -o /tmp/test_feed.xml + +echo -e "\n\n==========================================" +echo "10. Brotli Decode Test (yeni video ile)" +echo " Not: İlk istekte 404 alınabilir (transcript henüz işlenmemiş)" +echo "==========================================" +curl -X GET "${BASE_URL}/?channel_id=UCsXVk37bltHxD1rDPwtNM8Q&format=Atom&max_items=1" \ + -H "X-API-Key: ${API_KEY}" \ + -v + +echo -e "\n\n==========================================" +echo "Test tamamlandı!" +echo "" +echo "✅ Brotli desteği eklendi (requirements.txt)" +echo " YouTube response'ları artık otomatik decode edilecek" +echo "" +echo "POST response debug dosyaları: output/flaresolverr_debug/" +echo " - post_response_*.txt (her POST response)" +echo " - post_response_error_*.txt (JSONDecodeError durumunda)" +echo "" +echo "⚠️ Docker container'ı yeniden build etmeniz gerekiyor:" +echo " sudo docker compose down" +echo " sudo docker compose build --no-cache" +echo " sudo docker compose up -d" +echo "==========================================" +