fediversion/backend/routers/videos.py
fullsizemalt b4cddf41ea feat: Initialize Fediversion multi-band platform
- Fork elmeg-demo codebase for multi-band support
- Add data importer infrastructure with base class
- Create band-specific importers:
  - phish.py: Phish.net API v5
  - grateful_dead.py: Grateful Stats API
  - setlistfm.py: Dead & Company, Billy Strings (Setlist.fm)
- Add spec-kit configuration for Gemini
- Update README with supported bands and architecture
2025-12-28 12:39:28 -08:00

130 lines
3.7 KiB
Python

"""
Videos endpoint - list all performances and shows with YouTube links
"""
from typing import List, Optional
from fastapi import APIRouter, Depends, Query
from sqlmodel import Session, select
from database import get_session
from models import Show, Performance, Song, Venue
router = APIRouter(prefix="/videos", tags=["videos"])
@router.get("/")
def get_all_videos(
limit: int = Query(default=100, le=500),
offset: int = Query(default=0),
session: Session = Depends(get_session)
):
"""Get all performances and shows with YouTube links."""
# Get performances with videos
perf_query = (
select(
Performance.id,
Performance.youtube_link,
Performance.show_id,
Song.id.label("song_id"),
Song.title.label("song_title"),
Song.slug.label("song_slug"),
Show.date,
Show.slug.label("show_slug"),
Venue.name.label("venue_name"),
Venue.city.label("venue_city"),
Venue.state.label("venue_state"),
Performance.slug.label("performance_slug"),
Venue.slug.label("venue_slug")
)
.join(Song, Performance.song_id == Song.id)
.join(Show, Performance.show_id == Show.id)
.join(Venue, Show.venue_id == Venue.id)
.where(Performance.youtube_link != None)
.order_by(Show.date.desc())
.limit(limit)
.offset(offset)
)
perf_results = session.exec(perf_query).all()
performances = [
{
"type": "performance",
"id": r[0],
"youtube_link": r[1],
"show_id": r[2],
"song_id": r[3],
"song_title": r[4],
"song_slug": r[5],
"date": r[6].isoformat() if r[6] else None,
"show_slug": r[7],
"venue_name": r[8],
"venue_city": r[9],
"venue_state": r[10],
"performance_slug": r[11],
"venue_slug": r[12]
}
for r in perf_results
]
# Get shows with videos
show_query = (
select(
Show.id,
Show.youtube_link,
Show.date,
Show.slug,
Venue.name.label("venue_name"),
Venue.city.label("venue_city"),
Venue.state.label("venue_state"),
Venue.slug.label("venue_slug")
)
.join(Venue, Show.venue_id == Venue.id)
.where(Show.youtube_link != None)
.order_by(Show.date.desc())
.limit(limit)
.offset(offset)
)
show_results = session.exec(show_query).all()
shows = [
{
"type": "full_show",
"id": r[0],
"youtube_link": r[1],
"date": r[2].isoformat() if r[2] else None,
"show_slug": r[3],
"venue_name": r[4],
"venue_city": r[5],
"venue_state": r[6],
"venue_slug": r[7]
}
for r in show_results
]
return {
"performances": performances,
"shows": shows,
"total_performances": len(performances),
"total_shows": len(shows)
}
@router.get("/stats")
def get_video_stats(session: Session = Depends(get_session)):
"""Get counts of videos in the database."""
from sqlmodel import func
perf_count = session.exec(
select(func.count(Performance.id)).where(Performance.youtube_link != None)
).one()
show_count = session.exec(
select(func.count(Show.id)).where(Show.youtube_link != None)
).one()
return {
"performance_videos": perf_count,
"full_show_videos": show_count,
"total": perf_count + show_count
}