[iOS] Admin Dashboard - Active Devices Icons (#1275)
* Add Device images & Reference using the Enum as a filler if the NowPlayingItem is Nil * Localize DeviceTypes.DisplayTitles * Review changes. Last potential TODO: Image: ImageResource might not be the correct format * DeviceType is needed to build tvOS * Mirror Jellyfin-Blue-Blob for SVG configuration. Use ImageResource for the Device/Client Images * Merge missing } * Don't recreate the ImageResource since it's already generated. * New webOS logo! Fix tvOS not having the new logos * use if let, implicit self * use secondary system fill for other --------- Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
|
@ -0,0 +1,276 @@
|
|||
//
|
||||
// Swiftfin is subject to the terms of the Mozilla Public
|
||||
// License, v2.0. If a copy of the MPL was not distributed with this
|
||||
// file, you can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
//
|
||||
// Copyright (c) 2024 Jellyfin & Jellyfin Contributors
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
enum DeviceType: String, Displayable, Codable, CaseIterable {
|
||||
case android
|
||||
case apple
|
||||
case chrome
|
||||
case edge
|
||||
case edgechromium
|
||||
case finamp
|
||||
case firefox
|
||||
case homeAssistant
|
||||
case html5
|
||||
case kodi
|
||||
case msie
|
||||
case opera
|
||||
case playstation
|
||||
case roku
|
||||
case safari
|
||||
case samsungtv
|
||||
case webos
|
||||
case windows
|
||||
case xbox
|
||||
case other
|
||||
|
||||
// MARK: - Display Title
|
||||
|
||||
var displayTitle: String {
|
||||
switch self {
|
||||
case .android:
|
||||
return "Android"
|
||||
case .apple:
|
||||
return "Apple"
|
||||
case .chrome:
|
||||
return "Chrome"
|
||||
case .edge:
|
||||
return "Edge"
|
||||
case .edgechromium:
|
||||
return "Edge Chromium"
|
||||
case .finamp:
|
||||
return "Finamp"
|
||||
case .firefox:
|
||||
return "Firefox"
|
||||
case .homeAssistant:
|
||||
return "Home Assistant"
|
||||
case .html5:
|
||||
return "HTML5"
|
||||
case .kodi:
|
||||
return "Kodi"
|
||||
case .msie:
|
||||
return "Internet Explorer"
|
||||
case .opera:
|
||||
return "Opera"
|
||||
case .playstation:
|
||||
return "PlayStation"
|
||||
case .roku:
|
||||
return "Roku"
|
||||
case .safari:
|
||||
return "Safari"
|
||||
case .samsungtv:
|
||||
return "Samsung TV"
|
||||
case .webos:
|
||||
return "WebOS"
|
||||
case .windows:
|
||||
return "Windows"
|
||||
case .xbox:
|
||||
return "Xbox"
|
||||
case .other:
|
||||
return "Other"
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Initialize the Client
|
||||
|
||||
init(client: String?, deviceName: String?) {
|
||||
guard let client = client?.lowercased() else {
|
||||
self = .other
|
||||
return
|
||||
}
|
||||
|
||||
switch client {
|
||||
|
||||
/* Android or Findroid */
|
||||
case let str where str.range(of: #"android|findroid"#, options: .regularExpression) != nil:
|
||||
self = .android
|
||||
|
||||
/* Apple devices: iOS, tvOS, iPadOS, Swiftfin, or Infuse */
|
||||
case let str where str.range(of: #"ios|tvos|ipados|swiftfin|infuse"#, options: .regularExpression) != nil:
|
||||
self = .apple
|
||||
|
||||
/* Finamp */
|
||||
case let str where str.range(of: #"finamp"#, options: .regularExpression) != nil:
|
||||
self = .finamp
|
||||
|
||||
/* Home Assistant or HomeAssistant */
|
||||
case let str where str.range(of: #"home.assistant|homeassistant"#, options: .regularExpression) != nil:
|
||||
self = .homeAssistant
|
||||
|
||||
/* Jellyfin Web or JellyfinWeb (Vue versions included) */
|
||||
case let str where str.range(of: #"jellyfin.web|jellyfinweb"#, options: .regularExpression) != nil:
|
||||
self = DeviceType(webBrowser: deviceName)
|
||||
|
||||
/* Kodi or JellyCon */
|
||||
case let str where str.range(of: #"kodi|jellycon"#, options: .regularExpression) != nil:
|
||||
self = .kodi
|
||||
|
||||
/* LG TV, LG Smart TV, or WebOS devices */
|
||||
case let str where str.range(of: #"lg.+tv|webos"#, options: .regularExpression) != nil:
|
||||
self = .webos
|
||||
|
||||
/* PlayStation: Sony PS3, PS4, or any PlayStation */
|
||||
case let str where str.range(of: #"sony\sps[3-4]|playstation"#, options: .regularExpression) != nil:
|
||||
self = .playstation
|
||||
|
||||
/* Roku devices */
|
||||
case let str where str.range(of: #"roku"#, options: .regularExpression) != nil:
|
||||
self = .roku
|
||||
|
||||
/* Samsung TV, Samsung Smart TV, or devices running Tizen */
|
||||
case let str where str.range(of: #"samsung.+tv|tizen"#, options: .regularExpression) != nil:
|
||||
self = .samsungtv
|
||||
|
||||
/* Xbox One or any Xbox device */
|
||||
case let str where str.range(of: #"xbox"#, options: .regularExpression) != nil:
|
||||
self = .xbox
|
||||
|
||||
/* Default case for anything else */
|
||||
default:
|
||||
self = .other
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Initialize the Browser if Jellyfin-Web
|
||||
|
||||
private init(webBrowser: String?) {
|
||||
guard let webBrowser = webBrowser?.lowercased() else {
|
||||
self = .html5
|
||||
return
|
||||
}
|
||||
|
||||
switch webBrowser {
|
||||
|
||||
/* Matches any string containing 'chrome' */
|
||||
case let str where str.range(of: #"chrome"#, options: .regularExpression) != nil:
|
||||
self = .chrome
|
||||
|
||||
/* Matches any string containing 'edge chromium' or 'edgechromium' */
|
||||
case let str where str.range(of: #"edge.chromium|edgechromium"#, options: .regularExpression) != nil:
|
||||
self = .edgechromium
|
||||
|
||||
/* Matches any string containing 'edge' but not 'chromium' */
|
||||
case let str
|
||||
where str.range(of: #"edge"#, options: .regularExpression) != nil && str
|
||||
.range(of: #"chromium"#, options: .regularExpression) == nil:
|
||||
self = .edge
|
||||
|
||||
/* Matches any string containing 'firefox' */
|
||||
case let str where str.range(of: #"firefox"#, options: .regularExpression) != nil:
|
||||
self = .firefox
|
||||
|
||||
/* Matches any string containing 'internet explorer', 'IE', 'MSIE', or 'MSFT IE' */
|
||||
case let str
|
||||
where str.range(of: #"internet.explorer|internetexplorer|ie\d|ie.\d|msie|msft.ie"#, options: .regularExpression) != nil:
|
||||
self = .msie
|
||||
|
||||
/* Matches any string containing 'opera' */
|
||||
case let str where str.range(of: #"opera"#, options: .regularExpression) != nil:
|
||||
self = .opera
|
||||
|
||||
/* Matches any string containing 'safari' */
|
||||
case let str where str.range(of: #"safari"#, options: .regularExpression) != nil:
|
||||
self = .safari
|
||||
|
||||
/* Default case for anything else */
|
||||
default:
|
||||
self = .html5
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Client Image
|
||||
|
||||
var image: ImageResource {
|
||||
switch self {
|
||||
case .android:
|
||||
return .deviceClientAndroid
|
||||
case .apple:
|
||||
return .deviceClientApple
|
||||
case .chrome:
|
||||
return .deviceBrowserChrome
|
||||
case .edge:
|
||||
return .deviceBrowserEdge
|
||||
case .edgechromium:
|
||||
return .deviceBrowserEdgechromium
|
||||
case .finamp:
|
||||
return .deviceClientFinamp
|
||||
case .firefox:
|
||||
return .deviceBrowserFirefox
|
||||
case .homeAssistant:
|
||||
return .deviceOtherHomeassistant
|
||||
case .html5:
|
||||
return .deviceBrowserHtml5
|
||||
case .kodi:
|
||||
return .deviceClientKodi
|
||||
case .msie:
|
||||
return .deviceBrowserMsie
|
||||
case .opera:
|
||||
return .deviceBrowserOpera
|
||||
case .playstation:
|
||||
return .deviceClientPlaystation
|
||||
case .roku:
|
||||
return .deviceClientRoku
|
||||
case .safari:
|
||||
return .deviceBrowserSafari
|
||||
case .samsungtv:
|
||||
return .deviceClientSamsungtv
|
||||
case .webos:
|
||||
return .deviceClientWebos
|
||||
case .windows:
|
||||
return .deviceClientWindows
|
||||
case .xbox:
|
||||
return .deviceClientXbox
|
||||
case .other:
|
||||
return .deviceOtherOther
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Client Color
|
||||
|
||||
var clientColor: Color {
|
||||
switch self {
|
||||
case .android:
|
||||
return Color(red: 0.18, green: 0.8, blue: 0.44) // Android Green
|
||||
case .apple:
|
||||
return Color(red: 0.35, green: 0.35, blue: 0.35) // Apple Gray
|
||||
case .chrome:
|
||||
return Color(red: 0.98, green: 0.75, blue: 0.18) // Chrome Yellow
|
||||
case .edge:
|
||||
return Color(red: 0.19, green: 0.31, blue: 0.51) // Edge Gray
|
||||
case .edgechromium:
|
||||
return Color(red: 0.0, green: 0.45, blue: 0.75) // Edge Chromium Blue
|
||||
case .firefox:
|
||||
return Color(red: 1.0, green: 0.33, blue: 0.0) // Firefox Orange
|
||||
case .finamp:
|
||||
return Color(red: 0.61, green: 0.32, blue: 0.88) // Finamp Purple
|
||||
case .homeAssistant:
|
||||
return Color(red: 0.0, green: 0.55, blue: 0.87) // Home Assistant Blue
|
||||
case .kodi:
|
||||
return Color(red: 0.0, green: 0.58, blue: 0.83) // Kodi Blue
|
||||
case .msie:
|
||||
return Color(red: 0.0, green: 0.53, blue: 1.0) // Internet Explorer Blue
|
||||
case .opera:
|
||||
return Color(red: 1.0, green: 0.0, blue: 0.0) // Opera Red
|
||||
case .playstation:
|
||||
return Color(red: 0.0, green: 0.32, blue: 0.65) // PlayStation Blue
|
||||
case .roku:
|
||||
return Color(red: 0.31, green: 0.09, blue: 0.55) // Roku Purple
|
||||
case .safari:
|
||||
return Color(red: 0.0, green: 0.48, blue: 1.0) // Safari Blue
|
||||
case .samsungtv:
|
||||
return Color(red: 0.0, green: 0.44, blue: 0.74) // Samsung Blue
|
||||
case .webos:
|
||||
return Color(red: 0.6667, green: 0.1569, blue: 0.2745) // WebOS Pink
|
||||
case .xbox:
|
||||
return Color(red: 0.0, green: 0.5, blue: 0.0) // Xbox Green
|
||||
default:
|
||||
return Color.secondarySystemFill
|
||||
}
|
||||
}
|
||||
}
|
|
@ -11,6 +11,13 @@ import JellyfinAPI
|
|||
|
||||
extension SessionInfo {
|
||||
|
||||
var device: DeviceType {
|
||||
DeviceType(
|
||||
client: client,
|
||||
deviceName: deviceName
|
||||
)
|
||||
}
|
||||
|
||||
var playMethodDisplayTitle: String? {
|
||||
guard nowPlayingItem != nil, let playState, let playMethod = playState.playMethod else { return nil }
|
||||
|
||||
|
|
|
@ -9,8 +9,11 @@
|
|||
/* Begin PBXBuildFile section */
|
||||
091B5A8A2683142E00D78B61 /* ServerDiscovery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 091B5A872683142E00D78B61 /* ServerDiscovery.swift */; };
|
||||
091B5A8D268315D400D78B61 /* ServerDiscovery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 091B5A872683142E00D78B61 /* ServerDiscovery.swift */; };
|
||||
4E0253BD2CBF0C06007EB9CD /* DeviceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E12F9152CBE9615006C217E /* DeviceType.swift */; };
|
||||
4E0A8FFB2CAF74D20014B047 /* TaskCompletionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E0A8FFA2CAF74CD0014B047 /* TaskCompletionStatus.swift */; };
|
||||
4E0A8FFC2CAF74D20014B047 /* TaskCompletionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E0A8FFA2CAF74CD0014B047 /* TaskCompletionStatus.swift */; };
|
||||
4E11805F2CBF52380077A588 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5377CBF8263B596B003A4E83 /* Assets.xcassets */; };
|
||||
4E12F9172CBE9619006C217E /* DeviceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E12F9152CBE9615006C217E /* DeviceType.swift */; };
|
||||
4E16FD512C0183DB00110147 /* LetterPickerButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E16FD502C0183DB00110147 /* LetterPickerButton.swift */; };
|
||||
4E16FD532C01840C00110147 /* LetterPickerBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E16FD522C01840C00110147 /* LetterPickerBar.swift */; };
|
||||
4E16FD572C01A32700110147 /* LetterPickerOrientation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E16FD562C01A32700110147 /* LetterPickerOrientation.swift */; };
|
||||
|
@ -57,6 +60,8 @@
|
|||
4EB1A8CA2C9A766200F43898 /* ActiveSessionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB1A8C92C9A765800F43898 /* ActiveSessionsView.swift */; };
|
||||
4EB1A8CC2C9B1BA200F43898 /* ServerTaskButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB1A8CB2C9B1B9700F43898 /* ServerTaskButton.swift */; };
|
||||
4EB1A8CE2C9B2D0800F43898 /* ActiveSessionRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB1A8CD2C9B2D0100F43898 /* ActiveSessionRow.swift */; };
|
||||
4EB4ECE32CBEFC4D002FF2FC /* SessionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB4ECE22CBEFC49002FF2FC /* SessionInfo.swift */; };
|
||||
4EB4ECE42CBEFC4D002FF2FC /* SessionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB4ECE22CBEFC49002FF2FC /* SessionInfo.swift */; };
|
||||
4EB7B33B2CBDE645004A342E /* ChevronAlertButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB7B33A2CBDE63F004A342E /* ChevronAlertButton.swift */; };
|
||||
4EBE06462C7E9509004A6C03 /* PlaybackCompatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EBE06452C7E9509004A6C03 /* PlaybackCompatibility.swift */; };
|
||||
4EBE06472C7E9509004A6C03 /* PlaybackCompatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EBE06452C7E9509004A6C03 /* PlaybackCompatibility.swift */; };
|
||||
|
@ -1023,6 +1028,7 @@
|
|||
/* Begin PBXFileReference section */
|
||||
091B5A872683142E00D78B61 /* ServerDiscovery.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServerDiscovery.swift; sourceTree = "<group>"; };
|
||||
4E0A8FFA2CAF74CD0014B047 /* TaskCompletionStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskCompletionStatus.swift; sourceTree = "<group>"; };
|
||||
4E12F9152CBE9615006C217E /* DeviceType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceType.swift; sourceTree = "<group>"; };
|
||||
4E16FD502C0183DB00110147 /* LetterPickerButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LetterPickerButton.swift; sourceTree = "<group>"; };
|
||||
4E16FD522C01840C00110147 /* LetterPickerBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LetterPickerBar.swift; sourceTree = "<group>"; };
|
||||
4E16FD562C01A32700110147 /* LetterPickerOrientation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LetterPickerOrientation.swift; sourceTree = "<group>"; };
|
||||
|
@ -1057,6 +1063,7 @@
|
|||
4EB1A8C92C9A765800F43898 /* ActiveSessionsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveSessionsView.swift; sourceTree = "<group>"; };
|
||||
4EB1A8CB2C9B1B9700F43898 /* ServerTaskButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerTaskButton.swift; sourceTree = "<group>"; };
|
||||
4EB1A8CD2C9B2D0100F43898 /* ActiveSessionRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActiveSessionRow.swift; sourceTree = "<group>"; };
|
||||
4EB4ECE22CBEFC49002FF2FC /* SessionInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionInfo.swift; sourceTree = "<group>"; };
|
||||
4EB7B33A2CBDE63F004A342E /* ChevronAlertButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChevronAlertButton.swift; sourceTree = "<group>"; };
|
||||
4EBE06452C7E9509004A6C03 /* PlaybackCompatibility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaybackCompatibility.swift; sourceTree = "<group>"; };
|
||||
4EBE064C2C7EB6D3004A6C03 /* VideoPlayerType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoPlayerType.swift; sourceTree = "<group>"; };
|
||||
|
@ -3569,6 +3576,8 @@
|
|||
E1ED7FDA2CAA4B6D00ACB6E3 /* PlayerStateInfo.swift */,
|
||||
E1CB758A2C80F9EC00217C76 /* CodecProfile.swift */,
|
||||
4EBE06502C7ED0E1004A6C03 /* DeviceProfile.swift */,
|
||||
4E12F9152CBE9615006C217E /* DeviceType.swift */,
|
||||
4EB4ECE22CBEFC49002FF2FC /* SessionInfo.swift */,
|
||||
4E0A8FFA2CAF74CD0014B047 /* TaskCompletionStatus.swift */,
|
||||
E1CB75712C80E71800217C76 /* DirectPlayProfile.swift */,
|
||||
E1722DB029491C3900CC0239 /* ImageBlurHashes.swift */,
|
||||
|
@ -4157,6 +4166,7 @@
|
|||
53913BF026D323FE00EB3286 /* Localizable.strings in Resources */,
|
||||
53913C0826D323FE00EB3286 /* Localizable.strings in Resources */,
|
||||
53913C1126D323FE00EB3286 /* Localizable.strings in Resources */,
|
||||
4E11805F2CBF52380077A588 /* Assets.xcassets in Resources */,
|
||||
535870672669D21700D05A09 /* Assets.xcassets in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
|
@ -4279,6 +4289,7 @@
|
|||
E1B490452967E26300D3EDCE /* PersistentLogHandler.swift in Sources */,
|
||||
E193D53327193F7D00900D82 /* FilterCoordinator.swift in Sources */,
|
||||
E18E021E2887492B0022598C /* RowDivider.swift in Sources */,
|
||||
4EB4ECE42CBEFC4D002FF2FC /* SessionInfo.swift in Sources */,
|
||||
E1DC983E296DEB9B00982F06 /* UnwatchedIndicator.swift in Sources */,
|
||||
4E2AC4BF2C6C48D200DD600D /* CustomDeviceProfileAction.swift in Sources */,
|
||||
4EBE06472C7E9509004A6C03 /* PlaybackCompatibility.swift in Sources */,
|
||||
|
@ -4450,6 +4461,7 @@
|
|||
E1575E6C293E77B5001665B1 /* SliderType.swift in Sources */,
|
||||
E1E2F8402B757DFA00B75998 /* OnFinalDisappearModifier.swift in Sources */,
|
||||
E17DC74B2BE740D900B42379 /* StoredValues+Server.swift in Sources */,
|
||||
4E0253BD2CBF0C06007EB9CD /* DeviceType.swift in Sources */,
|
||||
E10E842A29A587110064EA49 /* LoadingView.swift in Sources */,
|
||||
E193D53927193F8E00900D82 /* SearchCoordinator.swift in Sources */,
|
||||
E13316FF2ADE42B6009BF865 /* OnSizeChangedModifier.swift in Sources */,
|
||||
|
@ -4678,6 +4690,7 @@
|
|||
621338932660107500A81A2A /* String.swift in Sources */,
|
||||
E17AC96F2954EE4B003D2BC2 /* DownloadListViewModel.swift in Sources */,
|
||||
BD39577C2C113FAA0078CEF8 /* TimestampSection.swift in Sources */,
|
||||
4EB4ECE32CBEFC4D002FF2FC /* SessionInfo.swift in Sources */,
|
||||
4EC6C16B2C92999800FC904B /* TranscodeSection.swift in Sources */,
|
||||
62C83B08288C6A630004ED0C /* FontPickerView.swift in Sources */,
|
||||
E122A9132788EAAD0060FA63 /* MediaStream.swift in Sources */,
|
||||
|
@ -5040,6 +5053,7 @@
|
|||
E10B1EB62BD98C6600A92EAF /* AddUserRow.swift in Sources */,
|
||||
E1CB75802C80F28F00217C76 /* SubtitleProfile.swift in Sources */,
|
||||
E1DD20412BE1EB8C00C0DE51 /* AddUserButton.swift in Sources */,
|
||||
4E12F9172CBE9619006C217E /* DeviceType.swift in Sources */,
|
||||
E145EB422BE0A6EE003BF6F3 /* ServerSelectionMenu.swift in Sources */,
|
||||
4E5E48E52AB59806003F1B48 /* CustomizeViewsSettings.swift in Sources */,
|
||||
E14EA15E2BF6F72900DE757A /* PhotoPicker.swift in Sources */,
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "chrome.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Google Chrome icon</title><path d="M16.214 8.69l6.715-1.679A12.027 12.027 0 0 1 24 11.972C24 18.57 18.569 24 11.968 24c-.302 0-.605-.011-.907-.034l4.905-8.347c.356-.376.655-.803.881-1.271a5.451 5.451 0 0 0-.043-4.748 5.156 5.156 0 0 0-.59-.91zm-3.24 8.575l-2.121 6.682C4.738 23.345 0 18.14 0 11.977 0 9.592.709 7.26 2.038 5.279l4.834 8.377c.18.539 1.119 2.581 3.067 3.327.998.382 2.041.481 3.035.282zM11.973 7.62c-2.006.019-3.878 1.544-4.281 3.512a4.478 4.478 0 0 0 1.237 4.032c1.214 1.186 3.14 1.578 4.734.927 1.408-.576 2.47-1.927 2.691-3.431.272-1.856-.788-3.832-2.495-4.629a4.413 4.413 0 0 0-1.886-.411zM7.046 9.962L2.259 4.963A12.043 12.043 0 0 1 11.997 0c4.56 0 8.744 2.592 10.774 6.675H12.558c-1.811-.125-3.288.52-4.265 1.453a5.345 5.345 0 0 0-1.247 1.834z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 863 B |
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "edge.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><title>Microsoft Edge icon</title><path d="M23.158 14.25H7.821c0 .578.086 1.103.262 1.575.188.465.431.881.743 1.245.31.364.675.675 1.102.938.413.262.863.48 1.343.648.476.173.975.3 1.48.383a10.078 10.078 0 0 0 3.311-.026c.564-.105 1.111-.244 1.651-.42.54-.177 1.061-.387 1.583-.627.525-.24 1.057-.502 1.605-.795v5.085c-.612.3-1.212.552-1.812.769-.6.21-1.2.394-1.81.54-.612.15-1.23.263-1.865.33a18.41 18.41 0 0 1-1.957.105c-.9 0-1.77-.105-2.606-.311a10.217 10.217 0 0 1-2.355-.893 9.869 9.869 0 0 1-2.018-1.417 8.957 8.957 0 0 1-2.595-4.148 9.359 9.359 0 0 1-.356-2.61c0-.986.135-1.924.405-2.82.274-.9.66-1.717 1.17-2.467a8.92 8.92 0 0 1 1.856-1.999A9.82 9.82 0 0 1 9.426 5.91a5.206 5.206 0 0 0-1.163 1.774 7.671 7.671 0 0 0-.536 2.055h8.542c0-.863-.086-1.613-.262-2.258-.176-.645-.458-1.181-.851-1.605-.39-.427-.893-.75-1.512-.96-.618-.214-1.365-.322-2.238-.322-1.032 0-2.063.15-3.094.461-1.031.3-2.01.731-2.94 1.275-.93.551-1.785 1.2-2.565 1.942-.78.75-1.436 1.557-1.969 2.43a14 14 0 0 1 .649-2.913C1.798 6.863 2.21 6 2.706 5.2a11.606 11.606 0 0 1 1.74-2.152c.663-.645 1.398-1.2 2.212-1.65C7.472.949 8.334.585 9.272.34A13.4 13.4 0 0 1 12.257 0c.615 0 1.226.056 1.837.165.612.113 1.208.263 1.79.458 1.154.397 2.185.952 3.093 1.657a10.553 10.553 0 0 1 2.287 2.449c.62.926 1.088 1.95 1.41 3.063.323 1.114.488 2.273.488 3.477v2.981z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 1.4 KiB |
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "edgechromium.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><title>Microsoft Edge icon</title><path d="M21.86 17.86q.14 0 .25.12.1.13.1.25t-.11.33l-.32.46-.43.53-.44.5q-.21.25-.38.42l-.22.23q-.58.53-1.34 1.04-.76.51-1.6.91-.86.4-1.74.64t-1.67.24q-.9 0-1.69-.28-.8-.28-1.48-.78-.68-.5-1.22-1.17-.53-.66-.92-1.44-.38-.77-.58-1.6-.2-.83-.2-1.67 0-1 .32-1.96.33-.97.87-1.8.14.95.55 1.77.41.82 1.02 1.5.6.68 1.38 1.21.78.54 1.64.9.86.36 1.77.56.92.2 1.8.2 1.12 0 2.18-.24 1.06-.23 2.06-.72l.2-.1.2-.05zm-15.5-1.27q0 1.1.27 2.15.27 1.06.78 2.03.51.96 1.24 1.77.74.82 1.66 1.4-1.47-.2-2.8-.74-1.33-.55-2.48-1.37-1.15-.83-2.08-1.9-.92-1.07-1.58-2.33T.36 14.94Q0 13.54 0 12.06q0-.81.32-1.49.31-.68.83-1.23.53-.55 1.2-.96.66-.4 1.35-.66.74-.27 1.5-.39.78-.12 1.55-.12.7 0 1.42.1.72.12 1.4.35.68.23 1.32.57.63.35 1.16.83-.35 0-.7.07-.33.07-.65.23v-.02q-.63.28-1.2.74-.57.46-1.05 1.04-.48.58-.87 1.26-.38.67-.65 1.39-.27.71-.42 1.44-.15.72-.15 1.38zM11.96.06q1.7 0 3.33.39 1.63.38 3.07 1.15 1.43.77 2.62 1.93 1.18 1.16 1.98 2.7.49.94.76 1.96.28 1 .28 2.08 0 .89-.23 1.7-.24.8-.69 1.48-.45.68-1.1 1.22-.64.53-1.45.88-.54.24-1.11.36-.58.13-1.16.13-.42 0-.97-.03-.54-.03-1.1-.12-.55-.1-1.05-.28-.5-.19-.84-.5-.12-.09-.23-.24-.1-.16-.1-.33 0-.15.16-.35.16-.2.35-.5.2-.28.36-.68.16-.4.16-.95 0-1.06-.4-1.96-.4-.91-1.06-1.64-.66-.74-1.52-1.28-.86-.55-1.79-.89-.84-.3-1.72-.44-.87-.14-1.76-.14-1.55 0-3.06.45T.94 7.55q.71-1.74 1.81-3.13 1.1-1.38 2.52-2.35Q6.68 1.1 8.37.58q1.7-.52 3.58-.52Z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 1.5 KiB |
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "firefox.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 5.5 KiB |
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "html5.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>HTML5 icon</title><path d="M1.5 0h21l-1.91 21.563L11.977 24l-8.564-2.438L1.5 0zm7.031 9.75l-.232-2.718 10.059.003.23-2.622L5.412 4.41l.698 8.01h9.126l-.326 3.426-2.91.804-2.955-.81-.188-2.11H6.248l.33 4.171L12 19.351l5.379-1.443.744-8.157H8.531z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 345 B |
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "msie.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><title>Internet Explorer icon</title><path d="M22.8 7.381c1.125-2.7 1.2-4.95-.15-6.3-1.5-1.499-5.1-1.05-8.924.75h-.45c-2.7 0-5.324.976-7.274 2.7-1.65 1.5-2.85 3.45-3.375 5.625.375-.45 2.475-2.925 4.875-4.275.075 0 .675-.375.675-.375-.075 0-1.2 1.125-1.425 1.35-5.25 5.4-8.324 13.574-5.924 15.973 1.574 1.575 4.424 1.2 7.724-.6 1.425.675 3 .975 4.724.975 2.25 0 4.35-.6 6.15-1.8 1.874-1.2 3.224-3.074 4.05-5.249h-5.85c-.75 1.425-2.475 2.4-4.275 2.4-2.55 0-4.65-2.1-4.724-4.5V13.83h15.298v-.225c0-.375.075-.825.075-1.124 0-1.8-.45-3.525-1.2-5.1zM2.477 22.38c-1.2-1.2-.824-3.524.6-6.299.675 1.875 1.8 3.525 3.225 4.725.45.375.975.75 1.5 1.05-2.4 1.274-4.35 1.5-5.325.524zm15.374-11.398H8.702v-.075c.15-2.325 2.324-4.35 4.874-4.35 2.4 0 4.35 1.875 4.5 4.35v.075zm4.574-4.2c-.45-.75-1.05-1.5-1.725-2.1a11.213 11.213 0 0 0-3.6-2.25c2.4-1.124 4.425-1.274 5.475-.224.825.975.75 2.624-.15 4.574 0 .075 0 .075 0 0 0 .075 0 .075 0 0z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 1015 B |
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "opera.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Opera icon</title><path d="M8.051 5.238c-1.328 1.566-2.186 3.883-2.246 6.48v.564c.061 2.598.918 4.912 2.246 6.479 1.721 2.236 4.279 3.654 7.139 3.654 1.756 0 3.4-.537 4.807-1.471C17.879 22.846 15.074 24 12 24c-.192 0-.383-.004-.57-.014C5.064 23.689 0 18.436 0 12 0 5.371 5.373 0 12 0h.045c3.055.012 5.84 1.166 7.953 3.055-1.408-.93-3.051-1.471-4.81-1.471-2.858 0-5.417 1.42-7.14 3.654h.003zM24 12c0 3.556-1.545 6.748-4.002 8.945-3.078 1.5-5.946.451-6.896-.205 3.023-.664 5.307-4.32 5.307-8.74 0-4.422-2.283-8.075-5.307-8.74.949-.654 3.818-1.703 6.896-.205C22.455 5.25 24 8.445 24 12z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 683 B |
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "safari.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>safari icon</title><path d="M12 24C5.373 24 0 18.627 0 12S5.373 0 12 0s12 5.373 12 12-5.373 12-12 12zm0-.75c6.213 0 11.25-5.037 11.25-11.25S18.213.75 12 .75.75 5.787.75 12 5.787 23.25 12 23.25zM12 2a.25.25 0 0 1 .25.25v1a.25.25 0 1 1-.5 0v-1A.25.25 0 0 1 12 2zm0 18.5a.25.25 0 0 1 .25.25v1a.25.25 0 1 1-.5 0v-1a.25.25 0 0 1 .25-.25zm7.071-15.571a.25.25 0 0 1 0 .353l-.707.708a.25.25 0 0 1-.354-.354l.708-.707a.25.25 0 0 1 .353 0zM5.99 18.01a.25.25 0 0 1 0 .354l-.708.707a.25.25 0 1 1-.353-.353l.707-.708a.25.25 0 0 1 .354 0zM4.929 4.93a.25.25 0 0 1 .353 0l.708.707a.25.25 0 0 1-.354.354l-.707-.708a.25.25 0 0 1 0-.353zM18.01 18.01a.25.25 0 0 1 .354 0l.707.708a.25.25 0 1 1-.353.353l-.708-.707a.25.25 0 0 1 0-.354zM2 12a.25.25 0 0 1 .25-.25h1a.25.25 0 1 1 0 .5h-1A.25.25 0 0 1 2 12zm18.5 0a.25.25 0 0 1 .25-.25h1a.25.25 0 1 1 0 .5h-1a.25.25 0 0 1-.25-.25zm-4.593-9.205a.25.25 0 0 1 .133.328l-.391.92a.25.25 0 1 1-.46-.195l.39-.92a.25.25 0 0 1 .328-.133zM8.68 19.825a.25.25 0 0 1 .132.327l-.39.92a.25.25 0 0 1-.46-.195l.39-.92a.25.25 0 0 1 .328-.133zM21.272 8.253a.25.25 0 0 1-.138.325l-.927.375a.25.25 0 1 1-.188-.464l.927-.374a.25.25 0 0 1 .326.138zm-17.153 6.93a.25.25 0 0 1-.138.326l-.927.374a.25.25 0 1 1-.188-.463l.927-.375a.25.25 0 0 1 .326.138zM8.254 2.728a.25.25 0 0 1 .325.138l.375.927a.25.25 0 0 1-.464.188l-.374-.927a.25.25 0 0 1 .138-.326zm6.93 17.153a.25.25 0 0 1 .326.138l.374.927a.25.25 0 1 1-.463.188l-.375-.927a.25.25 0 0 1 .138-.326zM2.795 8.093a.25.25 0 0 1 .328-.133l.92.391a.25.25 0 0 1-.195.46l-.92-.39a.25.25 0 0 1-.133-.328zm17.03 7.228a.25.25 0 0 1 .327-.132l.92.39a.25.25 0 1 1-.195.46l-.92-.39a.25.25 0 0 1-.133-.328zM12.879 12.879L11.12 11.12l-4.141 5.9 5.899-4.142zm6.192-7.95l-5.834 8.308-8.308 5.834 5.834-8.308 8.308-5.834z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 1.8 KiB |
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "android.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M24 19H0a13.6 13.6 0 0 1 2.21-6.07A11.2 11.2 0 0 1 5.87 9.4l.41-.23-2.02-3.41a.51.51 0 0 1 .17-.7.5.5 0 0 1 .69.18l2.08 3.5a12.62 12.62 0 0 1 4.84-.9 12.2 12.2 0 0 1 4.75.9l2.07-3.5a.5.5 0 0 1 .7-.17.51.51 0 0 1 .16.7L17.7 9.19l.5.28a11.38 11.38 0 0 1 3.63 3.62A14.48 14.48 0 0 1 24 19zm-7.5-4.48a1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1 1 1 0 0 0-1 1zm-11 0a1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1 1 1 0 0 0-1 1z" fill="#fff"/>
|
||||
</svg>
|
After Width: | Height: | Size: 563 B |
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "apple.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Apple</title><path d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701" fill="#fff"/></svg>
|
After Width: | Height: | Size: 663 B |
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "finamp.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
<svg role="img"
|
||||
viewBox="0 0 210 297"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<title>Finamp icon</title>
|
||||
<path
|
||||
d="M 69.370216,241.70457 C 50.612585,216.22412 40.075179,174.495 36.128998,110.06608 33.495274,67.065618 44.085825,59.226924 92.567634,68.292508 c 20.934416,3.914496 27.827066,4.198089 67.943236,2.795479 15.01644,-0.525043 24.24345,-0.51262 24.24345,0.03203 0,2.02352 -25.20667,26.40015 -30.51241,29.507633 -5.41098,3.16913 -5.88645,3.26795 -17.41763,3.61937 -7.67759,0.23415 -15.65652,-0.17009 -22.64411,-1.14686 -25.347573,-3.543166 -36.936862,-0.7853 -42.62579,10.14353 -1.529767,2.93881 -2.116814,6.06888 -2.414344,12.87312 -0.48661,11.12778 0.442174,17.231 6.870204,45.14563 8.542177,37.09557 9.801925,52.50941 5.33119,65.22953 -1.971968,5.6106 -5.317334,11.03143 -6.807825,11.03143 -0.483648,0 -2.807164,-2.61877 -5.163389,-5.81948 z m 35.127024,-56.85485 c -1.42116,-0.77103 -3.48289,-3.16401 -4.581609,-5.31769 -2.833376,-5.55388 -7.34604,-27.6604 -8.030213,-39.33817 -0.530095,-9.04772 -0.416003,-10.08518 1.345967,-12.2394 1.71807,-2.10052 2.566639,-2.33623 7.887475,-2.19094 8.99051,0.24553 36.88418,8.63901 44.81806,13.48633 4.77149,2.91519 5.6724,5.8241 3.30988,10.68687 -3.36134,6.91866 -25.14851,29.96587 -32.75071,34.64485 -3.38073,2.08076 -8.44917,2.194 -11.99885,0.2683 z"
|
||||
style="fill:#fff"/></svg>
|
After Width: | Height: | Size: 1.3 KiB |
15
Swiftfin/Resources/Assets.xcassets/DeviceIcons/Clients/Device-client-kodi.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "kodi.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
11
Swiftfin/Resources/Assets.xcassets/DeviceIcons/Clients/Device-client-kodi.imageset/kodi.svg
vendored
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
|
||||
<g transform="translate(-36.173 -93.796)">
|
||||
<g transform="matrix(.08 0 0 .08 40.527 88.485)">
|
||||
<path d="m53.295 119.35v-39.688h79.375v79.375h-79.375z" fill="#fcfdfd" stroke-width=".26458"/>
|
||||
</g>
|
||||
<g transform="matrix(1.3761 0 0 1.3825 -26.63 -38.456)" fill="#fff">
|
||||
<path transform="matrix(.08 0 0 .08 40.527 88.485)" d="m86.822 141.89c-4.738-4.7596-5.2168-5.3235-5.2168-6.1442 0-0.82158 0.47505-1.3787 5.2329-6.1365 4.7552-4.7552 5.3153-5.2329 6.1353-5.2329 0.81617 0 1.3676 0.46161 5.7678 4.8286 4.8692 4.8324 5.6182 5.7452 5.6182 6.8466 0 0.41218-1.5697 2.1641-5.2274 5.834-4.8206 4.8367-5.3 5.2449-6.1603 5.2449-0.86046 0-1.3378-0.40681-6.1497-5.2406zm22.168-12.455c-0.43656-0.27248-2.9071-2.6371-5.4901-5.2547-4.1957-4.2519-4.6964-4.8534-4.6964-5.6418 0-0.7938 0.52954-1.414 5.2644-6.1655 4.6582-4.6746 5.362-5.2829 6.1127-5.2829 0.75071 0 1.4546 0.60829 6.1127 5.2829 4.7729 4.7898 5.2644 5.3668 5.2644 6.1818 0 0.81542-0.48628 1.3851-5.2394 6.1382-5.6104 5.6104-5.7707 5.7142-7.3283 4.742zm-40.16-5.2731c-3.5636-3.5816-4.9518-5.1483-4.9518-5.5886 0-0.75745 9.3384-10.601 10.057-10.601 0.2584 0 0.54208 0.18833 0.63041 0.41851s0.1606 4.7624 0.1606 10.072c0 9.1098-0.10948 10.677-0.74606 10.677-0.10905 0-2.4266-2.2396-5.1501-4.9768zm13.2-1.5272c-0.08833-0.23018-0.1606-5.3558-0.1606-11.39 0-8.9734 0.06852-11.102 0.37621-11.686 0.20691-0.39296 2.447-2.7683 4.9781-5.2785 4.3226-4.2871 4.6624-4.5641 5.5987-4.5641 0.94583 0 1.2591 0.26717 6.1277 5.2255 4.658 4.7439 5.1315 5.3102 5.1376 6.1439 6e-3 0.85888-0.67407 1.6-10.506 11.443-5.782 5.7887-10.71 10.525-10.952 10.525s-0.51144-0.18833-0.59977-0.41852z" fill="#fff" stroke-width=".26458"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "playstation.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>PlayStation icon</title><path d="M8.985 2.596v17.548l3.915 1.261V6.688c0-.69.304-1.151.794-.991.636.181.76.814.76 1.505v5.876c2.441 1.193 4.362-.002 4.362-3.153 0-3.237-1.126-4.675-4.438-5.827-1.307-.448-3.728-1.186-5.391-1.502h-.002zm4.656 16.242l6.296-2.275c.715-.258.826-.625.246-.818-.586-.192-1.637-.139-2.357.123l-4.205 1.499v-2.385l.24-.085s1.201-.42 2.913-.615c1.696-.18 3.785.029 5.437.661 1.848.601 2.041 1.472 1.576 2.072s-1.622 1.036-1.622 1.036l-8.544 3.107v-2.297l.02-.023zM1.808 18.6c-1.9-.545-2.214-1.668-1.352-2.321.801-.585 2.159-1.051 2.159-1.051l5.616-2.013v2.313L4.206 17c-.705.271-.825.632-.239.826.586.195 1.637.15 2.343-.12L8.248 17v2.074c-.121.029-.256.044-.391.073-1.938.331-3.995.196-6.037-.479l-.012-.068z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 833 B |
15
Swiftfin/Resources/Assets.xcassets/DeviceIcons/Clients/Device-client-roku.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "roku.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
7
Swiftfin/Resources/Assets.xcassets/DeviceIcons/Clients/Device-client-roku.imageset/roku.svg
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
<svg role="img"
|
||||
viewBox="0 0 210 297"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<title>Roku icon</title>
|
||||
<path
|
||||
d="m 134.501,227.38486 c -2.44819,-3.39677 -5.40762,-7.5041 -6.57652,-9.1274 -1.16891,-1.6233 -2.87952,-3.99592 -3.80137,-5.27251 -0.92184,-1.27658 -2.32281,-3.22438 -3.11326,-4.32845 -0.79045,-1.10408 -2.21327,-3.08277 -3.16181,-4.39711 -0.94855,-1.31433 -2.22961,-3.09276 -2.84679,-3.95207 -0.61719,-0.8593 -1.69455,-2.35278 -2.39413,-3.31885 -2.14638,-2.96394 -6.73436,-9.33234 -7.77326,-10.78978 -0.54108,-0.75905 -1.27705,-1.7753 -1.63549,-2.25833 -0.35844,-0.48303 -1.44122,-1.97917 -2.40619,-3.32476 -0.96497,-1.34558 -2.64833,-3.6886 -3.74081,-5.20669 -1.09248,-1.5181 -2.68538,-3.73408 -3.53977,-4.92441 l -1.55344,-2.16423 h -7.897297 -7.897299 v 32.55754 32.55755 H 50.004612 23.84566 V 135.44907 37.462783 l 38.987503,0.0012 c 38.978177,0.0012 40.941657,0.02063 45.197897,0.447079 17.74196,1.77761 34.09908,8.541533 46.7415,19.328335 6.96873,5.945875 12.56918,13.064776 16.42102,20.873253 3.98038,8.069037 5.87088,16.23414 5.88243,25.40618 0.004,2.93097 -0.10859,4.42747 -0.56006,7.46502 -2.28584,15.37939 -11.4805,29.9398 -25.61296,40.55997 -1.74452,1.31096 -4.01525,2.86206 -6.70655,4.58113 l -1.03428,0.66066 0.98006,1.34477 c 1.16032,1.59211 3.19563,4.41968 5.98013,8.30794 1.11186,1.5526 3.05961,4.26259 4.32832,6.02221 1.2687,1.75961 3.07604,4.272 4.01629,5.58308 0.94025,1.31109 3.51501,4.89618 5.72168,7.96688 2.20667,3.07069 4.5993,6.40173 5.31692,7.40229 2.88999,4.02938 4.20775,5.86082 6.58996,9.15877 1.3707,1.89762 3.1781,4.41001 4.01644,5.58308 0.83834,1.17308 2.68173,3.74193 4.09641,5.70855 5.84268,8.12224 7.24486,10.07327 10.61731,14.77322 l 3.53351,4.92441 H 168.65572 138.95226 Z M 93.86514,135.44732 c 6.72676,-0.37308 12.60026,-2.55392 18.23498,-6.77066 2.29302,-1.71598 5.02043,-4.58492 6.86064,-7.21667 5.34727,-7.64731 7.16217,-17.51458 4.88138,-26.53915 -1.38094,-5.46408 -4.34944,-10.857153 -8.06981,-14.660971 -5.11636,-5.231116 -11.18225,-8.448076 -18.24084,-9.673774 -2.55155,-0.443066 -4.02597,-0.500864 -12.805103,-0.501964 l -8.562823,-0.0011 v 32.745739 32.74573 l 7.747316,-0.002 c 4.261024,-0.001 8.74044,-0.0575 9.95426,-0.1248 z"
|
||||
fill="#fff"/></svg>
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "samsungtv.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" role="img" viewBox="0 0 24 24"><title>Samsung icon</title><path d="M19.8166 10.2808l.0459 2.6934h-.023l-.7793-2.6934h-1.2837v3.3925h.8481l-.0458-2.785h.023l.8366 2.785h1.2264v-3.3925zm-16.149 0l-.6418 3.427h.9284l.4699-3.1175h.0229l.4585 3.1174h.9169l-.6304-3.4269zm5.1805 0l-.424 2.6132h-.023l-.424-2.6132H6.5788l-.0688 3.427h.8596l.023-3.0832h.0114l.573 3.0831h.8711l.5731-3.083h.023l.0228 3.083h.8596l-.0802-3.4269zm-7.2664 2.4527c.0343.0802.0229.1949.0114.2522-.0229.1146-.1031.2292-.3324.2292-.2177 0-.3438-.126-.3438-.3095v-.3323H0v.2636c0 .7679.6074.9971 1.2493.9971.6189 0 1.1346-.2178 1.2149-.7794.0458-.298.0114-.4928 0-.5616-.1605-.722-1.467-.9283-1.5588-1.3295-.0114-.0688-.0114-.1375 0-.1834.023-.1146.1032-.2292.3095-.2292.2063 0 .321.126.321.3095v.2063h.8595v-.2407c0-.745-.6762-.8596-1.1576-.8596-.6074 0-1.1117.2063-1.2034.7564-.023.149-.0344.2866.0114.4585.1376.7106 1.364.9169 1.5358 1.3524m11.152 0c.0343.0803.0228.1834.0114.2522-.023.1146-.1032.2292-.3324.2292-.2178 0-.3438-.126-.3438-.3095v-.3323h-.917v.2636c0 .7564.596.9857 1.2379.9857.6189 0 1.1232-.2063 1.2034-.7794.0459-.298.0115-.4814 0-.5616-.1375-.7106-1.4327-.9284-1.5243-1.318-.0115-.0688-.0115-.1376 0-.1835.0229-.1146.1031-.2292.3094-.2292.1948 0 .321.126.321.3095v.2063h.848v-.2407c0-.745-.6647-.8596-1.146-.8596-.6075 0-1.1004.1948-1.192.7564-.023.149-.023.2866.0114.4585.1376.7106 1.341.9054 1.513 1.3524m2.8882.4585c.2407 0 .3094-.1605.3323-.2522.0115-.0343.0115-.0917.0115-.126v-2.533h.871v2.4642c0 .0688 0 .1948-.0114.2292-.0573.6419-.5616.8482-1.192.8482-.6303 0-1.1346-.2063-1.192-.8482 0-.0344-.0114-.1604-.0114-.2292v-2.4642h.871v2.533c0 .0458 0 .0916.0115.126 0 .0917.0688.2522.3095.2522m7.1518-.0344c.2522 0 .3324-.1605.3553-.2522.0115-.0343.0115-.0917.0115-.126v-.4929h-.3553v-.5043H24v.917c0 .0687 0 .1145-.0115.2292-.0573.6303-.596.8481-1.2034.8481-.6075 0-1.1461-.2178-1.2034-.8481-.0115-.1147-.0115-.1605-.0115-.2293v-1.444c0-.0574.0115-.172.0115-.2293.0802-.6419.596-.8482 1.2034-.8482s1.1347.2063 1.2034.8482c.0115.1031.0115.2292.0115.2292v.1146h-.8596v-.1948s0-.0803-.0115-.1261c-.0114-.0802-.0802-.2521-.3438-.2521-.2521 0-.321.1604-.3438.2521-.0115.0458-.0115.1032-.0115.1605v1.5702c0 .0458 0 .0916.0115.126 0 .0917.0917.2522.3323.2522" fill="#fff"/></svg>
|
After Width: | Height: | Size: 2.3 KiB |
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "webOS.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
28
Swiftfin/Resources/Assets.xcassets/DeviceIcons/Clients/Device-client-webos.imageset/webOS.svg
vendored
Normal file
|
@ -0,0 +1,28 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 174 43">
|
||||
<defs>
|
||||
<style>
|
||||
.cls-1 {
|
||||
fill: none;
|
||||
}
|
||||
|
||||
.cls-2 {
|
||||
fill: #fff;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<g id="Layer_1-2" data-name="Layer_1">
|
||||
<g>
|
||||
<g id="webOS_OSE_logo_gray">
|
||||
<g id="Group_1">
|
||||
<path id="Path_1" class="cls-2" d="M142.85,28.88c0,8.85,6.09,13.28,14.95,13.28,9.96,0,14.95-3.87,14.95-10.51h0c0-7.63-4.99-9.23-14.95-12.06-6.88-1.81-10.86-3.61-10.86-7.95h0c0-5.08,3.81-7.43,10.8-7.43h0c6.57,0,10.91,2.3,10.91,9.18h2.99c0-8.85-5.54-12.17-13.84-12.17-8.86,0-13.84,3.32-13.84,9.96s4.98,8.97,13.84,11.49c7.35,2.03,11.96,2.94,11.96,8.98,0,5.06-4.37,7.53-11.99,7.53h0c-6.82,0-11.91-3.06-11.91-10.29h-2.99Z"/>
|
||||
<path id="Path_2" class="cls-2" d="M120.15,1.22c-11.31,0-20.47,9.18-20.46,20.49,0,11.31,9.18,20.47,20.49,20.46,11.3,0,20.46-9.17,20.46-20.47,0-11.31-9.17-20.48-20.48-20.47,0,0,0,0,0,0M120.15,39.18c-9.66,0-17.49-7.84-17.48-17.49,0-9.66,7.84-17.49,17.49-17.48,9.66,0,17.48,7.83,17.48,17.49,0,9.66-7.83,17.49-17.49,17.49"/>
|
||||
<path id="Path_3" class="cls-2" d="M84.16,12.28c-4.18,0-7.24,1.59-9.19,4.5V1.77h-2.99v25.45h2.99c0-7.52,3.34-11.96,9.19-11.96s9.19,4.43,9.19,11.96-3.34,11.96-9.19,11.96c-4.41,0-7.39-2.52-8.59-6.98h-3.1c1.34,6.35,5.43,9.96,11.7,9.96,7.75,0,12.18-5.53,12.18-14.94s-4.43-14.94-12.18-14.94"/>
|
||||
<path id="Path_4" class="cls-2" d="M55.38,39.15c-5.85,0-9.19-4.42-9.19-11.92h21.37c0-9.41-4.43-14.94-12.18-14.94s-12.18,5.53-12.18,14.94,4.43,14.94,12.18,14.94c6.26,0,10.35-3.61,11.7-9.96h-3.11c-1.2,4.44-4.19,6.94-8.59,6.94M55.37,15.3c5.02,0,8.2,3.26,8.99,8.94h-17.98c.79-5.68,3.97-8.94,8.99-8.94"/>
|
||||
<path id="Path_5" class="cls-2" d="M14.44,41.61l7.61-24.13,7.61,24.13h3.36l9.07-28.78h-3.13l-7.62,24.17-7.62-24.17h-3.34l-7.62,24.17L5.13,12.83H2l9.07,28.78h3.36Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<rect id="Rectangle_1" class="cls-1" width="174" height="43"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.0 KiB |
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "windows.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Windows icon</title><path d="M0 3.449L9.75 2.1v9.451H0m10.949-9.602L24 0v11.4H10.949M0 12.6h9.75v9.451L0 20.699M10.949 12.6H24V24l-12.9-1.801" fill="#fff"/></svg>
|
After Width: | Height: | Size: 241 B |
15
Swiftfin/Resources/Assets.xcassets/DeviceIcons/Clients/Device-client-xbox.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "xbox.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
1
Swiftfin/Resources/Assets.xcassets/DeviceIcons/Clients/Device-client-xbox.imageset/xbox.svg
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Xbox icon</title><path d="M4.102 21.033C6.211 22.881 8.977 24 12 24c3.026 0 5.789-1.119 7.902-2.967 1.877-1.912-4.316-8.709-7.902-11.417-3.582 2.708-9.779 9.505-7.898 11.417zm11.16-14.406c2.5 2.961 7.484 10.313 6.076 12.912C23.002 17.48 24 14.861 24 12.004c0-3.34-1.365-6.362-3.57-8.536 0 0-.027-.022-.082-.042-.063-.022-.152-.045-.281-.045-.592 0-1.985.434-4.805 3.246zM3.654 3.426c-.057.02-.082.041-.086.042C1.365 5.642 0 8.664 0 12.004c0 2.854.998 5.473 2.661 7.533-1.401-2.605 3.579-9.951 6.08-12.91-2.82-2.813-4.216-3.245-4.806-3.245-.131 0-.223.021-.281.046v-.002zM12 3.551S9.055 1.828 6.755 1.746c-.903-.033-1.454.295-1.521.339C7.379.646 9.659 0 11.984 0H12c2.334 0 4.605.646 6.766 2.085-.068-.046-.615-.372-1.52-.339C14.946 1.828 12 3.545 12 3.545v.006z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 861 B |
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "home-assistant.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 5.0 KiB |
15
Swiftfin/Resources/Assets.xcassets/DeviceIcons/Other/Device-other-other.imageset/Contents.json
vendored
Normal file
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "other.svg",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
},
|
||||
"properties" : {
|
||||
"preserves-vector-representation" : true
|
||||
}
|
||||
}
|
1
Swiftfin/Resources/Assets.xcassets/DeviceIcons/Other/Device-other-other.imageset/other.svg
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 6h18V4H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h4v-2H3V6zm10 6H9v1.78c-.61.55-1 1.33-1 2.22s.39 1.67 1 2.22V20h4v-1.78c.61-.55 1-1.34 1-2.22s-.39-1.67-1-2.22V12zm-2 5.5c-.83 0-1.5-.67-1.5-1.5s.67-1.5 1.5-1.5 1.5.67 1.5 1.5-.67 1.5-1.5 1.5zM22 8h-6c-.5 0-1 .5-1 1v10c0 .5.5 1 1 1h6c.5 0 1-.5 1-1V9c0-.5-.5-1-1-1zm-1 10h-4v-8h4v8z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 453 B |
|
@ -10,8 +10,6 @@ import Defaults
|
|||
import JellyfinAPI
|
||||
import SwiftUI
|
||||
|
||||
// TODO: inactive session device image
|
||||
|
||||
extension ActiveSessionsView {
|
||||
|
||||
struct ActiveSessionRow: View {
|
||||
|
@ -24,7 +22,6 @@ extension ActiveSessionsView {
|
|||
|
||||
private let onSelect: () -> Void
|
||||
|
||||
// parent list won't show row if value is nil anyways
|
||||
private var session: SessionInfo {
|
||||
box.value ?? .init()
|
||||
}
|
||||
|
@ -38,29 +35,44 @@ extension ActiveSessionsView {
|
|||
private var rowLeading: some View {
|
||||
// TODO: better handling for different poster types
|
||||
Group {
|
||||
if session.nowPlayingItem?.type == .audio {
|
||||
ZStack {
|
||||
Color.clear
|
||||
if let nowPlayingItem = session.nowPlayingItem {
|
||||
if nowPlayingItem.type == .audio {
|
||||
ZStack {
|
||||
Color.clear
|
||||
|
||||
ImageView(session.nowPlayingItem?.squareImageSources(maxWidth: 60) ?? [])
|
||||
.failure {
|
||||
SystemImageContentView(systemName: session.nowPlayingItem?.systemImage)
|
||||
}
|
||||
ImageView(nowPlayingItem.squareImageSources(maxWidth: 60))
|
||||
.failure {
|
||||
SystemImageContentView(systemName: nowPlayingItem.systemImage)
|
||||
}
|
||||
}
|
||||
.squarePosterStyle()
|
||||
.frame(width: 60, height: 60)
|
||||
} else {
|
||||
ZStack {
|
||||
Color.clear
|
||||
|
||||
ImageView(nowPlayingItem.portraitImageSources(maxWidth: 60))
|
||||
.failure {
|
||||
SystemImageContentView(systemName: nowPlayingItem.systemImage)
|
||||
}
|
||||
}
|
||||
.posterStyle(.portrait)
|
||||
.frame(width: 60, height: 90)
|
||||
}
|
||||
.squarePosterStyle()
|
||||
} else {
|
||||
ZStack {
|
||||
Color.clear
|
||||
session.device.clientColor
|
||||
|
||||
ImageView(session.nowPlayingItem?.portraitImageSources(maxWidth: 60) ?? [])
|
||||
.failure {
|
||||
SystemImageContentView(systemName: session.nowPlayingItem?.systemImage)
|
||||
}
|
||||
Image(session.device.image)
|
||||
.resizable()
|
||||
.aspectRatio(contentMode: .fit)
|
||||
.frame(width: 40)
|
||||
}
|
||||
.posterStyle(.portrait)
|
||||
.squarePosterStyle()
|
||||
.frame(width: 60, height: 60)
|
||||
}
|
||||
}
|
||||
.frame(width: 60)
|
||||
.frame(width: 60, height: 90)
|
||||
.posterShadow()
|
||||
.padding(.vertical, 8)
|
||||
}
|
||||
|
|