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>
112 lines
2.9 KiB
YAML
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
|