feat(app): add real images to all seed content + universal SVG text fallbacks
- Songs: 19/21 now have iTunes album art URLs (2 niche Bitcoin artists use fallback) - Podcasts: 21/21 now have iTunes artwork URLs - News: 21/21 now have Unsplash topic images - Books: Fixed The Network State cover URL - Places: 21/21 now have photos (Unsplash + Wikimedia) - Added generateNewsFallback() and generateImageFallback() SVG generators - Updated NewsCard, NewsGrid, ImageCard to use SVG text fallback instead of emoji - Added error handling to PlaceCard and PlaceGrid for failed photo loads Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
982a0c6aa6
commit
c88e837cc9
@@ -18,13 +18,9 @@
|
||||
/>
|
||||
<div
|
||||
v-else
|
||||
class="w-full h-full flex items-center justify-center"
|
||||
:class="isDark ? 'bg-white/5' : 'bg-black/5'"
|
||||
>
|
||||
<svg class="w-5 h-5" :class="isDark ? 'text-white/20' : 'text-gray-300'" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z" />
|
||||
</svg>
|
||||
</div>
|
||||
class="w-full h-full bg-cover bg-center"
|
||||
:style="{ backgroundImage: `url(${fallbackImg})` }"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex-1 min-w-0 py-0.5">
|
||||
@@ -45,13 +41,18 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { ref, computed } from 'vue'
|
||||
import type { ImageItem } from '@aiui/core/types/content'
|
||||
import { useTheme } from '@/composables/useTheme'
|
||||
import { generateImageFallback } from '@/composables/useImageFallback'
|
||||
|
||||
defineProps<{ image: ImageItem }>()
|
||||
const props = defineProps<{ image: ImageItem }>()
|
||||
defineEmits<{ select: [image: ImageItem] }>()
|
||||
|
||||
const { isDark } = useTheme()
|
||||
const imgFailed = ref(false)
|
||||
|
||||
const fallbackImg = computed(() =>
|
||||
generateImageFallback(props.image.title || props.image.alt || 'Image')
|
||||
)
|
||||
</script>
|
||||
|
||||
@@ -17,13 +17,9 @@
|
||||
/>
|
||||
<div
|
||||
v-else
|
||||
class="w-full h-full rounded-[6px] bg-cover bg-center flex items-center justify-center"
|
||||
:style="{ backgroundImage: faviconUrl ? `url(${faviconUrl})` : undefined }"
|
||||
>
|
||||
<span v-if="!faviconUrl"
|
||||
class="text-lg opacity-40"
|
||||
:class="isDark ? 'text-white' : 'text-gray-600'">📰</span>
|
||||
</div>
|
||||
class="w-full h-full rounded-[6px] bg-cover bg-center"
|
||||
:style="{ backgroundImage: `url(${fallbackImg})` }"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="min-w-0 flex-1 py-0.5">
|
||||
@@ -52,6 +48,7 @@ import { ref, computed } from 'vue'
|
||||
import type { WebSearchResult } from '@aiui/core/types/message'
|
||||
import { useTheme } from '@/composables/useTheme'
|
||||
import { isSafeUrl, formatDomain } from '@/utils/html'
|
||||
import { generateNewsFallback } from '@/composables/useImageFallback'
|
||||
|
||||
const props = defineProps<{ article: WebSearchResult }>()
|
||||
defineEmits<{ 'select-article': [article: WebSearchResult] }>()
|
||||
@@ -65,15 +62,8 @@ const imgSrc = computed(() => {
|
||||
return isSafeUrl(u) ? u : null
|
||||
})
|
||||
|
||||
const faviconUrl = computed(() => {
|
||||
if (imgSrc.value) return null
|
||||
try {
|
||||
const u = new URL(props.article.url)
|
||||
if (!/^https?:\/\//i.test(props.article.url)) return null
|
||||
return `https://www.google.com/s2/favicons?domain=${encodeURIComponent(u.hostname)}&sz=64`
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
})
|
||||
const fallbackImg = computed(() =>
|
||||
generateNewsFallback(props.article.title, formatDomain(props.article.url))
|
||||
)
|
||||
|
||||
</script>
|
||||
|
||||
@@ -49,37 +49,9 @@
|
||||
/>
|
||||
<div
|
||||
v-else
|
||||
class="absolute inset-0 flex items-center justify-center"
|
||||
:class="isDark ? 'bg-white/5' : 'bg-black/[0.04]'"
|
||||
>
|
||||
<!-- Websites: glassmorphic circle -->
|
||||
<div
|
||||
v-if="variant === 'websites'"
|
||||
class="w-14 h-14 rounded-full flex items-center justify-center path-glass-icon shrink-0"
|
||||
>
|
||||
<img
|
||||
v-if="faviconUrl(article.url)"
|
||||
:src="faviconUrl(article.url)!"
|
||||
:alt="formatDomain(article.url)"
|
||||
class="w-7 h-7 object-contain"
|
||||
/>
|
||||
<span v-else
|
||||
class="text-xl opacity-70"
|
||||
:class="isDark ? 'text-white' : 'text-gray-600'">🌐</span>
|
||||
</div>
|
||||
<!-- News: icon -->
|
||||
<template v-else>
|
||||
<img
|
||||
v-if="faviconUrl(article.url)"
|
||||
:src="faviconUrl(article.url)!"
|
||||
:alt="formatDomain(article.url)"
|
||||
class="w-8 h-8 object-contain opacity-70"
|
||||
/>
|
||||
<span v-else
|
||||
class="text-2xl opacity-40"
|
||||
:class="isDark ? 'text-white' : 'text-gray-600'">📰</span>
|
||||
</template>
|
||||
</div>
|
||||
class="absolute inset-0 bg-cover bg-center"
|
||||
:style="{ backgroundImage: `url(${newsFallback(article)})` }"
|
||||
/>
|
||||
<div class="absolute inset-0 bg-gradient-to-t from-black/60 via-black/20 to-transparent pointer-events-none" />
|
||||
</div>
|
||||
|
||||
@@ -122,6 +94,7 @@ import { ref, computed } from 'vue'
|
||||
import type { WebSearchResult } from '@aiui/core/types/message'
|
||||
import { useTheme } from '@/composables/useTheme'
|
||||
import { useContentPanel } from '@/composables/useContentPanel'
|
||||
import { generateNewsFallback } from '@/composables/useImageFallback'
|
||||
|
||||
const props = withDefaults(defineProps<{
|
||||
articles: WebSearchResult[]
|
||||
@@ -158,14 +131,8 @@ function formatDomain(url: string): string {
|
||||
}
|
||||
}
|
||||
|
||||
function faviconUrl(url: string): string | null {
|
||||
try {
|
||||
if (!/^https?:\/\//i.test(url)) return null
|
||||
const u = new URL(url)
|
||||
return `https://www.google.com/s2/favicons?domain=${encodeURIComponent(u.hostname)}&sz=64`
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
function newsFallback(article: WebSearchResult): string {
|
||||
return generateNewsFallback(article.title, formatDomain(article.url))
|
||||
}
|
||||
|
||||
function openArticle(article: WebSearchResult) {
|
||||
|
||||
@@ -8,11 +8,12 @@
|
||||
>
|
||||
<div class="shrink-0 w-12 h-12 rounded-lg overflow-hidden">
|
||||
<img
|
||||
v-if="place.photoUrl"
|
||||
:src="place.photoUrl"
|
||||
v-if="photoSrc"
|
||||
:src="photoSrc"
|
||||
:alt="place.name"
|
||||
class="w-full h-full object-cover rounded-[6px] transition-transform duration-300 group-hover:scale-105"
|
||||
loading="lazy"
|
||||
@error="photoFailed = true"
|
||||
/>
|
||||
<div
|
||||
v-else
|
||||
@@ -45,7 +46,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed } from 'vue'
|
||||
import { ref, computed } from 'vue'
|
||||
import type { Place } from '@aiui/core/types/content'
|
||||
import { useTheme } from '@/composables/useTheme'
|
||||
import { generatePlaceFallback } from '@/composables/useImageFallback'
|
||||
@@ -54,6 +55,12 @@ const props = defineProps<{ place: Place }>()
|
||||
defineEmits<{ select: [place: Place] }>()
|
||||
|
||||
const { isDark } = useTheme()
|
||||
const photoFailed = ref(false)
|
||||
|
||||
const photoSrc = computed(() => {
|
||||
if (photoFailed.value) return null
|
||||
return props.place.photoUrl || null
|
||||
})
|
||||
|
||||
const fallbackPhoto = computed(() =>
|
||||
generatePlaceFallback(props.place.name, props.place.cuisine || props.place.category)
|
||||
|
||||
@@ -47,14 +47,15 @@
|
||||
>
|
||||
<div class="aspect-[4/3] relative w-full overflow-hidden rounded-t-[10px]">
|
||||
<img
|
||||
v-if="place.photoUrl"
|
||||
v-if="place.photoUrl && !failedPhotos.has(place.id)"
|
||||
:src="place.photoUrl"
|
||||
:alt="place.name"
|
||||
class="w-full h-full object-cover transition-transform duration-300 group-hover:scale-110"
|
||||
loading="lazy"
|
||||
@error="onPhotoError(place.id)"
|
||||
/>
|
||||
<div
|
||||
v-else
|
||||
v-if="!place.photoUrl || failedPhotos.has(place.id)"
|
||||
class="w-full h-full bg-cover bg-center"
|
||||
:style="{ backgroundImage: `url(${fallbackFor(place)})` }"
|
||||
/>
|
||||
@@ -103,6 +104,11 @@ defineEmits<{ selectPlace: [place: Place] }>()
|
||||
const { isDark } = useTheme()
|
||||
const search = ref('')
|
||||
const activeCategory = ref<string | null>(null)
|
||||
const failedPhotos = ref<Set<string>>(new Set())
|
||||
|
||||
function onPhotoError(id: string) {
|
||||
failedPhotos.value = new Set([...failedPhotos.value, id])
|
||||
}
|
||||
|
||||
function fallbackFor(place: Place): string {
|
||||
return generatePlaceFallback(place.name, place.cuisine || place.category)
|
||||
|
||||
@@ -106,6 +106,38 @@ export function generateSongCoverFallback(title: string, artist?: string): strin
|
||||
return `data:image/svg+xml,${encodeURIComponent(svg)}`
|
||||
}
|
||||
|
||||
/** News article fallback — newspaper style with category badge */
|
||||
export function generateNewsFallback(title: string, source?: string): string {
|
||||
const hue = [...(title + (source ?? ''))].reduce((acc, c) => acc + c.charCodeAt(0), 0) % 360
|
||||
const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
|
||||
<rect width="200" height="200" fill="hsl(${hue}, 18%, 10%)"/>
|
||||
<rect x="3" y="3" width="194" height="194" rx="12" fill="none" stroke="hsl(${hue}, 22%, 18%)" stroke-width="1"/>
|
||||
<text x="100" y="72" text-anchor="middle" fill="hsl(${hue}, 20%, 22%)" font-family="Georgia,'Times New Roman',serif" font-size="10" font-weight="400" letter-spacing="3">NEWS</text>
|
||||
<line x1="50" y1="82" x2="150" y2="82" stroke="hsl(${hue}, 22%, 17%)" stroke-width="0.8"/>
|
||||
<line x1="40" y1="100" x2="160" y2="100" stroke="hsl(${hue}, 18%, 16%)" stroke-width="3"/>
|
||||
<line x1="50" y1="112" x2="150" y2="112" stroke="hsl(${hue}, 18%, 14%)" stroke-width="2"/>
|
||||
<line x1="55" y1="122" x2="145" y2="122" stroke="hsl(${hue}, 18%, 13%)" stroke-width="1.5"/>
|
||||
<line x1="60" y1="132" x2="140" y2="132" stroke="hsl(${hue}, 18%, 13%)" stroke-width="1"/>
|
||||
${source ? `<text x="100" y="165" text-anchor="middle" fill="hsl(${hue}, 25%, 40%)" font-family="system-ui,sans-serif" font-size="9" font-weight="400">${escapeXml(source.length > 22 ? source.slice(0, 20) + '…' : source)}</text>` : ''}
|
||||
</svg>`
|
||||
return `data:image/svg+xml,${encodeURIComponent(svg)}`
|
||||
}
|
||||
|
||||
/** Image fallback — picture frame style */
|
||||
export function generateImageFallback(title: string): string {
|
||||
const hue = [...title].reduce((acc, c) => acc + c.charCodeAt(0), 0) % 360
|
||||
const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
|
||||
<rect width="200" height="200" fill="hsl(${hue}, 15%, 10%)"/>
|
||||
<rect x="3" y="3" width="194" height="194" rx="12" fill="none" stroke="hsl(${hue}, 20%, 18%)" stroke-width="1"/>
|
||||
<text x="100" y="72" text-anchor="middle" fill="hsl(${hue}, 18%, 22%)" font-family="system-ui,sans-serif" font-size="10" font-weight="500" letter-spacing="3">IMAGE</text>
|
||||
<rect x="60" y="85" width="80" height="60" rx="4" fill="none" stroke="hsl(${hue}, 25%, 25%)" stroke-width="1.5"/>
|
||||
<circle cx="80" cy="102" r="6" fill="hsl(${hue}, 30%, 30%)"/>
|
||||
<path d="M60 135 L85 115 L105 128 L120 118 L140 135 Z" fill="hsl(${hue}, 25%, 20%)"/>
|
||||
<text x="100" y="170" text-anchor="middle" fill="hsl(${hue}, 30%, 45%)" font-family="system-ui,sans-serif" font-size="10" font-weight="500">${escapeXml(title.length > 20 ? title.slice(0, 18) + '…' : title)}</text>
|
||||
</svg>`
|
||||
return `data:image/svg+xml,${encodeURIComponent(svg)}`
|
||||
}
|
||||
|
||||
/** Film poster fallback — cinematic sans-serif */
|
||||
export function generatePosterFallback(title: string, year?: number): string {
|
||||
const hue = [...title].reduce((acc, c) => acc + c.charCodeAt(0), 0) % 360
|
||||
|
||||
@@ -17,7 +17,7 @@ export const mockBooks: Book[] = [
|
||||
{ id: 'b14', title: 'Do Androids Dream of Electric Sheep?', author: 'Philip K. Dick', year: 1968, isbn: '9780345404473', coverUrl: 'https://covers.openlibrary.org/b/isbn/9780345404473-M.jpg', genres: ['Sci-Fi'], pages: 244, sources: [{ type: 'openlibrary', name: 'Open Library', url: 'https://openlibrary.org/isbn/9780345404473' }] },
|
||||
{ id: 'b15', title: 'The Left Hand of Darkness', author: 'Ursula K. Le Guin', year: 1969, isbn: '9780441478125', coverUrl: 'https://covers.openlibrary.org/b/isbn/9780441478125-M.jpg', genres: ['Sci-Fi', 'Fantasy'], pages: 304, sources: [{ type: 'openlibrary', name: 'Open Library', url: 'https://openlibrary.org/isbn/9780441478125' }] },
|
||||
{ id: 'b16', title: 'Solaris', author: 'Stanislaw Lem', year: 1961, isbn: '9780156027601', coverUrl: 'https://covers.openlibrary.org/b/isbn/9780156027601-M.jpg', genres: ['Sci-Fi'], pages: 224, sources: [{ type: 'openlibrary', name: 'Open Library', url: 'https://openlibrary.org/isbn/9780156027601' }] },
|
||||
{ id: 'b17', title: 'The Network State', author: 'Balaji Srinivasan', year: 2022, isbn: '9798986127507', coverUrl: undefined, genres: ['Technology', 'Political Theory'], pages: 432, sources: [{ type: 'openlibrary', name: 'Open Library', url: 'https://openlibrary.org/isbn/9798986127507' }] },
|
||||
{ id: 'b17', title: 'The Network State', author: 'Balaji Srinivasan', year: 2022, isbn: '9798986127507', coverUrl: 'https://covers.openlibrary.org/b/isbn/9798986127507-M.jpg', genres: ['Technology', 'Political Theory'], pages: 432, sources: [{ type: 'openlibrary', name: 'Open Library', url: 'https://openlibrary.org/isbn/9798986127507' }] },
|
||||
{ id: 'b18', title: 'The Fiat Standard', author: 'Saifedean Ammous', year: 2021, isbn: '9781544526478', coverUrl: 'https://covers.openlibrary.org/b/isbn/9781544526478-M.jpg', genres: ['Economics', 'Bitcoin'], pages: 382, sources: [{ type: 'openlibrary', name: 'Open Library', url: 'https://openlibrary.org/isbn/9781544526478' }] },
|
||||
{ id: 'b19', title: 'Hyperion', author: 'Dan Simmons', year: 1989, isbn: '9780553283686', coverUrl: 'https://covers.openlibrary.org/b/isbn/9780553283686-M.jpg', genres: ['Sci-Fi', 'Space Opera'], pages: 482, sources: [{ type: 'openlibrary', name: 'Open Library', url: 'https://openlibrary.org/isbn/9780553283686' }] },
|
||||
{ id: 'b20', title: 'Blindsight', author: 'Peter Watts', year: 2006, isbn: '9780765319647', coverUrl: 'https://covers.openlibrary.org/b/isbn/9780765319647-M.jpg', genres: ['Sci-Fi', 'Hard SF'], pages: 384, sources: [{ type: 'openlibrary', name: 'Open Library', url: 'https://openlibrary.org/isbn/9780765319647' }] },
|
||||
|
||||
@@ -10,27 +10,27 @@ export interface MockNewsArticle {
|
||||
}
|
||||
|
||||
export const mockNews: MockNewsArticle[] = [
|
||||
{ id: 'n1', title: 'Bitcoin Surpasses $150,000 Mark as Institutional Adoption Accelerates', source: 'Bitcoin Magazine', url: 'https://bitcoinmagazine.com/markets/btc-150k', publishedAt: '2026-03-01', summary: 'Bitcoin reached a new all-time high as major pension funds added BTC to their portfolios.', category: 'Markets', imageUrl: 'https://picsum.photos/id/100/600/400' },
|
||||
{ id: 'n2', title: 'Lightning Network Capacity Reaches 100,000 BTC', source: 'The Block', url: 'https://theblock.co/lightning-100k', publishedAt: '2026-02-28', summary: 'The Lightning Network continues its exponential growth with total capacity surpassing 100K BTC.', category: 'Technology' },
|
||||
{ id: 'n3', title: 'Nostr Protocol Reaches 50 Million Users Worldwide', source: 'Nostr Report', url: 'https://nostr.report/50m-users', publishedAt: '2026-02-27', summary: 'The censorship-resistant social protocol has seen massive growth in decentralized communication.', category: 'Technology' },
|
||||
{ id: 'n4', title: 'EU Digital Identity Regulation Raises Privacy Concerns', source: 'EFF', url: 'https://eff.org/eu-digital-id', publishedAt: '2026-02-26', summary: 'Digital rights groups warn about surveillance implications of new EU digital identity requirements.', category: 'Privacy' },
|
||||
{ id: 'n5', title: 'Open Source AI Models Now Match Proprietary Performance', source: 'Ars Technica', url: 'https://arstechnica.com/open-ai-models', publishedAt: '2026-02-25', summary: 'New open-source language models demonstrate capabilities on par with commercial alternatives.', category: 'AI' },
|
||||
{ id: 'n6', title: 'Fedimint Launches Production-Ready Version 1.0', source: 'Bitcoin Magazine', url: 'https://bitcoinmagazine.com/fedimint-1', publishedAt: '2026-02-24', summary: 'Community custody protocol Fedimint releases its first production-ready version.', category: 'Bitcoin' },
|
||||
{ id: 'n7', title: 'WebAssembly 3.0 Specification Published', source: 'Mozilla Blog', url: 'https://blog.mozilla.org/wasm-3', publishedAt: '2026-02-23', summary: 'The new WASM spec brings garbage collection and improved interop with JavaScript.', category: 'Technology' },
|
||||
{ id: 'n8', title: 'Signal Protocol Integrated Into Major Email Providers', source: 'Wired', url: 'https://wired.com/signal-email', publishedAt: '2026-02-22', summary: 'End-to-end encryption becomes the default for several major email services.', category: 'Privacy' },
|
||||
{ id: 'n9', title: 'Bitcoin Mining Now 80% Renewable Energy', source: 'CoinDesk', url: 'https://coindesk.com/mining-renewables', publishedAt: '2026-02-21', summary: 'Industry report shows Bitcoin mining has become predominantly powered by renewable energy sources.', category: 'Mining' },
|
||||
{ id: 'n10', title: 'Cashu eCash Protocol Sees Rapid Adoption', source: 'Bitcoin Magazine', url: 'https://bitcoinmagazine.com/cashu-adoption', publishedAt: '2026-02-20', summary: 'The Chaumian eCash protocol built on Bitcoin sees growing usage for privacy-preserving payments.', category: 'Bitcoin' },
|
||||
{ id: 'n11', title: 'Framework Laptop Launches ARM-Based Model', source: 'The Verge', url: 'https://theverge.com/framework-arm', publishedAt: '2026-02-19', summary: 'The repairable laptop company expands its lineup with an ARM processor option.', category: 'Hardware' },
|
||||
{ id: 'n12', title: 'Rust Becomes Top 5 Programming Language', source: 'TIOBE', url: 'https://tiobe.com/rust-top-5', publishedAt: '2026-02-18', summary: 'Memory-safe language Rust enters the top 5 in the TIOBE programming language index.', category: 'Technology' },
|
||||
{ id: 'n13', title: 'El Salvador Bitcoin Strategy Yields 300% Returns', source: 'Reuters', url: 'https://reuters.com/el-salvador-btc', publishedAt: '2026-02-17', summary: 'El Salvador\'s Bitcoin holdings have tripled in value since the country made it legal tender.', category: 'Markets' },
|
||||
{ id: 'n14', title: 'IPFS Pinning Becomes Free for Open Source Projects', source: 'Protocol Labs Blog', url: 'https://blog.protocol.ai/free-ipfs', publishedAt: '2026-02-16', summary: 'A new initiative provides free IPFS pinning for open source and public good projects.', category: 'Technology' },
|
||||
{ id: 'n15', title: 'Privacy-Preserving AI Training Methods Breakthrough', source: 'Nature', url: 'https://nature.com/private-ai', publishedAt: '2026-02-15', summary: 'Researchers demonstrate AI training on encrypted data without performance loss.', category: 'AI' },
|
||||
{ id: 'n16', title: 'Mesh Networking Protocol Goes Mainstream', source: 'TechCrunch', url: 'https://techcrunch.com/mesh-mainstream', publishedAt: '2026-02-14', summary: 'New mesh networking standard enables peer-to-peer connectivity without traditional ISPs.', category: 'Technology' },
|
||||
{ id: 'n17', title: 'Bitcoin Multisig Wallets See Enterprise Adoption', source: 'Bitcoin Magazine', url: 'https://bitcoinmagazine.com/multisig-enterprise', publishedAt: '2026-02-13', summary: 'Major corporations adopt multisignature Bitcoin wallets for treasury management.', category: 'Bitcoin' },
|
||||
{ id: 'n18', title: 'Right to Repair Legislation Passes in 30 US States', source: 'iFixit', url: 'https://ifixit.com/right-to-repair-30', publishedAt: '2026-02-12', summary: 'The right to repair movement achieves a major milestone with widespread legislative support.', category: 'Policy' },
|
||||
{ id: 'n19', title: 'Sovereign Computing Movement Gains Momentum', source: 'Hacker News', url: 'https://news.ycombinator.com/sovereign', publishedAt: '2026-02-11', summary: 'Growing number of individuals running personal servers and self-hosting critical services.', category: 'Technology' },
|
||||
{ id: 'n20', title: 'Zero-Knowledge Proofs Enable Private Bitcoin Transactions', source: 'CoinDesk', url: 'https://coindesk.com/zkp-bitcoin', publishedAt: '2026-02-10', summary: 'New zero-knowledge proof implementations bring enhanced privacy to Bitcoin transactions.', category: 'Bitcoin' },
|
||||
{ id: 'n21', title: 'Decentralized VPN Networks Reach 10 Million Nodes', source: 'TorrentFreak', url: 'https://torrentfreak.com/dvpn-10m', publishedAt: '2026-02-09', summary: 'Decentralized VPN services powered by community nodes reach significant scale.', category: 'Privacy' },
|
||||
{ id: 'n1', title: 'Bitcoin Surpasses $150,000 Mark as Institutional Adoption Accelerates', source: 'Bitcoin Magazine', url: 'https://bitcoinmagazine.com/markets/btc-150k', publishedAt: '2026-03-01', summary: 'Bitcoin reached a new all-time high as major pension funds added BTC to their portfolios.', category: 'Markets', imageUrl: 'https://images.unsplash.com/photo-1621761191319-c6fb62004040?w=600&h=400&fit=crop' },
|
||||
{ id: 'n2', title: 'Lightning Network Capacity Reaches 100,000 BTC', source: 'The Block', url: 'https://theblock.co/lightning-100k', publishedAt: '2026-02-28', summary: 'The Lightning Network continues its exponential growth with total capacity surpassing 100K BTC.', category: 'Technology', imageUrl: 'https://images.unsplash.com/photo-1558494949-ef010cbdcc31?w=600&h=400&fit=crop' },
|
||||
{ id: 'n3', title: 'Nostr Protocol Reaches 50 Million Users Worldwide', source: 'Nostr Report', url: 'https://nostr.report/50m-users', publishedAt: '2026-02-27', summary: 'The censorship-resistant social protocol has seen massive growth in decentralized communication.', category: 'Technology', imageUrl: 'https://images.unsplash.com/photo-1522071820081-009f0129c71c?w=600&h=400&fit=crop' },
|
||||
{ id: 'n4', title: 'EU Digital Identity Regulation Raises Privacy Concerns', source: 'EFF', url: 'https://eff.org/eu-digital-id', publishedAt: '2026-02-26', summary: 'Digital rights groups warn about surveillance implications of new EU digital identity requirements.', category: 'Privacy', imageUrl: 'https://images.unsplash.com/photo-1557597774-9d273605dfa9?w=600&h=400&fit=crop' },
|
||||
{ id: 'n5', title: 'Open Source AI Models Now Match Proprietary Performance', source: 'Ars Technica', url: 'https://arstechnica.com/open-ai-models', publishedAt: '2026-02-25', summary: 'New open-source language models demonstrate capabilities on par with commercial alternatives.', category: 'AI', imageUrl: 'https://images.unsplash.com/photo-1677442136019-21780ecad995?w=600&h=400&fit=crop' },
|
||||
{ id: 'n6', title: 'Fedimint Launches Production-Ready Version 1.0', source: 'Bitcoin Magazine', url: 'https://bitcoinmagazine.com/fedimint-1', publishedAt: '2026-02-24', summary: 'Community custody protocol Fedimint releases its first production-ready version.', category: 'Bitcoin', imageUrl: 'https://images.unsplash.com/photo-1639762681057-408e52192e55?w=600&h=400&fit=crop' },
|
||||
{ id: 'n7', title: 'WebAssembly 3.0 Specification Published', source: 'Mozilla Blog', url: 'https://blog.mozilla.org/wasm-3', publishedAt: '2026-02-23', summary: 'The new WASM spec brings garbage collection and improved interop with JavaScript.', category: 'Technology', imageUrl: 'https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=600&h=400&fit=crop' },
|
||||
{ id: 'n8', title: 'Signal Protocol Integrated Into Major Email Providers', source: 'Wired', url: 'https://wired.com/signal-email', publishedAt: '2026-02-22', summary: 'End-to-end encryption becomes the default for several major email services.', category: 'Privacy', imageUrl: 'https://images.unsplash.com/photo-1563013544-824ae1b704d3?w=600&h=400&fit=crop' },
|
||||
{ id: 'n9', title: 'Bitcoin Mining Now 80% Renewable Energy', source: 'CoinDesk', url: 'https://coindesk.com/mining-renewables', publishedAt: '2026-02-21', summary: 'Industry report shows Bitcoin mining has become predominantly powered by renewable energy sources.', category: 'Mining', imageUrl: 'https://images.unsplash.com/photo-1509391366360-2e959784a276?w=600&h=400&fit=crop' },
|
||||
{ id: 'n10', title: 'Cashu eCash Protocol Sees Rapid Adoption', source: 'Bitcoin Magazine', url: 'https://bitcoinmagazine.com/cashu-adoption', publishedAt: '2026-02-20', summary: 'The Chaumian eCash protocol built on Bitcoin sees growing usage for privacy-preserving payments.', category: 'Bitcoin', imageUrl: 'https://images.unsplash.com/photo-1620321023374-d1a68fbc720d?w=600&h=400&fit=crop' },
|
||||
{ id: 'n11', title: 'Framework Laptop Launches ARM-Based Model', source: 'The Verge', url: 'https://theverge.com/framework-arm', publishedAt: '2026-02-19', summary: 'The repairable laptop company expands its lineup with an ARM processor option.', category: 'Hardware', imageUrl: 'https://images.unsplash.com/photo-1496181133206-80ce9b88a853?w=600&h=400&fit=crop' },
|
||||
{ id: 'n12', title: 'Rust Becomes Top 5 Programming Language', source: 'TIOBE', url: 'https://tiobe.com/rust-top-5', publishedAt: '2026-02-18', summary: 'Memory-safe language Rust enters the top 5 in the TIOBE programming language index.', category: 'Technology', imageUrl: 'https://images.unsplash.com/photo-1461749280684-dccba630e2f6?w=600&h=400&fit=crop' },
|
||||
{ id: 'n13', title: 'El Salvador Bitcoin Strategy Yields 300% Returns', source: 'Reuters', url: 'https://reuters.com/el-salvador-btc', publishedAt: '2026-02-17', summary: 'El Salvador\'s Bitcoin holdings have tripled in value since the country made it legal tender.', category: 'Markets', imageUrl: 'https://images.unsplash.com/photo-1526304640581-d334cdbbf45e?w=600&h=400&fit=crop' },
|
||||
{ id: 'n14', title: 'IPFS Pinning Becomes Free for Open Source Projects', source: 'Protocol Labs Blog', url: 'https://blog.protocol.ai/free-ipfs', publishedAt: '2026-02-16', summary: 'A new initiative provides free IPFS pinning for open source and public good projects.', category: 'Technology', imageUrl: 'https://images.unsplash.com/photo-1544197150-b99a580bb7a8?w=600&h=400&fit=crop' },
|
||||
{ id: 'n15', title: 'Privacy-Preserving AI Training Methods Breakthrough', source: 'Nature', url: 'https://nature.com/private-ai', publishedAt: '2026-02-15', summary: 'Researchers demonstrate AI training on encrypted data without performance loss.', category: 'AI', imageUrl: 'https://images.unsplash.com/photo-1507146153580-69a1fe6d8aa1?w=600&h=400&fit=crop' },
|
||||
{ id: 'n16', title: 'Mesh Networking Protocol Goes Mainstream', source: 'TechCrunch', url: 'https://techcrunch.com/mesh-mainstream', publishedAt: '2026-02-14', summary: 'New mesh networking standard enables peer-to-peer connectivity without traditional ISPs.', category: 'Technology', imageUrl: 'https://images.unsplash.com/photo-1451187580459-43490279c0fa?w=600&h=400&fit=crop' },
|
||||
{ id: 'n17', title: 'Bitcoin Multisig Wallets See Enterprise Adoption', source: 'Bitcoin Magazine', url: 'https://bitcoinmagazine.com/multisig-enterprise', publishedAt: '2026-02-13', summary: 'Major corporations adopt multisignature Bitcoin wallets for treasury management.', category: 'Bitcoin', imageUrl: 'https://images.unsplash.com/photo-1551288049-bebda4e38f71?w=600&h=400&fit=crop' },
|
||||
{ id: 'n18', title: 'Right to Repair Legislation Passes in 30 US States', source: 'iFixit', url: 'https://ifixit.com/right-to-repair-30', publishedAt: '2026-02-12', summary: 'The right to repair movement achieves a major milestone with widespread legislative support.', category: 'Policy', imageUrl: 'https://images.unsplash.com/photo-1581092160562-40aa08e78837?w=600&h=400&fit=crop' },
|
||||
{ id: 'n19', title: 'Sovereign Computing Movement Gains Momentum', source: 'Hacker News', url: 'https://news.ycombinator.com/sovereign', publishedAt: '2026-02-11', summary: 'Growing number of individuals running personal servers and self-hosting critical services.', category: 'Technology', imageUrl: 'https://images.unsplash.com/photo-1558494949-ef010cbdcc31?w=600&h=400&fit=crop' },
|
||||
{ id: 'n20', title: 'Zero-Knowledge Proofs Enable Private Bitcoin Transactions', source: 'CoinDesk', url: 'https://coindesk.com/zkp-bitcoin', publishedAt: '2026-02-10', summary: 'New zero-knowledge proof implementations bring enhanced privacy to Bitcoin transactions.', category: 'Bitcoin', imageUrl: 'https://images.unsplash.com/photo-1526374965328-7f61d4dc18c5?w=600&h=400&fit=crop' },
|
||||
{ id: 'n21', title: 'Decentralized VPN Networks Reach 10 Million Nodes', source: 'TorrentFreak', url: 'https://torrentfreak.com/dvpn-10m', publishedAt: '2026-02-09', summary: 'Decentralized VPN services powered by community nodes reach significant scale.', category: 'Privacy', imageUrl: 'https://images.unsplash.com/photo-1510511459019-5dda7724fd87?w=600&h=400&fit=crop' },
|
||||
]
|
||||
|
||||
export function searchNews(query: string): MockNewsArticle[] {
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
import type { Place } from '@aiui/core/types/content'
|
||||
|
||||
export const mockPlaces: Place[] = [
|
||||
{ id: 'p1', name: 'Bitcoin Tower', address: 'Zug, Switzerland', lat: 47.1661, lng: 8.5155, category: 'Landmark', description: 'Heart of Crypto Valley, home to numerous Bitcoin companies.', rating: 4.5, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=47.1661&mlon=8.5155' }] },
|
||||
{ id: 'p2', name: 'El Zonte (Bitcoin Beach)', address: 'El Zonte, La Libertad, El Salvador', lat: 13.4967, lng: -89.3894, category: 'Beach', description: 'The birthplace of Bitcoin adoption in El Salvador.', rating: 4.7, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=13.4967&mlon=-89.3894' }] },
|
||||
{ id: 'p3', name: 'Shibuya Crossing', address: 'Shibuya, Tokyo, Japan', lat: 35.6595, lng: 139.7004, category: 'Landmark', description: 'The world\'s busiest pedestrian crossing.', rating: 4.6, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=35.6595&mlon=139.7004' }] },
|
||||
{ id: 'p4', name: 'CERN', address: 'Meyrin, Geneva, Switzerland', lat: 46.2335, lng: 6.0553, category: 'Science', description: 'European Organization for Nuclear Research, birthplace of the World Wide Web.', rating: 4.8, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=46.2335&mlon=6.0553' }] },
|
||||
{ id: 'p5', name: 'Akihabara', address: 'Akihabara, Tokyo, Japan', lat: 35.6984, lng: 139.7731, category: 'District', description: 'Tokyo\'s electronics and anime district.', rating: 4.4, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=35.6984&mlon=139.7731' }] },
|
||||
{ id: 'p6', name: 'Hacker Dojo', address: 'San Jose, CA, USA', lat: 37.3506, lng: -121.9550, category: 'Hackerspace', description: 'Community space for hackers and makers in Silicon Valley.', rating: 4.3, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=37.3506&mlon=-121.9550' }] },
|
||||
{ id: 'p7', name: 'Machu Picchu', address: 'Cusco Region, Peru', lat: -13.1631, lng: -72.5450, category: 'Archaeological', description: '15th-century Inca citadel set high in the Andes Mountains.', rating: 4.9, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=-13.1631&mlon=-72.5450' }] },
|
||||
{ id: 'p8', name: 'Reykjavik', address: 'Reykjavik, Iceland', lat: 64.1466, lng: -21.9426, category: 'City', description: 'World\'s northernmost capital, known for geothermal energy and bitcoin mining.', rating: 4.6, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=64.1466&mlon=-21.9426' }] },
|
||||
{ id: 'p9', name: 'MIT Media Lab', address: 'Cambridge, MA, USA', lat: 42.3601, lng: -71.0879, category: 'Research', description: 'Research laboratory at MIT known for unconventional technology research.', rating: 4.7, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=42.3601&mlon=-71.0879' }] },
|
||||
{ id: 'p10', name: 'Svalbard Global Seed Vault', address: 'Longyearbyen, Svalbard, Norway', lat: 78.2355, lng: 15.4942, category: 'Science', description: 'Secure seed bank storing duplicates of seeds from crop collections worldwide.', rating: 4.8, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=78.2355&mlon=15.4942' }] },
|
||||
{ id: 'p11', name: 'Room 77', address: 'Graefestraße, Berlin, Germany', lat: 52.4912, lng: 13.4188, category: 'Restaurant', description: 'One of the first bars in the world to accept Bitcoin (now closed, historic).', rating: 4.2, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=52.4912&mlon=13.4188' }] },
|
||||
{ id: 'p12', name: 'Antigua Bitcoin Beach', address: 'Antigua, Guatemala', lat: 14.5586, lng: -90.7295, category: 'Town', description: 'Growing Bitcoin circular economy in historic colonial town.', rating: 4.5, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=14.5586&mlon=-90.7295' }] },
|
||||
{ id: 'p13', name: 'Bletchley Park', address: 'Milton Keynes, UK', lat: 51.9977, lng: -0.7417, category: 'Museum', description: 'Historic site of WWII codebreaking, where Turing and team cracked Enigma.', rating: 4.7, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=51.9977&mlon=-0.7417' }] },
|
||||
{ id: 'p14', name: 'La Sagrada Familia', address: 'Barcelona, Spain', lat: 41.4036, lng: 2.1744, category: 'Architecture', description: 'Antoni Gaudí\'s unfinished masterpiece basilica.', rating: 4.8, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=41.4036&mlon=2.1744' }] },
|
||||
{ id: 'p15', name: 'The Internet Archive', address: 'San Francisco, CA, USA', lat: 37.7823, lng: -122.4714, category: 'Library', description: 'Non-profit digital library offering free access to archived web pages and media.', rating: 4.6, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=37.7823&mlon=-122.4714' }] },
|
||||
{ id: 'p16', name: 'Madeira Bitcoin Island', address: 'Funchal, Madeira, Portugal', lat: 32.6669, lng: -16.9241, category: 'Island', description: 'Portuguese island adopting Bitcoin as part of its economic strategy.', rating: 4.4, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=32.6669&mlon=-16.9241' }] },
|
||||
{ id: 'p17', name: 'Kowloon Walled City Park', address: 'Kowloon, Hong Kong', lat: 22.3315, lng: 114.1889, category: 'Park', description: 'Memorial park on the site of the former Kowloon Walled City.', rating: 4.3, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=22.3315&mlon=114.1889' }] },
|
||||
{ id: 'p18', name: 'Bitcoin Lake', address: 'Panajachel, Guatemala', lat: 14.7403, lng: -91.1594, category: 'Lake', description: 'Lake Atitlán community promoting Bitcoin circular economy.', rating: 4.5, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=14.7403&mlon=-91.1594' }] },
|
||||
{ id: 'p19', name: 'Taipei 101', address: 'Xinyi District, Taipei, Taiwan', lat: 25.0340, lng: 121.5645, category: 'Skyscraper', description: 'Former world\'s tallest building, now a tech hub landmark.', rating: 4.7, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=25.0340&mlon=121.5645' }] },
|
||||
{ id: 'p20', name: 'Chiang Mai Old City', address: 'Chiang Mai, Thailand', lat: 18.7883, lng: 98.9853, category: 'District', description: 'Popular digital nomad hub with growing Bitcoin acceptance.', rating: 4.6, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=18.7883&mlon=98.9853' }] },
|
||||
{ id: 'p21', name: 'Nostr Café', address: 'Prague, Czech Republic', lat: 50.0755, lng: 14.4378, category: 'Café', description: 'Crypto-friendly café in the heart of Prague\'s bitcoin community.', rating: 4.4, sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=50.0755&mlon=14.4378' }] },
|
||||
{ id: 'p1', name: 'Bitcoin Tower', address: 'Zug, Switzerland', lat: 47.1661, lng: 8.5155, category: 'Landmark', description: 'Heart of Crypto Valley, home to numerous Bitcoin companies.', rating: 4.5, photoUrl: 'https://images.unsplash.com/photo-1527668752968-14dc70a27c95?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=47.1661&mlon=8.5155' }] },
|
||||
{ id: 'p2', name: 'El Zonte (Bitcoin Beach)', address: 'El Zonte, La Libertad, El Salvador', lat: 13.4967, lng: -89.3894, category: 'Beach', description: 'The birthplace of Bitcoin adoption in El Salvador.', rating: 4.7, photoUrl: 'https://upload.wikimedia.org/wikipedia/commons/8/88/El_Zonte_%2801.2011%29_-_panoramio.jpg', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=13.4967&mlon=-89.3894' }] },
|
||||
{ id: 'p3', name: 'Shibuya Crossing', address: 'Shibuya, Tokyo, Japan', lat: 35.6595, lng: 139.7004, category: 'Landmark', description: 'The world\'s busiest pedestrian crossing.', rating: 4.6, photoUrl: 'https://images.unsplash.com/photo-1542051841857-5f90071e7989?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=35.6595&mlon=139.7004' }] },
|
||||
{ id: 'p4', name: 'CERN', address: 'Meyrin, Geneva, Switzerland', lat: 46.2335, lng: 6.0553, category: 'Science', description: 'European Organization for Nuclear Research, birthplace of the World Wide Web.', rating: 4.8, photoUrl: 'https://images.unsplash.com/photo-1581092160607-ee22621dd758?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=46.2335&mlon=6.0553' }] },
|
||||
{ id: 'p5', name: 'Akihabara', address: 'Akihabara, Tokyo, Japan', lat: 35.6984, lng: 139.7731, category: 'District', description: 'Tokyo\'s electronics and anime district.', rating: 4.4, photoUrl: 'https://images.unsplash.com/photo-1480796927426-f609979314bd?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=35.6984&mlon=139.7731' }] },
|
||||
{ id: 'p6', name: 'Hacker Dojo', address: 'San Jose, CA, USA', lat: 37.3506, lng: -121.9550, category: 'Hackerspace', description: 'Community space for hackers and makers in Silicon Valley.', rating: 4.3, photoUrl: 'https://images.unsplash.com/photo-1517694712202-14dd9538aa97?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=37.3506&mlon=-121.9550' }] },
|
||||
{ id: 'p7', name: 'Machu Picchu', address: 'Cusco Region, Peru', lat: -13.1631, lng: -72.5450, category: 'Archaeological', description: '15th-century Inca citadel set high in the Andes Mountains.', rating: 4.9, photoUrl: 'https://images.unsplash.com/photo-1587595431973-160d0d94add1?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=-13.1631&mlon=-72.5450' }] },
|
||||
{ id: 'p8', name: 'Reykjavik', address: 'Reykjavik, Iceland', lat: 64.1466, lng: -21.9426, category: 'City', description: 'World\'s northernmost capital, known for geothermal energy and bitcoin mining.', rating: 4.6, photoUrl: 'https://images.unsplash.com/photo-1504829857797-ddff29c27927?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=64.1466&mlon=-21.9426' }] },
|
||||
{ id: 'p9', name: 'MIT Media Lab', address: 'Cambridge, MA, USA', lat: 42.3601, lng: -71.0879, category: 'Research', description: 'Research laboratory at MIT known for unconventional technology research.', rating: 4.7, photoUrl: 'https://images.unsplash.com/photo-1564981797816-1043664bf78d?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=42.3601&mlon=-71.0879' }] },
|
||||
{ id: 'p10', name: 'Svalbard Global Seed Vault', address: 'Longyearbyen, Svalbard, Norway', lat: 78.2355, lng: 15.4942, category: 'Science', description: 'Secure seed bank storing duplicates of seeds from crop collections worldwide.', rating: 4.8, photoUrl: 'https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=78.2355&mlon=15.4942' }] },
|
||||
{ id: 'p11', name: 'Room 77', address: 'Graefestraße, Berlin, Germany', lat: 52.4912, lng: 13.4188, category: 'Restaurant', description: 'One of the first bars in the world to accept Bitcoin (now closed, historic).', rating: 4.2, photoUrl: 'https://images.unsplash.com/photo-1560840067-ddcaeb7831d2?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=52.4912&mlon=13.4188' }] },
|
||||
{ id: 'p12', name: 'Antigua Bitcoin Beach', address: 'Antigua, Guatemala', lat: 14.5586, lng: -90.7295, category: 'Town', description: 'Growing Bitcoin circular economy in historic colonial town.', rating: 4.5, photoUrl: 'https://images.unsplash.com/photo-1604961666760-81e04cc67d47?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=14.5586&mlon=-90.7295' }] },
|
||||
{ id: 'p13', name: 'Bletchley Park', address: 'Milton Keynes, UK', lat: 51.9977, lng: -0.7417, category: 'Museum', description: 'Historic site of WWII codebreaking, where Turing and team cracked Enigma.', rating: 4.7, photoUrl: 'https://upload.wikimedia.org/wikipedia/commons/4/43/Bletchley_Park_Mansion.jpg', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=51.9977&mlon=-0.7417' }] },
|
||||
{ id: 'p14', name: 'La Sagrada Familia', address: 'Barcelona, Spain', lat: 41.4036, lng: 2.1744, category: 'Architecture', description: 'Antoni Gaudí\'s unfinished masterpiece basilica.', rating: 4.8, photoUrl: 'https://images.unsplash.com/photo-1583779457711-ab081e71d8ee?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=41.4036&mlon=2.1744' }] },
|
||||
{ id: 'p15', name: 'The Internet Archive', address: 'San Francisco, CA, USA', lat: 37.7823, lng: -122.4714, category: 'Library', description: 'Non-profit digital library offering free access to archived web pages and media.', rating: 4.6, photoUrl: 'https://images.unsplash.com/photo-1521587760476-6c12a4b040da?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=37.7823&mlon=-122.4714' }] },
|
||||
{ id: 'p16', name: 'Madeira Bitcoin Island', address: 'Funchal, Madeira, Portugal', lat: 32.6669, lng: -16.9241, category: 'Island', description: 'Portuguese island adopting Bitcoin as part of its economic strategy.', rating: 4.4, photoUrl: 'https://images.unsplash.com/photo-1555881400-74d7acaacd8b?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=32.6669&mlon=-16.9241' }] },
|
||||
{ id: 'p17', name: 'Kowloon Walled City Park', address: 'Kowloon, Hong Kong', lat: 22.3315, lng: 114.1889, category: 'Park', description: 'Memorial park on the site of the former Kowloon Walled City.', rating: 4.3, photoUrl: 'https://images.unsplash.com/photo-1536599018102-9f803c140fc1?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=22.3315&mlon=114.1889' }] },
|
||||
{ id: 'p18', name: 'Bitcoin Lake', address: 'Panajachel, Guatemala', lat: 14.7403, lng: -91.1594, category: 'Lake', description: 'Lake Atitlán community promoting Bitcoin circular economy.', rating: 4.5, photoUrl: 'https://images.unsplash.com/photo-1501785888041-af3ef285b470?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=14.7403&mlon=-91.1594' }] },
|
||||
{ id: 'p19', name: 'Taipei 101', address: 'Xinyi District, Taipei, Taiwan', lat: 25.0340, lng: 121.5645, category: 'Skyscraper', description: 'Former world\'s tallest building, now a tech hub landmark.', rating: 4.7, photoUrl: 'https://images.unsplash.com/photo-1508269099219-5ed600647a49?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=25.0340&mlon=121.5645' }] },
|
||||
{ id: 'p20', name: 'Chiang Mai Old City', address: 'Chiang Mai, Thailand', lat: 18.7883, lng: 98.9853, category: 'District', description: 'Popular digital nomad hub with growing Bitcoin acceptance.', rating: 4.6, photoUrl: 'https://images.unsplash.com/photo-1512553983966-3e77e4713e00?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=18.7883&mlon=98.9853' }] },
|
||||
{ id: 'p21', name: 'Nostr Café', address: 'Prague, Czech Republic', lat: 50.0755, lng: 14.4378, category: 'Café', description: 'Crypto-friendly café in the heart of Prague\'s bitcoin community.', rating: 4.4, photoUrl: 'https://images.unsplash.com/photo-1554118811-1e0d58224f24?w=600&h=400&fit=crop', sources: [{ type: 'osm', name: 'OpenStreetMap', url: 'https://www.openstreetmap.org/?mlat=50.0755&mlon=14.4378' }] },
|
||||
]
|
||||
|
||||
export function searchPlaces(query: string): Place[] {
|
||||
|
||||
@@ -6,7 +6,7 @@ export const mockPodcasts: Podcast[] = [
|
||||
title: 'What Bitcoin Did',
|
||||
host: 'Peter McCormack',
|
||||
description: 'Interview-based podcast exploring Bitcoin, freedom, and the future of money.',
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts221/v4/fb/ff/bb/fbffbba3-1a5b-0759-fa35-cafc42f214c9/mza_4444412895211887709.jpg/600x600bb.jpg',
|
||||
year: 2018,
|
||||
episodeCount: 400,
|
||||
genres: ['Bitcoin', 'Finance', 'Tech'],
|
||||
@@ -22,7 +22,7 @@ export const mockPodcasts: Podcast[] = [
|
||||
title: 'The Audacity to Podcast',
|
||||
host: 'Daniel J. Lewis',
|
||||
description: 'Podcasting tips, strategies, and news. Podcasting 2.0 focused.',
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts123/v4/7a/b6/84/7ab6843a-3f8a-f3b6-772e-74904aeb1fa1/mza_5013277301801181914.png/600x600bb.jpg',
|
||||
year: 2010,
|
||||
episodeCount: 500,
|
||||
genres: ['Podcasting', 'Tech', 'How-To'],
|
||||
@@ -37,7 +37,7 @@ export const mockPodcasts: Podcast[] = [
|
||||
title: 'Tales from the Crypt',
|
||||
host: 'Marty Bent',
|
||||
description: 'Bitcoin, Austrian economics, and the importance of sound money.',
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts221/v4/84/cd/73/84cd73e4-eddb-d7f6-a777-875efb65b924/mza_15569173368189135395.jpg/600x600bb.jpg',
|
||||
year: 2017,
|
||||
episodeCount: 300,
|
||||
genres: ['Bitcoin', 'Economics', 'Finance'],
|
||||
@@ -53,7 +53,7 @@ export const mockPodcasts: Podcast[] = [
|
||||
title: 'Stephan Livera Podcast',
|
||||
host: 'Stephan Livera',
|
||||
description: 'Bitcoin, Lightning Network, and sovereign individual topics.',
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts113/v4/ed/fb/80/edfb8088-08fb-adfc-3a0e-89a216d0cb0a/mza_546663195369372323.jpg/600x600bb.jpg',
|
||||
year: 2018,
|
||||
episodeCount: 450,
|
||||
genres: ['Bitcoin', 'Lightning', 'Tech'],
|
||||
@@ -69,7 +69,7 @@ export const mockPodcasts: Podcast[] = [
|
||||
title: 'Hell Money',
|
||||
host: 'Brittany Kaiser & Patrick Wood',
|
||||
description: 'Investigative podcast on financial crime, surveillance, and control systems.',
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts112/v4/dd/00/4a/dd004ad9-a2b5-d905-59f9-761309118e47/mza_8872129051801444337.jpg/600x600bb.jpg',
|
||||
year: 2022,
|
||||
episodeCount: 80,
|
||||
genres: ['True Crime', 'Finance', 'Investigative'],
|
||||
@@ -84,7 +84,7 @@ export const mockPodcasts: Podcast[] = [
|
||||
title: 'Cypherpunk Bitstream',
|
||||
host: 'Brandon Zemp',
|
||||
description: 'Decentralization, privacy tech, and cypherpunk philosophy.',
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts125/v4/82/70/44/827044a2-cabb-f681-00e7-64d2e02fff13/mza_18243182780759307932.jpg/600x600bb.jpg',
|
||||
year: 2020,
|
||||
episodeCount: 120,
|
||||
genres: ['Privacy', 'Bitcoin', 'Decentralization'],
|
||||
@@ -95,21 +95,21 @@ export const mockPodcasts: Podcast[] = [
|
||||
{ type: 'rss', name: 'RSS', url: 'https://cypherpunkbitstream.com/feed', icon: '📡' },
|
||||
],
|
||||
},
|
||||
{ id: 'p7', title: 'Bitcoin Audible', host: 'Guy Swann', description: 'Reading the best in Bitcoin content, one article at a time.', coverUrl: undefined, year: 2017, episodeCount: 600, genres: ['Bitcoin', 'Education'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/bitcoinaudible', icon: '⚡' }] },
|
||||
{ id: 'p8', title: 'The Bitcoin Standard Podcast', host: 'Saifedean Ammous', description: 'Economics, sound money, and the case for Bitcoin.', coverUrl: undefined, year: 2019, episodeCount: 200, genres: ['Bitcoin', 'Economics'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/tbs', icon: '⚡' }] },
|
||||
{ id: 'p9', title: 'Bitcoin Explained', host: 'Aaron van Wirdum & Sjors Provoost', description: 'Technical explanations of Bitcoin protocol developments.', coverUrl: undefined, year: 2020, episodeCount: 150, genres: ['Bitcoin', 'Technology'], sources: [{ type: 'rss', name: 'RSS', url: 'https://bitcoinexplained.com/feed', icon: '📡' }] },
|
||||
{ id: 'p10', title: 'Nostr Talks', host: 'The Nostr Community', description: 'Discussions about the Nostr protocol, clients, and ecosystem.', coverUrl: undefined, year: 2023, episodeCount: 60, genres: ['Nostr', 'Decentralization', 'Tech'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/nostrtalks', icon: '⚡' }] },
|
||||
{ id: 'p11', title: 'Lex Fridman Podcast', host: 'Lex Fridman', description: 'Conversations about the nature of intelligence, consciousness, love, and power.', coverUrl: undefined, year: 2018, episodeCount: 420, genres: ['Science', 'Technology', 'Philosophy'], sources: [{ type: 'youtube', name: 'YouTube', url: 'https://youtube.com/@lexfridman', icon: '▶️' }] },
|
||||
{ id: 'p12', title: 'Darknet Diaries', host: 'Jack Rhysider', description: 'True stories from the dark side of the Internet.', coverUrl: undefined, year: 2017, episodeCount: 160, genres: ['Cybersecurity', 'True Crime', 'Technology'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/darknetdiaries', icon: '⚡' }] },
|
||||
{ id: 'p13', title: 'The Investors Podcast', host: 'Preston Pysh & Stig Brodersen', description: 'Value investing, Bitcoin, and financial analysis.', coverUrl: undefined, year: 2014, episodeCount: 700, genres: ['Bitcoin', 'Investing', 'Finance'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/tip', icon: '⚡' }] },
|
||||
{ id: 'p14', title: 'Rabbit Hole Recap', host: 'Matt Odell & Marty Bent', description: 'Weekly Bitcoin news and analysis.', coverUrl: undefined, year: 2019, episodeCount: 250, genres: ['Bitcoin', 'News'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/rhr', icon: '⚡' }] },
|
||||
{ id: 'p15', title: 'Citadel Dispatch', host: 'Matt Odell', description: 'Interactive Bitcoin discussion with audience participation.', coverUrl: undefined, year: 2021, episodeCount: 130, genres: ['Bitcoin', 'Privacy', 'Open Source'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/citadeldispatch', icon: '⚡' }, { type: 'youtube', name: 'YouTube', url: 'https://youtube.com/@citadeldispatch', icon: '▶️' }] },
|
||||
{ id: 'p16', title: 'Hardcore History', host: 'Dan Carlin', description: 'Deep dives into the hardest core history topics.', coverUrl: undefined, year: 2006, episodeCount: 70, genres: ['History', 'Education'], sources: [{ type: 'rss', name: 'RSS', url: 'https://dchhaddendum.libsyn.com/rss', icon: '📡' }] },
|
||||
{ id: 'p17', title: 'The Changelog', host: 'Adam Stacoviak & Jerod Santo', description: 'Conversations with the hackers, leaders, and innovators of open source.', coverUrl: undefined, year: 2009, episodeCount: 600, genres: ['Open Source', 'Technology', 'Programming'], sources: [{ type: 'rss', name: 'RSS', url: 'https://changelog.com/podcast/feed', icon: '📡' }] },
|
||||
{ id: 'p18', title: 'Once BITten!', host: 'Daniel Prince', description: 'Bitcoin, philosophy, and the orange pill journey.', coverUrl: undefined, year: 2019, episodeCount: 350, genres: ['Bitcoin', 'Philosophy'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/oncebitten', icon: '⚡' }] },
|
||||
{ id: 'p19', title: 'Bitcoin Fundamentals', host: 'Preston Pysh', description: 'Understanding Bitcoin from first principles.', coverUrl: undefined, year: 2020, episodeCount: 180, genres: ['Bitcoin', 'Education', 'Finance'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/btcfundamentals', icon: '⚡' }] },
|
||||
{ id: 'p20', title: 'Opt Out Podcast', host: 'Seth For Privacy', description: 'Privacy tools, techniques, and philosophy for everyone.', coverUrl: undefined, year: 2021, episodeCount: 90, genres: ['Privacy', 'Technology', 'Security'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/optout', icon: '⚡' }, { type: 'rss', name: 'RSS', url: 'https://optoutpod.com/feed', icon: '📡' }] },
|
||||
{ id: 'p21', title: 'Bitcoin Review', host: 'NVK & community', description: 'Technical Bitcoin development review and discussion.', coverUrl: undefined, year: 2022, episodeCount: 75, genres: ['Bitcoin', 'Development', 'Open Source'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/bitcoinreview', icon: '⚡' }] },
|
||||
{ id: 'p7', title: 'Bitcoin Audible', host: 'Guy Swann', description: 'Reading the best in Bitcoin content, one article at a time.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts126/v4/a8/1c/b2/a81cb23a-7aa5-c123-60a1-9e5d0335496b/mza_12623622548899082019.jpg/600x600bb.jpg', year: 2017, episodeCount: 600, genres: ['Bitcoin', 'Education'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/bitcoinaudible', icon: '⚡' }] },
|
||||
{ id: 'p8', title: 'The Bitcoin Standard Podcast', host: 'Saifedean Ammous', description: 'Economics, sound money, and the case for Bitcoin.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts221/v4/fc/a5/38/fca5380d-362d-d44c-04f5-df14044e88ac/mza_4951446082004808256.jpg/600x600bb.jpg', year: 2019, episodeCount: 200, genres: ['Bitcoin', 'Economics'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/tbs', icon: '⚡' }] },
|
||||
{ id: 'p9', title: 'Bitcoin Explained', host: 'Aaron van Wirdum & Sjors Provoost', description: 'Technical explanations of Bitcoin protocol developments.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts116/v4/1a/7b/d2/1a7bd297-e8c8-bf51-860e-fd36a788242a/mza_14220953861479257188.jpg/600x600bb.jpg', year: 2020, episodeCount: 150, genres: ['Bitcoin', 'Technology'], sources: [{ type: 'rss', name: 'RSS', url: 'https://bitcoinexplained.com/feed', icon: '📡' }] },
|
||||
{ id: 'p10', title: 'Nostr Talks', host: 'The Nostr Community', description: 'Discussions about the Nostr protocol, clients, and ecosystem.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts211/v4/aa/3e/7b/aa3e7b40-7546-aa17-9695-6cdc506cdc10/mza_15889741860915228164.jpeg/600x600bb.jpg', year: 2023, episodeCount: 60, genres: ['Nostr', 'Decentralization', 'Tech'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/nostrtalks', icon: '⚡' }] },
|
||||
{ id: 'p11', title: 'Lex Fridman Podcast', host: 'Lex Fridman', description: 'Conversations about the nature of intelligence, consciousness, love, and power.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts115/v4/3e/e3/9c/3ee39c89-de08-47a6-7f3d-3849cef6d255/mza_16657851278549137484.png/600x600bb.jpg', year: 2018, episodeCount: 420, genres: ['Science', 'Technology', 'Philosophy'], sources: [{ type: 'youtube', name: 'YouTube', url: 'https://youtube.com/@lexfridman', icon: '▶️' }] },
|
||||
{ id: 'p12', title: 'Darknet Diaries', host: 'Jack Rhysider', description: 'True stories from the dark side of the Internet.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts122/v4/3a/80/a7/3a80a7db-5620-f77b-9935-016e61cc2fbc/mza_9399859904175514567.jpg/600x600bb.jpg', year: 2017, episodeCount: 160, genres: ['Cybersecurity', 'True Crime', 'Technology'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/darknetdiaries', icon: '⚡' }] },
|
||||
{ id: 'p13', title: 'The Investors Podcast', host: 'Preston Pysh & Stig Brodersen', description: 'Value investing, Bitcoin, and financial analysis.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts211/v4/e5/1d/ec/e51decd3-c299-33d3-15dc-cbf732db40ba/mza_7000864012270734067.jpg/600x600bb.jpg', year: 2014, episodeCount: 700, genres: ['Bitcoin', 'Investing', 'Finance'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/tip', icon: '⚡' }] },
|
||||
{ id: 'p14', title: 'Rabbit Hole Recap', host: 'Matt Odell & Marty Bent', description: 'Weekly Bitcoin news and analysis.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts211/v4/f2/e2/17/f2e2177f-46df-8eba-a909-485d182cbde2/mza_8161838611335848412.jpg/600x600bb.jpg', year: 2019, episodeCount: 250, genres: ['Bitcoin', 'News'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/rhr', icon: '⚡' }] },
|
||||
{ id: 'p15', title: 'Citadel Dispatch', host: 'Matt Odell', description: 'Interactive Bitcoin discussion with audience participation.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts221/v4/01/bc/59/01bc59a8-83df-55dc-3f7e-b03ad6180d21/mza_16016917205334564904.jpeg/600x600bb.jpg', year: 2021, episodeCount: 130, genres: ['Bitcoin', 'Privacy', 'Open Source'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/citadeldispatch', icon: '⚡' }, { type: 'youtube', name: 'YouTube', url: 'https://youtube.com/@citadeldispatch', icon: '▶️' }] },
|
||||
{ id: 'p16', title: 'Hardcore History', host: 'Dan Carlin', description: 'Deep dives into the hardest core history topics.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts115/v4/49/b7/eb/49b7eb32-8f08-6fac-aadb-2f002131fe5f/mza_15196161972010256532.jpg/600x600bb.jpg', year: 2006, episodeCount: 70, genres: ['History', 'Education'], sources: [{ type: 'rss', name: 'RSS', url: 'https://dchhaddendum.libsyn.com/rss', icon: '📡' }] },
|
||||
{ id: 'p17', title: 'The Changelog', host: 'Adam Stacoviak & Jerod Santo', description: 'Conversations with the hackers, leaders, and innovators of open source.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts123/v4/b5/b1/43/b5b14333-7cbe-123d-c444-0204e5d08102/mza_311421542997449775.png/600x600bb.jpg', year: 2009, episodeCount: 600, genres: ['Open Source', 'Technology', 'Programming'], sources: [{ type: 'rss', name: 'RSS', url: 'https://changelog.com/podcast/feed', icon: '📡' }] },
|
||||
{ id: 'p18', title: 'Once BITten!', host: 'Daniel Prince', description: 'Bitcoin, philosophy, and the orange pill journey.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts211/v4/a8/2f/36/a82f3675-c69d-b076-9fbe-eb6e7d69c5a8/mza_2824796342334185417.jpg/600x600bb.jpg', year: 2019, episodeCount: 350, genres: ['Bitcoin', 'Philosophy'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/oncebitten', icon: '⚡' }] },
|
||||
{ id: 'p19', title: 'Bitcoin Fundamentals', host: 'Preston Pysh', description: 'Understanding Bitcoin from first principles.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts211/v4/e5/1d/ec/e51decd3-c299-33d3-15dc-cbf732db40ba/mza_7000864012270734067.jpg/600x600bb.jpg', year: 2020, episodeCount: 180, genres: ['Bitcoin', 'Education', 'Finance'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/btcfundamentals', icon: '⚡' }] },
|
||||
{ id: 'p20', title: 'Opt Out Podcast', host: 'Seth For Privacy', description: 'Privacy tools, techniques, and philosophy for everyone.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts221/v4/92/9a/27/929a27d3-bc84-fad6-052e-8e112e3e439d/mza_947152063232700697.jpg/600x600bb.jpg', year: 2021, episodeCount: 90, genres: ['Privacy', 'Technology', 'Security'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/optout', icon: '⚡' }, { type: 'rss', name: 'RSS', url: 'https://optoutpod.com/feed', icon: '📡' }] },
|
||||
{ id: 'p21', title: 'Bitcoin Review', host: 'NVK & community', description: 'Technical Bitcoin development review and discussion.', coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Podcasts221/v4/9d/d9/60/9dd96097-725b-be30-4541-90f2e85c6f55/mza_11769037187183507672.jpg/600x600bb.jpg', year: 2022, episodeCount: 75, genres: ['Bitcoin', 'Development', 'Open Source'], sources: [{ type: 'fountain', name: 'Fountain', url: 'https://fountain.fm/show/bitcoinreview', icon: '⚡' }] },
|
||||
]
|
||||
|
||||
export function searchPodcasts(query: string): Podcast[] {
|
||||
|
||||
@@ -7,7 +7,7 @@ export const mockSongs: Song[] = [
|
||||
artist: 'American Football',
|
||||
album: 'American Football',
|
||||
year: 1999,
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music122/v4/17/90/19/179019ea-4eaf-b2e5-ca19-68cdbb795032/644110027696.png/600x600bb.jpg',
|
||||
duration: 269,
|
||||
genres: ['Math Rock', 'Emo', 'Indie'],
|
||||
sources: [
|
||||
@@ -21,7 +21,7 @@ export const mockSongs: Song[] = [
|
||||
artist: 'Toe',
|
||||
album: 'The Book About My Idle Plot on a Vague Anxiety',
|
||||
year: 2005,
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/5f/d9/63/5fd96387-45fa-6b94-afd8-7b2c4a24a93b/11UMGIM38959.rgb.jpg/600x600bb.jpg',
|
||||
duration: 248,
|
||||
genres: ['Math Rock', 'Post-Rock'],
|
||||
sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example2', icon: 'spotify' }],
|
||||
@@ -32,7 +32,7 @@ export const mockSongs: Song[] = [
|
||||
artist: 'Pierce the Veil',
|
||||
album: 'Selfish Machines',
|
||||
year: 2010,
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music114/v4/b6/02/3c/b6023c10-8d56-071d-6acc-a778a8550479/886443323360.jpg/600x600bb.jpg',
|
||||
duration: 234,
|
||||
genres: ['Post-Hardcore', 'Math Rock'],
|
||||
sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example3', icon: 'spotify' }],
|
||||
@@ -43,7 +43,7 @@ export const mockSongs: Song[] = [
|
||||
artist: 'Clever Girl',
|
||||
album: 'No Drum and Bass in the Jazz Room',
|
||||
year: 2016,
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music114/v4/88/0a/47/880a475a-3878-d3d9-8e72-498085aeedd4/cover.jpg/600x600bb.jpg',
|
||||
duration: 312,
|
||||
genres: ['Math Rock', 'Instrumental'],
|
||||
sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example4', icon: 'spotify' }],
|
||||
@@ -54,7 +54,7 @@ export const mockSongs: Song[] = [
|
||||
artist: 'TTNG',
|
||||
album: 'Animals',
|
||||
year: 2008,
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music211/v4/4e/c6/80/4ec680c3-78b5-7888-b9bf-9f662c039021/113992.jpg/600x600bb.jpg',
|
||||
duration: 198,
|
||||
genres: ['Math Rock', 'Indie'],
|
||||
sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example5', icon: 'spotify' }],
|
||||
@@ -65,7 +65,7 @@ export const mockSongs: Song[] = [
|
||||
artist: 'Battles',
|
||||
album: 'Mirrored',
|
||||
year: 2007,
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music124/v4/00/93/01/009301a8-ee08-50a9-25d4-f31e6e8d4a10/mzi.jfnvclpy.jpg/600x600bb.jpg',
|
||||
duration: 427,
|
||||
genres: ['Math Rock', 'Experimental'],
|
||||
sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example6', icon: 'spotify' }],
|
||||
@@ -76,7 +76,7 @@ export const mockSongs: Song[] = [
|
||||
artist: 'Don Caballero',
|
||||
album: 'American Don',
|
||||
year: 2000,
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music20/v4/4d/76/68/4d766801-c391-450d-521b-8a80d829c7f6/cover.jpg/600x600bb.jpg',
|
||||
duration: 334,
|
||||
genres: ['Math Rock', 'Instrumental'],
|
||||
sources: [{ type: 'bandcamp', name: 'Bandcamp', url: 'https://doncaballero.bandcamp.com', icon: 'bandcamp' }],
|
||||
@@ -87,7 +87,7 @@ export const mockSongs: Song[] = [
|
||||
artist: 'Tera Melos',
|
||||
album: 'Untitled',
|
||||
year: 2005,
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music221/v4/bf/af/37/bfaf3751-e991-b205-82ad-524a74136d74/114135.jpg/600x600bb.jpg',
|
||||
duration: 189,
|
||||
genres: ['Math Rock', 'Noise Rock'],
|
||||
sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example8', icon: 'spotify' }],
|
||||
@@ -98,21 +98,21 @@ export const mockSongs: Song[] = [
|
||||
artist: 'Maps & Atlases',
|
||||
album: 'Trees, Swallows, Houses',
|
||||
year: 2006,
|
||||
coverUrl: undefined,
|
||||
coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music4/v4/2c/4d/a7/2c4da769-6d8c-c498-10d3-264aa0ae1757/885686094808.jpg/600x600bb.jpg',
|
||||
duration: 256,
|
||||
genres: ['Math Rock', 'Indie'],
|
||||
sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example9', icon: 'spotify' }],
|
||||
},
|
||||
{ id: 's10', title: 'Atlas', artist: 'Polyphia', album: 'Muse', year: 2014, coverUrl: undefined, duration: 245, genres: ['Math Rock', 'Progressive'], sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example10', icon: 'spotify' }] },
|
||||
{ id: 's11', title: 'G.O.A.T.', artist: 'Polyphia', album: 'New Levels New Devils', year: 2018, coverUrl: undefined, duration: 203, genres: ['Math Rock', 'Progressive'], sources: [{ type: 'youtube', name: 'YouTube', url: 'https://youtube.com/watch?v=goat', icon: 'youtube' }] },
|
||||
{ id: 's12', title: 'Electric Sunrise', artist: 'Plini', album: 'Handmade Cities', year: 2016, coverUrl: undefined, duration: 284, genres: ['Progressive', 'Instrumental'], sources: [{ type: 'bandcamp', name: 'Bandcamp', url: 'https://plini.bandcamp.com', icon: 'bandcamp' }] },
|
||||
{ id: 's13', title: 'The Number of the Beast', artist: 'Iron Maiden', album: 'The Number of the Beast', year: 1982, coverUrl: undefined, duration: 289, genres: ['Heavy Metal', 'NWOBHM'], sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example13', icon: 'spotify' }] },
|
||||
{ id: 's14', title: 'Value 4 Value', artist: 'Ainsley Costello', album: 'Lightning Sessions', year: 2023, coverUrl: undefined, duration: 195, genres: ['Folk', 'Bitcoin'], sources: [{ type: 'wavlake', name: 'Wavlake', url: 'https://wavlake.com/track/v4v', icon: 'wavlake' }] },
|
||||
{ id: 's10', title: 'Atlas', artist: 'Polyphia', album: 'Muse', year: 2014, coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/10/ca/85/10ca8598-27aa-23d5-286d-2694e25e1d57/859738995726_cover.jpg/600x600bb.jpg', duration: 245, genres: ['Math Rock', 'Progressive'], sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example10', icon: 'spotify' }] },
|
||||
{ id: 's11', title: 'G.O.A.T.', artist: 'Polyphia', album: 'New Levels New Devils', year: 2018, coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music124/v4/57/5c/00/575c009a-6d69-6ac4-7c91-7e307d920279/794558040969.jpg/600x600bb.jpg', duration: 203, genres: ['Math Rock', 'Progressive'], sources: [{ type: 'youtube', name: 'YouTube', url: 'https://youtube.com/watch?v=goat', icon: 'youtube' }] },
|
||||
{ id: 's12', title: 'Electric Sunrise', artist: 'Plini', album: 'Handmade Cities', year: 2016, coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/f5/0f/6b/f50f6bb3-2e91-d365-df84-49078b627590/11689.jpg/600x600bb.jpg', duration: 284, genres: ['Progressive', 'Instrumental'], sources: [{ type: 'bandcamp', name: 'Bandcamp', url: 'https://plini.bandcamp.com', icon: 'bandcamp' }] },
|
||||
{ id: 's13', title: 'The Number of the Beast', artist: 'Iron Maiden', album: 'The Number of the Beast', year: 1982, coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music124/v4/b4/37/6c/b4376c0d-5647-dfb0-d7f1-d18b73e0f9c5/4050538293227.jpg/600x600bb.jpg', duration: 289, genres: ['Heavy Metal', 'NWOBHM'], sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example13', icon: 'spotify' }] },
|
||||
{ id: 's14', title: 'Value 4 Value', artist: 'Ainsley Costello', album: 'Lightning Sessions', year: 2023, coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music116/v4/d5/68/47/d56847ce-fe3f-7903-0373-de3e4aeebab0/195729402522_cover.jpg/600x600bb.jpg', duration: 195, genres: ['Folk', 'Bitcoin'], sources: [{ type: 'wavlake', name: 'Wavlake', url: 'https://wavlake.com/track/v4v', icon: 'wavlake' }] },
|
||||
{ id: 's15', title: 'Bitcoin Thunder', artist: 'Mandrik', album: 'Orange Pill', year: 2022, coverUrl: undefined, duration: 178, genres: ['Electronic', 'Bitcoin'], sources: [{ type: 'wavlake', name: 'Wavlake', url: 'https://wavlake.com/track/thunder', icon: 'wavlake' }] },
|
||||
{ id: 's16', title: 'Lateralus', artist: 'Tool', album: 'Lateralus', year: 2001, coverUrl: undefined, duration: 563, genres: ['Progressive Metal', 'Art Rock'], sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example16', icon: 'spotify' }] },
|
||||
{ id: 's17', title: 'Teardrop', artist: 'Massive Attack', album: 'Mezzanine', year: 1998, coverUrl: undefined, duration: 323, genres: ['Trip Hop', 'Electronic'], sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example17', icon: 'spotify' }] },
|
||||
{ id: 's18', title: 'Windowlicker', artist: 'Aphex Twin', album: 'Windowlicker EP', year: 1999, coverUrl: undefined, duration: 371, genres: ['IDM', 'Electronic'], sources: [{ type: 'bandcamp', name: 'Bandcamp', url: 'https://aphextwin.bandcamp.com', icon: 'bandcamp' }] },
|
||||
{ id: 's19', title: 'Schism', artist: 'Tool', album: 'Lateralus', year: 2001, coverUrl: undefined, duration: 399, genres: ['Progressive Metal'], sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example19', icon: 'spotify' }] },
|
||||
{ id: 's20', title: 'Flim', artist: 'Aphex Twin', album: 'Come to Daddy EP', year: 1997, coverUrl: undefined, duration: 170, genres: ['IDM', 'Ambient'], sources: [{ type: 'bandcamp', name: 'Bandcamp', url: 'https://aphextwin.bandcamp.com', icon: 'bandcamp' }] },
|
||||
{ id: 's16', title: 'Lateralus', artist: 'Tool', album: 'Lateralus', year: 2001, coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music113/v4/fb/99/8c/fb998c1e-1a11-2434-0fa7-0d90beba5d2b/886447824764.jpg/600x600bb.jpg', duration: 563, genres: ['Progressive Metal', 'Art Rock'], sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example16', icon: 'spotify' }] },
|
||||
{ id: 's17', title: 'Teardrop', artist: 'Massive Attack', album: 'Mezzanine', year: 1998, coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/0a/98/55/0a98555b-8d9d-3b46-660a-b91261557d17/00724384559953.rgb.jpg/600x600bb.jpg', duration: 323, genres: ['Trip Hop', 'Electronic'], sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example17', icon: 'spotify' }] },
|
||||
{ id: 's18', title: 'Windowlicker', artist: 'Aphex Twin', album: 'Windowlicker EP', year: 1999, coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music123/v4/81/20/73/812073f2-c437-fd1d-636d-6be5a4432747/0801061910532.png/600x600bb.jpg', duration: 371, genres: ['IDM', 'Electronic'], sources: [{ type: 'bandcamp', name: 'Bandcamp', url: 'https://aphextwin.bandcamp.com', icon: 'bandcamp' }] },
|
||||
{ id: 's19', title: 'Schism', artist: 'Tool', album: 'Lateralus', year: 2001, coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music113/v4/fb/99/8c/fb998c1e-1a11-2434-0fa7-0d90beba5d2b/886447824764.jpg/600x600bb.jpg', duration: 399, genres: ['Progressive Metal'], sources: [{ type: 'spotify', name: 'Spotify', url: 'https://open.spotify.com/track/example19', icon: 'spotify' }] },
|
||||
{ id: 's20', title: 'Flim', artist: 'Aphex Twin', album: 'Come to Daddy EP', year: 1997, coverUrl: 'https://is1-ssl.mzstatic.com/image/thumb/Music211/v4/bf/0b/a5/bf0ba54c-1c9b-d812-2ccf-54d137dc81ae/ticket.qknfmwov.png/600x600bb.jpg', duration: 170, genres: ['IDM', 'Ambient'], sources: [{ type: 'bandcamp', name: 'Bandcamp', url: 'https://aphextwin.bandcamp.com', icon: 'bandcamp' }] },
|
||||
{ id: 's21', title: 'Bitcoin is Dead', artist: 'HODL Band', album: 'Stack Sats', year: 2024, coverUrl: undefined, duration: 212, genres: ['Rock', 'Bitcoin'], sources: [{ type: 'wavlake', name: 'Wavlake', url: 'https://wavlake.com/track/dead', icon: 'wavlake' }] },
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user