Turns the Podcasts tab into a proper podcast-app experience across three features that compose on a shared background-generation service. Background generation (#2) - New PodcastGenerationManager runs generate→poll→download off the player, so producing a new episode never stops current playback. - Headphone taps never interrupt: idle → generate-and-play in the foreground (unchanged); already playing → generate in the background, episode lands in the library. A "Generating…" banner surfaces active jobs. Played/unplayed + queue (#1) - PodcastEntry gains playedAt (old index.json decodes as unplayed). - Podcasts tab splits into Up Next / Played with a Play All queue that auto-advances; finishing marks played; swipe to toggle played state. Share-extension audio (#3) - "Create podcast" toggle on the save card, plus configurable Auto-Podcast Tags in Settings. The extension enqueues a request into the App Group; the main app drains it on launch/foreground and generates in the background. Closes #1 Closes #2 Closes #3 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
129 lines
3.0 KiB
YAML
129 lines
3.0 KiB
YAML
name: Marks
|
|
|
|
options:
|
|
bundleIdPrefix: com.magicive
|
|
deploymentTarget:
|
|
iOS: "26.0"
|
|
xcodeVersion: "16.3"
|
|
createIntermediateGroups: true
|
|
|
|
settings:
|
|
base:
|
|
SWIFT_VERSION: "6.0"
|
|
DEVELOPMENT_TEAM: AE5DZKJHGN
|
|
CODE_SIGN_STYLE: Automatic
|
|
IPHONEOS_DEPLOYMENT_TARGET: "26.0"
|
|
ENABLE_PREVIEWS: YES
|
|
|
|
schemes:
|
|
Marks:
|
|
build:
|
|
targets:
|
|
Marks: all
|
|
ShareExtension: all
|
|
MarksWidget: all
|
|
run:
|
|
config: Debug
|
|
test:
|
|
config: Debug
|
|
targets:
|
|
- MarksTests
|
|
profile:
|
|
config: Release
|
|
analyze:
|
|
config: Debug
|
|
archive:
|
|
config: Release
|
|
|
|
MarksWidget:
|
|
build:
|
|
targets:
|
|
Marks: all
|
|
MarksWidget: all
|
|
run:
|
|
config: Debug
|
|
analyze:
|
|
config: Debug
|
|
archive:
|
|
config: Release
|
|
|
|
ShareExtension:
|
|
build:
|
|
targets:
|
|
Marks: all
|
|
ShareExtension: all
|
|
run:
|
|
config: Debug
|
|
analyze:
|
|
config: Debug
|
|
archive:
|
|
config: Release
|
|
|
|
targets:
|
|
Marks:
|
|
type: application
|
|
platform: iOS
|
|
sources:
|
|
- path: Marks
|
|
- path: MarksWidget/WidgetDataStore.swift
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: com.magicive.marks
|
|
INFOPLIST_FILE: Marks/Info.plist
|
|
CODE_SIGN_ENTITLEMENTS: Marks/Marks.entitlements
|
|
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
|
|
dependencies:
|
|
- target: ShareExtension
|
|
- target: MarksWidget
|
|
- sdk: WidgetKit.framework
|
|
- sdk: AppIntents.framework
|
|
|
|
ShareExtension:
|
|
type: app-extension
|
|
platform: iOS
|
|
sources:
|
|
- path: ShareExtension
|
|
# Shared with the main app so the extension can talk to linkding + the AI
|
|
# backend (the save card checks for duplicates and suggests tags).
|
|
- path: Marks/Models/Bookmark.swift
|
|
- path: Marks/Models/ServerConfig.swift
|
|
- path: Marks/Services/LinkdingAPI.swift
|
|
- path: Marks/Services/MarksAuth.swift
|
|
- path: Marks/Services/Log.swift
|
|
# Cross-process podcast request queue: the extension enqueues, the app runs it.
|
|
- path: Marks/Services/PodcastRequests.swift
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: com.magicive.marks.ShareExtension
|
|
INFOPLIST_FILE: ShareExtension/Info.plist
|
|
CODE_SIGN_ENTITLEMENTS: ShareExtension/ShareExtension.entitlements
|
|
SKIP_INSTALL: YES
|
|
APPLICATION_EXTENSION_API_ONLY: YES
|
|
|
|
MarksTests:
|
|
type: bundle.unit-test
|
|
platform: iOS
|
|
sources:
|
|
- path: MarksTests
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: com.magicive.marks.MarksTests
|
|
GENERATE_INFOPLIST_FILE: YES
|
|
dependencies:
|
|
- target: Marks
|
|
|
|
MarksWidget:
|
|
type: app-extension
|
|
platform: iOS
|
|
sources:
|
|
- path: MarksWidget
|
|
settings:
|
|
base:
|
|
PRODUCT_BUNDLE_IDENTIFIER: com.magicive.marks.MarksWidget
|
|
INFOPLIST_FILE: MarksWidget/Info.plist
|
|
CODE_SIGN_ENTITLEMENTS: MarksWidget/MarksWidget.entitlements
|
|
SKIP_INSTALL: YES
|
|
dependencies:
|
|
- sdk: WidgetKit.framework
|
|
- sdk: SwiftUI.framework
|