✨ Playlist & tracks
This commit is contained in:
		
							
								
								
									
										5
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| { | ||||
|     "cSpell.words": [ | ||||
|         "Skeletonizer" | ||||
|     ] | ||||
| } | ||||
| @@ -1 +1,2 @@ | ||||
| #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" | ||||
| #include "Generated.xcconfig" | ||||
|   | ||||
| @@ -1 +1,2 @@ | ||||
| #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" | ||||
| #include "Generated.xcconfig" | ||||
|   | ||||
							
								
								
									
										44
									
								
								ios/Podfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								ios/Podfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,44 @@ | ||||
| # Uncomment this line to define a global platform for your project | ||||
| # platform :ios, '12.0' | ||||
|  | ||||
| # CocoaPods analytics sends network stats synchronously affecting flutter build latency. | ||||
| ENV['COCOAPODS_DISABLE_STATS'] = 'true' | ||||
|  | ||||
| project 'Runner', { | ||||
|   'Debug' => :debug, | ||||
|   'Profile' => :release, | ||||
|   'Release' => :release, | ||||
| } | ||||
|  | ||||
| def flutter_root | ||||
|   generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) | ||||
|   unless File.exist?(generated_xcode_build_settings_path) | ||||
|     raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" | ||||
|   end | ||||
|  | ||||
|   File.foreach(generated_xcode_build_settings_path) do |line| | ||||
|     matches = line.match(/FLUTTER_ROOT\=(.*)/) | ||||
|     return matches[1].strip if matches | ||||
|   end | ||||
|   raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" | ||||
| end | ||||
|  | ||||
| require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) | ||||
|  | ||||
| flutter_ios_podfile_setup | ||||
|  | ||||
| target 'Runner' do | ||||
|   use_frameworks! | ||||
|   use_modular_headers! | ||||
|  | ||||
|   flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) | ||||
|   target 'RunnerTests' do | ||||
|     inherit! :search_paths | ||||
|   end | ||||
| end | ||||
|  | ||||
| post_install do |installer| | ||||
|   installer.pods_project.targets.each do |target| | ||||
|     flutter_additional_ios_build_settings(target) | ||||
|   end | ||||
| end | ||||
							
								
								
									
										36
									
								
								ios/Podfile.lock
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								ios/Podfile.lock
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | ||||
| PODS: | ||||
|   - Flutter (1.0.0) | ||||
|   - package_info_plus (0.4.5): | ||||
|     - Flutter | ||||
|   - path_provider_foundation (0.0.1): | ||||
|     - Flutter | ||||
|     - FlutterMacOS | ||||
|   - sqflite (0.0.3): | ||||
|     - Flutter | ||||
|     - FlutterMacOS | ||||
|  | ||||
| DEPENDENCIES: | ||||
|   - Flutter (from `Flutter`) | ||||
|   - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) | ||||
|   - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) | ||||
|   - sqflite (from `.symlinks/plugins/sqflite/darwin`) | ||||
|  | ||||
| EXTERNAL SOURCES: | ||||
|   Flutter: | ||||
|     :path: Flutter | ||||
|   package_info_plus: | ||||
|     :path: ".symlinks/plugins/package_info_plus/ios" | ||||
|   path_provider_foundation: | ||||
|     :path: ".symlinks/plugins/path_provider_foundation/darwin" | ||||
|   sqflite: | ||||
|     :path: ".symlinks/plugins/sqflite/darwin" | ||||
|  | ||||
| SPEC CHECKSUMS: | ||||
|   Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 | ||||
|   package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c | ||||
|   path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 | ||||
|   sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec | ||||
|  | ||||
| PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796 | ||||
|  | ||||
| COCOAPODS: 1.15.2 | ||||
| @@ -14,6 +14,8 @@ | ||||
| 		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; | ||||
| 		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; | ||||
| 		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; | ||||
| 		D59D206BCC2BFD2ED4491BB5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 13E3FE83DDD8C103E07F9FFF /* Pods_Runner.framework */; }; | ||||
| 		FED66AC6F9A9EACA447A4012 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 218121024AC67443183BBCE4 /* Pods_RunnerTests.framework */; }; | ||||
| /* End PBXBuildFile section */ | ||||
|  | ||||
| /* Begin PBXContainerItemProxy section */ | ||||
| @@ -40,11 +42,16 @@ | ||||
| /* End PBXCopyFilesBuildPhase section */ | ||||
|  | ||||
| /* Begin PBXFileReference section */ | ||||
| 		13E3FE83DDD8C103E07F9FFF /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; | ||||
| 		1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; | ||||
| 		1CF40EE9C145DC3FDC6C41BF /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; }; | ||||
| 		218121024AC67443183BBCE4 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; }; | ||||
| 		331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
| 		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; }; | ||||
| 		3DEC12170E7193C6D80F23E1 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; }; | ||||
| 		46282EF254B0694E3C40CCA1 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; }; | ||||
| 		74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; }; | ||||
| 		74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; | ||||
| 		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; }; | ||||
| @@ -55,13 +62,25 @@ | ||||
| 		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; | ||||
| 		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; | ||||
| 		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; | ||||
| 		BE2251C368D2AEB55A45876C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; }; | ||||
| 		DAFDCBCA918FE99EC399DF6B /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; }; | ||||
| 		F6AA4F6E560887D88DACF99C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; }; | ||||
| /* End PBXFileReference section */ | ||||
|  | ||||
| /* Begin PBXFrameworksBuildPhase section */ | ||||
| 		70B5431EA89CDE1115951411 /* Frameworks */ = { | ||||
| 			isa = PBXFrameworksBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				FED66AC6F9A9EACA447A4012 /* Pods_RunnerTests.framework in Frameworks */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| 		97C146EB1CF9000F007C117D /* Frameworks */ = { | ||||
| 			isa = PBXFrameworksBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				D59D206BCC2BFD2ED4491BB5 /* Pods_Runner.framework in Frameworks */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
| @@ -94,6 +113,8 @@ | ||||
| 				97C146F01CF9000F007C117D /* Runner */, | ||||
| 				97C146EF1CF9000F007C117D /* Products */, | ||||
| 				331C8082294A63A400263BE5 /* RunnerTests */, | ||||
| 				E318006AFE227B6C9A22AA5B /* Pods */, | ||||
| 				AC759F256F78D7AB804BFB99 /* Frameworks */, | ||||
| 			); | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| @@ -121,6 +142,29 @@ | ||||
| 			path = Runner; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		AC759F256F78D7AB804BFB99 /* Frameworks */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				13E3FE83DDD8C103E07F9FFF /* Pods_Runner.framework */, | ||||
| 				218121024AC67443183BBCE4 /* Pods_RunnerTests.framework */, | ||||
| 			); | ||||
| 			name = Frameworks; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| 		E318006AFE227B6C9A22AA5B /* Pods */ = { | ||||
| 			isa = PBXGroup; | ||||
| 			children = ( | ||||
| 				F6AA4F6E560887D88DACF99C /* Pods-Runner.debug.xcconfig */, | ||||
| 				BE2251C368D2AEB55A45876C /* Pods-Runner.release.xcconfig */, | ||||
| 				3DEC12170E7193C6D80F23E1 /* Pods-Runner.profile.xcconfig */, | ||||
| 				46282EF254B0694E3C40CCA1 /* Pods-RunnerTests.debug.xcconfig */, | ||||
| 				1CF40EE9C145DC3FDC6C41BF /* Pods-RunnerTests.release.xcconfig */, | ||||
| 				DAFDCBCA918FE99EC399DF6B /* Pods-RunnerTests.profile.xcconfig */, | ||||
| 			); | ||||
| 			name = Pods; | ||||
| 			path = Pods; | ||||
| 			sourceTree = "<group>"; | ||||
| 		}; | ||||
| /* End PBXGroup section */ | ||||
|  | ||||
| /* Begin PBXNativeTarget section */ | ||||
| @@ -128,8 +172,10 @@ | ||||
| 			isa = PBXNativeTarget; | ||||
| 			buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; | ||||
| 			buildPhases = ( | ||||
| 				574D611B790BD04E35277C07 /* [CP] Check Pods Manifest.lock */, | ||||
| 				331C807D294A63A400263BE5 /* Sources */, | ||||
| 				331C807F294A63A400263BE5 /* Resources */, | ||||
| 				70B5431EA89CDE1115951411 /* Frameworks */, | ||||
| 			); | ||||
| 			buildRules = ( | ||||
| 			); | ||||
| @@ -145,12 +191,14 @@ | ||||
| 			isa = PBXNativeTarget; | ||||
| 			buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; | ||||
| 			buildPhases = ( | ||||
| 				E79B3B46C2CDBACD0667DE79 /* [CP] Check Pods Manifest.lock */, | ||||
| 				9740EEB61CF901F6004384FC /* Run Script */, | ||||
| 				97C146EA1CF9000F007C117D /* Sources */, | ||||
| 				97C146EB1CF9000F007C117D /* Frameworks */, | ||||
| 				97C146EC1CF9000F007C117D /* Resources */, | ||||
| 				9705A1C41CF9048500538489 /* Embed Frameworks */, | ||||
| 				3B06AD1E1E4923F5004D2608 /* Thin Binary */, | ||||
| 				3D2CD364E406FF297E18AB10 /* [CP] Embed Pods Frameworks */, | ||||
| 			); | ||||
| 			buildRules = ( | ||||
| 			); | ||||
| @@ -238,6 +286,45 @@ | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; | ||||
| 		}; | ||||
| 		3D2CD364E406FF297E18AB10 /* [CP] Embed Pods Frameworks */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputFileListPaths = ( | ||||
| 				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", | ||||
| 			); | ||||
| 			name = "[CP] Embed Pods Frameworks"; | ||||
| 			outputFileListPaths = ( | ||||
| 				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; | ||||
| 			showEnvVarsInLog = 0; | ||||
| 		}; | ||||
| 		574D611B790BD04E35277C07 /* [CP] Check Pods Manifest.lock */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputFileListPaths = ( | ||||
| 			); | ||||
| 			inputPaths = ( | ||||
| 				"${PODS_PODFILE_DIR_PATH}/Podfile.lock", | ||||
| 				"${PODS_ROOT}/Manifest.lock", | ||||
| 			); | ||||
| 			name = "[CP] Check Pods Manifest.lock"; | ||||
| 			outputFileListPaths = ( | ||||
| 			); | ||||
| 			outputPaths = ( | ||||
| 				"$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; | ||||
| 			showEnvVarsInLog = 0; | ||||
| 		}; | ||||
| 		9740EEB61CF901F6004384FC /* Run Script */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			alwaysOutOfDate = 1; | ||||
| @@ -253,6 +340,28 @@ | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; | ||||
| 		}; | ||||
| 		E79B3B46C2CDBACD0667DE79 /* [CP] Check Pods Manifest.lock */ = { | ||||
| 			isa = PBXShellScriptBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 			); | ||||
| 			inputFileListPaths = ( | ||||
| 			); | ||||
| 			inputPaths = ( | ||||
| 				"${PODS_PODFILE_DIR_PATH}/Podfile.lock", | ||||
| 				"${PODS_ROOT}/Manifest.lock", | ||||
| 			); | ||||
| 			name = "[CP] Check Pods Manifest.lock"; | ||||
| 			outputFileListPaths = ( | ||||
| 			); | ||||
| 			outputPaths = ( | ||||
| 				"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 			shellPath = /bin/sh; | ||||
| 			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; | ||||
| 			showEnvVarsInLog = 0; | ||||
| 		}; | ||||
| /* End PBXShellScriptBuildPhase section */ | ||||
|  | ||||
| /* Begin PBXSourcesBuildPhase section */ | ||||
| @@ -379,6 +488,7 @@ | ||||
| 		}; | ||||
| 		331C8088294A63A400263BE5 /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 46282EF254B0694E3C40CCA1 /* Pods-RunnerTests.debug.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				BUNDLE_LOADER = "$(TEST_HOST)"; | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| @@ -396,6 +506,7 @@ | ||||
| 		}; | ||||
| 		331C8089294A63A400263BE5 /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = 1CF40EE9C145DC3FDC6C41BF /* Pods-RunnerTests.release.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				BUNDLE_LOADER = "$(TEST_HOST)"; | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
| @@ -411,6 +522,7 @@ | ||||
| 		}; | ||||
| 		331C808A294A63A400263BE5 /* Profile */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			baseConfigurationReference = DAFDCBCA918FE99EC399DF6B /* Pods-RunnerTests.profile.xcconfig */; | ||||
| 			buildSettings = { | ||||
| 				BUNDLE_LOADER = "$(TEST_HOST)"; | ||||
| 				CODE_SIGN_STYLE = Automatic; | ||||
|   | ||||
							
								
								
									
										3
									
								
								ios/Runner.xcworkspace/contents.xcworkspacedata
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										3
									
								
								ios/Runner.xcworkspace/contents.xcworkspacedata
									
									
									
										generated
									
									
									
								
							| @@ -4,4 +4,7 @@ | ||||
|    <FileRef | ||||
|       location = "group:Runner.xcodeproj"> | ||||
|    </FileRef> | ||||
|    <FileRef | ||||
|       location = "group:Pods/Pods.xcodeproj"> | ||||
|    </FileRef> | ||||
| </Workspace> | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:get/get.dart'; | ||||
| import 'package:get/get_navigation/src/root/get_material_app.dart'; | ||||
| import 'package:rhythm_box/providers/spotify.dart'; | ||||
| import 'package:rhythm_box/router.dart'; | ||||
| import 'package:rhythm_box/translations.dart'; | ||||
|  | ||||
| @@ -40,5 +40,7 @@ class MyApp extends StatelessWidget { | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   void _initializeProviders(BuildContext context) async {} | ||||
|   void _initializeProviders(BuildContext context) async { | ||||
|     Get.lazyPut(() => SpotifyProvider()); | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										41
									
								
								lib/platform.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								lib/platform.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| import 'dart:io'; | ||||
|  | ||||
| import 'package:flutter/foundation.dart'; | ||||
| import 'package:package_info_plus/package_info_plus.dart'; | ||||
|  | ||||
| abstract class PlatformInfo { | ||||
|   static bool get isWeb => kIsWeb; | ||||
|  | ||||
|   static bool get isLinux => !kIsWeb && Platform.isLinux; | ||||
|  | ||||
|   static bool get isWindows => !kIsWeb && Platform.isWindows; | ||||
|  | ||||
|   static bool get isMacOS => !kIsWeb && Platform.isMacOS; | ||||
|  | ||||
|   static bool get isIOS => !kIsWeb && Platform.isIOS; | ||||
|  | ||||
|   static bool get isAndroid => !kIsWeb && Platform.isAndroid; | ||||
|  | ||||
|   static bool get isMobile => isAndroid || isIOS; | ||||
|  | ||||
|   // Not first tier supported platform | ||||
|   static bool get isBetaDesktop => isWindows || isLinux; | ||||
|  | ||||
|   static bool get isDesktop => isLinux || isWindows || isMacOS; | ||||
|  | ||||
|   static bool get useTouchscreen => !isMobile; | ||||
|  | ||||
|   static bool get canCacheImage => isAndroid || isIOS || isMacOS; | ||||
|  | ||||
|   static bool get canRecord => (isMobile || isMacOS); | ||||
|  | ||||
|   static bool get canPushNotification => isAndroid || isIOS || isMacOS; | ||||
|  | ||||
|   static Future<String> getVersion() async { | ||||
|     var version = kIsWeb ? 'Web' : 'Unknown'; | ||||
|     try { | ||||
|       version = (await PackageInfo.fromPlatform()).version; | ||||
|     } catch (_) {} | ||||
|     return version; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										17
									
								
								lib/providers/spotify.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								lib/providers/spotify.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| import 'package:get/get.dart'; | ||||
| import 'package:spotify/spotify.dart'; | ||||
|  | ||||
| class SpotifyProvider extends GetxController { | ||||
|   late final SpotifyApi api; | ||||
|  | ||||
|   @override | ||||
|   void onInit() { | ||||
|     api = SpotifyApi( | ||||
|       SpotifyApiCredentials( | ||||
|         "f73d4bff91d64d89be9930036f553534", | ||||
|         "5cbec0b928d247cd891d06195f07b8c9", | ||||
|       ), | ||||
|     ); | ||||
|     super.onInit(); | ||||
|   } | ||||
| } | ||||
| @@ -1,5 +1,6 @@ | ||||
| import 'package:go_router/go_router.dart'; | ||||
| import 'package:rhythm_box/screens/explore.dart'; | ||||
| import 'package:rhythm_box/screens/playlist/view.dart'; | ||||
| import 'package:rhythm_box/screens/settings.dart'; | ||||
| import 'package:rhythm_box/shells/nav_shell.dart'; | ||||
|  | ||||
| @@ -12,6 +13,13 @@ final router = GoRouter(routes: [ | ||||
|         name: "explore", | ||||
|         builder: (context, state) => const ExploreScreen(), | ||||
|       ), | ||||
|       GoRoute( | ||||
|         path: "/playlist/:id", | ||||
|         name: "playlistView", | ||||
|         builder: (context, state) => PlaylistViewScreen( | ||||
|           playlistId: state.pathParameters['id']!, | ||||
|         ), | ||||
|       ), | ||||
|       GoRoute( | ||||
|         path: "/settings", | ||||
|         name: "settings", | ||||
|   | ||||
| @@ -1,4 +1,10 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:get/get.dart'; | ||||
| import 'package:go_router/go_router.dart'; | ||||
| import 'package:rhythm_box/providers/spotify.dart'; | ||||
| import 'package:rhythm_box/widgets/auto_cache_image.dart'; | ||||
| import 'package:skeletonizer/skeletonizer.dart'; | ||||
| import 'package:spotify/spotify.dart'; | ||||
|  | ||||
| class ExploreScreen extends StatefulWidget { | ||||
|   const ExploreScreen({super.key}); | ||||
| @@ -8,8 +14,73 @@ class ExploreScreen extends StatefulWidget { | ||||
| } | ||||
|  | ||||
| class _ExploreScreenState extends State<ExploreScreen> { | ||||
|   late final SpotifyProvider _spotify = Get.find(); | ||||
|  | ||||
|   bool _isLoading = true; | ||||
|  | ||||
|   List<PlaylistSimple>? _featuredPlaylist; | ||||
|  | ||||
|   Future<void> _pullPlaylist() async { | ||||
|     _featuredPlaylist = | ||||
|         (await _spotify.api.playlists.featured.all(10)).toList(); | ||||
|     setState(() => _isLoading = false); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   void initState() { | ||||
|     super.initState(); | ||||
|     _pullPlaylist(); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return const Placeholder(); | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|       child: Scaffold( | ||||
|         appBar: AppBar( | ||||
|           title: Text('explore'.tr), | ||||
|         ), | ||||
|         body: Skeletonizer( | ||||
|           enabled: _isLoading, | ||||
|           child: ListView.builder( | ||||
|             itemCount: _featuredPlaylist?.length ?? 20, | ||||
|             itemBuilder: (context, idx) { | ||||
|               final item = _featuredPlaylist?[idx]; | ||||
|               return ListTile( | ||||
|                 leading: ClipRRect( | ||||
|                   borderRadius: const BorderRadius.all(Radius.circular(16)), | ||||
|                   child: item != null | ||||
|                       ? AutoCacheImage( | ||||
|                           item.images!.first.url!, | ||||
|                           width: 64.0, | ||||
|                           height: 64.0, | ||||
|                         ) | ||||
|                       : const SizedBox( | ||||
|                           width: 64, | ||||
|                           height: 64, | ||||
|                           child: Center( | ||||
|                             child: Icon(Icons.image), | ||||
|                           ), | ||||
|                         ), | ||||
|                 ), | ||||
|                 title: Text(item?.name ?? 'Loading...'), | ||||
|                 subtitle: Text( | ||||
|                   item?.description ?? 'Please stand by...', | ||||
|                   maxLines: 2, | ||||
|                   overflow: TextOverflow.ellipsis, | ||||
|                 ), | ||||
|                 onTap: () { | ||||
|                   if (item == null) return; | ||||
|                   GoRouter.of(context).pushNamed( | ||||
|                     'playlistView', | ||||
|                     pathParameters: {'id': item.id!}, | ||||
|                   ); | ||||
|                 }, | ||||
|               ); | ||||
|             }, | ||||
|           ), | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										149
									
								
								lib/screens/playlist/view.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								lib/screens/playlist/view.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,149 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:gap/gap.dart'; | ||||
| import 'package:get/get.dart'; | ||||
| import 'package:google_fonts/google_fonts.dart'; | ||||
| import 'package:intl/intl.dart'; | ||||
| import 'package:rhythm_box/providers/spotify.dart'; | ||||
| import 'package:rhythm_box/widgets/auto_cache_image.dart'; | ||||
| import 'package:rhythm_box/widgets/tracks/playlist_track_list.dart'; | ||||
| import 'package:spotify/spotify.dart'; | ||||
|  | ||||
| class PlaylistViewScreen extends StatefulWidget { | ||||
|   final String playlistId; | ||||
|   final Playlist? playlist; | ||||
|  | ||||
|   const PlaylistViewScreen({ | ||||
|     super.key, | ||||
|     required this.playlistId, | ||||
|     this.playlist, | ||||
|   }); | ||||
|  | ||||
|   @override | ||||
|   State<PlaylistViewScreen> createState() => _PlaylistViewScreenState(); | ||||
| } | ||||
|  | ||||
| class _PlaylistViewScreenState extends State<PlaylistViewScreen> { | ||||
|   late final SpotifyProvider _spotify = Get.find(); | ||||
|  | ||||
|   bool _isLoading = true; | ||||
|  | ||||
|   Playlist? _playlist; | ||||
|  | ||||
|   Future<void> _pullPlaylist() async { | ||||
|     _playlist = await _spotify.api.playlists.get(widget.playlistId); | ||||
|     setState(() => _isLoading = false); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   void initState() { | ||||
|     super.initState(); | ||||
|     _pullPlaylist(); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     const radius = BorderRadius.all(Radius.circular(8)); | ||||
|  | ||||
|     return Material( | ||||
|       color: Theme.of(context).colorScheme.surface, | ||||
|       child: Scaffold( | ||||
|         appBar: AppBar( | ||||
|           title: const Text('Playlist'), | ||||
|         ), | ||||
|         body: Builder( | ||||
|           builder: (context) { | ||||
|             if (_isLoading) { | ||||
|               return const Center( | ||||
|                 child: CircularProgressIndicator(), | ||||
|               ); | ||||
|             } | ||||
|  | ||||
|             return CustomScrollView( | ||||
|               slivers: [ | ||||
|                 SliverToBoxAdapter( | ||||
|                   child: Column( | ||||
|                     crossAxisAlignment: CrossAxisAlignment.start, | ||||
|                     children: [ | ||||
|                       Row( | ||||
|                         crossAxisAlignment: CrossAxisAlignment.center, | ||||
|                         children: [ | ||||
|                           Material( | ||||
|                             borderRadius: radius, | ||||
|                             elevation: 2, | ||||
|                             child: ClipRRect( | ||||
|                               borderRadius: radius, | ||||
|                               child: Hero( | ||||
|                                 tag: Key('playlist-cover-${_playlist!.id}'), | ||||
|                                 child: AutoCacheImage( | ||||
|                                   _playlist!.images!.first.url!, | ||||
|                                   width: 160.0, | ||||
|                                   height: 160.0, | ||||
|                                 ), | ||||
|                               ), | ||||
|                             ), | ||||
|                           ), | ||||
|                           const Gap(24), | ||||
|                           Expanded( | ||||
|                             child: Column( | ||||
|                               crossAxisAlignment: CrossAxisAlignment.start, | ||||
|                               children: [ | ||||
|                                 Text( | ||||
|                                   _playlist!.name ?? 'Playlist', | ||||
|                                   style: | ||||
|                                       Theme.of(context).textTheme.headlineSmall, | ||||
|                                   maxLines: 2, | ||||
|                                   overflow: TextOverflow.fade, | ||||
|                                 ), | ||||
|                                 Text( | ||||
|                                   _playlist!.description ?? 'A Playlist', | ||||
|                                   maxLines: 3, | ||||
|                                   overflow: TextOverflow.ellipsis, | ||||
|                                 ), | ||||
|                                 const Gap(8), | ||||
|                                 Text( | ||||
|                                   "${NumberFormat.compactCurrency(symbol: '', decimalDigits: 2).format(_playlist!.followers!.total!)} saves", | ||||
|                                 ), | ||||
|                                 Text( | ||||
|                                   "#${_playlist!.id}", | ||||
|                                   style: GoogleFonts.robotoMono(fontSize: 10), | ||||
|                                 ), | ||||
|                               ], | ||||
|                             ), | ||||
|                           ), | ||||
|                         ], | ||||
|                       ).paddingOnly(left: 24, right: 24, top: 24), | ||||
|                       const Gap(8), | ||||
|                       Wrap( | ||||
|                         spacing: 8, | ||||
|                         children: [ | ||||
|                           ElevatedButton.icon( | ||||
|                             icon: const Icon(Icons.play_arrow_outlined), | ||||
|                             label: const Text('Play'), | ||||
|                             onPressed: () {}, | ||||
|                           ), | ||||
|                           TextButton.icon( | ||||
|                             icon: const Icon(Icons.shuffle), | ||||
|                             label: const Text('Shuffle'), | ||||
|                             onPressed: () {}, | ||||
|                           ), | ||||
|                         ], | ||||
|                       ).paddingSymmetric(horizontal: 24), | ||||
|                       const Gap(24), | ||||
|                     ], | ||||
|                   ), | ||||
|                 ), | ||||
|                 SliverToBoxAdapter( | ||||
|                   child: Text( | ||||
|                     'Songs (${_playlist!.tracks!.total})', | ||||
|                     style: Theme.of(context).textTheme.titleLarge, | ||||
|                   ).paddingOnly(left: 28, right: 28, bottom: 4), | ||||
|                 ), | ||||
|                 PlaylistTrackList(playlistId: widget.playlistId), | ||||
|               ], | ||||
|             ); | ||||
|           }, | ||||
|         ), | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										26
									
								
								lib/widgets/auto_cache_image.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								lib/widgets/auto_cache_image.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| import 'package:cached_network_image/cached_network_image.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:rhythm_box/platform.dart'; | ||||
|  | ||||
| class AutoCacheImage extends StatelessWidget { | ||||
|   final String url; | ||||
|   final double? width, height; | ||||
|  | ||||
|   const AutoCacheImage(this.url, {super.key, this.width, this.height}); | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     if (PlatformInfo.canCacheImage) { | ||||
|       return CachedNetworkImage( | ||||
|         imageUrl: url, | ||||
|         width: width, | ||||
|         height: height, | ||||
|       ); | ||||
|     } | ||||
|     return Image.network( | ||||
|       url, | ||||
|       width: width, | ||||
|       height: height, | ||||
|     ); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										73
									
								
								lib/widgets/tracks/playlist_track_list.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								lib/widgets/tracks/playlist_track_list.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:get/get.dart'; | ||||
| import 'package:rhythm_box/providers/spotify.dart'; | ||||
| import 'package:rhythm_box/widgets/auto_cache_image.dart'; | ||||
| import 'package:skeletonizer/skeletonizer.dart'; | ||||
| import 'package:spotify/spotify.dart'; | ||||
|  | ||||
| class PlaylistTrackList extends StatefulWidget { | ||||
|   final String playlistId; | ||||
|  | ||||
|   const PlaylistTrackList({super.key, required this.playlistId}); | ||||
|  | ||||
|   @override | ||||
|   State<PlaylistTrackList> createState() => _PlaylistTrackListState(); | ||||
| } | ||||
|  | ||||
| class _PlaylistTrackListState extends State<PlaylistTrackList> { | ||||
|   late final SpotifyProvider _spotify = Get.find(); | ||||
|  | ||||
|   bool _isLoading = true; | ||||
|  | ||||
|   List<Track>? _tracks; | ||||
|  | ||||
|   Future<void> _pullTracks() async { | ||||
|     _tracks = (await _spotify.api.playlists | ||||
|             .getTracksByPlaylistId(widget.playlistId) | ||||
|             .all()) | ||||
|         .toList(); | ||||
|     setState(() => _isLoading = false); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   void initState() { | ||||
|     _pullTracks(); | ||||
|     super.initState(); | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Widget build(BuildContext context) { | ||||
|     return Skeletonizer.sliver( | ||||
|       enabled: _isLoading, | ||||
|       child: SliverList.builder( | ||||
|         itemCount: _tracks?.length ?? 3, | ||||
|         itemBuilder: (context, idx) { | ||||
|           final item = _tracks?[idx]; | ||||
|           return ListTile( | ||||
|             leading: ClipRRect( | ||||
|               borderRadius: const BorderRadius.all(Radius.circular(16)), | ||||
|               child: item != null | ||||
|                   ? AutoCacheImage( | ||||
|                       item.album!.images!.first.url!, | ||||
|                       width: 64.0, | ||||
|                       height: 64.0, | ||||
|                     ) | ||||
|                   : const SizedBox( | ||||
|                       width: 64, | ||||
|                       height: 64, | ||||
|                       child: Center( | ||||
|                         child: Icon(Icons.image), | ||||
|                       ), | ||||
|                     ), | ||||
|             ), | ||||
|             title: Text(item?.name ?? 'Loading...'), | ||||
|             subtitle: Text( | ||||
|               item?.artists!.map((x) => x.name!).join(', ') ?? | ||||
|                   'Please stand by...', | ||||
|             ), | ||||
|           ); | ||||
|         }, | ||||
|       ), | ||||
|     ); | ||||
|   } | ||||
| } | ||||
| @@ -1 +1,2 @@ | ||||
| #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" | ||||
| #include "ephemeral/Flutter-Generated.xcconfig" | ||||
|   | ||||
| @@ -1 +1,2 @@ | ||||
| #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" | ||||
| #include "ephemeral/Flutter-Generated.xcconfig" | ||||
|   | ||||
| @@ -5,6 +5,12 @@ | ||||
| import FlutterMacOS | ||||
| import Foundation | ||||
|  | ||||
| import package_info_plus | ||||
| import path_provider_foundation | ||||
| import sqflite | ||||
|  | ||||
| func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { | ||||
|   FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) | ||||
|   PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) | ||||
|   SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) | ||||
| } | ||||
|   | ||||
							
								
								
									
										43
									
								
								macos/Podfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								macos/Podfile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| platform :osx, '10.14' | ||||
|  | ||||
| # CocoaPods analytics sends network stats synchronously affecting flutter build latency. | ||||
| ENV['COCOAPODS_DISABLE_STATS'] = 'true' | ||||
|  | ||||
| project 'Runner', { | ||||
|   'Debug' => :debug, | ||||
|   'Profile' => :release, | ||||
|   'Release' => :release, | ||||
| } | ||||
|  | ||||
| def flutter_root | ||||
|   generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) | ||||
|   unless File.exist?(generated_xcode_build_settings_path) | ||||
|     raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" | ||||
|   end | ||||
|  | ||||
|   File.foreach(generated_xcode_build_settings_path) do |line| | ||||
|     matches = line.match(/FLUTTER_ROOT\=(.*)/) | ||||
|     return matches[1].strip if matches | ||||
|   end | ||||
|   raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" | ||||
| end | ||||
|  | ||||
| require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) | ||||
|  | ||||
| flutter_macos_podfile_setup | ||||
|  | ||||
| target 'Runner' do | ||||
|   use_frameworks! | ||||
|   use_modular_headers! | ||||
|  | ||||
|   flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) | ||||
|   target 'RunnerTests' do | ||||
|     inherit! :search_paths | ||||
|   end | ||||
| end | ||||
|  | ||||
| post_install do |installer| | ||||
|   installer.pods_project.targets.each do |target| | ||||
|     flutter_additional_macos_build_settings(target) | ||||
|   end | ||||
| end | ||||
							
								
								
									
										354
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										354
									
								
								pubspec.lock
									
									
									
									
									
								
							| @@ -17,6 +17,30 @@ packages: | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.1.1" | ||||
|   cached_network_image: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: cached_network_image | ||||
|       sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.4.1" | ||||
|   cached_network_image_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: cached_network_image_platform_interface | ||||
|       sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "4.1.1" | ||||
|   cached_network_image_web: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: cached_network_image_web | ||||
|       sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.3.1" | ||||
|   characters: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -41,6 +65,22 @@ packages: | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.18.0" | ||||
|   crypto: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: crypto | ||||
|       sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.0.5" | ||||
|   csslib: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: csslib | ||||
|       sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.0.0" | ||||
|   cupertino_icons: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
| @@ -57,11 +97,43 @@ packages: | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.3.1" | ||||
|   ffi: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: ffi | ||||
|       sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.1.3" | ||||
|   file: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: file | ||||
|       sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "7.0.0" | ||||
|   fixnum: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: fixnum | ||||
|       sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.1.0" | ||||
|   flutter: | ||||
|     dependency: "direct main" | ||||
|     description: flutter | ||||
|     source: sdk | ||||
|     version: "0.0.0" | ||||
|   flutter_cache_manager: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: flutter_cache_manager | ||||
|       sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.4.1" | ||||
|   flutter_lints: | ||||
|     dependency: "direct dev" | ||||
|     description: | ||||
| @@ -80,6 +152,22 @@ packages: | ||||
|     description: flutter | ||||
|     source: sdk | ||||
|     version: "0.0.0" | ||||
|   freezed_annotation: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: freezed_annotation | ||||
|       sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.4.4" | ||||
|   gap: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: gap | ||||
|       sha256: f19387d4e32f849394758b91377f9153a1b41d79513ef7668c088c77dbc6955d | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.0.1" | ||||
|   get: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
| @@ -96,6 +184,54 @@ packages: | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "14.2.7" | ||||
|   google_fonts: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: google_fonts | ||||
|       sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "6.2.1" | ||||
|   html: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: html | ||||
|       sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.15.4" | ||||
|   http: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: http | ||||
|       sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.2.2" | ||||
|   http_parser: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: http_parser | ||||
|       sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "4.0.2" | ||||
|   intl: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: intl | ||||
|       sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.19.0" | ||||
|   json_annotation: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: json_annotation | ||||
|       sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "4.9.0" | ||||
|   leak_tracker: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -160,6 +296,38 @@ packages: | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.15.0" | ||||
|   oauth2: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: oauth2 | ||||
|       sha256: c84470642cbb2bec450ccab2f8520c079cd1ca546a76ffd5c40589e07f4e8bf4 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.0.3" | ||||
|   octo_image: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: octo_image | ||||
|       sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.1.0" | ||||
|   package_info_plus: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: package_info_plus | ||||
|       sha256: a75164ade98cb7d24cfd0a13c6408927c6b217fa60dee5a7ff5c116a58f28918 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "8.0.2" | ||||
|   package_info_plus_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: package_info_plus_platform_interface | ||||
|       sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.0.1" | ||||
|   path: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -168,6 +336,94 @@ packages: | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.9.0" | ||||
|   path_provider: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_provider | ||||
|       sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.1.4" | ||||
|   path_provider_android: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_provider_android | ||||
|       sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.2.10" | ||||
|   path_provider_foundation: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_provider_foundation | ||||
|       sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.4.0" | ||||
|   path_provider_linux: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_provider_linux | ||||
|       sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.2.1" | ||||
|   path_provider_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_provider_platform_interface | ||||
|       sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.1.2" | ||||
|   path_provider_windows: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path_provider_windows | ||||
|       sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.3.0" | ||||
|   petitparser: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: petitparser | ||||
|       sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "6.0.2" | ||||
|   platform: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: platform | ||||
|       sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.1.5" | ||||
|   plugin_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: plugin_platform_interface | ||||
|       sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.1.8" | ||||
|   rxdart: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: rxdart | ||||
|       sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.28.0" | ||||
|   skeletonizer: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: skeletonizer | ||||
|       sha256: "3b202e4fa9c49b017d368fb0e570d4952bcd19972b67b2face071bdd68abbfae" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.4.2" | ||||
|   sky_engine: | ||||
|     dependency: transitive | ||||
|     description: flutter | ||||
| @@ -181,6 +437,38 @@ packages: | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.10.0" | ||||
|   spotify: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: spotify | ||||
|       sha256: "705f09a457a893973451c15f4072670ac4783d67e42c35c080c55a48dee3a01f" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.13.7" | ||||
|   sprintf: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: sprintf | ||||
|       sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "7.0.0" | ||||
|   sqflite: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: sqflite | ||||
|       sha256: a43e5a27235518c03ca238e7b4732cf35eabe863a369ceba6cbefa537a66f16d | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.3.3+1" | ||||
|   sqflite_common: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: sqflite_common | ||||
|       sha256: "7b41b6c3507854a159e24ae90a8e3e9cc01eb26a477c118d6dca065b5f55453e" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.5.4+2" | ||||
|   stack_trace: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -205,6 +493,14 @@ packages: | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.2.0" | ||||
|   synchronized: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: synchronized | ||||
|       sha256: a824e842b8a054f91a728b783c177c1e4731f6b124f9192468457a8913371255 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.2.0" | ||||
|   term_glyph: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -221,6 +517,22 @@ packages: | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.7.2" | ||||
|   typed_data: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: typed_data | ||||
|       sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.3.2" | ||||
|   uuid: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: uuid | ||||
|       sha256: "83d37c7ad7aaf9aa8e275490669535c8080377cfa7a7004c24dfac53afffaa90" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "4.4.2" | ||||
|   vector_math: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -237,6 +549,46 @@ packages: | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "14.2.4" | ||||
|   web: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: web | ||||
|       sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.0.0" | ||||
|   win32: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: win32 | ||||
|       sha256: "68d1e89a91ed61ad9c370f9f8b6effed9ae5e0ede22a270bdfa6daf79fc2290a" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "5.5.4" | ||||
|   xdg_directories: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: xdg_directories | ||||
|       sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.0.4" | ||||
|   xml: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: xml | ||||
|       sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "6.5.0" | ||||
|   youtube_explode_dart: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: youtube_explode_dart | ||||
|       sha256: "26c9671d638f3396a1bfb2666f586988ee7b0ba3469e478b22a4c1a168bcf6ee" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.2.1" | ||||
| sdks: | ||||
|   dart: ">=3.5.0 <4.0.0" | ||||
|   flutter: ">=3.19.0" | ||||
|   flutter: ">=3.22.0" | ||||
|   | ||||
| @@ -37,6 +37,14 @@ dependencies: | ||||
|   cupertino_icons: ^1.0.8 | ||||
|   get: ^4.6.6 | ||||
|   go_router: ^14.2.7 | ||||
|   youtube_explode_dart: ^2.2.1 | ||||
|   spotify: ^0.13.7 | ||||
|   cached_network_image: ^3.4.1 | ||||
|   package_info_plus: ^8.0.2 | ||||
|   skeletonizer: ^1.4.2 | ||||
|   gap: ^3.0.1 | ||||
|   intl: ^0.19.0 | ||||
|   google_fonts: ^6.2.1 | ||||
|  | ||||
| dev_dependencies: | ||||
|   flutter_test: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user