Files
linkding-ios/project.yml
Krishna Kumar af3112530e
All checks were successful
CI / build-and-deploy (push) Successful in 24s
CI / build-and-deploy (pull_request) Successful in 15s
feat(podcasts): played/unplayed queue, background generation, share-sheet audio
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>
2026-07-01 11:37:42 -05:00

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