// swift-tools-version: 6.2 import PackageDescription let package = Package( name: "FlixyKit", // Quellsprache ist Englisch, damit die Schlüssel im Code lesbar bleiben. // Deutsch kommt als Übersetzung dazu; die Systemsprache entscheidet. defaultLocalization: "en", // macOS steht hier nur, damit `swift test` die Logik-Tests ohne // Simulator laufen lassen kann — das spart bei jedem Durchlauf Minuten. // Welche Plattformen die Apps bedienen, legt project.yml fest: iOS für // Flixy, tvOS für FlixyTV. platforms: [.iOS(.v26), .macOS(.v26), .tvOS(.v26)], products: [ .library(name: "MediaKit", targets: ["MediaKit"]), .library(name: "JellyfinKit", targets: ["JellyfinKit"]), .library(name: "FlixyDesign", targets: ["FlixyDesign"]), .library(name: "FlixyPlayback", targets: ["FlixyPlayback"]), .library(name: "FlixyDownloads", targets: ["FlixyDownloads"]), ], targets: [ // Sprechen mit dem Server: Anmeldung, Endpunkte, Modelle. Kein SwiftUI, // damit die gesamte Protokoll-Schicht ohne Oberfläche testbar bleibt. // Die neutrale Grundschicht: Typen und Rechnungen, die für jeden // Server gelten. Hängt von nichts ab — genau das macht sie zur // Grundlage, auf der jeder Server und später das Web-Projekt // dasselbe meinen. .target(name: "MediaKit"), .testTarget(name: "MediaKitTests", dependencies: ["MediaKit"]), // Jellyfin. Eigenes Target auf der neutralen Schicht — ein Server, // eine Schachtel. Kommt ein zweiter dazu, steht er daneben und // nicht darin; herausnehmen heisst dann, ein Verzeichnis zu löschen. .target(name: "JellyfinKit", dependencies: ["MediaKit"], resources: [.process("Localizable.xcstrings")]), .testTarget( name: "JellyfinKitTests", dependencies: ["JellyfinKit"], resources: [.copy("Fixtures")] ), // Ein Werkzeug für die Fragen, die reines HTTP sind — ohne Oberfläche, // ohne Gerät, ohne Upload. Eine Runde dauert damit Sekunden statt // eines halben Tages, und das Upload-Kontingent bleibt für Builds. .executableTarget(name: "FlixyProbe", dependencies: ["MediaKit", "JellyfinKit"]), // Farben, Typografie, wiederkehrende Bausteine. Hängt bewusst von // nichts ab: dadurch bleibt das Umstellen der Akzentfarbe ein // Token-Wechsel und keine Suche quer durch die App. .target(name: "FlixyDesign", resources: [.process("Localizable.xcstrings")]), .testTarget(name: "FlixyDesignTests", dependencies: ["FlixyDesign"]), // Die Wiedergabe-Abstraktion samt AVPlayer-Engine und der Entscheidung // direkt / umpacken / umrechnen. .target(name: "FlixyPlayback", dependencies: ["MediaKit"]), .testTarget(name: "FlixyPlaybackTests", dependencies: ["FlixyPlayback"]), // Warteschlange, Hintergrundübertragung, Offline-Bestand. .target(name: "FlixyDownloads", dependencies: ["MediaKit"], resources: [.process("Localizable.xcstrings")]), .testTarget(name: "FlixyDownloadsTests", dependencies: ["FlixyDownloads"]), ] )