<rss version="2.0">
  <channel>
    <title>Web Whimsy on Nic Babarskis</title>
    <link>https://nic.babarskis.blog/categories/web-whimsy/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Wed, 29 Apr 2026 21:06:23 -0400</lastBuildDate>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/04/29/tea-anemone-by-tatsuya-tanaka.html</link>
      <pubDate>Wed, 29 Apr 2026 21:06:23 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/04/29/tea-anemone-by-tatsuya-tanaka.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://miniature-calendar.com/260427&#34;&gt;Tea Anemone&lt;/a&gt; by Tatsuya Tanaka at Miniature Calendar:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://miniature-calendar.com/wp-content/uploads/2026/04/260427mon.jpg&#34; alt=&#34;A miniature diorama by Tatsuya Tanaka featuring a bamboo matcha whisk (chasen) stood upright to resemble a sea anemone. Several tiny clownfish figures are nestled within the whisk&amp;rsquo;s bristles. To the left, a miniature scuba diver in an orange suit &amp;ldquo;swims&amp;rdquo; through the air, trailing small bubbles. The background includes a ceramic matcha bowl and a plate of colorful dango (pink, white, and green rice dumplings), all set against a soft teal backdrop that mimics water.&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/04/25/the-eldest-shares-her-mom.html</link>
      <pubDate>Sat, 25 Apr 2026 18:34:44 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/04/25/the-eldest-shares-her-mom.html</guid>
      <description>&lt;p&gt;The eldest shares her mom and grandmothers&#39; interest.&lt;/p&gt;
&lt;img src=&#34;https://nic.babarskis.blog/uploads/2026/img-2752.jpg&#34; width=&#34;600&#34; height=&#34;800&#34; alt=&#34;&#34;&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/04/23/to-the-extent-i-pay.html</link>
      <pubDate>Thu, 23 Apr 2026 11:01:36 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/04/23/to-the-extent-i-pay.html</guid>
      <description>&lt;p&gt;To the extent I pay attention to Home and Garden trends I always got the impression the platonic ideal for lawn maintenance was a golf course fairway.&lt;/p&gt;
&lt;p&gt;Meanwhile I’m out here weedmaxxing&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nic.babarskis.blog/uploads/2026/81bf593692d043b7b6cc96ca905dc7b4.jpg&#34;&gt;&lt;img src=&#34;https://nic.babarskis.blog/uploads/2026/0771af5994f941c68b14042684d0ab23.jpg&#34;&gt;&lt;img src=&#34;https://nic.babarskis.blog/uploads/2026/6080a94d8e5a4a27aacd53d7d0a2e52c.jpg&#34;&gt;&lt;img src=&#34;https://nic.babarskis.blog/uploads/2026/161bd99983e74d5c8f9f9facccb0d70b.jpg&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/04/15/spring-progress-the-maple-awakens.html</link>
      <pubDate>Wed, 15 Apr 2026 19:35:07 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/04/15/spring-progress-the-maple-awakens.html</guid>
      <description>&lt;p&gt;Spring Progress 📸 2026.04.08 The maple awakens #SP26.3&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://nic.babarskis.blog/uploads/2026/img-2691.jpg&#34; alt=&#34;Auto-generated description: A tree with budding red flowers is set against a backdrop of a suburban street and a clear blue sky.&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/04/15/public-domain-review-highlighting-works.html</link>
      <pubDate>Wed, 15 Apr 2026 10:34:38 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/04/15/public-domain-review-highlighting-works.html</guid>
      <description>&lt;p&gt;Public Domain Review highlighting works that feature Notre Dame today:&lt;/p&gt;
&lt;blockquote class=&#34;quoteback&#34; data-author=&#34;The Public Domain Review&#34; data-avatar=&#34;https://micro.blog/publicdomainrev@mastodon.social/avatar.jpg&#34; cite=&#34;https://mastodon.social/@publicdomainrev/116408559908239505&#34;&gt;&lt;p&gt;Highlights from the many centuries of artworks to feature the Notre-Dame de Paris — which caught fire 5 years ago &lt;a href=&#34;https://mastodon.social/tags/onthisday&#34; class=&#34;mention hashtag&#34;&gt;#&lt;span&gt;onthisday&lt;/span&gt;&lt;/a&gt; — from its illuminated punctuation of medieval skylines to grainy detailed studies at the birth of photography: &lt;a href=&#34;https://publicdomainreview.org/collection/the-notre-dame-cathedral-in-art-1460-1921&#34;&gt;&lt;span class=&#34;invisible&#34;&gt;https://&lt;/span&gt;&lt;span class=&#34;ellipsis&#34;&gt;publicdomainreview.org/collect&lt;/span&gt;&lt;span class=&#34;invisible&#34;&gt;ion/the-notre-dame-cathedral-in-art-1460-1921&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class=&#34;microblog_collection&#34;&gt;
&lt;img src=&#34;https://cdn.micro.blog/photos/1000x/https%3A%2F%2Ffiles.mastodon.social%2Fmedia_attachments%2Ffiles%2F116%2F408%2F559%2F710%2F148%2F524%2Foriginal%2Ffd7bca5f92a03e23.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;img src=&#34;https://cdn.micro.blog/photos/1000x/https%3A%2F%2Ffiles.mastodon.social%2Fmedia_attachments%2Ffiles%2F116%2F408%2F559%2F756%2F300%2F787%2Foriginal%2F9de0ad951cb7d57d.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;img src=&#34;https://cdn.micro.blog/photos/1000x/https%3A%2F%2Ffiles.mastodon.social%2Fmedia_attachments%2Ffiles%2F116%2F408%2F559%2F818%2F519%2F886%2Foriginal%2Fd2fb74f15cfc6793.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;&lt;img src=&#34;https://cdn.micro.blog/photos/1000x/https%3A%2F%2Ffiles.mastodon.social%2Fmedia_attachments%2Ffiles%2F116%2F408%2F559%2F879%2F277%2F831%2Foriginal%2Fbec0a371a1b8b1d6.jpg&#34; alt=&#34;&#34; loading=&#34;lazy&#34;&gt;
&lt;/div&gt;&lt;footer&gt;The Public Domain Review &lt;cite&gt;&lt;a href=&#34;https://mastodon.social/@publicdomainrev/116408559908239505&#34; class=&#34;u-in-reply-to&#34;&gt;https://mastodon.social/@publicdomainrev/116408559908239505&lt;/a&gt;&lt;/cite&gt;&lt;/footer&gt;&lt;/blockquote&gt;&lt;script src=&#34;https://cdn.micro.blog/quoteback.js&#34;&gt;&lt;/script&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/04/13/how-to-eat-french-fries.html</link>
      <pubDate>Mon, 13 Apr 2026 21:52:44 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/04/13/how-to-eat-french-fries.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://miniature-calendar.com/260410&#34;&gt;&amp;lsquo;How to Eat French Fries&amp;rsquo; by Tatsuya Tanaka at Miniature Calendar:&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://miniature-calendar.com/wp-content/uploads/2026/04/260410fri.jpg&#34; alt=&#34;A miniature art photograph by Tatsuya Tanaka. A tiny figure of a woman in a yellow tracksuit with a black stripe—reminiscent of &amp;ldquo;The Bride&amp;rdquo; from Kill Bill—stands in a combat pose with a katana. She is surrounded by &amp;ldquo;severed&amp;rdquo; French fries scattered on a white surface, with red ketchup at the broken ends to mimic blood. In the background, a large red carton of fries and a small container of ketchup are visible under dramatic lighting.&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/04/12/per-my-last-post-the.html</link>
      <pubDate>Sun, 12 Apr 2026 23:11:18 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/04/12/per-my-last-post-the.html</guid>
      <description>&lt;p&gt;Per my last post, &lt;a href=&#34;https://youtu.be/e2oZtvjg5oA?si=w3TqMQP-Tbs8Kpya&#34;&gt;the Castlevania 2 &amp;lsquo;Bloody Tears&amp;rsquo; theme&lt;/a&gt; goes harder than it has a right too.&lt;/p&gt;
&lt;blockquote class=&#34;quoteback&#34; data-author=&#34;Nic Babarskis&#34; data-avatar=&#34;https://micro.blog/thebigbabooski/avatar.jpg&#34; cite=&#34;https://nic.babarskis.blog/2026/04/12/somehow-was-able-to-get.html&#34;&gt;
&lt;p&gt;Somehow was able to get classic video game soundtracks into the 5-year-olds music rotation (its a delicate inception, but worth the respite from the usual playlists) and every time &lt;a href=&#34;https://www.youtube.com/watch?v=Zqa2mgjbOIM&#34;&gt;Dire Dire Docks&lt;/a&gt; comes on I think of &lt;a href=&#34;https://youtu.be/bFexVk2U-EA?si=eeYfswn11ShZIRVM&#34;&gt;the Northernlion commentary.&lt;/a&gt;&lt;/p&gt;
&lt;footer&gt;Nic Babarskis &lt;cite&gt;&lt;a href=&#34;https://nic.babarskis.blog/2026/04/12/somehow-was-able-to-get.html&#34; class=&#34;u-in-reply-to&#34;&gt;https://nic.babarskis.blog/2026/04/12/somehow-was-able-to-get.html&lt;/a&gt;&lt;/cite&gt;&lt;/footer&gt;
&lt;/blockquote&gt;&lt;script src=&#34;https://cdn.micro.blog/quoteback.js&#34;&gt;&lt;/script&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/04/12/somehow-was-able-to-get.html</link>
      <pubDate>Sun, 12 Apr 2026 23:07:12 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/04/12/somehow-was-able-to-get.html</guid>
      <description>&lt;p&gt;Somehow was able to get classic video game soundtracks into the 5-year-olds music rotation (its a delicate inception, but worth the respite from the usual playlists) and every time &lt;a href=&#34;https://www.youtube.com/watch?v=Zqa2mgjbOIM&#34;&gt;Dire Dire Docks&lt;/a&gt; comes on I think of &lt;a href=&#34;https://youtu.be/bFexVk2U-EA?si=eeYfswn11ShZIRVM&#34;&gt;the Northernlion commentary.&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/04/06/the-toddler-is-experiencing-some.html</link>
      <pubDate>Mon, 06 Apr 2026 06:45:13 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/04/06/the-toddler-is-experiencing-some.html</guid>
      <description>&lt;p&gt;The toddler is experiencing some sort of sleep regression.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Thomas_C._Lea_III_-_That_Two-Thousand_Yard_Stare_-_Original.jpg/1280px-Thomas_C._Lea_III_-_That_Two-Thousand_Yard_Stare_-_Original.jpg&#34; alt=&#34; &amp;ldquo;That 2,000 Yard Stare&amp;rdquo; - Thomas Lee, 1944, World War II. Army Art Collection, U.S. Army Center of Military History&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/04/03/ongoing-artemis-mission-updates-on.html</link>
      <pubDate>Fri, 03 Apr 2026 08:03:23 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/04/03/ongoing-artemis-mission-updates-on.html</guid>
      <description>&lt;p&gt;Ongoing Artemis 2 mission updates on &lt;a href=&#34;https://www.nasa.gov/blogs/missions/&#34;&gt;this blog&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/04/01/the-artemis-launch-has-me.html</link>
      <pubDate>Wed, 01 Apr 2026 21:39:11 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/04/01/the-artemis-launch-has-me.html</guid>
      <description>&lt;p&gt;The Artemis launch has me thinking about Mass Effect space exploration so here&amp;rsquo;s the links to each game&amp;rsquo;s galaxy map music:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=7ZoFw9uXJwk&#34;&gt;ME 1&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=jqvcqe9KOW0&amp;amp;t=11s&#34;&gt;ME 2&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=DS6FQsgXfxk&#34;&gt;ME 3&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=T3mCj2u3XSY&#34;&gt;ME-A&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/04/01/perhaps-youve-been-warned-to.html</link>
      <pubDate>Wed, 01 Apr 2026 20:30:10 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/04/01/perhaps-youve-been-warned-to.html</guid>
      <description>&lt;p&gt;Perhaps you’ve been warned to watch for “woke” Michigan companies but have you been informed about:&lt;/p&gt;
&lt;img src=&#34;https://nic.babarskis.blog/uploads/2026/9c52aa9ade.jpg&#34; width=&#34;449&#34; height=&#34;600&#34; alt=&#34;&#34;&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/04/01/when-youve-been-forced-for.html</link>
      <pubDate>Wed, 01 Apr 2026 20:28:17 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/04/01/when-youve-been-forced-for.html</guid>
      <description>&lt;p&gt;When you’ve been forced (for better or worse) to live through “interesting times:”&lt;/p&gt;
&lt;img src=&#34;https://nic.babarskis.blog/uploads/2026/a3eb7d019e.jpg&#34;&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/03/26/feists-let-it-die-is.html</link>
      <pubDate>Thu, 26 Mar 2026 12:56:24 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/03/26/feists-let-it-die-is.html</guid>
      <description>&lt;p&gt;🎵 Feist&amp;rsquo;s &lt;em&gt;Let It Die&lt;/em&gt; is an &lt;a href=&#34;https://album.link/bm3wpvxrgvckb&#34;&gt;undefeated album&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/03/10/come-here-quick-falling-frontier.html</link>
      <pubDate>Tue, 10 Mar 2026 20:01:51 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/03/10/come-here-quick-falling-frontier.html</guid>
      <description>&lt;p&gt;Come here quick!! &lt;a href=&#34;https://youtu.be/msj-iui56so&#34;&gt;Falling Frontier just dropped another gameplay trailer!&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/02/11/when-your-franchise-has-to.html</link>
      <pubDate>Wed, 11 Feb 2026 08:54:00 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/02/11/when-your-franchise-has-to.html</guid>
      <description>&lt;p&gt;When your franchise has to reach up to touch rock bottom you accept any crack of light that manifests.&lt;/p&gt;
&lt;img src=&#34;https://nic.babarskis.blog/uploads/2026/3a941dbd42.jpg&#34;&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/02/05/abbey-toast-by-tatsuya-tanaka.html</link>
      <pubDate>Thu, 05 Feb 2026 01:10:00 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/02/05/abbey-toast-by-tatsuya-tanaka.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://miniature-calendar.com/260204&#34;&gt;&amp;lsquo;Abbey Toast&amp;rsquo; by Tatsuya Tanaka posted to Miniature-Calendar:&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://miniature-calendar.com/wp-content/uploads/2026/02/260204wed.jpg&#34; alt=&#34;A miniaturized remix of The Beatles Abbey Road album photo with toast and broccoli substituting as the street&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/01/20/onion-pond-by-miniaturecalendar.html</link>
      <pubDate>Tue, 20 Jan 2026 13:31:00 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/01/20/onion-pond-by-miniaturecalendar.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://miniature-calendar.com/260120&#34;&gt;Onion Pond by Miniature-Calendar:&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://miniature-calendar.com/wp-content/uploads/2026/01/260120tue1.jpg&#34; alt=&#34;A miniature diorama featuring several whole yellow onions arranged to look like a cluster of hills or islands. In the center, a halved onion lies flat, its smooth, concentric inner layers serving as the surface of a pond. A tiny model boat with two miniature figures is positioned on the &amp;ldquo;pond,&amp;rdquo; and several small, green model evergreen trees are tucked between the onions, completing the scenic, whimsical landscape&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2026/01/13/dusttodigital-now-has-a-streaming.html</link>
      <pubDate>Tue, 13 Jan 2026 09:40:00 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2026/01/13/dusttodigital-now-has-a-streaming.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.dust-digital.com/about&#34;&gt;Dust-to-Digital&lt;/a&gt; now has a &lt;a href=&#34;https://dust-digital.com/&#34;&gt;24/7 streaming radio station&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2025/12/25/apropos-for-today-an-excerpt.html</link>
      <pubDate>Thu, 25 Dec 2025 12:30:00 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2025/12/25/apropos-for-today-an-excerpt.html</guid>
      <description>&lt;p&gt;Apropos for today, an excerpt from &lt;a href=&#34;https://youtu.be/t8Ax6KXnQZI?si=glrM-mZIpYG33YWM&#34;&gt;&amp;lsquo;The Darkling Thrush&amp;rsquo;&lt;/a&gt; which I was introduced too through yesterday&amp;rsquo;s &lt;a href=&#34;https://www.yourclassical.org/story/2025/12/03/a-festival-of-nine-lessons-and-carols&#34;&gt;Festival of Nine Lessons and Carols:&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;So little cause for carolings&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Of such ecstatic sound&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Was written on terrestrial things&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Afar or nigh around,&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;That I could think there trembled through&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;His happy good-night air&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Some blessed Hope, whereof he knew&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;And I was unaware.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2025/12/01/what-a-delight-to-discover.html</link>
      <pubDate>Mon, 01 Dec 2025 23:09:00 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2025/12/01/what-a-delight-to-discover.html</guid>
      <description>&lt;p&gt;What a delight to discover that Robert Glasper &lt;a href=&#34;https://www.youtube.com/watch?v=Cvd2SypKdIM&amp;amp;list=PLIh86OChcGjYuaw7K86o-JfRzYa8VQxXV&#34;&gt;made a Christmas album&lt;/a&gt;.&lt;/p&gt;

&lt;style&gt;
:root {
   
  --yt-aspect-ratio-16-9: 56.25%;

   
  --yt-bg-black: #000;
  --yt-play-button-bg: rgba(255, 0, 0, 0.8);
  --yt-play-button-bg-hover: rgba(255, 0, 0, 1);
  --yt-play-button-icon: #fff;
  --yt-overlay-bg: rgba(0, 0, 0, 0.85);
  --yt-overlay-text: #fff;
  --yt-focus-outline: #e53935;

   
  --yt-play-button-width: 68px;
  --yt-play-button-height: 48px;
  --yt-play-button-border-radius: 12px;

   
  --yt-focus-outline-width: 3px;
  --yt-focus-outline-offset: 4px;

   
  --yt-transition-duration: 0.2s;
  --yt-transition-timing: ease-in-out;
}

.video-wrapper {
  position: relative;
  display: block;
  width: 100%;
  padding: 0;
  padding-bottom: var(--yt-aspect-ratio-16-9);
  margin: 0;
  height: 0;
  max-width: 100%;
  overflow: hidden;
  background-color: var(--yt-bg-black);
  cursor: pointer;
  outline: none;
  border: none;
  color: inherit;
  font: inherit;
  text-align: inherit;
  appearance: none;
  -webkit-appearance: none;
}

.video-wrapper[data-is-loaded=&#34;true&#34;] {
  cursor: auto;
}

.video-wrapper:focus-visible {
  outline: var(--yt-focus-outline-width) solid var(--yt-focus-outline);
  outline-offset: var(--yt-focus-outline-offset);
}

.video-thumbnail {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;
  object-position: center;
  background-color: var(--yt-bg-black);
  z-index: 1;
  transition: opacity var(--yt-transition-duration) var(--yt-transition-timing);
}

.video-wrapper:hover .video-thumbnail {
  opacity: 0.9;
}

.video-overlay {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  background: var(--yt-overlay-bg);
  color: var(--yt-overlay-text);
  text-align: center;
  font-size: 0.85em;
  padding: 0.5em 1em;
  z-index: 2;
  pointer-events: auto;
}

.video-play-button {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--yt-play-button-width);
  height: var(--yt-play-button-height);
  background-color: var(--yt-play-button-bg);
  border-radius: var(--yt-play-button-border-radius);
  z-index: 3;
  pointer-events: none;
  transition: all var(--yt-transition-duration) var(--yt-transition-timing);
}

.video-wrapper:hover .video-play-button {
  background-color: var(--yt-play-button-bg-hover);
  transform: translate(-50%, -50%) scale(1.1);
}

.video-wrapper:active .video-play-button {
  transform: translate(-50%, -50%) scale(1.05);
}

.video-play-button::before {
  content: &#39;&#39;;
  position: absolute;
  left: 26px;
  top: 14px;
  width: 0;
  height: 0;
  border-left: 18px solid var(--yt-play-button-icon);
  border-top: 12px solid transparent;
  border-bottom: 12px solid transparent;
}

.video-wrapper iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  border: none;
  z-index: 4;
}

.video-noscript {
  display: block;
  max-width: 100%;
  background-color: var(--yt-bg-black);
  color: inherit;
  text-align: center;
  padding: 0;
  margin-top: 0.5em;
}

.video-noscript img {
  display: block;
  width: 100%;
  height: auto;
}

.video-noscript a {
  display: inline-block;
  padding: 0.75em 1em;
  color: inherit;
  text-decoration: underline;
}

.yt-text-link {
  display: none;
}
&lt;/style&gt;

&lt;script&gt;
(function(){
  &#39;use strict&#39;;

  
  const CONSTANTS = {
    VIDEO_ID_LENGTH: 11,
    MAX_INPUT_LENGTH: 2048,
    VIDEO_ID_PATTERN: /^[a-zA-Z0-9_-]{11}$/,
    PLAYLIST_PREFIXES: /^(PL|OL|UU|LL|FL)/i,
    ALLOWED_URL_CHARS: /^[a-zA-Z0-9_\-?=&amp;#:/.]+$/,
    TIME_FORMATS: {
      HOURS: 3600,
      MINUTES: 60,
      SECONDS: 1
    },
    YOUTUBE_NOCOOKIE_DOMAIN: &#39;https://www.youtube-nocookie.com&#39;,
    YOUTUBE_IMG_DOMAIN: &#39;https://img.youtube.com&#39;,
    EMBED_PARAMS: &#39;autoplay=1&amp;mute=1&#39;
  };

  

  function validateInput(input, maxLength = CONSTANTS.MAX_INPUT_LENGTH) {
    if (!input || typeof input !== &#39;string&#39;) return &#39;&#39;;

    const trimmed = input.trim();

    if (trimmed.length &gt; maxLength) {
      console.warn(`Input exceeds maximum length of ${maxLength}`);
      return &#39;&#39;;
    }

    
    if (!CONSTANTS.ALLOWED_URL_CHARS.test(trimmed)) {
      console.warn(&#39;Input contains invalid characters&#39;);
      return &#39;&#39;;
    }

    return trimmed;
  }

  

  function parseStartValue(value) {
    if (!value) return 0;

    
    if (/^\d+$/.test(value)) {
      const parsed = parseInt(value, 10);
      return isNaN(parsed) ? 0 : Math.max(0, parsed);
    }

    
    let total = 0;
    let matched = false;
    const regex = /(\d+)(h|m|s)/gi;
    let match;

    while ((match = regex.exec(value)) !== null) {
      matched = true;
      const num = parseInt(match[1], 10);
      if (isNaN(num)) continue;

      const unit = match[2].toLowerCase();
      if (unit === &#39;h&#39;) total += num * CONSTANTS.TIME_FORMATS.HOURS;
      else if (unit === &#39;m&#39;) total += num * CONSTANTS.TIME_FORMATS.MINUTES;
      else if (unit === &#39;s&#39;) total += num * CONSTANTS.TIME_FORMATS.SECONDS;
    }

    return matched ? Math.max(0, total) : 0;
  }

  

  function extractStartTime(queryString) {
    if (!queryString) return 0;

    try {
      const cleanQuery = queryString.startsWith(&#39;?&#39;) || queryString.startsWith(&#39;#&#39;)
        ? queryString.slice(1)
        : queryString;

      const params = new URLSearchParams(cleanQuery);

      
      return parseStartValue(params.get(&#39;start&#39;)) ||
             parseStartValue(params.get(&#39;t&#39;)) ||
             parseStartValue(params.get(&#39;time_continue&#39;)) ||
             0;
    } catch (e) {
      console.warn(&#39;Failed to parse query parameters:&#39;, e);
      return 0;
    }
  }

  

  function parseId(raw) {
    const validated = validateInput(raw);
    if (!validated) {
      return { type: &#39;unknown&#39;, id: &#39;&#39;, start: 0 };
    }

    let startSeconds = 0;
    let normalized = validated;

    
    const queryIndex = normalized.indexOf(&#39;?&#39;);
    if (queryIndex !== -1) {
      startSeconds = extractStartTime(normalized.slice(queryIndex + 1));
      normalized = normalized.slice(0, queryIndex);
    }

    
    const hashIndex = normalized.indexOf(&#39;#&#39;);
    if (hashIndex !== -1) {
      startSeconds = startSeconds || extractStartTime(normalized.slice(hashIndex + 1));
      normalized = normalized.slice(0, hashIndex);
    }

    
    if (CONSTANTS.PLAYLIST_PREFIXES.test(normalized)) {
      return { type: &#39;playlist&#39;, id: normalized, start: startSeconds };
    }

    
    if (CONSTANTS.VIDEO_ID_PATTERN.test(normalized)) {
      return { type: &#39;video&#39;, id: normalized, start: startSeconds };
    }

    
    const listMatch = normalized.match(/list=([^&amp;]+)/);
    if (listMatch &amp;&amp; listMatch[1]) {
      return { type: &#39;playlist&#39;, id: listMatch[1], start: startSeconds };
    }

    console.warn(&#39;Unable to parse video/playlist ID:&#39;, raw);
    return { type: &#39;unknown&#39;, id: &#39;&#39;, start: startSeconds };
  }

  

  function validateThumbnailUrl(thumbUrl) {
    if (!thumbUrl) return &#39;&#39;;

    let cleaned = thumbUrl.trim();

    
    const markdownMatch = cleaned.match(/^\[[^\]]*\]\(([^)]+)\)$/);
    if (markdownMatch) {
      cleaned = markdownMatch[1].trim();
    }

    
    try {
      const url = new URL(cleaned, document.baseURI);

      
      if (url.protocol !== &#39;http:&#39; &amp;&amp; url.protocol !== &#39;https:&#39;) {
        console.warn(&#39;Thumbnail URL must use http or https protocol&#39;);
        return &#39;&#39;;
      }

      return url.href;
    } catch (e) {
      console.warn(&#39;Invalid thumbnail URL:&#39;, e);
      return &#39;&#39;;
    }
  }

  

  function getPlaylistPlaceholder() {
    const svg = `&lt;svg xmlns=&#39;http://www.w3.org/2000/svg&#39; viewBox=&#39;0 0 1280 720&#39;&gt;` +
                `&lt;rect width=&#39;100%&#39; height=&#39;100%&#39; fill=&#39;#000&#39;/&gt;` +
                `&lt;rect x=&#39;220&#39; y=&#39;260&#39; width=&#39;840&#39; height=&#39;60&#39; fill=&#39;#fff&#39;/&gt;` +
                `&lt;rect x=&#39;220&#39; y=&#39;340&#39; width=&#39;660&#39; height=&#39;60&#39; fill=&#39;#fff&#39;/&gt;` +
                `&lt;/svg&gt;`;
    return &#39;data:image/svg+xml;charset=utf-8,&#39; + encodeURIComponent(svg);
  }

  /**
   * Sets up thumbnail for video wrapper
   * @param {HTMLImageElement} thumbnail - Thumbnail element
   * @param {Object} kind - Parsed video/playlist info
   * @param {string} customThumb - Custom thumbnail URL
   */
  function setupThumbnail(thumbnail, kind, customThumb) {
    if (!thumbnail) return;

    if (customThumb) {
      // Use custom thumbnail
      thumbnail.onerror = null;
      thumbnail.src = customThumb;
    } else if (kind.type === &#39;playlist&#39;) {
      // Use playlist placeholder
      thumbnail.src = getPlaylistPlaceholder();
    } else if (kind.type === &#39;video&#39; &amp;&amp; kind.id) {
      // Use YouTube thumbnail with fallback
      thumbnail.src = `${CONSTANTS.YOUTUBE_IMG_DOMAIN}/vi/${kind.id}/maxresdefault.jpg`;
      thumbnail.onerror = () =&gt; {
        thumbnail.onerror = null;
        thumbnail.src = `${CONSTANTS.YOUTUBE_IMG_DOMAIN}/vi/${kind.id}/0.jpg`;
      };
    }
    // For unknown type, keep the default placeholder
  }

  /**
   * Creates embed URL for video or playlist
   * @param {Object} kind - Parsed video/playlist info
   * @returns {string} Embed URL or empty string if invalid
   */
  function createEmbedUrl(kind) {
    if (kind.type === &#39;playlist&#39; &amp;&amp; kind.id) {
      return `${CONSTANTS.YOUTUBE_NOCOOKIE_DOMAIN}/embed/videoseries?list=${encodeURIComponent(kind.id)}&amp;${CONSTANTS.EMBED_PARAMS}`;
    } else if (kind.type === &#39;video&#39; &amp;&amp; kind.id) {
      let url = `${CONSTANTS.YOUTUBE_NOCOOKIE_DOMAIN}/embed/${encodeURIComponent(kind.id)}?${CONSTANTS.EMBED_PARAMS}`;
      if (kind.start &gt; 0) {
        url += `&amp;start=${Math.floor(kind.start)}`;
      }
      return url;
    }
    return &#39;&#39;;
  }

  /**
   * Creates and loads iframe embed
   * @param {HTMLElement} wrapper - Video wrapper element
   * @param {Object} kind - Parsed video/playlist info
   * @param {string} title - Video title
   */
  function loadEmbed(wrapper, kind, title) {
    if (wrapper.dataset.isLoaded === &#39;true&#39;) return;

    const embedUrl = createEmbedUrl(kind);
    if (!embedUrl) {
      console.error(&#39;Unable to create embed URL - invalid video/playlist ID&#39;);
      // Show error message to user
      wrapper.innerHTML = &#39;&lt;div style=&#34;padding: 2em; text-align: center; color: #fff;&#34;&gt;Unable to load video. Please check the video ID.&lt;/div&gt;&#39;;
      return;
    }

    // Create iframe
    const iframe = document.createElement(&#39;iframe&#39;);
    iframe.setAttribute(&#39;allowfullscreen&#39;, &#39;&#39;);
    iframe.setAttribute(&#39;loading&#39;, &#39;lazy&#39;);
    iframe.setAttribute(&#39;allow&#39;, &#39;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#39;);
    iframe.setAttribute(&#39;title&#39;, title ? `YouTube video player: ${title}` : &#39;YouTube video player&#39;);
    iframe.src = embedUrl;

    
    const replacement = document.createElement(&#39;div&#39;);
    replacement.className = wrapper.className;
    replacement.dataset.listenersAdded = &#39;true&#39;;
    replacement.dataset.isLoaded = &#39;true&#39;;
    replacement.appendChild(iframe);

    wrapper.replaceWith(replacement);
  }

  

  function enhanceEmbeds() {
    const wrappers = document.querySelectorAll(&#39;.video-wrapper&#39;);

    wrappers.forEach(wrapper =&gt; {
      
      if (wrapper.dataset.listenersAdded === &#39;true&#39;) return;
      wrapper.dataset.listenersAdded = &#39;true&#39;;

      
      const rawVideoId = wrapper.dataset.videoId || &#39;&#39;;
      const rawThumbUrl = wrapper.dataset.thumb || &#39;&#39;;
      const videoTitle = wrapper.dataset.videoTitle || &#39;&#39;;

      
      const kind = parseId(rawVideoId);
      const safeThumb = validateThumbnailUrl(rawThumbUrl);

      
      const thumbnail = wrapper.querySelector(&#39;.video-thumbnail&#39;);
      setupThumbnail(thumbnail, kind, safeThumb);

      
      const loadHandler = () =&gt; loadEmbed(wrapper, kind, videoTitle);

      wrapper.addEventListener(&#39;click&#39;, loadHandler);

      const overlay = wrapper.querySelector(&#39;.video-overlay&#39;);
      if (overlay) overlay.addEventListener(&#39;click&#39;, loadHandler);
      if (thumbnail) thumbnail.addEventListener(&#39;click&#39;, loadHandler);

      
      wrapper.addEventListener(&#39;keydown&#39;, (e) =&gt; {
        if (e.key === &#39;Enter&#39; || e.key === &#39; &#39;) {
          e.preventDefault();
          loadHandler();
        }
      });
    });
  }

  
  enhanceEmbeds();
  if (document.readyState === &#39;loading&#39;) {
    document.addEventListener(&#39;DOMContentLoaded&#39;, enhanceEmbeds);
  }
})();
&lt;/script&gt;&lt;p class=&#34;yt-text-link&#34;&gt;
      &lt;a href=&#34;https://www.youtube.com/playlist?list=PLIh86OChcGjYuaw7K86o-JfRzYa8VQxXV&#34;&gt;YouTube Playlist&lt;/a&gt;
    &lt;/p&gt;&lt;button type=&#34;button&#34;
    class=&#34;video-wrapper&#34;
    aria-label=&#34;Play YouTube video&#34;
    data-video-id=&#34;PLIh86OChcGjYuaw7K86o-JfRzYa8VQxXV&#34;
    data-thumb=&#34;&#34;
    &gt;&lt;img
      class=&#34;video-thumbnail&#34;
      src=&#34;data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20viewBox=%270%200%201280%20720%27%3E%3Crect%20width=%27100%25%25%27%20height=%27100%25%25%27%20fill=%27%23000%27/%3E%3C/svg%3E&#34;
      alt=&#34;YouTube Thumbnail&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;&lt;div class=&#34;video-play-button&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;&lt;noscript&gt;
    &lt;div class=&#34;video-noscript&#34;&gt;&lt;img src=&#34;data:image/svg&amp;#43;xml;charset=utf-8,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20viewBox=%270%200%201280%20720%27%3E%3Crect%20width=%27100%25%25%27%20height=%27100%25%25%27%20fill=%27%23000%27/%3E%3Crect%20x=%27220%27%20y=%27260%27%20width=%27840%27%20height=%2760%27%20fill=%27%23fff%27/%3E%3Crect%20x=%27220%27%20y=%27340%27%20width=%27660%27%20height=%2760%27%20fill=%27%23fff%27/%3E%3C/svg%3E&#34;
             alt=&#34;YouTube Thumbnail&#34;&gt;&lt;p&gt;
          &lt;a href=&#34;https://www.youtube.com/playlist?list=PLIh86OChcGjYuaw7K86o-JfRzYa8VQxXV&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;YouTube Playlist&lt;/a&gt;
        &lt;/p&gt;&lt;/div&gt;
  &lt;/noscript&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2025/11/22/yo-you-can-watch-pretty.html</link>
      <pubDate>Sat, 22 Nov 2025 19:38:00 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2025/11/22/yo-you-can-watch-pretty.html</guid>
      <description>&lt;p&gt;Yo! You can watch pretty much the &lt;a href=&#34;https://archive.org/details/ReadingRainbowTVSeries&#34;&gt;entire Reading Rainbow archive through the Internet Archive.&lt;/a&gt;&lt;/p&gt;
&lt;iframe src=&#34;https://archive.org/embed/ReadingRainbowTVSeries&amp;playlist=1&#34; width=&#34;640&#34; height=&#34;580&#34; frameborder=&#34;0&#34; webkitallowfullscreen=&#34;true&#34; mozallowfullscreen=&#34;true&#34; allowfullscreen&gt;&lt;/iframe&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2025/11/22/treasure-of-life-from-miniature.html</link>
      <pubDate>Sat, 22 Nov 2025 10:08:00 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2025/11/22/treasure-of-life-from-miniature.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://miniature-calendar.com/251122&#34;&gt;Treasure of Life from Miniature Calendar:&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://miniature-calendar.com/wp-content/uploads/2025/11/251122sat.jpg&#34; alt=&#34;A picture of a miniature showing two adults reclining in bed reading. The bed is made from a ring box and the ring sits at the foot of the bed&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Chicago Transit Authority’s slow TV ‘Ride the Rails’ videos remind me why I love the Brown Line</title>
      <link>https://nic.babarskis.blog/2025/11/21/chicago-transit-authoritys-slow-tv.html</link>
      <pubDate>Fri, 21 Nov 2025 22:33:00 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2025/11/21/chicago-transit-authoritys-slow-tv.html</guid>
      <description>&lt;p&gt;My family has maintained a relationship to Chicago’s Brown Line.&lt;/p&gt;
&lt;p&gt;For the years that we lived in central Illinois my parents would periodically take my sister and I to the city for a day or weekend excursion. Ostensibly we were there to visit my grandmother in Bridgeport (a Red Line stop) or my cousins in the suburbs, but we would also find an excuse to take the bikes down to the lakefront for a ride from the Adler Planetarium to the Lincoln Park zoo, or a jaunt up and down lake shore drive. We’d also ride the El. We’d take the Brown Line to Sedgwick and eat at the &lt;a href=&#34;https://oldjerusalemrestaurant.net/?y_source=1_MTA5MjA5ODUzNy03MTUtbG9jYXRpb24ud2Vic2l0ZQ%253D%253D&#34;&gt;Old Jerusalem Restaurant.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When I lived in Wheaton I’d keep up the pattern and find excuses to take the Brown Line to Old Town or Lincoln Park. My future spouse lived not far from the Diversey stop for a time.&lt;/p&gt;
&lt;p&gt;The CTA &lt;a href=&#34;https://youtube.com/playlist?list=PL0-sTc_CuqtXDvfQIx_Za5kG8nB4nz8FU&amp;amp;si=KawfhckFN383vJEA&#34;&gt;maintains a playlist of ‘Ride the Rails’ videos.&lt;/a&gt; The production values have improved incrementally over time. I find it comforting to pull one up and ride along for a couple stops. The familiar “doors closing” cadence and the click-clack of the tracks acts a bit like a breathe prayer. The Brown Line remains my favorite.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Could we make CosmodromePunk a thing?</title>
      <link>https://nic.babarskis.blog/2025/11/03/could-we-make-cosmodromepunk-a.html</link>
      <pubDate>Mon, 03 Nov 2025 12:38:00 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2025/11/03/could-we-make-cosmodromepunk-a.html</guid>
      <description>&lt;p&gt;The artistic director of &lt;a href=&#34;https://youtu.be/RwV4RyGOJZM?si=qJD2F11_lQmN57H3&#34;&gt;this film&lt;/a&gt; would go on to lead artistic direction for the first Ghost in the Shell film. I wouldn&amp;rsquo;t call it&amp;rsquo;s aesthetic vision cyberpunk though. I&amp;rsquo;d propose something else, like cassettepunk, or maybe CosmodromePunk. I think a lot of the videos &lt;a href=&#34;https://www.youtube.com/@hanahakiblank&#34;&gt;this YT channel&lt;/a&gt; makes could fall into that aesthetic.&lt;/p&gt;

&lt;style&gt;
:root {
   
  --yt-aspect-ratio-16-9: 56.25%;

   
  --yt-bg-black: #000;
  --yt-play-button-bg: rgba(255, 0, 0, 0.8);
  --yt-play-button-bg-hover: rgba(255, 0, 0, 1);
  --yt-play-button-icon: #fff;
  --yt-overlay-bg: rgba(0, 0, 0, 0.85);
  --yt-overlay-text: #fff;
  --yt-focus-outline: #e53935;

   
  --yt-play-button-width: 68px;
  --yt-play-button-height: 48px;
  --yt-play-button-border-radius: 12px;

   
  --yt-focus-outline-width: 3px;
  --yt-focus-outline-offset: 4px;

   
  --yt-transition-duration: 0.2s;
  --yt-transition-timing: ease-in-out;
}

.video-wrapper {
  position: relative;
  display: block;
  width: 100%;
  padding: 0;
  padding-bottom: var(--yt-aspect-ratio-16-9);
  margin: 0;
  height: 0;
  max-width: 100%;
  overflow: hidden;
  background-color: var(--yt-bg-black);
  cursor: pointer;
  outline: none;
  border: none;
  color: inherit;
  font: inherit;
  text-align: inherit;
  appearance: none;
  -webkit-appearance: none;
}

.video-wrapper[data-is-loaded=&#34;true&#34;] {
  cursor: auto;
}

.video-wrapper:focus-visible {
  outline: var(--yt-focus-outline-width) solid var(--yt-focus-outline);
  outline-offset: var(--yt-focus-outline-offset);
}

.video-thumbnail {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;
  object-position: center;
  background-color: var(--yt-bg-black);
  z-index: 1;
  transition: opacity var(--yt-transition-duration) var(--yt-transition-timing);
}

.video-wrapper:hover .video-thumbnail {
  opacity: 0.9;
}

.video-overlay {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  background: var(--yt-overlay-bg);
  color: var(--yt-overlay-text);
  text-align: center;
  font-size: 0.85em;
  padding: 0.5em 1em;
  z-index: 2;
  pointer-events: auto;
}

.video-play-button {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--yt-play-button-width);
  height: var(--yt-play-button-height);
  background-color: var(--yt-play-button-bg);
  border-radius: var(--yt-play-button-border-radius);
  z-index: 3;
  pointer-events: none;
  transition: all var(--yt-transition-duration) var(--yt-transition-timing);
}

.video-wrapper:hover .video-play-button {
  background-color: var(--yt-play-button-bg-hover);
  transform: translate(-50%, -50%) scale(1.1);
}

.video-wrapper:active .video-play-button {
  transform: translate(-50%, -50%) scale(1.05);
}

.video-play-button::before {
  content: &#39;&#39;;
  position: absolute;
  left: 26px;
  top: 14px;
  width: 0;
  height: 0;
  border-left: 18px solid var(--yt-play-button-icon);
  border-top: 12px solid transparent;
  border-bottom: 12px solid transparent;
}

.video-wrapper iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  border: none;
  z-index: 4;
}

.video-noscript {
  display: block;
  max-width: 100%;
  background-color: var(--yt-bg-black);
  color: inherit;
  text-align: center;
  padding: 0;
  margin-top: 0.5em;
}

.video-noscript img {
  display: block;
  width: 100%;
  height: auto;
}

.video-noscript a {
  display: inline-block;
  padding: 0.75em 1em;
  color: inherit;
  text-decoration: underline;
}

.yt-text-link {
  display: none;
}
&lt;/style&gt;

&lt;script&gt;
(function(){
  &#39;use strict&#39;;

  
  const CONSTANTS = {
    VIDEO_ID_LENGTH: 11,
    MAX_INPUT_LENGTH: 2048,
    VIDEO_ID_PATTERN: /^[a-zA-Z0-9_-]{11}$/,
    PLAYLIST_PREFIXES: /^(PL|OL|UU|LL|FL)/i,
    ALLOWED_URL_CHARS: /^[a-zA-Z0-9_\-?=&amp;#:/.]+$/,
    TIME_FORMATS: {
      HOURS: 3600,
      MINUTES: 60,
      SECONDS: 1
    },
    YOUTUBE_NOCOOKIE_DOMAIN: &#39;https://www.youtube-nocookie.com&#39;,
    YOUTUBE_IMG_DOMAIN: &#39;https://img.youtube.com&#39;,
    EMBED_PARAMS: &#39;autoplay=1&amp;mute=1&#39;
  };

  

  function validateInput(input, maxLength = CONSTANTS.MAX_INPUT_LENGTH) {
    if (!input || typeof input !== &#39;string&#39;) return &#39;&#39;;

    const trimmed = input.trim();

    if (trimmed.length &gt; maxLength) {
      console.warn(`Input exceeds maximum length of ${maxLength}`);
      return &#39;&#39;;
    }

    
    if (!CONSTANTS.ALLOWED_URL_CHARS.test(trimmed)) {
      console.warn(&#39;Input contains invalid characters&#39;);
      return &#39;&#39;;
    }

    return trimmed;
  }

  

  function parseStartValue(value) {
    if (!value) return 0;

    
    if (/^\d+$/.test(value)) {
      const parsed = parseInt(value, 10);
      return isNaN(parsed) ? 0 : Math.max(0, parsed);
    }

    
    let total = 0;
    let matched = false;
    const regex = /(\d+)(h|m|s)/gi;
    let match;

    while ((match = regex.exec(value)) !== null) {
      matched = true;
      const num = parseInt(match[1], 10);
      if (isNaN(num)) continue;

      const unit = match[2].toLowerCase();
      if (unit === &#39;h&#39;) total += num * CONSTANTS.TIME_FORMATS.HOURS;
      else if (unit === &#39;m&#39;) total += num * CONSTANTS.TIME_FORMATS.MINUTES;
      else if (unit === &#39;s&#39;) total += num * CONSTANTS.TIME_FORMATS.SECONDS;
    }

    return matched ? Math.max(0, total) : 0;
  }

  

  function extractStartTime(queryString) {
    if (!queryString) return 0;

    try {
      const cleanQuery = queryString.startsWith(&#39;?&#39;) || queryString.startsWith(&#39;#&#39;)
        ? queryString.slice(1)
        : queryString;

      const params = new URLSearchParams(cleanQuery);

      
      return parseStartValue(params.get(&#39;start&#39;)) ||
             parseStartValue(params.get(&#39;t&#39;)) ||
             parseStartValue(params.get(&#39;time_continue&#39;)) ||
             0;
    } catch (e) {
      console.warn(&#39;Failed to parse query parameters:&#39;, e);
      return 0;
    }
  }

  

  function parseId(raw) {
    const validated = validateInput(raw);
    if (!validated) {
      return { type: &#39;unknown&#39;, id: &#39;&#39;, start: 0 };
    }

    let startSeconds = 0;
    let normalized = validated;

    
    const queryIndex = normalized.indexOf(&#39;?&#39;);
    if (queryIndex !== -1) {
      startSeconds = extractStartTime(normalized.slice(queryIndex + 1));
      normalized = normalized.slice(0, queryIndex);
    }

    
    const hashIndex = normalized.indexOf(&#39;#&#39;);
    if (hashIndex !== -1) {
      startSeconds = startSeconds || extractStartTime(normalized.slice(hashIndex + 1));
      normalized = normalized.slice(0, hashIndex);
    }

    
    if (CONSTANTS.PLAYLIST_PREFIXES.test(normalized)) {
      return { type: &#39;playlist&#39;, id: normalized, start: startSeconds };
    }

    
    if (CONSTANTS.VIDEO_ID_PATTERN.test(normalized)) {
      return { type: &#39;video&#39;, id: normalized, start: startSeconds };
    }

    
    const listMatch = normalized.match(/list=([^&amp;]+)/);
    if (listMatch &amp;&amp; listMatch[1]) {
      return { type: &#39;playlist&#39;, id: listMatch[1], start: startSeconds };
    }

    console.warn(&#39;Unable to parse video/playlist ID:&#39;, raw);
    return { type: &#39;unknown&#39;, id: &#39;&#39;, start: startSeconds };
  }

  

  function validateThumbnailUrl(thumbUrl) {
    if (!thumbUrl) return &#39;&#39;;

    let cleaned = thumbUrl.trim();

    
    const markdownMatch = cleaned.match(/^\[[^\]]*\]\(([^)]+)\)$/);
    if (markdownMatch) {
      cleaned = markdownMatch[1].trim();
    }

    
    try {
      const url = new URL(cleaned, document.baseURI);

      
      if (url.protocol !== &#39;http:&#39; &amp;&amp; url.protocol !== &#39;https:&#39;) {
        console.warn(&#39;Thumbnail URL must use http or https protocol&#39;);
        return &#39;&#39;;
      }

      return url.href;
    } catch (e) {
      console.warn(&#39;Invalid thumbnail URL:&#39;, e);
      return &#39;&#39;;
    }
  }

  

  function getPlaylistPlaceholder() {
    const svg = `&lt;svg xmlns=&#39;http://www.w3.org/2000/svg&#39; viewBox=&#39;0 0 1280 720&#39;&gt;` +
                `&lt;rect width=&#39;100%&#39; height=&#39;100%&#39; fill=&#39;#000&#39;/&gt;` +
                `&lt;rect x=&#39;220&#39; y=&#39;260&#39; width=&#39;840&#39; height=&#39;60&#39; fill=&#39;#fff&#39;/&gt;` +
                `&lt;rect x=&#39;220&#39; y=&#39;340&#39; width=&#39;660&#39; height=&#39;60&#39; fill=&#39;#fff&#39;/&gt;` +
                `&lt;/svg&gt;`;
    return &#39;data:image/svg+xml;charset=utf-8,&#39; + encodeURIComponent(svg);
  }

  /**
   * Sets up thumbnail for video wrapper
   * @param {HTMLImageElement} thumbnail - Thumbnail element
   * @param {Object} kind - Parsed video/playlist info
   * @param {string} customThumb - Custom thumbnail URL
   */
  function setupThumbnail(thumbnail, kind, customThumb) {
    if (!thumbnail) return;

    if (customThumb) {
      // Use custom thumbnail
      thumbnail.onerror = null;
      thumbnail.src = customThumb;
    } else if (kind.type === &#39;playlist&#39;) {
      // Use playlist placeholder
      thumbnail.src = getPlaylistPlaceholder();
    } else if (kind.type === &#39;video&#39; &amp;&amp; kind.id) {
      // Use YouTube thumbnail with fallback
      thumbnail.src = `${CONSTANTS.YOUTUBE_IMG_DOMAIN}/vi/${kind.id}/maxresdefault.jpg`;
      thumbnail.onerror = () =&gt; {
        thumbnail.onerror = null;
        thumbnail.src = `${CONSTANTS.YOUTUBE_IMG_DOMAIN}/vi/${kind.id}/0.jpg`;
      };
    }
    // For unknown type, keep the default placeholder
  }

  /**
   * Creates embed URL for video or playlist
   * @param {Object} kind - Parsed video/playlist info
   * @returns {string} Embed URL or empty string if invalid
   */
  function createEmbedUrl(kind) {
    if (kind.type === &#39;playlist&#39; &amp;&amp; kind.id) {
      return `${CONSTANTS.YOUTUBE_NOCOOKIE_DOMAIN}/embed/videoseries?list=${encodeURIComponent(kind.id)}&amp;${CONSTANTS.EMBED_PARAMS}`;
    } else if (kind.type === &#39;video&#39; &amp;&amp; kind.id) {
      let url = `${CONSTANTS.YOUTUBE_NOCOOKIE_DOMAIN}/embed/${encodeURIComponent(kind.id)}?${CONSTANTS.EMBED_PARAMS}`;
      if (kind.start &gt; 0) {
        url += `&amp;start=${Math.floor(kind.start)}`;
      }
      return url;
    }
    return &#39;&#39;;
  }

  /**
   * Creates and loads iframe embed
   * @param {HTMLElement} wrapper - Video wrapper element
   * @param {Object} kind - Parsed video/playlist info
   * @param {string} title - Video title
   */
  function loadEmbed(wrapper, kind, title) {
    if (wrapper.dataset.isLoaded === &#39;true&#39;) return;

    const embedUrl = createEmbedUrl(kind);
    if (!embedUrl) {
      console.error(&#39;Unable to create embed URL - invalid video/playlist ID&#39;);
      // Show error message to user
      wrapper.innerHTML = &#39;&lt;div style=&#34;padding: 2em; text-align: center; color: #fff;&#34;&gt;Unable to load video. Please check the video ID.&lt;/div&gt;&#39;;
      return;
    }

    // Create iframe
    const iframe = document.createElement(&#39;iframe&#39;);
    iframe.setAttribute(&#39;allowfullscreen&#39;, &#39;&#39;);
    iframe.setAttribute(&#39;loading&#39;, &#39;lazy&#39;);
    iframe.setAttribute(&#39;allow&#39;, &#39;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#39;);
    iframe.setAttribute(&#39;title&#39;, title ? `YouTube video player: ${title}` : &#39;YouTube video player&#39;);
    iframe.src = embedUrl;

    
    const replacement = document.createElement(&#39;div&#39;);
    replacement.className = wrapper.className;
    replacement.dataset.listenersAdded = &#39;true&#39;;
    replacement.dataset.isLoaded = &#39;true&#39;;
    replacement.appendChild(iframe);

    wrapper.replaceWith(replacement);
  }

  

  function enhanceEmbeds() {
    const wrappers = document.querySelectorAll(&#39;.video-wrapper&#39;);

    wrappers.forEach(wrapper =&gt; {
      
      if (wrapper.dataset.listenersAdded === &#39;true&#39;) return;
      wrapper.dataset.listenersAdded = &#39;true&#39;;

      
      const rawVideoId = wrapper.dataset.videoId || &#39;&#39;;
      const rawThumbUrl = wrapper.dataset.thumb || &#39;&#39;;
      const videoTitle = wrapper.dataset.videoTitle || &#39;&#39;;

      
      const kind = parseId(rawVideoId);
      const safeThumb = validateThumbnailUrl(rawThumbUrl);

      
      const thumbnail = wrapper.querySelector(&#39;.video-thumbnail&#39;);
      setupThumbnail(thumbnail, kind, safeThumb);

      
      const loadHandler = () =&gt; loadEmbed(wrapper, kind, videoTitle);

      wrapper.addEventListener(&#39;click&#39;, loadHandler);

      const overlay = wrapper.querySelector(&#39;.video-overlay&#39;);
      if (overlay) overlay.addEventListener(&#39;click&#39;, loadHandler);
      if (thumbnail) thumbnail.addEventListener(&#39;click&#39;, loadHandler);

      
      wrapper.addEventListener(&#39;keydown&#39;, (e) =&gt; {
        if (e.key === &#39;Enter&#39; || e.key === &#39; &#39;) {
          e.preventDefault();
          loadHandler();
        }
      });
    });
  }

  
  enhanceEmbeds();
  if (document.readyState === &#39;loading&#39;) {
    document.addEventListener(&#39;DOMContentLoaded&#39;, enhanceEmbeds);
  }
})();
&lt;/script&gt;&lt;p class=&#34;yt-text-link&#34;&gt;
      &lt;a href=&#34;https://www.youtube.com/watch?v=RwV4RyGOJZM&#34;&gt;YouTube Video&lt;/a&gt;
    &lt;/p&gt;&lt;button type=&#34;button&#34;
    class=&#34;video-wrapper&#34;
    aria-label=&#34;Play YouTube video&#34;
    data-video-id=&#34;RwV4RyGOJZM&#34;
    data-thumb=&#34;&#34;
    &gt;&lt;img
      class=&#34;video-thumbnail&#34;
      src=&#34;data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20viewBox=%270%200%201280%20720%27%3E%3Crect%20width=%27100%25%25%27%20height=%27100%25%25%27%20fill=%27%23000%27/%3E%3C/svg%3E&#34;
      alt=&#34;YouTube Thumbnail&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;&lt;div class=&#34;video-play-button&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;&lt;noscript&gt;
    &lt;div class=&#34;video-noscript&#34;&gt;&lt;img src=&#34;https://img.youtube.com/vi/RwV4RyGOJZM/maxresdefault.jpg&#34;
             alt=&#34;YouTube Thumbnail&#34;&gt;&lt;p&gt;
          &lt;a href=&#34;https://www.youtube.com/watch?v=RwV4RyGOJZM&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;YouTube Video&lt;/a&gt;
        &lt;/p&gt;&lt;/div&gt;
  &lt;/noscript&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2025/10/26/parents-leave-all-sorts-of.html</link>
      <pubDate>Sun, 26 Oct 2025 19:52:43 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2025/10/26/parents-leave-all-sorts-of.html</guid>
      <description>&lt;p&gt;Parents leave all sorts of small indelible marks on their children that last a lifetime, and from my mom I&amp;rsquo;ve held onto an affection for &lt;a href=&#34;https://www.youtube.com/watch?v=bDgOwX72fLI&#34;&gt;Bruce Hornsby &amp;amp; The Range&lt;/a&gt;.&lt;/p&gt;

&lt;style&gt;
:root {
   
  --yt-aspect-ratio-16-9: 56.25%;

   
  --yt-bg-black: #000;
  --yt-play-button-bg: rgba(255, 0, 0, 0.8);
  --yt-play-button-bg-hover: rgba(255, 0, 0, 1);
  --yt-play-button-icon: #fff;
  --yt-overlay-bg: rgba(0, 0, 0, 0.85);
  --yt-overlay-text: #fff;
  --yt-focus-outline: #e53935;

   
  --yt-play-button-width: 68px;
  --yt-play-button-height: 48px;
  --yt-play-button-border-radius: 12px;

   
  --yt-focus-outline-width: 3px;
  --yt-focus-outline-offset: 4px;

   
  --yt-transition-duration: 0.2s;
  --yt-transition-timing: ease-in-out;
}

.video-wrapper {
  position: relative;
  display: block;
  width: 100%;
  padding: 0;
  padding-bottom: var(--yt-aspect-ratio-16-9);
  margin: 0;
  height: 0;
  max-width: 100%;
  overflow: hidden;
  background-color: var(--yt-bg-black);
  cursor: pointer;
  outline: none;
  border: none;
  color: inherit;
  font: inherit;
  text-align: inherit;
  appearance: none;
  -webkit-appearance: none;
}

.video-wrapper[data-is-loaded=&#34;true&#34;] {
  cursor: auto;
}

.video-wrapper:focus-visible {
  outline: var(--yt-focus-outline-width) solid var(--yt-focus-outline);
  outline-offset: var(--yt-focus-outline-offset);
}

.video-thumbnail {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;
  object-position: center;
  background-color: var(--yt-bg-black);
  z-index: 1;
  transition: opacity var(--yt-transition-duration) var(--yt-transition-timing);
}

.video-wrapper:hover .video-thumbnail {
  opacity: 0.9;
}

.video-overlay {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  background: var(--yt-overlay-bg);
  color: var(--yt-overlay-text);
  text-align: center;
  font-size: 0.85em;
  padding: 0.5em 1em;
  z-index: 2;
  pointer-events: auto;
}

.video-play-button {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: var(--yt-play-button-width);
  height: var(--yt-play-button-height);
  background-color: var(--yt-play-button-bg);
  border-radius: var(--yt-play-button-border-radius);
  z-index: 3;
  pointer-events: none;
  transition: all var(--yt-transition-duration) var(--yt-transition-timing);
}

.video-wrapper:hover .video-play-button {
  background-color: var(--yt-play-button-bg-hover);
  transform: translate(-50%, -50%) scale(1.1);
}

.video-wrapper:active .video-play-button {
  transform: translate(-50%, -50%) scale(1.05);
}

.video-play-button::before {
  content: &#39;&#39;;
  position: absolute;
  left: 26px;
  top: 14px;
  width: 0;
  height: 0;
  border-left: 18px solid var(--yt-play-button-icon);
  border-top: 12px solid transparent;
  border-bottom: 12px solid transparent;
}

.video-wrapper iframe {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  border: none;
  z-index: 4;
}

.video-noscript {
  display: block;
  max-width: 100%;
  background-color: var(--yt-bg-black);
  color: inherit;
  text-align: center;
  padding: 0;
  margin-top: 0.5em;
}

.video-noscript img {
  display: block;
  width: 100%;
  height: auto;
}

.video-noscript a {
  display: inline-block;
  padding: 0.75em 1em;
  color: inherit;
  text-decoration: underline;
}

.yt-text-link {
  display: none;
}
&lt;/style&gt;

&lt;script&gt;
(function(){
  &#39;use strict&#39;;

  
  const CONSTANTS = {
    VIDEO_ID_LENGTH: 11,
    MAX_INPUT_LENGTH: 2048,
    VIDEO_ID_PATTERN: /^[a-zA-Z0-9_-]{11}$/,
    PLAYLIST_PREFIXES: /^(PL|OL|UU|LL|FL)/i,
    ALLOWED_URL_CHARS: /^[a-zA-Z0-9_\-?=&amp;#:/.]+$/,
    TIME_FORMATS: {
      HOURS: 3600,
      MINUTES: 60,
      SECONDS: 1
    },
    YOUTUBE_NOCOOKIE_DOMAIN: &#39;https://www.youtube-nocookie.com&#39;,
    YOUTUBE_IMG_DOMAIN: &#39;https://img.youtube.com&#39;,
    EMBED_PARAMS: &#39;autoplay=1&amp;mute=1&#39;
  };

  

  function validateInput(input, maxLength = CONSTANTS.MAX_INPUT_LENGTH) {
    if (!input || typeof input !== &#39;string&#39;) return &#39;&#39;;

    const trimmed = input.trim();

    if (trimmed.length &gt; maxLength) {
      console.warn(`Input exceeds maximum length of ${maxLength}`);
      return &#39;&#39;;
    }

    
    if (!CONSTANTS.ALLOWED_URL_CHARS.test(trimmed)) {
      console.warn(&#39;Input contains invalid characters&#39;);
      return &#39;&#39;;
    }

    return trimmed;
  }

  

  function parseStartValue(value) {
    if (!value) return 0;

    
    if (/^\d+$/.test(value)) {
      const parsed = parseInt(value, 10);
      return isNaN(parsed) ? 0 : Math.max(0, parsed);
    }

    
    let total = 0;
    let matched = false;
    const regex = /(\d+)(h|m|s)/gi;
    let match;

    while ((match = regex.exec(value)) !== null) {
      matched = true;
      const num = parseInt(match[1], 10);
      if (isNaN(num)) continue;

      const unit = match[2].toLowerCase();
      if (unit === &#39;h&#39;) total += num * CONSTANTS.TIME_FORMATS.HOURS;
      else if (unit === &#39;m&#39;) total += num * CONSTANTS.TIME_FORMATS.MINUTES;
      else if (unit === &#39;s&#39;) total += num * CONSTANTS.TIME_FORMATS.SECONDS;
    }

    return matched ? Math.max(0, total) : 0;
  }

  

  function extractStartTime(queryString) {
    if (!queryString) return 0;

    try {
      const cleanQuery = queryString.startsWith(&#39;?&#39;) || queryString.startsWith(&#39;#&#39;)
        ? queryString.slice(1)
        : queryString;

      const params = new URLSearchParams(cleanQuery);

      
      return parseStartValue(params.get(&#39;start&#39;)) ||
             parseStartValue(params.get(&#39;t&#39;)) ||
             parseStartValue(params.get(&#39;time_continue&#39;)) ||
             0;
    } catch (e) {
      console.warn(&#39;Failed to parse query parameters:&#39;, e);
      return 0;
    }
  }

  

  function parseId(raw) {
    const validated = validateInput(raw);
    if (!validated) {
      return { type: &#39;unknown&#39;, id: &#39;&#39;, start: 0 };
    }

    let startSeconds = 0;
    let normalized = validated;

    
    const queryIndex = normalized.indexOf(&#39;?&#39;);
    if (queryIndex !== -1) {
      startSeconds = extractStartTime(normalized.slice(queryIndex + 1));
      normalized = normalized.slice(0, queryIndex);
    }

    
    const hashIndex = normalized.indexOf(&#39;#&#39;);
    if (hashIndex !== -1) {
      startSeconds = startSeconds || extractStartTime(normalized.slice(hashIndex + 1));
      normalized = normalized.slice(0, hashIndex);
    }

    
    if (CONSTANTS.PLAYLIST_PREFIXES.test(normalized)) {
      return { type: &#39;playlist&#39;, id: normalized, start: startSeconds };
    }

    
    if (CONSTANTS.VIDEO_ID_PATTERN.test(normalized)) {
      return { type: &#39;video&#39;, id: normalized, start: startSeconds };
    }

    
    const listMatch = normalized.match(/list=([^&amp;]+)/);
    if (listMatch &amp;&amp; listMatch[1]) {
      return { type: &#39;playlist&#39;, id: listMatch[1], start: startSeconds };
    }

    console.warn(&#39;Unable to parse video/playlist ID:&#39;, raw);
    return { type: &#39;unknown&#39;, id: &#39;&#39;, start: startSeconds };
  }

  

  function validateThumbnailUrl(thumbUrl) {
    if (!thumbUrl) return &#39;&#39;;

    let cleaned = thumbUrl.trim();

    
    const markdownMatch = cleaned.match(/^\[[^\]]*\]\(([^)]+)\)$/);
    if (markdownMatch) {
      cleaned = markdownMatch[1].trim();
    }

    
    try {
      const url = new URL(cleaned, document.baseURI);

      
      if (url.protocol !== &#39;http:&#39; &amp;&amp; url.protocol !== &#39;https:&#39;) {
        console.warn(&#39;Thumbnail URL must use http or https protocol&#39;);
        return &#39;&#39;;
      }

      return url.href;
    } catch (e) {
      console.warn(&#39;Invalid thumbnail URL:&#39;, e);
      return &#39;&#39;;
    }
  }

  

  function getPlaylistPlaceholder() {
    const svg = `&lt;svg xmlns=&#39;http://www.w3.org/2000/svg&#39; viewBox=&#39;0 0 1280 720&#39;&gt;` +
                `&lt;rect width=&#39;100%&#39; height=&#39;100%&#39; fill=&#39;#000&#39;/&gt;` +
                `&lt;rect x=&#39;220&#39; y=&#39;260&#39; width=&#39;840&#39; height=&#39;60&#39; fill=&#39;#fff&#39;/&gt;` +
                `&lt;rect x=&#39;220&#39; y=&#39;340&#39; width=&#39;660&#39; height=&#39;60&#39; fill=&#39;#fff&#39;/&gt;` +
                `&lt;/svg&gt;`;
    return &#39;data:image/svg+xml;charset=utf-8,&#39; + encodeURIComponent(svg);
  }

  /**
   * Sets up thumbnail for video wrapper
   * @param {HTMLImageElement} thumbnail - Thumbnail element
   * @param {Object} kind - Parsed video/playlist info
   * @param {string} customThumb - Custom thumbnail URL
   */
  function setupThumbnail(thumbnail, kind, customThumb) {
    if (!thumbnail) return;

    if (customThumb) {
      // Use custom thumbnail
      thumbnail.onerror = null;
      thumbnail.src = customThumb;
    } else if (kind.type === &#39;playlist&#39;) {
      // Use playlist placeholder
      thumbnail.src = getPlaylistPlaceholder();
    } else if (kind.type === &#39;video&#39; &amp;&amp; kind.id) {
      // Use YouTube thumbnail with fallback
      thumbnail.src = `${CONSTANTS.YOUTUBE_IMG_DOMAIN}/vi/${kind.id}/maxresdefault.jpg`;
      thumbnail.onerror = () =&gt; {
        thumbnail.onerror = null;
        thumbnail.src = `${CONSTANTS.YOUTUBE_IMG_DOMAIN}/vi/${kind.id}/0.jpg`;
      };
    }
    // For unknown type, keep the default placeholder
  }

  /**
   * Creates embed URL for video or playlist
   * @param {Object} kind - Parsed video/playlist info
   * @returns {string} Embed URL or empty string if invalid
   */
  function createEmbedUrl(kind) {
    if (kind.type === &#39;playlist&#39; &amp;&amp; kind.id) {
      return `${CONSTANTS.YOUTUBE_NOCOOKIE_DOMAIN}/embed/videoseries?list=${encodeURIComponent(kind.id)}&amp;${CONSTANTS.EMBED_PARAMS}`;
    } else if (kind.type === &#39;video&#39; &amp;&amp; kind.id) {
      let url = `${CONSTANTS.YOUTUBE_NOCOOKIE_DOMAIN}/embed/${encodeURIComponent(kind.id)}?${CONSTANTS.EMBED_PARAMS}`;
      if (kind.start &gt; 0) {
        url += `&amp;start=${Math.floor(kind.start)}`;
      }
      return url;
    }
    return &#39;&#39;;
  }

  /**
   * Creates and loads iframe embed
   * @param {HTMLElement} wrapper - Video wrapper element
   * @param {Object} kind - Parsed video/playlist info
   * @param {string} title - Video title
   */
  function loadEmbed(wrapper, kind, title) {
    if (wrapper.dataset.isLoaded === &#39;true&#39;) return;

    const embedUrl = createEmbedUrl(kind);
    if (!embedUrl) {
      console.error(&#39;Unable to create embed URL - invalid video/playlist ID&#39;);
      // Show error message to user
      wrapper.innerHTML = &#39;&lt;div style=&#34;padding: 2em; text-align: center; color: #fff;&#34;&gt;Unable to load video. Please check the video ID.&lt;/div&gt;&#39;;
      return;
    }

    // Create iframe
    const iframe = document.createElement(&#39;iframe&#39;);
    iframe.setAttribute(&#39;allowfullscreen&#39;, &#39;&#39;);
    iframe.setAttribute(&#39;loading&#39;, &#39;lazy&#39;);
    iframe.setAttribute(&#39;allow&#39;, &#39;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#39;);
    iframe.setAttribute(&#39;title&#39;, title ? `YouTube video player: ${title}` : &#39;YouTube video player&#39;);
    iframe.src = embedUrl;

    
    const replacement = document.createElement(&#39;div&#39;);
    replacement.className = wrapper.className;
    replacement.dataset.listenersAdded = &#39;true&#39;;
    replacement.dataset.isLoaded = &#39;true&#39;;
    replacement.appendChild(iframe);

    wrapper.replaceWith(replacement);
  }

  

  function enhanceEmbeds() {
    const wrappers = document.querySelectorAll(&#39;.video-wrapper&#39;);

    wrappers.forEach(wrapper =&gt; {
      
      if (wrapper.dataset.listenersAdded === &#39;true&#39;) return;
      wrapper.dataset.listenersAdded = &#39;true&#39;;

      
      const rawVideoId = wrapper.dataset.videoId || &#39;&#39;;
      const rawThumbUrl = wrapper.dataset.thumb || &#39;&#39;;
      const videoTitle = wrapper.dataset.videoTitle || &#39;&#39;;

      
      const kind = parseId(rawVideoId);
      const safeThumb = validateThumbnailUrl(rawThumbUrl);

      
      const thumbnail = wrapper.querySelector(&#39;.video-thumbnail&#39;);
      setupThumbnail(thumbnail, kind, safeThumb);

      
      const loadHandler = () =&gt; loadEmbed(wrapper, kind, videoTitle);

      wrapper.addEventListener(&#39;click&#39;, loadHandler);

      const overlay = wrapper.querySelector(&#39;.video-overlay&#39;);
      if (overlay) overlay.addEventListener(&#39;click&#39;, loadHandler);
      if (thumbnail) thumbnail.addEventListener(&#39;click&#39;, loadHandler);

      
      wrapper.addEventListener(&#39;keydown&#39;, (e) =&gt; {
        if (e.key === &#39;Enter&#39; || e.key === &#39; &#39;) {
          e.preventDefault();
          loadHandler();
        }
      });
    });
  }

  
  enhanceEmbeds();
  if (document.readyState === &#39;loading&#39;) {
    document.addEventListener(&#39;DOMContentLoaded&#39;, enhanceEmbeds);
  }
})();
&lt;/script&gt;&lt;p class=&#34;yt-text-link&#34;&gt;
      &lt;a href=&#34;https://www.youtube.com/watch?v=bDgOwX72fLI&#34;&gt;YouTube Video&lt;/a&gt;
    &lt;/p&gt;&lt;button type=&#34;button&#34;
    class=&#34;video-wrapper&#34;
    aria-label=&#34;Play YouTube video&#34;
    data-video-id=&#34;bDgOwX72fLI&#34;
    data-thumb=&#34;&#34;
    &gt;&lt;img
      class=&#34;video-thumbnail&#34;
      src=&#34;data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20viewBox=%270%200%201280%20720%27%3E%3Crect%20width=%27100%25%25%27%20height=%27100%25%25%27%20fill=%27%23000%27/%3E%3C/svg%3E&#34;
      alt=&#34;YouTube Thumbnail&#34;
      loading=&#34;lazy&#34;
      decoding=&#34;async&#34;&gt;&lt;div class=&#34;video-play-button&#34;&gt;&lt;/div&gt;
  &lt;/button&gt;&lt;noscript&gt;
    &lt;div class=&#34;video-noscript&#34;&gt;&lt;img src=&#34;https://img.youtube.com/vi/bDgOwX72fLI/maxresdefault.jpg&#34;
             alt=&#34;YouTube Thumbnail&#34;&gt;&lt;p&gt;
          &lt;a href=&#34;https://www.youtube.com/watch?v=bDgOwX72fLI&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;YouTube Video&lt;/a&gt;
        &lt;/p&gt;&lt;/div&gt;
  &lt;/noscript&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2025/10/18/this-morning-i-saw-a.html</link>
      <pubDate>Sat, 18 Oct 2025 12:47:10 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2025/10/18/this-morning-i-saw-a.html</guid>
      <description>&lt;p&gt;This morning I saw a senior citizen with a cane, on the curb, in an inflatable animal costume, with signage promoting the No Kings rally happening downtown later today. Punching all the squares on my U.S.-in-2025 bingo card.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2025/10/14/this-site-is-so-delightful.html</link>
      <pubDate>Tue, 14 Oct 2025 10:28:14 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2025/10/14/this-site-is-so-delightful.html</guid>
      <description>&lt;p&gt;This site is so delightful. &lt;a href=&#34;https://miniature-calendar.com/251014&#34;&gt;https://miniature-calendar.com/251014&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2025/06/02/hanahaki-blank-continuing-to-evoke.html</link>
      <pubDate>Mon, 02 Jun 2025 11:25:38 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2025/06/02/hanahaki-blank-continuing-to-evoke.html</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://youtu.be/OgcV4LhEQ6E?si=HjilgmW8Mzjqc1ol&#34;&gt;Hanahaki Blank continuing to evoke the golden age of hand drawn anime:&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;ndash;&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/OgcV4LhEQ6E?si=-WdtSaBiaiSmBcRZ&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2025/05/28/taking-a-python-intro-course.html</link>
      <pubDate>Wed, 28 May 2025 22:19:33 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2025/05/28/taking-a-python-intro-course.html</guid>
      <description>&lt;p&gt;Taking a Python Intro course this summer and turns out if you need to code late into the evening Olde Pine is a great companion:&lt;/p&gt;
&lt;p&gt;&amp;ndash;&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/WqYVapE7KTA?si=s5u4tOFriB4yJvCA&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&amp;ndash;&lt;/p&gt;
&lt;iframe style=&#34;border-radius:12px&#34; src=&#34;https://open.spotify.com/embed/track/3XY1XnhE0QjPUZqpIb7GDn?utm_source=generator&#34; width=&#34;100%&#34; height=&#34;152&#34; frameborder=&#34;0&#34; allowfullscreen=&#34;&#34; allow=&#34;autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture&#34; loading=&#34;lazy&#34;&gt;&lt;/iframe&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2025/05/14/i-took-amazon-immolating-million.html</link>
      <pubDate>Wed, 14 May 2025 11:30:00 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2025/05/14/i-took-amazon-immolating-million.html</guid>
      <description>&lt;p&gt;I took Amazon immolating $700 million dollars to distill a pure moment that evokes Tolkein at his best–as I remember him when read to me in my childhood–so good job I guess?&lt;/p&gt;
&lt;p&gt;It really is best viewed on a big screen with a good sound system:&lt;/p&gt;
&lt;p&gt;&amp;ndash;&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/M8Zas_YRD3g?si=r32pxBs__qBXmETO&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2025/03/30/theres-very-specific-vibes-video.html</link>
      <pubDate>Sun, 30 Mar 2025 21:46:09 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2025/03/30/theres-very-specific-vibes-video.html</guid>
      <description>&lt;p&gt;There&amp;rsquo;s very specific vibes video that features 80s and 90s anime that exudes what I&amp;rsquo;d call a &lt;a href=&#34;https://youtube.com/shorts/KofY0oCVpcA?si=9mD9X-RDlPOdFc6b&#34;&gt;#vhspunk aesthetic&lt;/a&gt;–before the iPhone with its black mirror imposed a glass sheen on tech products. The video style is typified by &lt;a href=&#34;https://www.youtube.com/@hanahakiblank&#34;&gt;Hanahaki Blank&amp;rsquo;s&lt;/a&gt; youtube channel. Its the perfect delta of the beauty of hand drawn animation, late 20th century nostaligia, and technophilia.&lt;/p&gt;
&lt;p&gt;&amp;ndash;&lt;/p&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/cFfpmC0Kv5w?si=ZNAMzDvcO9_KxpNi&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; allowfullscreen&gt;&lt;/iframe&gt;
</description>
    </item>
    
    <item>
      <title></title>
      <link>https://nic.babarskis.blog/2025/03/19/pssst-you-can-buy-bsky.html</link>
      <pubDate>Wed, 19 Mar 2025 08:09:51 -0400</pubDate>
      
      <guid>http://thebigbabooski.micro.blog/2025/03/19/pssst-you-can-buy-bsky.html</guid>
      <description>&lt;p&gt;Pssst, you can buy BSKY CEO’s SXSW “A World Without Caesars” t-shirt &lt;a href=&#34;https://worldwithoutcaesars.com/&#34;&gt;here.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hat tip to &lt;a href=&#34;https://micro.blog/manton&#34;&gt;@manton&lt;/a&gt; for the link.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>