mirror of
https://github.com/whoeevee/EeveeSpotifyReborn.git
synced 2026-01-09 00:23:20 +01:00
Genius Lyrics (I so like it)
This commit is contained in:
1 parent
aca33323f5
commit
04bad04ac9
24 files changed
+765
-2
No files matched your search
@@ -0,0 +1,10 @@
|
||||
import Foundation
|
||||
|
||||
extension Collection {
|
||||
func dropLast(while predicate: (Element) throws -> Bool) rethrows -> SubSequence {
|
||||
guard let index = try indices.reversed().first(where: { try !predicate(self[$0]) }) else {
|
||||
return self[startIndex..<startIndex]
|
||||
}
|
||||
return self[...index]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
import SwiftUI
|
||||
import UIKit
|
||||
|
||||
extension Color {
|
||||
|
||||
init(hex: String) {
|
||||
|
||||
let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
|
||||
var int: UInt64 = 0
|
||||
Scanner(string: hex).scanHexInt64(&int)
|
||||
let a, r, g, b: UInt64
|
||||
switch hex.count {
|
||||
case 3:
|
||||
(a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
|
||||
case 6:
|
||||
(a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
|
||||
case 8:
|
||||
(a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
|
||||
default:
|
||||
(a, r, g, b) = (1, 1, 1, 0)
|
||||
}
|
||||
|
||||
self.init(
|
||||
.sRGB,
|
||||
red: Double(r) / 255,
|
||||
green: Double(g) / 255,
|
||||
blue: Double(b) / 255,
|
||||
opacity: Double(a) / 255
|
||||
)
|
||||
}
|
||||
|
||||
var components: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
|
||||
|
||||
typealias NativeColor = UIColor
|
||||
|
||||
var r: CGFloat = 0
|
||||
var g: CGFloat = 0
|
||||
var b: CGFloat = 0
|
||||
var a: CGFloat = 0
|
||||
|
||||
guard NativeColor(self).getRed(&r, green: &g, blue: &b, alpha: &a) else {
|
||||
return (0, 0, 0, 0)
|
||||
}
|
||||
|
||||
return (r, g, b, a)
|
||||
}
|
||||
|
||||
var uInt32: UInt32 {
|
||||
UInt32(components.alpha * 255) << 24
|
||||
| UInt32(components.red * 255) << 16
|
||||
| UInt32(components.green * 255) << 8
|
||||
| UInt32(components.blue * 255)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
import Foundation
|
||||
|
||||
extension Dictionary {
|
||||
var queryString: String {
|
||||
return self
|
||||
.compactMap({ (key, value) -> String in
|
||||
return "\(key)=\(value)"
|
||||
})
|
||||
.joined(separator: "&")
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,32 @@
|
||||
import Foundation
|
||||
|
||||
extension String {
|
||||
|
||||
|
||||
static func ~= (lhs: String, rhs: String) -> Bool {
|
||||
guard let regex = try? NSRegularExpression(pattern: rhs) else { return false }
|
||||
let range = NSRange(location: 0, length: lhs.utf16.count)
|
||||
return regex.firstMatch(in: lhs, options: [], range: range) != nil
|
||||
}
|
||||
|
||||
var range: NSRange {
|
||||
NSRange(self.startIndex..., in: self)
|
||||
}
|
||||
|
||||
func containsInsensitive<S: StringProtocol>(_ s: S) -> Bool {
|
||||
self.range(of: s, options: .caseInsensitive) != nil
|
||||
}
|
||||
|
||||
func matches(_ pattern: String) -> Bool {
|
||||
try! NSRegularExpression(pattern: pattern)
|
||||
.firstMatch(in: self, range: self.range) != nil
|
||||
}
|
||||
|
||||
func removeMatches(_ pattern: String) -> String {
|
||||
try! NSRegularExpression(pattern: pattern)
|
||||
.stringByReplacingMatches(
|
||||
in: self,
|
||||
range: self.range,
|
||||
withTemplate: ""
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
import Foundation
|
||||
|
||||
extension URL {
|
||||
var isLyrics: Bool {
|
||||
self.path.contains("color-lyrics/v2")
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user