Files
Spanish/Conjuga/project.yml
Trey t 5777a210cd Fixes #21 — Curated YouTube videos per guide + grammar item
Each of the 56 tense guides and grammar notes gets a curated YouTube video
attached (54 with picks, 2 silent nulls on rare / hard-to-find topics).
Users can stream in YouTube/Safari, download via YouTubeKit for offline
viewing, or play the local MP4 full-screen via AVPlayer.

YouTubeVideoStore loads the bundled youtube_videos.json at launch and serves
lookups by tense id or grammar note id. VideoDownloadService resolves the
best progressive MP4 stream off the main actor (YouTubeKit isn't Sendable),
writes to documents/videos/<videoId>.mp4, and records a DownloadedVideo row
in the local SwiftData container so the app knows what's on disk across
launches.

VideoActionsButtonRow is the unified UI for both detail views: three large
buttons — Stream (red, always enabled), Download (blue, disabled while in
flight and after completion, shows progress), Play (green, enabled only
when downloaded). Full-screen cover on tap. Settings gains a Downloaded
Videos list with swipe-delete, total-size summary, and a 500 MB warning.

Local store reset version bumped to 4 for the new DownloadedVideo schema.

Known fragility: YouTubeKit scrapes YouTube's private stream API and will
break when YouTube changes their internal format. Streaming keeps working
regardless.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 18:51:19 -05:00

112 lines
2.9 KiB
YAML

name: Conjuga
options:
bundleIdPrefix: com.conjuga
deploymentTarget:
iOS: "26.0"
xcodeVersion: "26.0"
schemePathPrefix: ""
generateEmptyDirectories: true
schemes:
Conjuga:
build:
targets:
Conjuga: all
ConjugaWidgetExtension: all
run:
config: Debug
executable: Conjuga
test:
config: Debug
profile:
config: Release
analyze:
config: Debug
archive:
config: Release
packages:
SharedModels:
path: SharedModels
YouTubeKit:
url: https://github.com/alexeichhorn/YouTubeKit.git
from: 0.3.0
settings:
base:
SWIFT_VERSION: "6.0"
CURRENT_PROJECT_VERSION: 1
MARKETING_VERSION: 1.0.0
targets:
Conjuga:
type: application
platform: iOS
sources:
- path: Conjuga
excludes:
- "*.json"
- path: Conjuga/conjuga_data.json
buildPhase: resources
- path: Conjuga/course_data.json
buildPhase: resources
- path: Conjuga/reflexive_verbs.json
buildPhase: resources
- path: Conjuga/youtube_videos.json
buildPhase: resources
info:
path: Conjuga/Info.plist
properties:
CFBundleDisplayName: Conjuga
LSApplicationCategoryType: public.app-category.education
UILaunchScreen: {}
UIBackgroundModes:
- fetch
- remote-notification
BGTaskSchedulerPermittedIdentifiers:
- com.conjuga.app.refresh
UISupportedInterfaceOrientations:
- UIInterfaceOrientationPortrait
UISupportedInterfaceOrientations~ipad:
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationPortraitUpsideDown
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.conjuga.app
CODE_SIGN_ENTITLEMENTS: Conjuga/Conjuga.entitlements
SWIFT_STRICT_CONCURRENCY: complete
ENABLE_DEBUG_DYLIB: NO
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
TARGETED_DEVICE_FAMILY: "1,2"
DEVELOPMENT_TEAM: V3PF3M6B6U
CODE_SIGN_STYLE: Automatic
dependencies:
- target: ConjugaWidgetExtension
- package: SharedModels
- package: YouTubeKit
ConjugaWidgetExtension:
type: app-extension
platform: iOS
sources:
- path: ConjugaWidget
info:
path: ConjugaWidget/Info.plist
properties:
CFBundleDisplayName: Conjuga Widget
NSExtension:
NSExtensionPointIdentifier: com.apple.widgetkit-extension
settings:
base:
PRODUCT_BUNDLE_IDENTIFIER: com.conjuga.app.widget
CODE_SIGN_ENTITLEMENTS: ConjugaWidget/ConjugaWidget.entitlements
DEVELOPMENT_TEAM: V3PF3M6B6U
CODE_SIGN_STYLE: Automatic
SWIFT_STRICT_CONCURRENCY: complete
TARGETED_DEVICE_FAMILY: "1,2"
ENABLE_DEBUG_DYLIB: NO
dependencies:
- package: SharedModels