Version 1.3 für App Store
This commit is contained in:
@@ -274,8 +274,8 @@
|
|||||||
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||||
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
@@ -310,8 +310,8 @@
|
|||||||
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||||
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"filename" : "subsonic_94696.svg",
|
||||||
|
"idiom" : "universal"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
},
|
||||||
|
"properties" : {
|
||||||
|
"preserves-vector-representation" : true
|
||||||
|
}
|
||||||
|
}
|
||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" version="1.1" viewBox="0 0 32 32">
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="linearGradient4207" x1="2" x2="8" y1="1038.1" y2="1038.1" gradientUnits="userSpaceOnUse">
|
||||||
|
<stop offset="0" stop-opacity="0"/>
|
||||||
|
<stop offset="1"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g transform="translate(0 -1020.4)">
|
||||||
|
<g transform="matrix(.66667 0 0 .8 -1.3333 215.87)">
|
||||||
|
<rect fill="#41b941" width="3" height="10" x="14" y="1014.4" rx="1.406" ry="1.747"/>
|
||||||
|
<path fill="#fff" opacity=".2" d="m15.406 10c-0.779 0-1.406 0.778-1.406 1.746v1c0-0.968 0.627-1.746 1.406-1.746h0.1875c0.779 0 1.406 0.778 1.406 1.746v-1c0-0.968-0.627-1.746-1.406-1.746h-0.1875z" transform="translate(0 1004.4)"/>
|
||||||
|
</g>
|
||||||
|
<path fill="#ffca1d" d="m14.6 1027.4c-0.7756 0-1.6 0.6175-1.6 1.3846v1.6168c-2.5977 0.8209-4.3 3.114-5 4.4986-0.7-1.3846-5-2-5-2v3.5h-1v4h1v3c-0.027344 0 4.3-0.6154 5-2 0.7 1.3846 4.5 4 10.1 4s11.9-3.0272 11.9-7.6154c-0.0061-3.2607-2.7438-6.0433-7-7.3859v-1.6141c0-0.7671-0.6244-1.3846-1.4-1.3846z"/>
|
||||||
|
<circle opacity=".2" cx="18" cy="1038.4" r="2"/>
|
||||||
|
<circle fill="#fff" cx="18" cy="1037.4" r="2"/>
|
||||||
|
<circle opacity=".2" cx="23" cy="1038.4" r="2"/>
|
||||||
|
<circle fill="#fff" cx="23" cy="1037.4" r="2"/>
|
||||||
|
<circle opacity=".2" cx="13" cy="1038.4" r="2"/>
|
||||||
|
<circle fill="#fff" cx="13" cy="1037.4" r="2"/>
|
||||||
|
<path fill="#fff" opacity=".2" d="m14.6 7c-0.776 0-1.6 0.6177-1.6 1.3848v1c0-0.7671 0.824-1.3848 1.6-1.3848h7c0.775 0 1.4 0.6177 1.4 1.3848v-1c0-0.7671-0.625-1.3848-1.4-1.3848zm8.4 2.998v1c3.9894 1.2584 6.6445 3.7828 6.9668 6.7793 0.01-0.131 0.033-0.259 0.033-0.392-0.006-3.261-2.744-6.044-7-7.387zm-10 0.00391c-2.598 0.821-4.3 3.113-5 4.498-0.7-1.385-5-2-5-2v1s4.3 0.6154 5 2c0.7-1.3846 2.4023-3.6771 5-4.498z" transform="translate(0 1020.4)"/>
|
||||||
|
<path opacity=".2" d="m29.967 1038.1c-0.35239 4.3638-6.4312 7.2207-11.867 7.2207-5.6 0-9.3996-2.6154-10.1-4-0.7 1.3846-5.0273 2-5 2v1c-0.027344 0 4.3-0.6154 5-2 0.7 1.3846 4.4996 4 10.1 4 5.6 0 11.9-3.027 11.9-7.6152-0.000381-0.2038-0.01178-0.4057-0.0332-0.6055z"/>
|
||||||
|
<path fill="url(#linearGradient4207)" opacity=".1" d="m8 1034.9c-0.7-1.3846-5-2-5-2v3.5h-1v4h1v3c-0.027344 0 4.3-0.6154 5-2z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.1 KiB |
@@ -48,12 +48,21 @@ struct ProviderBadge: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
HStack(spacing: 4) {
|
HStack(spacing: 4) {
|
||||||
ForEach(providers, id: \.self) { provider in
|
ForEach(providers, id: \.self) { provider in
|
||||||
Image(systemName: provider.icon)
|
if let assetName = provider.logoAssetName {
|
||||||
.font(.system(size: 9, weight: .bold))
|
Image(assetName)
|
||||||
.foregroundStyle(.white)
|
.resizable()
|
||||||
.frame(width: 20, height: 20)
|
.aspectRatio(contentMode: .fill)
|
||||||
.background(.black.opacity(0.55))
|
.frame(width: 30, height: 30)
|
||||||
.clipShape(Circle())
|
.background(.black.opacity(0.55))
|
||||||
|
.clipShape(Circle())
|
||||||
|
} else {
|
||||||
|
Image(systemName: provider.icon)
|
||||||
|
.font(.system(size: 14, weight: .bold))
|
||||||
|
.foregroundStyle(.white)
|
||||||
|
.frame(width: 30, height: 30)
|
||||||
|
.background(.black.opacity(0.55))
|
||||||
|
.clipShape(Circle())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -76,24 +85,35 @@ enum MusicProvider: Hashable {
|
|||||||
case filesystem
|
case filesystem
|
||||||
case jellyfin
|
case jellyfin
|
||||||
case dlna
|
case dlna
|
||||||
|
case ardAudiothek
|
||||||
|
|
||||||
/// SF Symbol name for this provider.
|
/// Asset catalog image name for providers that have a custom logo.
|
||||||
|
/// Returns `nil` when the provider uses an SF Symbol instead.
|
||||||
|
var logoAssetName: String? {
|
||||||
|
switch self {
|
||||||
|
case .subsonic: return "SubsonicLogo"
|
||||||
|
default: return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// SF Symbol name for this provider (used when `logoAssetName` is nil).
|
||||||
var icon: String {
|
var icon: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .library: return "building.columns.fill"
|
case .library: return "building.columns.fill"
|
||||||
case .subsonic: return "ferry.fill"
|
case .subsonic: return "ferry.fill"
|
||||||
case .spotify: return "antenna.radiowaves.left.and.right.circle.fill"
|
case .spotify: return "antenna.radiowaves.left.and.right.circle.fill"
|
||||||
case .tidal: return "water.waves"
|
case .tidal: return "water.waves"
|
||||||
case .qobuz: return "hifispeaker.fill"
|
case .qobuz: return "hifispeaker.fill"
|
||||||
case .plex: return "play.square.stack.fill"
|
case .plex: return "play.square.stack.fill"
|
||||||
case .ytmusic: return "play.rectangle.fill"
|
case .ytmusic: return "play.rectangle.fill"
|
||||||
case .appleMusic: return "applelogo"
|
case .appleMusic: return "applelogo"
|
||||||
case .deezer: return "waveform"
|
case .deezer: return "waveform"
|
||||||
case .soundcloud: return "cloud.fill"
|
case .soundcloud: return "cloud.fill"
|
||||||
case .tunein: return "radio.fill"
|
case .tunein: return "radio.fill"
|
||||||
case .filesystem: return "folder.fill"
|
case .filesystem: return "folder.fill"
|
||||||
case .jellyfin: return "server.rack"
|
case .jellyfin: return "server.rack"
|
||||||
case .dlna: return "wifi"
|
case .dlna: return "wifi"
|
||||||
|
case .ardAudiothek: return "antenna.radiowaves.left.and.right"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,6 +135,8 @@ enum MusicProvider: Hashable {
|
|||||||
if scheme.hasPrefix("filesystem") { return .filesystem }
|
if scheme.hasPrefix("filesystem") { return .filesystem }
|
||||||
if scheme.hasPrefix("jellyfin") { return .jellyfin }
|
if scheme.hasPrefix("jellyfin") { return .jellyfin }
|
||||||
if scheme.hasPrefix("dlna") { return .dlna }
|
if scheme.hasPrefix("dlna") { return .dlna }
|
||||||
|
if scheme.hasPrefix("ard_audiothek") { return .ardAudiothek }
|
||||||
|
if scheme.hasPrefix("ard") { return .ardAudiothek }
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -134,8 +156,10 @@ enum MusicProvider: Hashable {
|
|||||||
if k.hasPrefix("soundcloud") { return .soundcloud }
|
if k.hasPrefix("soundcloud") { return .soundcloud }
|
||||||
if k.hasPrefix("tunein") { return .tunein }
|
if k.hasPrefix("tunein") { return .tunein }
|
||||||
if k.hasPrefix("filesystem") { return .filesystem }
|
if k.hasPrefix("filesystem") { return .filesystem }
|
||||||
if k.hasPrefix("jellyfin") { return .jellyfin }
|
if k.hasPrefix("jellyfin") { return .jellyfin }
|
||||||
if k.hasPrefix("dlna") { return .dlna }
|
if k.hasPrefix("dlna") { return .dlna }
|
||||||
|
if k.hasPrefix("ard_audiothek") { return .ardAudiothek }
|
||||||
|
if k.hasPrefix("ard") { return .ardAudiothek }
|
||||||
// Image-only metadata providers — not a music source
|
// Image-only metadata providers — not a music source
|
||||||
if k == "lastfm" || k == "musicbrainz" || k == "fanarttv" { return nil }
|
if k == "lastfm" || k == "musicbrainz" || k == "fanarttv" { return nil }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user