reduce bounce rate
This commit is contained in:
164
site/content/cache/content.json
vendored
164
site/content/cache/content.json
vendored
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generatedAt": "2026-02-10T09:28:27.367Z",
|
||||
"generatedAt": "2026-02-10T21:36:25.766Z",
|
||||
"items": [
|
||||
{
|
||||
"id": "gPGbtfQdaw4",
|
||||
@@ -10,7 +10,7 @@
|
||||
"publishedAt": "2026-02-08T19:57:08.000Z",
|
||||
"thumbnailUrl": "https://i.ytimg.com/vi/gPGbtfQdaw4/hqdefault.jpg",
|
||||
"metrics": {
|
||||
"views": 42
|
||||
"views": 63
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -22,7 +22,7 @@
|
||||
"publishedAt": "2026-02-05T05:53:25.000Z",
|
||||
"thumbnailUrl": "https://i.ytimg.com/vi/aesTuu2nS-I/hqdefault.jpg",
|
||||
"metrics": {
|
||||
"views": 147
|
||||
"views": 148
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -34,7 +34,7 @@
|
||||
"publishedAt": "2026-02-05T04:31:18.000Z",
|
||||
"thumbnailUrl": "https://i.ytimg.com/vi/9t8cBpZLHUo/hqdefault.jpg",
|
||||
"metrics": {
|
||||
"views": 328
|
||||
"views": 336
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -46,7 +46,7 @@
|
||||
"publishedAt": "2026-01-29T13:54:28.000Z",
|
||||
"thumbnailUrl": "https://i.ytimg.com/vi/71S5viSJG20/hqdefault.jpg",
|
||||
"metrics": {
|
||||
"views": 49
|
||||
"views": 50
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -118,7 +118,7 @@
|
||||
"publishedAt": "2026-01-20T17:02:14.000Z",
|
||||
"thumbnailUrl": "https://i.ytimg.com/vi/zR9Ey8DjG5s/hqdefault.jpg",
|
||||
"metrics": {
|
||||
"views": 24
|
||||
"views": 25
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -293,7 +293,7 @@
|
||||
"publishedAt": "2026-01-11T22:15:03.000Z",
|
||||
"thumbnailUrl": "https://i.ytimg.com/vi/XsJCIeqFWCY/hqdefault.jpg",
|
||||
"metrics": {
|
||||
"views": 5
|
||||
"views": 7
|
||||
}
|
||||
},
|
||||
{
|
||||
@@ -303,7 +303,8 @@
|
||||
"title": "E43. US History – Understanding This Country | Children's Crusade & the Civil Rights Act of 1964: Turning Protest into Law",
|
||||
"summary": "Dive into the pivotal summer of 1963 in this episode of US History - Understanding This Country, hosted by Santhosh Janardhanan. Explore the Birmingham Campaign's bold Project C, where brave children faced fire hoses and police dogs in the…",
|
||||
"publishedAt": "2026-01-24T03:17:34.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/114471652/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2026-0-24%2F1126c986-2549-be18-ac72-c68f016c3380.mp3"
|
||||
},
|
||||
{
|
||||
"id": "90b42ea8-16e9-4374-8043-858c5c04db3f",
|
||||
@@ -312,7 +313,8 @@
|
||||
"title": "E42. US History – Understanding This Country | Civil Rights Movement from Courtrooms to the Streets",
|
||||
"summary": "Episode 42 is where the Civil Rights Movement shifts from courtrooms to the streets. After legal wins like Brown v. Board of Education, activists and students push for real change in everyday life-at lunch counters, bus stations, and on in…",
|
||||
"publishedAt": "2026-01-16T19:59:44.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/114108808/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2026-0-16%2Ffbc30f2a-076c-244c-8edc-fe847073291a.mp3"
|
||||
},
|
||||
{
|
||||
"id": "9900f1c9-315b-42ba-991f-c31241bd9b55",
|
||||
@@ -321,7 +323,8 @@
|
||||
"title": "Episode 41a (Recap) - US History Podcast Catch‑Up: From Colonization to the Early Civil Rights Movement",
|
||||
"summary": "I’m back - and I owe you an apology. I went AWOL after September for personal reasons, but US History - Understanding This Country by Irregular Mind is back in the groove. In this recap episode, I quickly bring you up to speed on everythin…",
|
||||
"publishedAt": "2026-01-15T16:24:16.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/114047090/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2026-0-15%2F745dfc28-5bb8-7a31-045a-9b93871910e6.mp3"
|
||||
},
|
||||
{
|
||||
"id": "9002e7f6-8ecf-47e2-9590-ba4adfc5dc6d",
|
||||
@@ -330,7 +333,8 @@
|
||||
"title": "E41. US History – Understanding This Country | Civil Rights Beginnings: Brown, Parks & King",
|
||||
"summary": "Explore the early US civil rights movement: Brown v. Board of Education, Montgomery Bus Boycott, Little Rock Nine, Rosa Parks, Martin Luther King Jr., school integration, nonviolence, and resistance in the 1950s. Legal cases, social justic…",
|
||||
"publishedAt": "2025-09-20T03:47:37.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/108561883/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-8-20%2Fcb7f16fc-e9be-5a09-bc96-af307f4ff5fd.mp3"
|
||||
},
|
||||
{
|
||||
"id": "96e72f96-fb71-4717-9047-120c6e32973a",
|
||||
@@ -339,7 +343,8 @@
|
||||
"title": "E40. US History – Understanding This Country | Prosperity, TV, Rock ’n’ Roll",
|
||||
"summary": "Step into the 1950s: GI Bill-fueled growth, Levittown suburbs, TV in every living room, and rock ’n’ roll teens—alongside redlining, poverty, and early sparks of Civil Rights. Booming, but brittle. Listen now.",
|
||||
"publishedAt": "2025-09-15T02:28:58.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/108306385/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-8-15%2Fc354780a-6a27-0df9-03a4-57a85ae25bb9.mp3"
|
||||
},
|
||||
{
|
||||
"id": "bb4faa6e-384d-4204-b133-438c5a82aefd",
|
||||
@@ -348,7 +353,8 @@
|
||||
"title": "E39. US History – Understanding This Country | The Korean War: America’s First Test of the Cold War",
|
||||
"summary": "From the North Korean invasion to MacArthur’s Inchon landing, Chinese intervention, and Truman’s clash with his general — discover how the Korean War became the blueprint for Cold War conflicts and earned the name “The Forgotten War.”",
|
||||
"publishedAt": "2025-09-07T04:58:14.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/107954085/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-8-7%2F29c9f21c-f6ea-449f-7e56-2df384af1435.mp3"
|
||||
},
|
||||
{
|
||||
"id": "2d56a5a0-948d-446f-b05d-f18f4299530f",
|
||||
@@ -357,7 +363,8 @@
|
||||
"title": "E38. US History – Understanding This Country | Victory to Cold War Tensions",
|
||||
"summary": "In 1945, victory brought hope and change. From the GI Bill and baby boom to the UN, Marshall Plan, Berlin Airlift, and Truman’s Fair Deal — discover how America emerged as a global leader while stepping into the Cold War.",
|
||||
"publishedAt": "2025-08-16T03:52:22.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/106932614/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-7-16%2F8e76d74b-a4b4-d921-79e0-143c61aa45eb.mp3"
|
||||
},
|
||||
{
|
||||
"id": "14912927-4ea3-4946-948a-dbeeacbd1535",
|
||||
@@ -366,7 +373,8 @@
|
||||
"title": "E37. US History – Understanding This Country | From D-Day to Nagasaki",
|
||||
"summary": "Coincidentally, on the anniversary of the bombing of Nagasaki, we retrace America’s path to victory in WWII — from D-Day’s stormed beaches and the Battle of the Bulge, to the Pacific war, the A-Bomb, and the dawn of a new world order.",
|
||||
"publishedAt": "2025-08-09T04:15:45.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/106639027/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-7-9%2F62b6e4e3-44d4-7f08-4d80-ae897643a2d3.mp3"
|
||||
},
|
||||
{
|
||||
"id": "063ab850-90c1-4e42-af44-9a64eaa1bf72",
|
||||
@@ -375,7 +383,8 @@
|
||||
"title": "E36. US History – Understanding This Country | The World at War, Again: How the US stepped into WWII",
|
||||
"summary": "Before Normandy and D-Day, there was fear, fascism, and a world unraveling. In this episode, we trace the rise of totalitarian regimes in Europe and Asia, the blitzkrieg that stunned the West, and the slow but steady shift in American sent…",
|
||||
"publishedAt": "2025-08-02T03:41:33.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/106336273/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-7-2%2F404983164-44100-2-bf1a3634fbd3c.m4a"
|
||||
},
|
||||
{
|
||||
"id": "4d616ef1-46e4-46b5-8fa4-e3e71688d2c0",
|
||||
@@ -384,7 +393,8 @@
|
||||
"title": "E35. US History – Understanding This Country | The Great Depression",
|
||||
"summary": "When the Roaring Twenties crashed into economic ruin, America found itself spiraling into the Great Depression. In this episode, we explore the causes, the fallout, and the ambitious response—from Hoover’s failure to FDR’s New Deal. Escapi…",
|
||||
"publishedAt": "2025-07-26T02:32:26.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/106005813/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-6-26%2F2b97b981-decd-fdd2-1317-ad57c9000792.mp3"
|
||||
},
|
||||
{
|
||||
"id": "2a5efb30-1749-4bcb-b54b-a83878a6015e",
|
||||
@@ -393,7 +403,8 @@
|
||||
"title": "E34. US History – Understanding This Country | The Roaring Twenties",
|
||||
"summary": "Explore the dazzling highs and hidden lows of 1920s America - from jazz clubs and cultural revolutions to rising nativism, fundamentalism, and an economy teetering on collapse. This episode dives deep into how the decade shaped modern Amer…",
|
||||
"publishedAt": "2025-07-19T03:58:56.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/105702720/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-6-19%2Fd4ce6b57-88f7-d794-d909-3e2cb093bcca.mp3"
|
||||
},
|
||||
{
|
||||
"id": "d41eeed2-96a0-4afe-a8e4-1cf30dec8988",
|
||||
@@ -402,7 +413,8 @@
|
||||
"title": "E33. US History – Understanding This Country | The Great War: How World War I Transformed America and the World",
|
||||
"summary": "Explore America’s entry into World War I, from trench warfare and propaganda to Wilson’s Fourteen Points and the Treaty of Versailles. Discover how the Great War reshaped the U.S. and set the stage for the Roaring Twenties.",
|
||||
"publishedAt": "2025-07-12T04:33:52.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/105390404/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-6-12%2F18fd798a-1a68-44ec-1076-302d619df5c7.mp3"
|
||||
},
|
||||
{
|
||||
"id": "1fc5bbbf-e649-41b2-9145-85757cbee0a8",
|
||||
@@ -411,7 +423,8 @@
|
||||
"title": "E32. US History – Understanding This Country | American Muscle and Presidents of Power",
|
||||
"summary": "In this episode, we follow America’s bold stride into global influence and domestic reform through the eyes of Theodore Roosevelt, William Howard Taft, and Woodrow Wilson. From the Panama Canal to trust-busting, and from Dollar Diplomacy t…",
|
||||
"publishedAt": "2025-07-05T03:30:53.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/105055742/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-6-5%2Fe000ebe6-4a2a-9549-84bb-3dacdc71cf74.mp3"
|
||||
},
|
||||
{
|
||||
"id": "9d5a87a4-bdb7-474f-a249-a43ac6d477e6",
|
||||
@@ -420,7 +433,8 @@
|
||||
"title": "E31. US History – Understanding This Country | Expansionism and Imperialism",
|
||||
"summary": "Explore how the United States expanded its reach beyond its borders through imperial ambition, war, and diplomacy. From Hawaii to the Philippines, this episode traces America’s rise as a world power.",
|
||||
"publishedAt": "2025-06-28T03:30:57.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/104747456/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-5-28%2F2b53d550-ce69-539f-03c4-c0b9f6cbf80b.mp3"
|
||||
},
|
||||
{
|
||||
"id": "6b47cd15-1f10-4175-a8d2-0863777022a7",
|
||||
@@ -429,7 +443,8 @@
|
||||
"title": "E30. US History – Understanding This Country | Progressivism in America",
|
||||
"summary": "Explore the transformative Progressive Era in U.S. history — from trust-busting and muckraking journalism to child labor laws, women’s suffrage, and civil rights movements. This episode dives into how reformers, activists, and everyday cit…",
|
||||
"publishedAt": "2025-06-19T03:42:14.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/104345126/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-5-19%2Fcf16ba9f-60d0-2012-5fc9-4158e495ba5b.mp3"
|
||||
},
|
||||
{
|
||||
"id": "f73008f3-78d6-4644-975f-f5d00d21f404",
|
||||
@@ -438,7 +453,8 @@
|
||||
"title": "E29. US History – Understanding This Country | Immigration and New Cities",
|
||||
"summary": "In this episode, we explore the explosive rise of American cities during the late 1800s and early 1900s. From Ellis Island to ethnic neighborhoods, from nativist backlash to reform movements, discover how waves of new immigrants shaped the…",
|
||||
"publishedAt": "2025-06-14T03:58:41.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/104111816/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-5-14%2F58ab0089-5011-599a-94b6-27349c29025c.mp3"
|
||||
},
|
||||
{
|
||||
"id": "c1c4778d-2597-4b8a-86e2-dd2e5adfe526",
|
||||
@@ -447,7 +463,8 @@
|
||||
"title": "E28. US History – Understanding This Country | Second Industrial Revolution and The Age of Capitalism",
|
||||
"summary": "In this episode, we explore the Second Industrial Revolution — a time of booming invention, corporate empires, and factory-floor struggles. From Edison’s lightbulb to Ford’s assembly line, and from the rise of the corporation to the birth…",
|
||||
"publishedAt": "2025-06-07T03:51:30.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/103784402/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-5-7%2Feb8aea45-90d7-fbbb-eeb3-f2b1f625ba6a.mp3"
|
||||
},
|
||||
{
|
||||
"id": "13359365-5be2-4f7c-ae11-94d412be7561",
|
||||
@@ -456,7 +473,8 @@
|
||||
"title": "E27. US History – Understanding This Country | Clash of Cultures",
|
||||
"summary": "The American frontier was not an empty land — it was home. In this powerful episode, we uncover the story of the Lakota and other Plains tribes who resisted removal, reservations, and forced assimilation. From Custer’s Last Stand to the bo…",
|
||||
"publishedAt": "2025-05-31T04:14:46.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/103457111/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-4-31%2F5d65fcda-a3ad-bfee-b1f3-e87ffcbe4a46.mp3"
|
||||
},
|
||||
{
|
||||
"id": "f7c449ee-f274-4944-9370-0d0c000a053c",
|
||||
@@ -465,7 +483,8 @@
|
||||
"title": "E26. US History – Understanding This Country | Trains, Bonanzas and Cowboys",
|
||||
"summary": "From steam engines to cattle drives, and from homesteads to populist rallies — this episode explores how the American West was won, worked, and mythologized. Discover how the Transcontinental Railroad changed everything, how farmers organi…",
|
||||
"publishedAt": "2025-05-24T03:30:17.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/103126664/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-4-24%2F7bd352a3-c787-98d2-a210-4914742351bc.mp3"
|
||||
},
|
||||
{
|
||||
"id": "b3edb562-64be-4902-a503-f9a93719caf9",
|
||||
@@ -474,7 +493,8 @@
|
||||
"title": "E25. US History – Understanding This Country | Reconstruction: Redefining Freedom",
|
||||
"summary": "After the Civil War, the United States faced its most difficult question yet: how do you rebuild a country that just tried to destroy itself? In this episode, we explore the highs and heartbreaks of Reconstruction — from the promise of fre…",
|
||||
"publishedAt": "2025-05-17T04:35:58.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/102785794/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-4-17%2Ff3a5a2ed-b51a-81bd-3577-85fb982628dd.mp3"
|
||||
},
|
||||
{
|
||||
"id": "bd1cb52f-29fc-456a-b971-13030def86eb",
|
||||
@@ -483,7 +503,8 @@
|
||||
"title": "E24. US History – Understanding This Country | The Civil War",
|
||||
"summary": "Dive deep into the American Civil War — a conflict that shattered the nation, ended slavery, and changed the course of U.S. history. This episode traces the path from secession to surrender, explores key battles like Gettysburg and Antieta…",
|
||||
"publishedAt": "2025-05-10T04:07:23.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/102452394/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-4-10%2F10329af5-e506-1f22-d2f7-2bc340ab3cc9.mp3"
|
||||
},
|
||||
{
|
||||
"id": "086d2da0-57b4-4410-8637-f076b19bdaf9",
|
||||
@@ -492,7 +513,8 @@
|
||||
"title": "E23. US History – Understanding This Country | Prelude to Civil War",
|
||||
"summary": "In this gripping episode of US History – Understanding This Country, we trace the volatile road to the American Civil War—from the Wilmot Proviso to Lincoln’s First Inaugural Address. Learn how heated debates over slavery, landmark legisla…",
|
||||
"publishedAt": "2025-05-03T03:30:33.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/102109648/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-4-3%2F22fd23a6-a068-7ab5-3089-6535766eaf26.mp3"
|
||||
},
|
||||
{
|
||||
"id": "b22a7a44-8028-4c84-9dd6-31e7a62a6def",
|
||||
@@ -501,7 +523,8 @@
|
||||
"title": "E22. US History – Understanding This Country | The Age of Reform",
|
||||
"summary": "In this episode of US History – Understanding This Country, explore the powerful movements that reshaped America in the mid-1800s. From immigration waves and city life challenges to the Second Great Awakening, the Temperance Movement, pris…",
|
||||
"publishedAt": "2025-04-26T03:38:18.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/101800723/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-3-26%2F02c65821-3a9f-b57d-5b28-897ea433ee8c.mp3"
|
||||
},
|
||||
{
|
||||
"id": "035b8239-d954-42a8-a1a5-d4fce21ff15a",
|
||||
@@ -510,7 +533,8 @@
|
||||
"title": "E21. US History – Understanding This Country | The Lone Star and the Borderlands",
|
||||
"summary": "In this episode of US History – Understanding This Country, we explore how Texas went from Mexican territory to independent republic—and how that sparked the Mexican-American War. Learn about the Alamo, the Battle of San Jacinto, the Treat…",
|
||||
"publishedAt": "2025-04-19T03:26:55.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/101486753/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-3-19%2F490ffdc1-c6f6-b467-1687-4eb3143ee377.mp3"
|
||||
},
|
||||
{
|
||||
"id": "92f62156-44ed-4757-b46b-7b8d3b0deb00",
|
||||
@@ -519,7 +543,8 @@
|
||||
"title": "E20. US History – Understanding This Country | The Oregon Trail",
|
||||
"summary": "In this immersive episode of US History – Understanding This Country, we journey along the iconic Oregon Trail — the 2,000-mile route that carried America’s pioneer spirit westward. From river crossings and food shortages to the resilience…",
|
||||
"publishedAt": "2025-04-12T04:39:58.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/101188164/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-3-12%2Fbcfaf501-9f8b-1ad7-f7ea-fda20e0604b3.mp3"
|
||||
},
|
||||
{
|
||||
"id": "3fef0da4-41a1-4f69-a444-30a846ba6817",
|
||||
@@ -528,7 +553,8 @@
|
||||
"title": "E19. US History – Understanding This Country | The Wild West Journeys",
|
||||
"summary": "In this gripping episode of US History – Understanding This Country, we journey deep into the legendary Oregon Trail — the 2,000-mile path that turned ordinary families into pioneers and a young nation into a continental power. Discover wh…",
|
||||
"publishedAt": "2025-04-04T23:00:00.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/100819921/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-3-4%2F5d62ff2f-45f0-e0f9-da75-c49272b2cbdb.mp3"
|
||||
},
|
||||
{
|
||||
"id": "564c1115-f9ac-4c18-8e6f-2e805db638e2",
|
||||
@@ -537,7 +563,8 @@
|
||||
"title": "E18. US History – Understanding This Country | From Corrupt Bargains to the Trail of Tears",
|
||||
"summary": "In this powerful episode of US History – Understanding This Country, host Santhosh Janardhanan unpacks the pivotal elections of 1824, 1828, and 1832—revealing how political rivalries, populist movements, and bitter controversies shaped the…",
|
||||
"publishedAt": "2025-03-29T04:10:39.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/100536780/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-2-29%2Fafe493af-8b1d-edf5-5375-00ef312acf0c.mp3"
|
||||
},
|
||||
{
|
||||
"id": "3fcbc28c-728f-42cf-83cd-812ba49db367",
|
||||
@@ -546,7 +573,8 @@
|
||||
"title": "E17. US History – Understanding This Country | The Era of Good Feelings? Nationalism, Industry & Division in Early America",
|
||||
"summary": "Was the “Era of Good Feelings” truly a time of peace and progress—or a calm before the storm? In Episode 17 of US History – Understanding This Country, we explore how the post-War of 1812 boom brought nationalism, innovation, and expansion…",
|
||||
"publishedAt": "2025-03-22T01:00:00.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/100165431/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-2-21%2F55bc62cd-e2d6-94cc-2d33-b3f6f0f012c4.mp3"
|
||||
},
|
||||
{
|
||||
"id": "dbf4251d-3b67-4e98-be85-d4888aac4357",
|
||||
@@ -555,7 +583,8 @@
|
||||
"title": "E16. US History – Understanding This Country | The War of 1812 and Birth of the Star Spangled Banner",
|
||||
"summary": "The War of 1812 shaped America’s destiny—Tecumseh’s confederation, the Battle of Tippecanoe, the burning of Washington D.C., the Star-Spangled Banner, and Andrew Jackson’s victory at New Orleans. Discover how this war redefined U.S. indepe…",
|
||||
"publishedAt": "2025-03-15T01:00:00.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/99676277/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-2-11%2F396348523-44100-2-17d81a634ca2e.m4a"
|
||||
},
|
||||
{
|
||||
"id": "87f6b19f-b74a-4345-929e-084dec7236b5",
|
||||
@@ -564,7 +593,8 @@
|
||||
"title": "E15. US History - Understanding this Country | Expansion, Power, and Contradictions",
|
||||
"summary": "Thomas Jefferson’s presidency reshaped America—doubling its size with the Louisiana Purchase, battling the Supreme Court, and enforcing the disastrous Embargo Act. Explore his legacy in this episode!",
|
||||
"publishedAt": "2025-03-08T05:43:34.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/99544328/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-2-8%2F396185365-44100-2-2dc56d748f8c2.m4a"
|
||||
},
|
||||
{
|
||||
"id": "0bb43b9e-c1bc-40be-b642-5b8c0a7977a1",
|
||||
@@ -573,7 +603,8 @@
|
||||
"title": "E14. US History - Understanding this Country | Presidents setting precedents",
|
||||
"summary": "Dive into the transformative era of the first presidents as they laid the groundwork for the United States by setting precedents in early America. This episode traces George Washington’s historic election, the formation of his cabinet, and…",
|
||||
"publishedAt": "2025-03-01T04:33:33.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/99202920/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-2-1%2F54f89a3e-6cb7-9d3d-ece0-d831d3739ab3.mp3"
|
||||
},
|
||||
{
|
||||
"id": "344e00d3-7a6c-4941-81d2-cb3c60f567cb",
|
||||
@@ -582,7 +613,8 @@
|
||||
"title": "E13. US History - Understanding this Country | Inside the U.S. Constitution",
|
||||
"summary": "The U.S. Constitution was written—but could it survive the fight for approval? In this episode, we dive into the ratification debates, the clash between Federalists and Anti-Federalists, and the political deals that saved the Constitution.…",
|
||||
"publishedAt": "2025-02-23T03:35:43.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/98885311/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-1-23%2F395361579-44100-2-a3f5b1899c71.m4a"
|
||||
},
|
||||
{
|
||||
"id": "2ffd8004-b419-4260-80de-e3e04518f70d",
|
||||
@@ -591,7 +623,8 @@
|
||||
"title": "E12. US History - Understanding this Country | Finding the Balance",
|
||||
"summary": "The U.S. Constitution wasn’t built overnight—it was shaped by intense debates and hard-fought compromises. In this episode, we dive into The Great Compromise, The Three-Fifths Compromise, and how these decisions created the foundation for…",
|
||||
"publishedAt": "2025-02-16T04:57:29.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/98561452/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-1-16%2F394955738-44100-2-7d2c7d88c368.m4a"
|
||||
},
|
||||
{
|
||||
"id": "ba1a2bcc-8ba8-40f6-afef-5528a7dae897",
|
||||
@@ -600,7 +633,8 @@
|
||||
"title": "E11. US History - Understanding this Country | Building a nation from the scratch",
|
||||
"summary": "How did the U.S. go from revolution to a functioning government? Of course, it was not a cake walk. In this episode, we break down the period of Article of Confederation - the first government in the U.S, creation of the Constitution, the…",
|
||||
"publishedAt": "2025-02-09T04:42:25.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/98227236/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-1-9%2F394539098-44100-2-212c5fa4d510a.m4a"
|
||||
},
|
||||
{
|
||||
"id": "0c25ee7a-bc69-4791-995a-07cc9456f980",
|
||||
@@ -609,7 +643,8 @@
|
||||
"title": "E10. US History - Understanding this Country | The Revolution’s Final Stand",
|
||||
"summary": "The American Revolution wasn’t just won on battlefields—it was won through resilience, strategy, and unexpected allies. In this episode, we cover the final battles, the global impact of the war, and the unsung heroes who made independence…",
|
||||
"publishedAt": "2025-02-01T02:00:00.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/97766177/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-0-30%2F393965209-44100-2-301b990bd3a5a.m4a"
|
||||
},
|
||||
{
|
||||
"id": "047a6592-70d3-4ff9-9f2f-f6302c4091f0",
|
||||
@@ -618,7 +653,8 @@
|
||||
"title": "E9. US History - Understanding this Country | From Declaration to Victory",
|
||||
"summary": "Explore the gritty journey from the Declaration of Independence to the early milestones of the American Revolution. In this episode, we cover the Battle of Long Island, Washington’s daring Delaware crossing, the turning point at Saratoga,…",
|
||||
"publishedAt": "2025-01-26T04:01:00.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/97569318/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-0-26%2F393720338-44100-2-eeeb29f35922e.m4a"
|
||||
},
|
||||
{
|
||||
"id": "c7484015-9116-4cd2-ae10-95e10b25cfe2",
|
||||
@@ -627,7 +663,8 @@
|
||||
"title": "E8. US History - Understanding this Country | The Road to Independence",
|
||||
"summary": "Join us in Episode 8 of Irregular Mind as we explore the pivotal moments that shaped America's fight for freedom. From the Second Continental Congress to the bold stand at Bunker Hill, the Olive Branch Petition, and Washington’s victory in…",
|
||||
"publishedAt": "2025-01-18T05:08:28.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/97214840/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-0-18%2Fdbb916af-1d80-4a9c-940a-977cea9a00fd.m4a"
|
||||
},
|
||||
{
|
||||
"id": "3f3949a2-032d-41ed-bb40-29d5d39ecd63",
|
||||
@@ -636,7 +673,8 @@
|
||||
"title": "E7. US History - Understanding this Country | The British Are Coming",
|
||||
"summary": "Dive into the electrifying moments that sparked the American Revolution in this episode of Irregular Mind. From the bold actions of the Sons of Liberty and Patrick Henry’s fiery “Give me liberty or give me death” speech to the first shots…",
|
||||
"publishedAt": "2025-01-10T04:14:48.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/96847344/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-0-10%2F5324f9ad-08ae-e065-e84f-ce1716eca1c7.m4a"
|
||||
},
|
||||
{
|
||||
"id": "e415d267-4104-4f40-a6d8-364cd6c36ccb",
|
||||
@@ -645,7 +683,8 @@
|
||||
"title": "E6. US History - Understanding this Country | The Spark of Revolution",
|
||||
"summary": "In this episode of Irregular Mind, we trace the growing tensions that lit the fuse of the American Revolution. Explore the cries of “No Taxation Without Representation”, the defiance of the Stamp Act, and the fiery rhetoric of Patrick Henr…",
|
||||
"publishedAt": "2025-01-04T14:12:00.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/96502701/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2025-0-2%2F67a41fef-5353-4525-b259-1dc76c111c3e.m4a"
|
||||
},
|
||||
{
|
||||
"id": "82811636-1652-4d69-8c80-62a3021ecc18",
|
||||
@@ -654,7 +693,8 @@
|
||||
"title": "E5. US History - Understanding this Country | Colonial America: The Spark Before the Revolution",
|
||||
"summary": "Dive into the pivotal moments that set the stage for the American Revolution in this episode of Irregular Mind. Explore the impact of the English Bill of Rights, the Great Awakening, and the Intolerable Acts as tensions between Britain and…",
|
||||
"publishedAt": "2024-12-28T03:46:34.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/96337408/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2024-11-28%2F392191473-44100-2-151ecd13be558.m4a"
|
||||
},
|
||||
{
|
||||
"id": "edae75c4-3a65-4771-8445-ae4a76e9c6c9",
|
||||
@@ -663,7 +703,8 @@
|
||||
"title": "E4. US History - Understanding this Country | Colonial America: Roots of a New Nation",
|
||||
"summary": "Explore the birth of Colonial America in this episode of Irregular Mind. Discover the rise of Virginia, the establishment of the Thirteen Colonies, and how regional differences shaped the early American identity. From Jamestown’s struggles…",
|
||||
"publishedAt": "2024-12-20T13:30:00.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/95927257/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2024-11-17%2F391677742-44100-2-ea0a557d872b7.m4a"
|
||||
},
|
||||
{
|
||||
"id": "87c0d58b-ac9f-4017-a269-c7f16ff67587",
|
||||
@@ -672,7 +713,8 @@
|
||||
"title": "E3. US History - Understanding this Country | Empires, Exploration, and the Birth of Colonies",
|
||||
"summary": "Discover the dramatic shifts in power as the Spanish Armada falls, the rise of tobacco in Virginia, and the relentless search for the Northwest Passage. Explore the early European settlements, trade networks, and cultural exchanges that sh…",
|
||||
"publishedAt": "2024-12-17T04:34:51.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/95721830/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2024-11-12%2F391421749-44100-2-528bde0d8cb69.m4a"
|
||||
},
|
||||
{
|
||||
"id": "d8f3684a-1fab-4ff1-a638-d48564c870a5",
|
||||
@@ -681,7 +723,8 @@
|
||||
"title": "E2. US History - Understanding this Country | 1492 and Beyond: The Atlantic World Unveiled",
|
||||
"summary": "Uncover the pivotal moments that reshaped history in Episode Two of Irregular Mind's U.S. history series, \"Understanding This Country.\" From Columbus' daring voyage and the race for riches in 15th-century Europe to the clash of cultures, t…",
|
||||
"publishedAt": "2024-12-09T05:11:09.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/95563461/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2024-11-9%2F35bb2106-d023-5bda-ac51-291f03816da4.mp3"
|
||||
},
|
||||
{
|
||||
"id": "7f5c488b-3a7b-4d62-847c-fd5a807577a9",
|
||||
@@ -690,7 +733,8 @@
|
||||
"title": "E1. US History - Understanding this Country",
|
||||
"summary": "I came to the United States chasing opportunities, but I quickly realized that this land is more than just skyscrapers and Hollywood. The history of this place is layered, complicated, and, honestly, sometimes stranger than fiction. And th…",
|
||||
"publishedAt": "2024-12-02T05:02:25.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded/7490178/7490178-1644680234566-cf5628ab210f1.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/95226944/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2024-11-9%2F58a5abaf-88d1-bf43-c09b-63fff3fbeefa.mp3"
|
||||
},
|
||||
{
|
||||
"id": "f25afab7-54b8-4a61-bc0d-143986c7d475",
|
||||
@@ -699,7 +743,8 @@
|
||||
"title": "One Person - One Relation",
|
||||
"summary": "A common issue faced by most of us - relationships. Just a wakeup call on it.",
|
||||
"publishedAt": "2022-03-12T19:43:48.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded400/7490178/7490178-1644680237670-d15b3f1acda1b.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded400/7490178/7490178-1644680237670-d15b3f1acda1b.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/48954123/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fproduction%2Fexports%2F2d3db148%2F48954123%2F7881df2d251946b11f07aa114a313114.m4a"
|
||||
},
|
||||
{
|
||||
"id": "95b07a0e-6f13-4822-9d4f-2fa74dd4cff9",
|
||||
@@ -708,7 +753,8 @@
|
||||
"title": "Dharmaraja.- Conclusion",
|
||||
"summary": "Conclusion and Aftermath of Yogi's plot.",
|
||||
"publishedAt": "2022-02-05T19:28:44.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded_episode/7490178/7490178-1644089311927-91c36cb8383e5.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded_episode/7490178/7490178-1644089311927-91c36cb8383e5.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/47228562/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fproduction%2Fexports%2F2d3db148%2F47228562%2Fe1c5f1c941e23d8716f0531afc530901.m4a"
|
||||
},
|
||||
{
|
||||
"id": "e72fb42d-1f10-4fe6-842c-811e260a54e7",
|
||||
@@ -717,7 +763,8 @@
|
||||
"title": "Dharmaraja - Episode 28",
|
||||
"summary": "The final showdown. Major players face off. And Yogi does the undoable.",
|
||||
"publishedAt": "2022-02-05T19:02:09.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded_episode/7490178/7490178-1644087715926-5f708b8948277.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded_episode/7490178/7490178-1644087715926-5f708b8948277.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/47227651/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fproduction%2Fexports%2F2d3db148%2F47227651%2F3edd96c916d24c499670aa71135e7e18.m4a"
|
||||
},
|
||||
{
|
||||
"id": "e1c0d4dc-35e7-4cb7-b022-0bebef8c3ed1",
|
||||
@@ -726,7 +773,8 @@
|
||||
"title": "Dharmaraja - Episode 27",
|
||||
"summary": "Yogi is shocked with a surprise news. Relationship between brothers crack. Can Yogi see what kind of mess he is into?",
|
||||
"publishedAt": "2022-02-05T17:52:55.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded_episode/7490178/7490178-1644083569325-d4aaaf3e6d72.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded_episode/7490178/7490178-1644083569325-d4aaaf3e6d72.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/47224768/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fproduction%2Fexports%2F2d3db148%2F47224768%2F8edbd4996efddbd8e7e058889e1ff20b.m4a"
|
||||
},
|
||||
{
|
||||
"id": "677892be-4457-49cb-a2b1-b7a696ea7275",
|
||||
@@ -735,7 +783,8 @@
|
||||
"title": "Dharmaraja - Episode 26",
|
||||
"summary": "Helplessness grasps Chandrakkaran. Thripurasundarikunjamma sees visions...",
|
||||
"publishedAt": "2022-02-04T21:12:06.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded_episode/7490178/7490178-1644083230812-bbcda04085e26.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded_episode/7490178/7490178-1644083230812-bbcda04085e26.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/47186638/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fproduction%2Fexports%2F2d3db148%2F47186638%2Fdcbf3696cbde84e8db2d1bde36aebc7b.m4a"
|
||||
},
|
||||
{
|
||||
"id": "8a09387c-bee8-46b9-97f1-828e28dfa09a",
|
||||
@@ -744,7 +793,8 @@
|
||||
"title": "Dharmaraja - Episode 25",
|
||||
"summary": "Conflict comes to day light. Kesavan Kunju escapes. Padathalavan is all out beast mode after knowing what happened to Kuppassar.",
|
||||
"publishedAt": "2022-02-03T21:23:34.000Z",
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded_episode/7490178/7490178-1643923406877-eef4729d8dab5.jpg"
|
||||
"thumbnailUrl": "https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded_episode/7490178/7490178-1643923406877-eef4729d8dab5.jpg",
|
||||
"audioUrl": "https://anchor.fm/s/2d3db148/podcast/play/47135056/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fproduction%2Fexports%2F2d3db148%2F47135056%2F90996aae5ca4bb6cb4103e2adc0c9c5e.m4a"
|
||||
}
|
||||
],
|
||||
"wordpress": {
|
||||
|
||||
3
site/content/podcast-spotify-map.example.json
Normal file
3
site/content/podcast-spotify-map.example.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"2dad79d8-ed54-42a8-91a1-4c12a22e3070": "https://open.spotify.com/episode/EPISODE_ID"
|
||||
}
|
||||
@@ -386,6 +386,15 @@ textarea:focus-visible {
|
||||
background 120ms ease;
|
||||
}
|
||||
|
||||
button.card {
|
||||
padding: 0;
|
||||
font: inherit;
|
||||
color: inherit;
|
||||
text-align: left;
|
||||
cursor: pointer;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.card-media {
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
@@ -573,3 +582,335 @@ textarea:focus-visible {
|
||||
height: 200px;
|
||||
}
|
||||
}
|
||||
|
||||
/* --- Media Modal --- */
|
||||
|
||||
#media-modal {
|
||||
max-width: 800px;
|
||||
width: calc(100vw - 48px);
|
||||
max-height: 90vh;
|
||||
border-radius: 20px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.16);
|
||||
background: var(--bg1);
|
||||
color: var(--fg);
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
box-shadow:
|
||||
0 24px 80px rgba(0, 0, 0, 0.6),
|
||||
0 0 0 1px rgba(255, 255, 255, 0.08) inset;
|
||||
}
|
||||
|
||||
#media-modal::backdrop {
|
||||
background: rgba(0, 0, 0, 0.75);
|
||||
backdrop-filter: blur(8px);
|
||||
}
|
||||
|
||||
.media-modal-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
.media-modal-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 16px;
|
||||
padding: 20px 24px;
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
.media-modal-header-left {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 14px;
|
||||
min-width: 0;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.media-modal-thumb {
|
||||
display: none;
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
border-radius: 14px;
|
||||
object-fit: cover;
|
||||
border: 1px solid rgba(255, 255, 255, 0.14);
|
||||
background: rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
|
||||
.media-modal-title-wrap {
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.media-modal-kicker {
|
||||
font-size: 11px;
|
||||
letter-spacing: 0.12em;
|
||||
text-transform: uppercase;
|
||||
color: var(--muted);
|
||||
margin: 0 0 6px;
|
||||
}
|
||||
|
||||
.media-modal-title {
|
||||
margin: 0;
|
||||
font-size: 20px;
|
||||
font-weight: 800;
|
||||
line-height: 1.3;
|
||||
letter-spacing: -0.02em;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.media-modal-close {
|
||||
flex: 0 0 auto;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 999px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.14);
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
color: var(--fg);
|
||||
cursor: pointer;
|
||||
transition:
|
||||
background 120ms ease,
|
||||
transform 120ms ease;
|
||||
}
|
||||
|
||||
.media-modal-close:hover {
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
transform: scale(1.05);
|
||||
}
|
||||
|
||||
.media-modal-embed-container {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
aspect-ratio: 16 / 9;
|
||||
background: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.media-modal-embed-container[data-embed-kind="spotify"],
|
||||
.media-modal-embed-container[data-embed-kind="audio"],
|
||||
.media-modal-embed-container[data-embed-kind="fallback"] {
|
||||
margin: 14px 24px 0;
|
||||
width: calc(100% - 48px);
|
||||
}
|
||||
|
||||
.media-modal-embed-container[data-embed-kind="spotify"] {
|
||||
aspect-ratio: auto;
|
||||
height: 232px;
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
border-radius: 12px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.media-modal-embed-container[data-embed-kind="audio"] {
|
||||
aspect-ratio: auto;
|
||||
height: auto;
|
||||
padding: 12px;
|
||||
background: linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.03));
|
||||
border-radius: 12px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.media-modal-embed-placeholder {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
z-index: 1;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.media-modal-embed-fallback {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
display: none;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 12px 14px;
|
||||
border-radius: 12px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.16);
|
||||
background: rgba(10, 14, 28, 0.55);
|
||||
color: var(--fg);
|
||||
font-weight: 700;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.media-modal-embed-container[data-embed-kind="fallback"] .media-modal-embed-placeholder::before,
|
||||
.media-modal-embed-container[data-embed-kind="fallback"] .media-modal-embed-placeholder::after {
|
||||
display: none;
|
||||
animation: none;
|
||||
}
|
||||
|
||||
.media-modal-embed-container[data-embed-kind="fallback"] .media-modal-embed-placeholder {
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
}
|
||||
|
||||
.media-modal-embed-container[data-embed-kind="fallback"] .media-modal-embed-fallback {
|
||||
display: inline-flex;
|
||||
}
|
||||
|
||||
.media-modal-embed-placeholder::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
z-index: 1;
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
transparent 0%,
|
||||
rgba(255, 255, 255, 0.12) 35%,
|
||||
rgba(255, 255, 255, 0.22) 50%,
|
||||
rgba(255, 255, 255, 0.12) 65%,
|
||||
transparent 100%
|
||||
);
|
||||
animation: shimmer 1.6s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.media-modal-embed-placeholder::after {
|
||||
content: "";
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border: 3px solid rgba(255, 255, 255, 0.2);
|
||||
border-top-color: var(--accent2);
|
||||
border-radius: 50%;
|
||||
animation: spin 0.8s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
.media-modal-embed {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border: 0;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.media-modal-embed-container[data-embed-kind="spotify"] .media-modal-embed,
|
||||
.media-modal-embed-container[data-embed-kind="spotify"] .media-modal-embed-placeholder {
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.media-modal-audio {
|
||||
display: none;
|
||||
width: 100%;
|
||||
height: 44px;
|
||||
color-scheme: dark;
|
||||
accent-color: var(--accent2);
|
||||
}
|
||||
|
||||
.media-modal-embed-container[data-embed-kind="audio"] .media-modal-audio {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.media-modal-audio::-webkit-media-controls-enclosure {
|
||||
border-radius: 12px;
|
||||
}
|
||||
|
||||
.media-modal-audio::-webkit-media-controls-panel {
|
||||
background: rgba(10, 14, 28, 0.55);
|
||||
}
|
||||
|
||||
.media-modal-body {
|
||||
padding: 24px;
|
||||
flex: 1 1 auto;
|
||||
}
|
||||
|
||||
.media-modal-description {
|
||||
margin: 0 0 16px;
|
||||
line-height: 1.6;
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.media-modal-meta {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
font-size: 14px;
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.media-modal-meta span:not(:last-child)::after {
|
||||
content: "•";
|
||||
margin-left: 12px;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.media-modal-ctas {
|
||||
display: flex;
|
||||
gap: 12px;
|
||||
padding: 16px 24px 24px;
|
||||
border-top: 1px solid rgba(255, 255, 255, 0.08);
|
||||
}
|
||||
|
||||
.media-modal-ctas .cta {
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
padding: 12px 16px;
|
||||
border-radius: 14px;
|
||||
border: 1px solid var(--stroke);
|
||||
background: linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.03));
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.01em;
|
||||
transition:
|
||||
background 120ms ease,
|
||||
transform 120ms ease;
|
||||
}
|
||||
|
||||
.media-modal-ctas .cta:hover {
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.media-modal-ctas .cta.primary {
|
||||
border-color: rgba(94, 228, 255, 0.55);
|
||||
background: linear-gradient(135deg, rgba(94, 228, 255, 0.24), rgba(255, 205, 74, 0.16));
|
||||
box-shadow:
|
||||
0 0 0 3px rgba(94, 228, 255, 0.14),
|
||||
0 10px 30px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
|
||||
@media (max-width: 760px) {
|
||||
#media-modal {
|
||||
max-width: 96vw;
|
||||
max-height: 94vh;
|
||||
width: 96vw;
|
||||
}
|
||||
|
||||
.media-modal-header {
|
||||
padding: 16px 20px;
|
||||
}
|
||||
|
||||
.media-modal-embed-container[data-embed-kind="spotify"],
|
||||
.media-modal-embed-container[data-embed-kind="audio"],
|
||||
.media-modal-embed-container[data-embed-kind="fallback"] {
|
||||
margin: 12px 20px 0;
|
||||
width: calc(100% - 40px);
|
||||
}
|
||||
|
||||
.media-modal-title {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.media-modal-body {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.media-modal-ctas {
|
||||
flex-direction: column;
|
||||
padding: 12px 20px 20px;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,41 @@ function dedupe(items: ContentItem[]): ContentItem[] {
|
||||
return out;
|
||||
}
|
||||
|
||||
function normalizeSpotifyEpisodeUrl(value: string): string | undefined {
|
||||
const v = (value || "").trim();
|
||||
if (!v) return undefined;
|
||||
|
||||
if (v.startsWith("https://open.spotify.com/episode/")) return v;
|
||||
if (v.startsWith("https://open.spotify.com/embed/episode/")) {
|
||||
return v.replace("/embed/episode/", "/episode/");
|
||||
}
|
||||
|
||||
if (v.startsWith("spotify:episode:")) {
|
||||
const id = v.split(":")[2];
|
||||
if (!id) return undefined;
|
||||
return `https://open.spotify.com/episode/${id}`;
|
||||
}
|
||||
|
||||
if (/^[A-Za-z0-9]{10,30}$/.test(v)) {
|
||||
return `https://open.spotify.com/episode/${v}`;
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
async function readPodcastSpotifyOverrideMap(logFn: (msg: string) => void) {
|
||||
const mapPath = path.join(process.cwd(), "content", "podcast-spotify-map.json");
|
||||
try {
|
||||
const raw = await fs.readFile(mapPath, "utf8");
|
||||
const parsed = JSON.parse(raw) as Record<string, string>;
|
||||
if (!parsed || typeof parsed !== "object") return undefined;
|
||||
return parsed;
|
||||
} catch {
|
||||
logFn("Podcast: spotify override map not found (content/podcast-spotify-map.json)");
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const cfg = getIngestConfigFromEnv(process.env);
|
||||
const generatedAt = new Date().toISOString();
|
||||
@@ -101,6 +136,23 @@ async function main() {
|
||||
);
|
||||
log(`Podcast: RSS ${cached ? "cache" : "live"} (${items.length} items)`);
|
||||
log(`Podcast: RSS ok (${items.length} items)`);
|
||||
|
||||
const overrideMap = await readPodcastSpotifyOverrideMap(log);
|
||||
if (overrideMap) {
|
||||
let overridden = 0;
|
||||
for (const it of items) {
|
||||
if (it.source !== "podcast") continue;
|
||||
const mapped = overrideMap[it.id] || overrideMap[it.url];
|
||||
const nextUrl = mapped ? normalizeSpotifyEpisodeUrl(mapped) : undefined;
|
||||
if (!nextUrl) continue;
|
||||
it.url = nextUrl;
|
||||
overridden++;
|
||||
}
|
||||
if (overridden > 0) {
|
||||
log(`Podcast: applied Spotify URL overrides (${overridden} items)`);
|
||||
}
|
||||
}
|
||||
|
||||
all.push(...items);
|
||||
} catch (e) {
|
||||
log(`Podcast: RSS failed (${String(e)})`);
|
||||
|
||||
@@ -20,17 +20,10 @@ const { categories, activeCategorySlug } = Astro.props;
|
||||
>
|
||||
All
|
||||
</a>
|
||||
<a
|
||||
class={activeCategorySlug === "__pages" ? "active" : ""}
|
||||
href="/blog/pages"
|
||||
data-umami-event="click"
|
||||
data-umami-event-target_id="blog.subnav.pages"
|
||||
data-umami-event-placement="blog.subnav"
|
||||
data-umami-event-target_url="/blog/pages"
|
||||
>
|
||||
Pages
|
||||
</a>
|
||||
{categories.map((c) => (
|
||||
|
||||
{categories
|
||||
.filter((c) => c.slug !== "uncategorized")
|
||||
.map((c) => (
|
||||
<a
|
||||
class={activeCategorySlug === c.slug ? "active" : ""}
|
||||
href={`/blog/category/${c.slug}`}
|
||||
|
||||
@@ -35,18 +35,34 @@ const umamiType =
|
||||
: undefined;
|
||||
|
||||
const umamiTitle = umamiType ? truncate(item.title, 160) : undefined;
|
||||
---
|
||||
|
||||
<StandardCard
|
||||
href={item.url}
|
||||
title={item.title}
|
||||
summary={item.summary}
|
||||
imageUrl={item.thumbnailUrl}
|
||||
dateLabel={dateLabel}
|
||||
viewsLabel={item.metrics?.views !== undefined ? `${item.metrics.views.toLocaleString()} views` : undefined}
|
||||
sourceLabel={item.source}
|
||||
isExternal={true}
|
||||
linkAttrs={{
|
||||
// Determine if card should open modal (youtube/podcast) or link normally (other sources)
|
||||
const isModalTrigger = item.source === "youtube" || item.source === "podcast";
|
||||
const mode = isModalTrigger ? "modal" : "link";
|
||||
|
||||
// Build link attrs based on mode
|
||||
const linkAttrs = isModalTrigger
|
||||
? {
|
||||
// Modal trigger: pass all item data via data-* attributes
|
||||
"data-item-id": item.id,
|
||||
"data-item-source": item.source,
|
||||
"data-item-url": item.url,
|
||||
"data-item-title": item.title,
|
||||
"data-item-summary": item.summary || "",
|
||||
"data-item-published-at": item.publishedAt,
|
||||
"data-item-thumbnail-url": item.thumbnailUrl || "",
|
||||
"data-item-audio-url": item.source === "podcast" ? item.audioUrl || "" : "",
|
||||
"data-item-views": item.metrics?.views?.toString() || "",
|
||||
// Umami tracking: media_preview instead of outbound_click
|
||||
"data-umami-event": "media_preview",
|
||||
"data-umami-event-target_id": targetId,
|
||||
"data-umami-event-placement": placement,
|
||||
"data-umami-event-title": umamiTitle,
|
||||
"data-umami-event-type": umamiType,
|
||||
"data-umami-event-source": item.source,
|
||||
}
|
||||
: {
|
||||
// Normal link: outbound_click tracking
|
||||
"data-umami-event": "outbound_click",
|
||||
"data-umami-event-target_id": targetId,
|
||||
"data-umami-event-placement": placement,
|
||||
@@ -56,5 +72,18 @@ const umamiTitle = umamiType ? truncate(item.title, 160) : undefined;
|
||||
"data-umami-event-domain": domain || "unknown",
|
||||
"data-umami-event-source": item.source,
|
||||
"data-umami-event-ui_placement": "content_card",
|
||||
}}
|
||||
};
|
||||
---
|
||||
|
||||
<StandardCard
|
||||
href={isModalTrigger ? undefined : item.url}
|
||||
title={item.title}
|
||||
summary={item.summary}
|
||||
imageUrl={item.thumbnailUrl}
|
||||
dateLabel={dateLabel}
|
||||
viewsLabel={item.metrics?.views !== undefined ? `${item.metrics.views.toLocaleString()} views` : undefined}
|
||||
sourceLabel={item.source}
|
||||
isExternal={!isModalTrigger}
|
||||
mode={mode}
|
||||
linkAttrs={linkAttrs}
|
||||
/>
|
||||
|
||||
398
site/src/components/MediaModal.astro
Normal file
398
site/src/components/MediaModal.astro
Normal file
@@ -0,0 +1,398 @@
|
||||
---
|
||||
import { LINKS } from "../lib/links";
|
||||
---
|
||||
|
||||
<dialog id="media-modal" aria-modal="true" aria-labelledby="media-modal-title">
|
||||
<div class="media-modal-content">
|
||||
<div class="media-modal-header">
|
||||
<div class="media-modal-header-left">
|
||||
<img class="media-modal-thumb" alt="" loading="lazy" />
|
||||
<div class="media-modal-title-wrap">
|
||||
<div class="media-modal-kicker"></div>
|
||||
<h2 id="media-modal-title" class="media-modal-title"></h2>
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" class="media-modal-close" aria-label="Close" data-close-method="button">
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<line x1="18" y1="6" x2="6" y2="18"></line>
|
||||
<line x1="6" y1="6" x2="18" y2="18"></line>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="media-modal-embed-container" data-embed-kind="">
|
||||
<div class="media-modal-embed-placeholder">
|
||||
<a class="media-modal-embed-fallback" target="_blank" rel="noopener noreferrer"></a>
|
||||
</div>
|
||||
<iframe
|
||||
class="media-modal-embed"
|
||||
title="Media embed"
|
||||
width="100%"
|
||||
frameborder="0"
|
||||
allowfullscreen
|
||||
></iframe>
|
||||
<audio class="media-modal-audio" controls></audio>
|
||||
</div>
|
||||
|
||||
<div class="media-modal-body">
|
||||
<p class="media-modal-description"></p>
|
||||
<div class="media-modal-meta">
|
||||
<span class="media-modal-date"></span>
|
||||
<span class="media-modal-views"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="media-modal-ctas">
|
||||
<a class="cta primary media-modal-cta-follow" target="_blank" rel="me noopener noreferrer"></a>
|
||||
<a class="cta media-modal-cta-view" target="_blank" rel="me noopener noreferrer"></a>
|
||||
</div>
|
||||
</div>
|
||||
</dialog>
|
||||
|
||||
<script is:inline define:vars={{ youtubeChannelUrl: LINKS.youtubeChannel, podcastUrl: LINKS.podcast }}>
|
||||
(function() {
|
||||
const dialog = document.getElementById("media-modal");
|
||||
const dialogContent = dialog.querySelector(".media-modal-content");
|
||||
const kickerEl = dialog.querySelector(".media-modal-kicker");
|
||||
const thumbEl = dialog.querySelector(".media-modal-thumb");
|
||||
const titleEl = dialog.querySelector(".media-modal-title");
|
||||
const embedContainer = dialog.querySelector(".media-modal-embed-container");
|
||||
const embedPlaceholder = dialog.querySelector(".media-modal-embed-placeholder");
|
||||
const embedFallback = dialog.querySelector(".media-modal-embed-fallback");
|
||||
const iframe = dialog.querySelector(".media-modal-embed");
|
||||
const audio = dialog.querySelector(".media-modal-audio");
|
||||
const descriptionEl = dialog.querySelector(".media-modal-description");
|
||||
const dateEl = dialog.querySelector(".media-modal-date");
|
||||
const viewsEl = dialog.querySelector(".media-modal-views");
|
||||
const followCta = dialog.querySelector(".media-modal-cta-follow");
|
||||
const viewCta = dialog.querySelector(".media-modal-cta-view");
|
||||
const closeBtn = dialog.querySelector(".media-modal-close");
|
||||
|
||||
let triggerElement = null;
|
||||
let currentTargetId = null;
|
||||
|
||||
// Extract video ID from YouTube URL
|
||||
function extractYoutubeId(url) {
|
||||
try {
|
||||
const u = new URL(url);
|
||||
// Handle youtube.com/watch?v=ID
|
||||
if (u.hostname.includes("youtube.com") && u.searchParams.has("v")) {
|
||||
return u.searchParams.get("v");
|
||||
}
|
||||
// Handle youtu.be/ID
|
||||
if (u.hostname.includes("youtu.be")) {
|
||||
return u.pathname.slice(1).split("/")[0];
|
||||
}
|
||||
} catch (e) {}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Extract Spotify episode ID from URL
|
||||
function extractSpotifyEpisodeId(input) {
|
||||
try {
|
||||
const u = new URL(String(input));
|
||||
if (!u.hostname.includes("spotify.com")) return null;
|
||||
const match = u.pathname.match(/\/episode\/([^/?]+)/);
|
||||
return match ? match[1] : null;
|
||||
} catch (e) {}
|
||||
return null;
|
||||
}
|
||||
|
||||
function extractSpotifyEpisodeIdFromGuid(guid) {
|
||||
const s = String(guid || "").trim();
|
||||
if (!s) return null;
|
||||
|
||||
// spotify:episode:EPISODE_ID
|
||||
if (s.startsWith("spotify:episode:")) {
|
||||
const parts = s.split(":");
|
||||
return parts.length >= 3 ? parts[2] : null;
|
||||
}
|
||||
|
||||
// URL form
|
||||
const fromUrl = extractSpotifyEpisodeId(s);
|
||||
if (fromUrl) return fromUrl;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function getEmbed(source, itemUrl, itemId) {
|
||||
if (source === "youtube") {
|
||||
const videoId = extractYoutubeId(itemUrl);
|
||||
if (!videoId) return null;
|
||||
return {
|
||||
kind: "youtube",
|
||||
src: `https://www.youtube.com/embed/${videoId}?rel=0&modestbranding=1`,
|
||||
};
|
||||
}
|
||||
|
||||
if (source === "podcast") {
|
||||
const episodeId =
|
||||
extractSpotifyEpisodeId(itemUrl) ||
|
||||
extractSpotifyEpisodeIdFromGuid(itemId) ||
|
||||
extractSpotifyEpisodeId(itemId);
|
||||
if (!episodeId) return null;
|
||||
return {
|
||||
kind: "spotify",
|
||||
src: `https://open.spotify.com/embed/episode/${episodeId}`,
|
||||
height: 232,
|
||||
};
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
// Add UTM parameters to URL
|
||||
function withUtm(url, utmParams) {
|
||||
const u = new URL(url);
|
||||
for (const [key, value] of Object.entries(utmParams)) {
|
||||
if (value) u.searchParams.set(key, value);
|
||||
}
|
||||
return u.toString();
|
||||
}
|
||||
|
||||
function withYoutubeSubscribePrompt(url) {
|
||||
try {
|
||||
const u = new URL(url);
|
||||
u.searchParams.set("sub_confirmation", "1");
|
||||
return u.toString();
|
||||
} catch {
|
||||
return url;
|
||||
}
|
||||
}
|
||||
|
||||
// Stop playback by blanking the iframe
|
||||
function stopPlayback() {
|
||||
iframe.src = "about:blank";
|
||||
embedPlaceholder.style.display = "block";
|
||||
embedContainer.dataset.embedKind = "";
|
||||
iframe.style.display = "";
|
||||
embedFallback.style.display = "none";
|
||||
embedFallback.removeAttribute("href");
|
||||
audio.pause();
|
||||
audio.removeAttribute("src");
|
||||
audio.style.display = "none";
|
||||
thumbEl.removeAttribute("src");
|
||||
thumbEl.style.display = "none";
|
||||
kickerEl.textContent = "";
|
||||
iframe.removeAttribute("allow");
|
||||
iframe.removeAttribute("height");
|
||||
}
|
||||
|
||||
// Close modal
|
||||
function closeModal(method) {
|
||||
if (!dialog.open) return;
|
||||
|
||||
stopPlayback();
|
||||
dialog.close();
|
||||
|
||||
// Emit media_preview_close event if Umami is available
|
||||
if (typeof window.umami !== "undefined" && currentTargetId) {
|
||||
window.umami.track("media_preview_close", {
|
||||
target_id: currentTargetId,
|
||||
close_method: method || "unknown"
|
||||
});
|
||||
}
|
||||
|
||||
// Restore focus to trigger element
|
||||
if (triggerElement) {
|
||||
triggerElement.focus();
|
||||
triggerElement = null;
|
||||
}
|
||||
|
||||
currentTargetId = null;
|
||||
}
|
||||
|
||||
// Open and populate modal
|
||||
function openModal(cardEl) {
|
||||
// Store trigger for focus return
|
||||
triggerElement = cardEl;
|
||||
|
||||
// Read data attributes
|
||||
const itemId = cardEl.dataset.itemId;
|
||||
const source = cardEl.dataset.itemSource;
|
||||
const url = cardEl.dataset.itemUrl;
|
||||
const audioUrl = cardEl.dataset.itemAudioUrl;
|
||||
const title = cardEl.dataset.itemTitle;
|
||||
const summary = cardEl.dataset.itemSummary;
|
||||
const publishedAt = cardEl.dataset.itemPublishedAt;
|
||||
const thumbnailUrl = cardEl.dataset.itemThumbnailUrl;
|
||||
const views = cardEl.dataset.itemViews;
|
||||
|
||||
// Store target ID for close tracking
|
||||
currentTargetId = cardEl.dataset.umamiEventTargetId;
|
||||
|
||||
kickerEl.textContent = source === "podcast" ? "Podcast" : source === "youtube" ? "Video" : "";
|
||||
if (source === "podcast" && thumbnailUrl) {
|
||||
thumbEl.src = thumbnailUrl;
|
||||
thumbEl.style.display = "block";
|
||||
} else {
|
||||
thumbEl.removeAttribute("src");
|
||||
thumbEl.style.display = "none";
|
||||
}
|
||||
|
||||
// Populate title
|
||||
titleEl.textContent = title || "";
|
||||
|
||||
// Populate description
|
||||
descriptionEl.textContent = summary || "";
|
||||
|
||||
// Populate date
|
||||
if (publishedAt) {
|
||||
const d = new Date(publishedAt);
|
||||
const formatted = Number.isFinite(d.valueOf())
|
||||
? d.toLocaleDateString(undefined, { year: "numeric", month: "short", day: "numeric" })
|
||||
: "";
|
||||
dateEl.textContent = formatted;
|
||||
dateEl.style.display = formatted ? "" : "none";
|
||||
} else {
|
||||
dateEl.style.display = "none";
|
||||
}
|
||||
|
||||
// Populate views
|
||||
if (views && views !== "") {
|
||||
const viewsNum = parseInt(views, 10);
|
||||
viewsEl.textContent = `${viewsNum.toLocaleString()} views`;
|
||||
viewsEl.style.display = "";
|
||||
} else {
|
||||
viewsEl.style.display = "none";
|
||||
}
|
||||
|
||||
// Construct embed
|
||||
const embed = getEmbed(source, url, itemId);
|
||||
if (embed) {
|
||||
embedContainer.dataset.embedKind = embed.kind;
|
||||
embedPlaceholder.style.display = "block";
|
||||
embedFallback.style.display = "none";
|
||||
embedFallback.removeAttribute("href");
|
||||
iframe.style.display = "";
|
||||
|
||||
if (embed.kind === "spotify") {
|
||||
iframe.setAttribute(
|
||||
"allow",
|
||||
"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture",
|
||||
);
|
||||
if (embed.height) iframe.setAttribute("height", String(embed.height));
|
||||
} else {
|
||||
iframe.setAttribute(
|
||||
"allow",
|
||||
"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
|
||||
);
|
||||
iframe.removeAttribute("height");
|
||||
}
|
||||
|
||||
iframe.src = embed.src;
|
||||
iframe.addEventListener("load", function onLoad() {
|
||||
embedPlaceholder.style.display = "none";
|
||||
iframe.removeEventListener("load", onLoad);
|
||||
});
|
||||
embedContainer.style.display = "block";
|
||||
} else {
|
||||
// No embed available
|
||||
if (source === "podcast") {
|
||||
embedContainer.style.display = "block";
|
||||
iframe.src = "about:blank";
|
||||
iframe.style.display = "none";
|
||||
|
||||
if (audioUrl) {
|
||||
embedContainer.dataset.embedKind = "audio";
|
||||
embedPlaceholder.style.display = "none";
|
||||
embedFallback.style.display = "none";
|
||||
audio.style.display = "block";
|
||||
audio.src = audioUrl;
|
||||
} else {
|
||||
embedContainer.dataset.embedKind = "fallback";
|
||||
embedPlaceholder.style.display = "flex";
|
||||
embedFallback.style.display = "inline-flex";
|
||||
embedFallback.href = url;
|
||||
embedFallback.textContent = "Listen on Spotify";
|
||||
audio.style.display = "none";
|
||||
}
|
||||
} else {
|
||||
embedContainer.style.display = "none";
|
||||
}
|
||||
}
|
||||
|
||||
const platform = source === "youtube" ? "youtube" : "spotify";
|
||||
const channelUrl = source === "youtube" ? youtubeChannelUrl : podcastUrl;
|
||||
|
||||
const followAction = source === "youtube" ? "subscribe" : "follow";
|
||||
const viewAction = source === "youtube" ? "view" : "listen";
|
||||
|
||||
const followLabel = source === "youtube" ? "Subscribe on YouTube" : "Follow on Spotify";
|
||||
const viewLabel = source === "youtube" ? "View on YouTube" : "Listen on Spotify";
|
||||
|
||||
const followBaseUrl = source === "youtube" ? withYoutubeSubscribePrompt(channelUrl) : channelUrl;
|
||||
|
||||
const followUrl = withUtm(followBaseUrl, {
|
||||
utm_source: "website",
|
||||
utm_medium: "cta",
|
||||
utm_campaign: "social-acquisition",
|
||||
utm_content: `${platform}:media_modal`,
|
||||
});
|
||||
followCta.href = followUrl;
|
||||
followCta.textContent = followLabel;
|
||||
followCta.setAttribute("data-umami-event", "cta_click");
|
||||
followCta.setAttribute("data-umami-event-target_id", `modal.cta.${followAction}.${platform}`);
|
||||
followCta.setAttribute("data-umami-event-placement", "media_modal");
|
||||
followCta.setAttribute("data-umami-event-platform", platform);
|
||||
followCta.setAttribute("data-umami-event-target_url", channelUrl);
|
||||
|
||||
const viewUrl = withUtm(url, {
|
||||
utm_source: "website",
|
||||
utm_medium: "cta",
|
||||
utm_campaign: "social-acquisition",
|
||||
utm_content: `${platform}:media_modal`,
|
||||
});
|
||||
viewCta.href = viewUrl;
|
||||
viewCta.textContent = viewLabel;
|
||||
viewCta.setAttribute("data-umami-event", "cta_click");
|
||||
viewCta.setAttribute("data-umami-event-target_id", `modal.cta.${viewAction}.${platform}`);
|
||||
viewCta.setAttribute("data-umami-event-placement", "media_modal");
|
||||
viewCta.setAttribute("data-umami-event-platform", platform);
|
||||
viewCta.setAttribute("data-umami-event-target_url", url);
|
||||
|
||||
// Open the dialog
|
||||
dialog.showModal();
|
||||
}
|
||||
|
||||
// Listen for clicks on modal-trigger cards
|
||||
document.addEventListener("click", function(e) {
|
||||
const card = e.target.closest("button.card[data-item-id]");
|
||||
if (card) {
|
||||
e.preventDefault();
|
||||
openModal(card);
|
||||
}
|
||||
});
|
||||
|
||||
// Close button
|
||||
closeBtn.addEventListener("click", function() {
|
||||
closeModal("button");
|
||||
});
|
||||
|
||||
// Backdrop click
|
||||
dialog.addEventListener("click", function(e) {
|
||||
if (e.target === dialog) {
|
||||
closeModal("backdrop");
|
||||
}
|
||||
});
|
||||
|
||||
// Escape key (native dialog handles the close, we hook into the close event)
|
||||
dialog.addEventListener("close", function() {
|
||||
// If dialog was closed but we didn't call closeModal explicitly (i.e., Escape key)
|
||||
if (dialog.open === false && currentTargetId) {
|
||||
stopPlayback();
|
||||
if (typeof window.umami !== "undefined") {
|
||||
window.umami.track("media_preview_close", {
|
||||
target_id: currentTargetId,
|
||||
close_method: "escape"
|
||||
});
|
||||
}
|
||||
if (triggerElement) {
|
||||
triggerElement.focus();
|
||||
triggerElement = null;
|
||||
}
|
||||
currentTargetId = null;
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
type Props = {
|
||||
href: string;
|
||||
href?: string;
|
||||
title: string;
|
||||
summary?: string;
|
||||
imageUrl?: string;
|
||||
@@ -9,6 +9,7 @@ type Props = {
|
||||
sourceLabel: string;
|
||||
isExternal?: boolean;
|
||||
linkAttrs?: Record<string, any>;
|
||||
mode?: "link" | "modal";
|
||||
};
|
||||
|
||||
const {
|
||||
@@ -21,6 +22,7 @@ const {
|
||||
sourceLabel,
|
||||
isExternal,
|
||||
linkAttrs,
|
||||
mode = "link",
|
||||
} = Astro.props;
|
||||
|
||||
function truncate(s: string, n: number) {
|
||||
@@ -33,14 +35,21 @@ function truncate(s: string, n: number) {
|
||||
|
||||
const summaryText = truncate(summary || "", 180);
|
||||
|
||||
const Element = mode === "modal" ? "button" : "a";
|
||||
const elementProps = mode === "modal"
|
||||
? { type: "button", ...linkAttrs }
|
||||
: {
|
||||
href,
|
||||
target: isExternal ? "_blank" : undefined,
|
||||
rel: isExternal ? "noopener noreferrer" : undefined,
|
||||
...linkAttrs
|
||||
};
|
||||
|
||||
---
|
||||
|
||||
<a
|
||||
<Element
|
||||
class="card"
|
||||
href={href}
|
||||
target={isExternal ? "_blank" : undefined}
|
||||
rel={isExternal ? "noopener noreferrer" : undefined}
|
||||
{...(linkAttrs || {})}
|
||||
{...elementProps}
|
||||
>
|
||||
<div class="card-media">
|
||||
{imageUrl ? (
|
||||
@@ -66,4 +75,4 @@ const summaryText = truncate(summary || "", 180);
|
||||
<span class={`pill pill-${sourceLabel}`}>{sourceLabel}</span>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</Element>
|
||||
|
||||
@@ -12,6 +12,7 @@ export type ContentItem = {
|
||||
summary?: string;
|
||||
publishedAt: string; // ISO-8601
|
||||
thumbnailUrl?: string;
|
||||
audioUrl?: string;
|
||||
metrics?: ContentMetrics;
|
||||
};
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ export function normalizePodcastFeedItems(items: any[], limit: number): ContentI
|
||||
const out = (items || []).slice(0, limit).map((it) => {
|
||||
const url = it.link || "";
|
||||
const id = (it.guid || it.id || url).toString();
|
||||
const audioUrl = (it.enclosure?.url || "").toString();
|
||||
const publishedAt = (it.isoDate || it.pubDate || new Date(0).toISOString()).toString();
|
||||
const summary = truncate(
|
||||
(it.contentSnippet ||
|
||||
@@ -44,6 +45,7 @@ export function normalizePodcastFeedItems(items: any[], limit: number): ContentI
|
||||
summary: summary || undefined,
|
||||
publishedAt: new Date(publishedAt).toISOString(),
|
||||
thumbnailUrl: (it.itunes?.image || undefined) as string | undefined,
|
||||
audioUrl: audioUrl || undefined,
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
export const LINKS = {
|
||||
youtubeChannel: "https://www.youtube.com/santhoshj",
|
||||
instagramProfile: "https://www.instagram.com/santhoshjanan/",
|
||||
podcast: "https://podcasters.spotify.com/pod/show/irregularmind", // default; override in CTA props if needed
|
||||
podcast: "https://creators.spotify.com/pod/profile/the-irregular-mind/",
|
||||
};
|
||||
|
||||
@@ -3,6 +3,7 @@ import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
import CtaLink from "../components/CtaLink.astro";
|
||||
import ContentCard from "../components/ContentCard.astro";
|
||||
import InstagramEmbed from "../components/InstagramEmbed.astro";
|
||||
import MediaModal from "../components/MediaModal.astro";
|
||||
import { readContentCache } from "../lib/content/cache";
|
||||
import {
|
||||
newestItems,
|
||||
@@ -240,4 +241,6 @@ const newYorkTime = new Date(cache.generatedAt).toLocaleString('en-US', options)
|
||||
<CtaLink platform="podcast" placement="footer_cta" url={LINKS.podcast} label="Podcast" />
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<MediaModal />
|
||||
</BaseLayout>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
import ContentCard from "../components/ContentCard.astro";
|
||||
import MediaModal from "../components/MediaModal.astro";
|
||||
import { readContentCache } from "../lib/content/cache";
|
||||
import { podcastEpisodes } from "../lib/content/selectors";
|
||||
|
||||
@@ -35,4 +36,6 @@ const episodes = podcastEpisodes(cache).sort(
|
||||
)
|
||||
}
|
||||
</section>
|
||||
|
||||
<MediaModal />
|
||||
</BaseLayout>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
---
|
||||
import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
import ContentCard from "../components/ContentCard.astro";
|
||||
import MediaModal from "../components/MediaModal.astro";
|
||||
import { readContentCache } from "../lib/content/cache";
|
||||
import { youtubeVideos } from "../lib/content/selectors";
|
||||
|
||||
@@ -35,4 +36,6 @@ const videos = youtubeVideos(cache).sort(
|
||||
)
|
||||
}
|
||||
</section>
|
||||
|
||||
<MediaModal />
|
||||
</BaseLayout>
|
||||
|
||||
@@ -22,10 +22,25 @@ describe("umami event attributes", () => {
|
||||
expect(src).toContain("data-umami-event-placement");
|
||||
});
|
||||
|
||||
it("instruments content cards using outbound_click", async () => {
|
||||
it("instruments youtube/podcast content cards using media_preview", async () => {
|
||||
const src = await read("src/components/ContentCard.astro");
|
||||
expect(src).toContain('"data-umami-event": "media_preview"');
|
||||
expect(src).toContain("data-umami-event-target_id");
|
||||
expect(src).toContain("data-umami-event-source");
|
||||
});
|
||||
|
||||
it("instruments other content cards using outbound_click", async () => {
|
||||
const src = await read("src/components/ContentCard.astro");
|
||||
expect(src).toContain('"data-umami-event": "outbound_click"');
|
||||
expect(src).toContain("data-umami-event-target_id");
|
||||
expect(src).toContain("data-umami-event-domain");
|
||||
});
|
||||
|
||||
it("instruments modal CTAs with correct attributes", async () => {
|
||||
const src = await read("src/components/MediaModal.astro");
|
||||
expect(src).toContain('"cta_click"');
|
||||
expect(src).toContain('"data-umami-event-target_id"');
|
||||
expect(src).toContain('"data-umami-event-placement", "media_modal"');
|
||||
expect(src).toContain('"data-umami-event-platform"');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user