From 0b6c147b115d47a79c43c575da6922f9cafb6776 Mon Sep 17 00:00:00 2001 From: Simon Ng Date: Fri, 3 Apr 2020 17:32:28 +0800 Subject: [PATCH] Initial version --- MusicPlayer.xcodeproj/project.pbxproj | 355 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../UserInterfaceState.xcuserstate | Bin 0 -> 27819 bytes .../UserInterfaceState.xcuserstate | Bin 0 -> 19309 bytes .../xcschemes/xcschememanagement.plist | 14 + .../xcschemes/xcschememanagement.plist | 14 + MusicPlayer/AppDelegate.swift | 37 ++ .../AppIcon.appiconset/Contents.json | 98 +++++ MusicPlayer/Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 25 ++ MusicPlayer/ContentView.swift | 41 ++ MusicPlayer/Info.plist | 70 ++++ MusicPlayer/PlayerView.swift | 81 ++++ .../Preview Assets.xcassets/Contents.json | 6 + MusicPlayer/SceneDelegate.swift | 64 ++++ MusicPlayer/SearchView.swift | 59 +++ musictoken.py | 39 ++ 18 files changed, 924 insertions(+) create mode 100644 MusicPlayer.xcodeproj/project.pbxproj create mode 100644 MusicPlayer.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 MusicPlayer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 MusicPlayer.xcodeproj/project.xcworkspace/xcuserdata/saikambampati.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 MusicPlayer.xcodeproj/project.xcworkspace/xcuserdata/simon.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 MusicPlayer.xcodeproj/xcuserdata/saikambampati.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 MusicPlayer.xcodeproj/xcuserdata/simon.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 MusicPlayer/AppDelegate.swift create mode 100644 MusicPlayer/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 MusicPlayer/Assets.xcassets/Contents.json create mode 100644 MusicPlayer/Base.lproj/LaunchScreen.storyboard create mode 100644 MusicPlayer/ContentView.swift create mode 100644 MusicPlayer/Info.plist create mode 100644 MusicPlayer/PlayerView.swift create mode 100644 MusicPlayer/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 MusicPlayer/SceneDelegate.swift create mode 100644 MusicPlayer/SearchView.swift create mode 100644 musictoken.py diff --git a/MusicPlayer.xcodeproj/project.pbxproj b/MusicPlayer.xcodeproj/project.pbxproj new file mode 100644 index 0000000..7d6ac08 --- /dev/null +++ b/MusicPlayer.xcodeproj/project.pbxproj @@ -0,0 +1,355 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 8B3DC4B92422A2810067355E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B3DC4B82422A2810067355E /* AppDelegate.swift */; }; + 8B3DC4BB2422A2810067355E /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B3DC4BA2422A2810067355E /* SceneDelegate.swift */; }; + 8B3DC4BD2422A2810067355E /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B3DC4BC2422A2810067355E /* ContentView.swift */; }; + 8B3DC4BF2422A2820067355E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8B3DC4BE2422A2820067355E /* Assets.xcassets */; }; + 8B3DC4C22422A2820067355E /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8B3DC4C12422A2820067355E /* Preview Assets.xcassets */; }; + 8B3DC4C52422A2820067355E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8B3DC4C32422A2820067355E /* LaunchScreen.storyboard */; }; + 8B708D642422FB9700CE1598 /* PlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B708D632422FB9700CE1598 /* PlayerView.swift */; }; + 8B708D662423108200CE1598 /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B708D652423108200CE1598 /* SearchView.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 8B3DC4B52422A2810067355E /* MusicPlayer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MusicPlayer.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 8B3DC4B82422A2810067355E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 8B3DC4BA2422A2810067355E /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 8B3DC4BC2422A2810067355E /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 8B3DC4BE2422A2820067355E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 8B3DC4C12422A2820067355E /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 8B3DC4C42422A2820067355E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 8B3DC4C62422A2820067355E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8B708D632422FB9700CE1598 /* PlayerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerView.swift; sourceTree = ""; }; + 8B708D652423108200CE1598 /* SearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchView.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8B3DC4B22422A2810067355E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 8B3DC4AC2422A2810067355E = { + isa = PBXGroup; + children = ( + 8B3DC4B72422A2810067355E /* MusicPlayer */, + 8B3DC4B62422A2810067355E /* Products */, + ); + sourceTree = ""; + }; + 8B3DC4B62422A2810067355E /* Products */ = { + isa = PBXGroup; + children = ( + 8B3DC4B52422A2810067355E /* MusicPlayer.app */, + ); + name = Products; + sourceTree = ""; + }; + 8B3DC4B72422A2810067355E /* MusicPlayer */ = { + isa = PBXGroup; + children = ( + 8B3DC4B82422A2810067355E /* AppDelegate.swift */, + 8B3DC4BA2422A2810067355E /* SceneDelegate.swift */, + 8B3DC4BC2422A2810067355E /* ContentView.swift */, + 8B708D632422FB9700CE1598 /* PlayerView.swift */, + 8B708D652423108200CE1598 /* SearchView.swift */, + 8B3DC4BE2422A2820067355E /* Assets.xcassets */, + 8B3DC4C32422A2820067355E /* LaunchScreen.storyboard */, + 8B3DC4C62422A2820067355E /* Info.plist */, + 8B3DC4C02422A2820067355E /* Preview Content */, + ); + path = MusicPlayer; + sourceTree = ""; + }; + 8B3DC4C02422A2820067355E /* Preview Content */ = { + isa = PBXGroup; + children = ( + 8B3DC4C12422A2820067355E /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8B3DC4B42422A2810067355E /* MusicPlayer */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8B3DC4C92422A2820067355E /* Build configuration list for PBXNativeTarget "MusicPlayer" */; + buildPhases = ( + 8B3DC4B12422A2810067355E /* Sources */, + 8B3DC4B22422A2810067355E /* Frameworks */, + 8B3DC4B32422A2810067355E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MusicPlayer; + productName = MusicPlayer; + productReference = 8B3DC4B52422A2810067355E /* MusicPlayer.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 8B3DC4AD2422A2810067355E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1130; + LastUpgradeCheck = 1130; + ORGANIZATIONNAME = "Sai Kambmapati"; + TargetAttributes = { + 8B3DC4B42422A2810067355E = { + CreatedOnToolsVersion = 11.3.1; + }; + }; + }; + buildConfigurationList = 8B3DC4B02422A2810067355E /* Build configuration list for PBXProject "MusicPlayer" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 8B3DC4AC2422A2810067355E; + productRefGroup = 8B3DC4B62422A2810067355E /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8B3DC4B42422A2810067355E /* MusicPlayer */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8B3DC4B32422A2810067355E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8B3DC4C52422A2820067355E /* LaunchScreen.storyboard in Resources */, + 8B3DC4C22422A2820067355E /* Preview Assets.xcassets in Resources */, + 8B3DC4BF2422A2820067355E /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8B3DC4B12422A2810067355E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8B708D662423108200CE1598 /* SearchView.swift in Sources */, + 8B3DC4B92422A2810067355E /* AppDelegate.swift in Sources */, + 8B3DC4BB2422A2810067355E /* SceneDelegate.swift in Sources */, + 8B3DC4BD2422A2810067355E /* ContentView.swift in Sources */, + 8B708D642422FB9700CE1598 /* PlayerView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 8B3DC4C32422A2820067355E /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 8B3DC4C42422A2820067355E /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 8B3DC4C72422A2820067355E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.2; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 8B3DC4C82422A2820067355E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.2; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 8B3DC4CA2422A2820067355E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"MusicPlayer/Preview Content\""; + DEVELOPMENT_TEAM = XJYMG76226; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = MusicPlayer/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.appcoda.MusicPlayer; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 8B3DC4CB2422A2820067355E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"MusicPlayer/Preview Content\""; + DEVELOPMENT_TEAM = XJYMG76226; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = MusicPlayer/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.appcoda.MusicPlayer; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 8B3DC4B02422A2810067355E /* Build configuration list for PBXProject "MusicPlayer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8B3DC4C72422A2820067355E /* Debug */, + 8B3DC4C82422A2820067355E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8B3DC4C92422A2820067355E /* Build configuration list for PBXNativeTarget "MusicPlayer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8B3DC4CA2422A2820067355E /* Debug */, + 8B3DC4CB2422A2820067355E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 8B3DC4AD2422A2810067355E /* Project object */; +} diff --git a/MusicPlayer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/MusicPlayer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..404a2e3 --- /dev/null +++ b/MusicPlayer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/MusicPlayer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/MusicPlayer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/MusicPlayer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/MusicPlayer.xcodeproj/project.xcworkspace/xcuserdata/saikambampati.xcuserdatad/UserInterfaceState.xcuserstate b/MusicPlayer.xcodeproj/project.xcworkspace/xcuserdata/saikambampati.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..880e1fa99740d0fb25ab037c66e78e071f62646b GIT binary patch literal 27819 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 C4>T13 literal 0 HcmV?d00001 diff --git a/MusicPlayer.xcodeproj/project.xcworkspace/xcuserdata/simon.xcuserdatad/UserInterfaceState.xcuserstate b/MusicPlayer.xcodeproj/project.xcworkspace/xcuserdata/simon.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..ae3f05d98cd97c350a2c8f5158c010f971a8784d GIT binary patch literal 19309 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 byQKR{_qFaD-A&E{q$uu_7vI(})ZO}DjR26T literal 0 HcmV?d00001 diff --git a/MusicPlayer.xcodeproj/xcuserdata/saikambampati.xcuserdatad/xcschemes/xcschememanagement.plist b/MusicPlayer.xcodeproj/xcuserdata/saikambampati.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..0ba9869 --- /dev/null +++ b/MusicPlayer.xcodeproj/xcuserdata/saikambampati.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + MusicPlayer.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/MusicPlayer.xcodeproj/xcuserdata/simon.xcuserdatad/xcschemes/xcschememanagement.plist b/MusicPlayer.xcodeproj/xcuserdata/simon.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..0ba9869 --- /dev/null +++ b/MusicPlayer.xcodeproj/xcuserdata/simon.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + MusicPlayer.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/MusicPlayer/AppDelegate.swift b/MusicPlayer/AppDelegate.swift new file mode 100644 index 0000000..3044070 --- /dev/null +++ b/MusicPlayer/AppDelegate.swift @@ -0,0 +1,37 @@ +// +// AppDelegate.swift +// MusicPlayer +// +// Created by Sai Kambampati on 3/18/20. +// Copyright © 2020 Sai Kambmapati. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + // Called when a new scene session is being created. + // Use this method to select a configuration to create the new scene with. + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } + + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { + // Called when the user discards a scene session. + // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. + // Use this method to release any resources that were specific to the discarded scenes, as they will not return. + } + + +} + diff --git a/MusicPlayer/Assets.xcassets/AppIcon.appiconset/Contents.json b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d8db8d6 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/MusicPlayer/Assets.xcassets/Contents.json b/MusicPlayer/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/MusicPlayer/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/MusicPlayer/Base.lproj/LaunchScreen.storyboard b/MusicPlayer/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/MusicPlayer/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MusicPlayer/ContentView.swift b/MusicPlayer/ContentView.swift new file mode 100644 index 0000000..74f272e --- /dev/null +++ b/MusicPlayer/ContentView.swift @@ -0,0 +1,41 @@ +// +// ContentView.swift +// MusicPlayer +// +// Created by Sai Kambampati on 3/18/20. +// Copyright © 2020 Sai Kambmapati. All rights reserved. +// + +import SwiftUI + +struct ContentView: View { + @State private var selection = 0 + + var body: some View { + TabView(selection: $selection) { + PlayerView() + .tag(0) + .tabItem { + VStack { + Image(systemName: "music.note") + Text("Player") + } + } + SearchView() + .tag(1) + .tabItem { + VStack { + Image(systemName: "magnifyingglass") + Text("Search") + } + } + } + .accentColor(.pink) + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/MusicPlayer/Info.plist b/MusicPlayer/Info.plist new file mode 100644 index 0000000..49e8f4a --- /dev/null +++ b/MusicPlayer/Info.plist @@ -0,0 +1,70 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarTintParameters + + UINavigationBar + + Style + UIBarStyleDefault + Translucent + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/MusicPlayer/PlayerView.swift b/MusicPlayer/PlayerView.swift new file mode 100644 index 0000000..a4a3a38 --- /dev/null +++ b/MusicPlayer/PlayerView.swift @@ -0,0 +1,81 @@ +// +// PlayerView.swift +// MusicPlayer +// +// Created by Sai Kambampati on 3/18/20. +// Copyright © 2020 Sai Kambmapati. All rights reserved. +// + +import SwiftUI + +struct PlayerView: View { + var body: some View { + GeometryReader { geometry in + VStack(spacing: 24) { + Image(systemName: "a.square") + .resizable() + .frame(width: geometry.size.width - 24, height: geometry.size.width - 24) + .cornerRadius(20) + .shadow(radius: 10) + + VStack(spacing: 8) { + Text("Song Title") + .font(Font.system(.title).bold()) + Text("Artist Name") + .font(.system(.headline)) + } + + HStack(spacing: 40) { + Button(action: { + print("Rewind") + }) { + ZStack { + Circle() + .frame(width: 80, height: 80) + .accentColor(.pink) + .shadow(radius: 10) + Image(systemName: "backward.fill") + .foregroundColor(.white) + .font(.system(.title)) + } + } + + Button(action: { + print("Pause") + }) { + ZStack { + Circle() + .frame(width: 80, height: 80) + .accentColor(.pink) + .shadow(radius: 10) + Image(systemName: "pause.fill") + .foregroundColor(.white) + .font(.system(.title)) + } + } + + Button(action: { + print("Skip") + }) { + ZStack { + Circle() + .frame(width: 80, height: 80) + .accentColor(.pink) + .shadow(radius: 10) + Image(systemName: "forward.fill") + .foregroundColor(.white) + .font(.system(.title)) + } + } + } + + } + } + } +} + +struct PlayerView_Previews: PreviewProvider { + static var previews: some View { + PlayerView() + } +} diff --git a/MusicPlayer/Preview Content/Preview Assets.xcassets/Contents.json b/MusicPlayer/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/MusicPlayer/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/MusicPlayer/SceneDelegate.swift b/MusicPlayer/SceneDelegate.swift new file mode 100644 index 0000000..9c819ab --- /dev/null +++ b/MusicPlayer/SceneDelegate.swift @@ -0,0 +1,64 @@ +// +// SceneDelegate.swift +// MusicPlayer +// +// Created by Sai Kambampati on 3/18/20. +// Copyright © 2020 Sai Kambmapati. All rights reserved. +// + +import UIKit +import SwiftUI + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. + // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). + + // Create the SwiftUI view that provides the window contents. + let contentView = ContentView() + + // Use a UIHostingController as window root view controller. + if let windowScene = scene as? UIWindowScene { + let window = UIWindow(windowScene: windowScene) + window.rootViewController = UIHostingController(rootView: contentView) + self.window = window + window.makeKeyAndVisible() + } + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } + + +} + diff --git a/MusicPlayer/SearchView.swift b/MusicPlayer/SearchView.swift new file mode 100644 index 0000000..e67f2d7 --- /dev/null +++ b/MusicPlayer/SearchView.swift @@ -0,0 +1,59 @@ +// +// SearchView.swift +// MusicPlayer +// +// Created by Sai Kambampati on 3/18/20. +// Copyright © 2020 Sai Kambmapati. All rights reserved. +// + +import SwiftUI + +struct SearchView: View { + @State private var searchText = "" + let songs = ["Blinding Lights", "That Way", "This Is Me"] + + var body: some View { + VStack { + TextField("Search Songs", text: $searchText, onCommit: { + print(self.searchText) + }) + .textFieldStyle(RoundedBorderTextFieldStyle()) + .padding(.horizontal, 16) + .accentColor(.pink) + + List { + ForEach(songs, id:\.self) { songTitle in + HStack { + Image(systemName: "rectangle.stack.fill") + .resizable() + .frame(width: 40, height: 40) + .cornerRadius(5) + .shadow(radius: 2) + + VStack(alignment: .leading) { + Text(songTitle) + .font(.headline) + Text("Artist Title") + .font(.caption) + .foregroundColor(.secondary) + } + Spacer() + Button(action: { + print("Playing \(songTitle)") + }) { + Image(systemName: "play.fill") + .foregroundColor(.pink) + } + } + } + } + .accentColor(.pink) + } + } +} + +struct SearchView_Previews: PreviewProvider { + static var previews: some View { + SearchView() + } +} diff --git a/musictoken.py b/musictoken.py new file mode 100644 index 0000000..3464b7e --- /dev/null +++ b/musictoken.py @@ -0,0 +1,39 @@ +import datetime +import jwt + + +secret = """-----BEGIN PRIVATE KEY----- +PASTE +YOUR +KEY +ER +-----END PRIVATE KEY-----""" +keyId = "ABCDEFGHIJ" +teamId = "0123456789" +alg = 'ES256' + +time_now = datetime.datetime.now() +time_expired = datetime.datetime.now() + datetime.timedelta(hours=4380) + +headers = { + "alg": alg, + "kid": keyId +} + +payload = { + "iss": teamId, + "exp": int(time_expired.strftime("%s")), + "iat": int(time_now.strftime("%s")) +} + + +if __name__ == "__main__": + """Create an auth token""" + token = jwt.encode(payload, secret, algorithm=alg, headers=headers) + + print "----TOKEN----" + print token + + print "----CURL----" + print "curl -v -H 'Authorization: Bearer %s' \"https://api.music.apple.com/v1/catalog/us/artists/36954\" " % (token) +