diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..5630304 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,25 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "spotify_downloader", + "request": "launch", + "type": "dart" + }, + { + "name": "spotify_downloader (profile mode)", + "request": "launch", + "type": "dart", + "flutterMode": "profile" + }, + { + "name": "spotify_downloader (release mode)", + "request": "launch", + "type": "dart", + "flutterMode": "release" + } + ] +} \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index e7cc6bd..6e43984 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -31,7 +31,9 @@ - + + @@ -42,5 +44,5 @@ - + \ No newline at end of file diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 9625e10..40865d8 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -7,20 +7,20 @@ CFBundleExecutable App CFBundleIdentifier - io.flutter.flutter.app + com.cdev.spotify_downloader CFBundleInfoDictionaryVersion 6.0 CFBundleName - App + SpotifyDownloader CFBundlePackageType FMWK CFBundleShortVersionString - 1.0 + 1.1 CFBundleSignature ???? CFBundleVersion - 1.0 + 1.1 MinimumOSVersion - 11.0 + 12.1 diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee..ec97fc6 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee..c4855bf 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..67acc87 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,52 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '12.1' + +# 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) + target.build_configurations.each do |config| + config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [ + '$(inherited)', + ## dart: PermissionGroup.notification + 'PERMISSION_NOTIFICATIONS=1' + ] + + end + end +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..3370bdd --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,170 @@ +PODS: + - awesome_notifications (0.8.1): + - Flutter + - IosAwnCore (~> 0.8.0) + - awesome_notifications_core (0.0.1): + - Flutter + - connectivity_plus (0.0.1): + - Flutter + - ReachabilitySwift + - device_info_plus (0.0.1): + - Flutter + - DKImagePickerController/Core (4.3.9): + - DKImagePickerController/ImageDataManager + - DKImagePickerController/Resource + - DKImagePickerController/ImageDataManager (4.3.9) + - DKImagePickerController/PhotoGallery (4.3.9): + - DKImagePickerController/Core + - DKPhotoGallery + - DKImagePickerController/Resource (4.3.9) + - DKPhotoGallery (0.0.19): + - DKPhotoGallery/Core (= 0.0.19) + - DKPhotoGallery/Model (= 0.0.19) + - DKPhotoGallery/Preview (= 0.0.19) + - DKPhotoGallery/Resource (= 0.0.19) + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Core (0.0.19): + - DKPhotoGallery/Model + - DKPhotoGallery/Preview + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Model (0.0.19): + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Preview (0.0.19): + - DKPhotoGallery/Model + - DKPhotoGallery/Resource + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Resource (0.0.19): + - SDWebImage + - SwiftyGif + - ffmpeg-kit-ios-full (6.0) + - ffmpeg_kit_flutter_full (6.0.3): + - ffmpeg_kit_flutter_full/full (= 6.0.3) + - Flutter + - ffmpeg_kit_flutter_full/full (6.0.3): + - ffmpeg-kit-ios-full (= 6.0) + - Flutter + - file_picker (0.0.1): + - DKImagePickerController/PhotoGallery + - Flutter + - Flutter (1.0.0) + - flutter_secure_storage (6.0.0): + - Flutter + - flutter_web_auth_2 (1.1.1): + - Flutter + - FMDB (2.7.12): + - FMDB/standard (= 2.7.12) + - FMDB/Core (2.7.12) + - FMDB/standard (2.7.12): + - FMDB/Core + - IosAwnCore (0.8.0) + - metadata_god (0.0.1) + - package_info_plus (0.4.5): + - Flutter + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - permission_handler_apple (9.1.1): + - Flutter + - ReachabilitySwift (5.2.3) + - SDWebImage (5.19.4): + - SDWebImage/Core (= 5.19.4) + - SDWebImage/Core (5.19.4) + - sqflite (0.0.3): + - Flutter + - FMDB (>= 2.7.5) + - SwiftyGif (5.4.5) + - url_launcher_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - awesome_notifications (from `.symlinks/plugins/awesome_notifications/ios`) + - awesome_notifications_core (from `.symlinks/plugins/awesome_notifications_core/ios`) + - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) + - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) + - ffmpeg_kit_flutter_full (from `.symlinks/plugins/ffmpeg_kit_flutter_full/ios`) + - file_picker (from `.symlinks/plugins/file_picker/ios`) + - Flutter (from `Flutter`) + - flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`) + - flutter_web_auth_2 (from `.symlinks/plugins/flutter_web_auth_2/ios`) + - metadata_god (from `.symlinks/plugins/metadata_god/ios`) + - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) + - sqflite (from `.symlinks/plugins/sqflite/ios`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + +SPEC REPOS: + trunk: + - DKImagePickerController + - DKPhotoGallery + - ffmpeg-kit-ios-full + - FMDB + - IosAwnCore + - ReachabilitySwift + - SDWebImage + - SwiftyGif + +EXTERNAL SOURCES: + awesome_notifications: + :path: ".symlinks/plugins/awesome_notifications/ios" + awesome_notifications_core: + :path: ".symlinks/plugins/awesome_notifications_core/ios" + connectivity_plus: + :path: ".symlinks/plugins/connectivity_plus/ios" + device_info_plus: + :path: ".symlinks/plugins/device_info_plus/ios" + ffmpeg_kit_flutter_full: + :path: ".symlinks/plugins/ffmpeg_kit_flutter_full/ios" + file_picker: + :path: ".symlinks/plugins/file_picker/ios" + Flutter: + :path: Flutter + flutter_secure_storage: + :path: ".symlinks/plugins/flutter_secure_storage/ios" + flutter_web_auth_2: + :path: ".symlinks/plugins/flutter_web_auth_2/ios" + metadata_god: + :path: ".symlinks/plugins/metadata_god/ios" + package_info_plus: + :path: ".symlinks/plugins/package_info_plus/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/darwin" + permission_handler_apple: + :path: ".symlinks/plugins/permission_handler_apple/ios" + sqflite: + :path: ".symlinks/plugins/sqflite/ios" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + +SPEC CHECKSUMS: + awesome_notifications: db394d2e061e4583ba0f738ddea611e3986cc3fb + awesome_notifications_core: d02eed89738fa362d56cbd372850e9adcd2c6bef + connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d + device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d + DKImagePickerController: 946cec48c7873164274ecc4624d19e3da4c1ef3c + DKPhotoGallery: b3834fecb755ee09a593d7c9e389d8b5d6deed60 + ffmpeg-kit-ios-full: 0099a769d22114dde52cdc238397941c32f75d27 + ffmpeg_kit_flutter_full: a2ad4ff5b14b7c040724edc8cd3bc293dd2d6d0f + file_picker: 15fd9539e4eb735dc54bae8c0534a7a9511a03de + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be + flutter_web_auth_2: a1bc00762c408a8f80b72a538cd7ff5b601c3e71 + FMDB: 728731dd336af3936ce00f91d9d8495f5718a0e6 + IosAwnCore: ed1b2b6d84962a758354dbacd9ce525c72ce28a9 + metadata_god: eceae399d0020475069a5cebc35943ce8562b5d7 + package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c + path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 + permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6 + ReachabilitySwift: 7f151ff156cea1481a8411701195ac6a984f4979 + SDWebImage: 066c47b573f408f18caa467d71deace7c0f8280d + sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a + SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 + url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe + +PODFILE CHECKSUM: 0408ca912856f5c3bf2bbf0787ea424d56bdf0ba + +COCOAPODS: 1.15.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index e525f8b..b4032db 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,12 +8,14 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 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 */; }; - 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + CB21622087150A2FA00D37AE /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5ED311D801CE27AADAFA128B /* Pods_RunnerTests.framework */; }; + E89C833A3B812247E594C220 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 59471FCDE392A2A0309D73C1 /* Pods_Runner.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,10 +44,17 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 20C59286EA4762C02DB57A1E /* 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 = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 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 = ""; }; + 4EB9B775D7857652376C1E6A /* 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 = ""; }; + 59471FCDE392A2A0309D73C1 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5ED311D801CE27AADAFA128B /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 8558344DC919A2A0C415CDCF /* 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 = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -53,21 +62,48 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 9C4E5D531FB3ED6BE5231A73 /* 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 = ""; }; + A79BEB4CA35971A6DF43A9AB /* 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 = ""; }; + BAAF9E8CA93412EEA29D2F87 /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 46909502815090D3923AAEB3 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + CB21622087150A2FA00D37AE /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + E89C833A3B812247E594C220 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 69034FF875A06767DDD3CF51 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 59471FCDE392A2A0309D73C1 /* Pods_Runner.framework */, + 5ED311D801CE27AADAFA128B /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -79,14 +115,6 @@ name = Flutter; sourceTree = ""; }; - 331C8082294A63A400263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C807B294A618700263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; 97C146E51CF9000F007C117D = { isa = PBXGroup; children = ( @@ -94,6 +122,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, + FF95FEEADB0FA0338B8FBDEE /* Pods */, + 69034FF875A06767DDD3CF51 /* Frameworks */, ); sourceTree = ""; }; @@ -121,6 +151,20 @@ path = Runner; sourceTree = ""; }; + FF95FEEADB0FA0338B8FBDEE /* Pods */ = { + isa = PBXGroup; + children = ( + A79BEB4CA35971A6DF43A9AB /* Pods-Runner.debug.xcconfig */, + 8558344DC919A2A0C415CDCF /* Pods-Runner.release.xcconfig */, + 4EB9B775D7857652376C1E6A /* Pods-Runner.profile.xcconfig */, + 9C4E5D531FB3ED6BE5231A73 /* Pods-RunnerTests.debug.xcconfig */, + BAAF9E8CA93412EEA29D2F87 /* Pods-RunnerTests.release.xcconfig */, + 20C59286EA4762C02DB57A1E /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -128,9 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( + 8658F95204F4814210808BE7 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, - 331C807E294A63A400263BE5 /* Frameworks */, 331C807F294A63A400263BE5 /* Resources */, + 46909502815090D3923AAEB3 /* Frameworks */, ); buildRules = ( ); @@ -146,12 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 3FA7C55A76915ACAA579E096 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 903762ECFB7D4C8381C74D5B /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -169,7 +216,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C8080294A63A400263BE5 = { @@ -239,10 +286,71 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 3FA7C55A76915ACAA579E096 /* [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; + }; + 8658F95204F4814210808BE7 /* [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; + }; + 903762ECFB7D4C8381C74D5B /* [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; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; - buildActionMask = 2147483647; + buildActionMask = 12; files = ( ); inputPaths = ( @@ -252,7 +360,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -345,7 +453,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -361,13 +469,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 642R69GYA2; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.spotifyDownloader; + PRODUCT_BUNDLE_IDENTIFIER = com.c0dev.spotifyDownloader; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -377,7 +486,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AE0B7B92F70575B8D7E0D07E /* Pods-RunnerTests.debug.xcconfig */; + baseConfigurationReference = 9C4E5D531FB3ED6BE5231A73 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -395,7 +504,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 89B67EB44CE7B6631473024E /* Pods-RunnerTests.release.xcconfig */; + baseConfigurationReference = BAAF9E8CA93412EEA29D2F87 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -411,7 +520,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 640959BDD8F10B91D80A66BE /* Pods-RunnerTests.profile.xcconfig */; + baseConfigurationReference = 20C59286EA4762C02DB57A1E /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -472,7 +581,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -521,7 +630,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -539,13 +648,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 642R69GYA2; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.spotifyDownloader; + PRODUCT_BUNDLE_IDENTIFIER = com.c0dev.spotifyDownloader; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -561,13 +671,14 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 642R69GYA2; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.spotifyDownloader; + PRODUCT_BUNDLE_IDENTIFIER = com.c0dev.spotifyDownloader; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 87131a0..8e3ca5d 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ + + diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d36b1fa..c03b426 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +1,14 @@ { "images" : [ { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" + "filename" : "sd_iconpsd.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } } diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index dc9ada4..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 7353c41..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index 797d452..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index 6ed2d93..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index 4cd7b00..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index fe73094..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100644 index 321773c..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index 797d452..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index 502f463..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index 0ec3034..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index 0ec3034..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index e9f5fea..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index 84ac32a..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100644 index 8953cba..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index 0467bf1..0000000 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/sd_iconpsd.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/sd_iconpsd.png new file mode 100644 index 0000000..a668a2a Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/sd_iconpsd.png differ diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard index f3c2851..7232e3b 100644 --- a/ios/Runner/Base.lproj/Main.storyboard +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -1,8 +1,10 @@ - - + + + - + + @@ -14,13 +16,14 @@ - + - + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 9f28833..d4bede4 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -1,51 +1,67 @@ - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Spotify Downloader - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - spotify_downloader - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - CADisableMinimumFrameDurationOnPhone - - UIApplicationSupportsIndirectInputEvents - - UIStatusBarHidden - - + + CADisableMinimumFrameDurationOnPhone + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Spotify Downloader + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + spotify_downloader + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIBackgroundModes + + processing + fetch + remote-notification + + NSDocumentsFolderUsageDescription + For downloaded tracks saving + UISupportsDocumentBrowser + + UIFileSharingEnabled + + LSSupportsOpeningDocumentsInPlace + + PermissionGroupNotification + For tracks loading notificatins + UIApplicationSupportsIndirectInputEvents + + diff --git a/lib/core/app/colors/colors.dart b/lib/core/app/colors/colors.dart index 2b2c2c4..69c5239 100644 --- a/lib/core/app/colors/colors.dart +++ b/lib/core/app/colors/colors.dart @@ -2,10 +2,10 @@ import 'package:flutter/material.dart'; const backgroundColor = Color.fromARGB(255, 18, 18, 18); const onBackgroundPrimaryColor = Color.fromARGB(255, 255, 255, 255); -const onBackgroundSecondaryColor = Color.fromARGB(255, 188, 188, 188); +const onBackgroundSecondaryColor = Color.fromARGB(255, 153, 153, 153); const onBackgroundThirdRateColor = Color.fromARGB(255, 110, 110, 110); -const surfaceColor = Color.fromARGB(255, 42, 42, 42); +const surfaceColor = Color.fromARGB(255, 36, 36, 36); const onSurfacePrimaryColor = Color.fromARGB(255, 255, 255, 255); const onSurfaceSecondaryColor = Color.fromARGB(255, 153, 153, 153); const onSurfaceSplashColor = Color.fromARGB(60, 153, 153, 153); @@ -18,8 +18,10 @@ const onPrimaryColor = Color.fromARGB(255, 18, 18, 18); const errorPrimaryColor = Color.fromARGB(255, 255, 102, 91); const searchFieldColor = Color.fromARGB(255, 255, 255, 255); -const onSearchFieldColor = Color.fromARGB(255, 99, 99, 99); +const searchFieldHintColor = Color.fromARGB(255, 59, 59, 59); const dialogColor = Color.fromARGB(255, 59, 59, 59); -const tilePlaceholderColor = Color.fromARGB(255, 59, 59, 59); \ No newline at end of file +const tilePlaceholderColor = Color.fromARGB(255, 59, 59, 59); + +const horizontalNavigationBarColor = Color.fromARGB(255, 30, 30, 30); diff --git a/lib/core/app/router/router.dart b/lib/core/app/router/router.dart index 6dbdc23..e4e6d22 100644 --- a/lib/core/app/router/router.dart +++ b/lib/core/app/router/router.dart @@ -1,30 +1,57 @@ import 'package:auto_route/auto_route.dart'; -import 'package:flutter/foundation.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/history_tracks_collectons/entities/history_tracks_collection.dart'; +import 'package:flutter/material.dart'; +import 'package:spotify_downloader/core/app/themes/themes.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/track.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/history_tracks_collections/domain/entities/history_tracks_collection.dart'; import 'package:spotify_downloader/features/presentation/about_app/view/about_app_screen.dart'; import 'package:spotify_downloader/features/presentation/change_source_video/view/change_source_video_screen.dart'; import 'package:spotify_downloader/features/presentation/history/view/history_screen.dart'; import 'package:spotify_downloader/features/presentation/home/view/home_screen.dart'; import 'package:spotify_downloader/features/presentation/main/view/main_screen.dart'; import 'package:spotify_downloader/features/presentation/download_tracks_collection/view/download_tracks_collection_screen.dart'; +import 'package:spotify_downloader/features/presentation/packages_info/view/packages_info_screen.dart'; import 'package:spotify_downloader/features/presentation/settings/view/settings_screen.dart'; -part 'router.gr.dart'; - -@AutoRouterConfig() -class AppRouter extends _$AppRouter { - - @override +part 'router.gr.dart'; + +@AutoRouterConfig() +class AppRouter extends _$AppRouter { + @override List get routes => [ - AutoRoute(page: MainRoute.page, path: '/', children: [ - AutoRoute(page: HomeRoute.page, path: 'home'), - AutoRoute(page: HistoryRoute.page, path: 'history'), - ]), - AutoRoute(page: DownloadTracksCollectionRouteWithHistoryTracksCollection.page), - AutoRoute(page: DownloadTracksCollectionRouteWithUrl.page), - AutoRoute(page: ChangeSourceVideoRoute.page), - AutoRoute(page: SettingsRoute.page), - AutoRoute(page: AboutAppRoute.page) - ]; - } \ No newline at end of file + AutoRoute(page: MainRoute.page, path: '/', children: [ + RedirectRoute(path: '', redirectTo: 'home'), + CustomRoute( + page: HomeRoute.page, + path: 'home', + transitionsBuilder: TransitionsBuildersExtension.fadeInWithBackground), + CustomRoute( + page: HistoryRoute.page, + path: 'history', + transitionsBuilder: TransitionsBuildersExtension.fadeInWithBackground), + CustomRoute( + page: DownloadTracksCollectionRouteWithHistoryTracksCollection.page, + path: 'downloadTracksCollectionFromHistory', + transitionsBuilder: TransitionsBuildersExtension.fadeInWithBackground), + CustomRoute( + page: DownloadTracksCollectionRouteWithUrl.page, + path: 'downloadTracksCollectionFromUrl', + transitionsBuilder: TransitionsBuildersExtension.fadeInWithBackground), + CustomRoute( + page: ChangeSourceVideoRoute.page, + path: 'changeSourceVideo', + transitionsBuilder: TransitionsBuildersExtension.fadeInWithBackground), + CustomRoute( + page: SettingsRoute.page, + path: 'settings', + transitionsBuilder: TransitionsBuildersExtension.fadeInWithBackground), + CustomRoute( + page: AboutAppRoute.page, + path: 'about', + transitionsBuilder: TransitionsBuildersExtension.fadeInWithBackground), + CustomRoute( + page: PackagesInfoRoute.page, + path: 'packages_info', + transitionsBuilder: TransitionsBuildersExtension.fadeInWithBackground) + ]), + ]; +} diff --git a/lib/core/app/router/router.gr.dart b/lib/core/app/router/router.gr.dart index c60f571..f9be667 100644 --- a/lib/core/app/router/router.gr.dart +++ b/lib/core/app/router/router.gr.dart @@ -28,6 +28,7 @@ abstract class _$AppRouter extends RootStackRouter { child: ChangeSourceVideoScreen( key: args.key, track: args.track, + oldYoutubeUrl: args.oldYoutubeUrl, ), ); }, @@ -70,6 +71,12 @@ abstract class _$AppRouter extends RootStackRouter { child: const MainScreen(), ); }, + PackagesInfoRoute.name: (routeData) { + return AutoRoutePage( + routeData: routeData, + child: const PackagesInfoScreen(), + ); + }, SettingsRoute.name: (routeData) { return AutoRoutePage( routeData: routeData, @@ -99,12 +106,14 @@ class ChangeSourceVideoRoute extends PageRouteInfo { ChangeSourceVideoRoute({ Key? key, required Track track, + String? oldYoutubeUrl, List? children, }) : super( ChangeSourceVideoRoute.name, args: ChangeSourceVideoRouteArgs( key: key, track: track, + oldYoutubeUrl: oldYoutubeUrl, ), initialChildren: children, ); @@ -119,15 +128,18 @@ class ChangeSourceVideoRouteArgs { const ChangeSourceVideoRouteArgs({ this.key, required this.track, + this.oldYoutubeUrl, }); final Key? key; final Track track; + final String? oldYoutubeUrl; + @override String toString() { - return 'ChangeSourceVideoRouteArgs{key: $key, track: $track}'; + return 'ChangeSourceVideoRouteArgs{key: $key, track: $track, oldYoutubeUrl: $oldYoutubeUrl}'; } } @@ -255,6 +267,20 @@ class MainRoute extends PageRouteInfo { static const PageInfo page = PageInfo(name); } +/// generated route for +/// [PackagesInfoScreen] +class PackagesInfoRoute extends PageRouteInfo { + const PackagesInfoRoute({List? children}) + : super( + PackagesInfoRoute.name, + initialChildren: children, + ); + + static const String name = 'PackagesInfoRoute'; + + static const PageInfo page = PageInfo(name); +} + /// generated route for /// [SettingsScreen] class SettingsRoute extends PageRouteInfo { diff --git a/lib/core/app/spotify_downloader_app.dart b/lib/core/app/spotify_downloader_app.dart index 60a1e4b..ad3e59e 100644 --- a/lib/core/app/spotify_downloader_app.dart +++ b/lib/core/app/spotify_downloader_app.dart @@ -1,14 +1,17 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:package_info_plus/package_info_plus.dart'; import 'package:spotify_downloader/core/app/router/router.dart'; import 'package:spotify_downloader/core/app/themes/themes.dart'; +import 'package:spotify_downloader/core/package_info/package_info_accessor.dart'; import 'package:spotify_downloader/generated/l10n.dart'; class SpotifyDownloaderApp extends StatefulWidget { - const SpotifyDownloaderApp({super.key, required this.locale}); + const SpotifyDownloaderApp({super.key, this.locale, required this.packageInfo}); - final String locale; + final String? locale; + final PackageInfo packageInfo; static void setLanguage(BuildContext context, String newLanguage) async { final state = context.findAncestorStateOfType<_SpotifyDownloaderAppState>(); @@ -25,8 +28,12 @@ class _SpotifyDownloaderAppState extends State { @override void initState() { - _language = widget.locale; super.initState(); + + if (widget.locale != null) { + _language = widget.locale!; + } + initTheme(); } @override @@ -42,6 +49,11 @@ class _SpotifyDownloaderAppState extends State { supportedLocales: S.delegate.supportedLocales, routerConfig: _appRouter.config(navigatorObservers: () => [AutoRouteObserver()]), theme: mainTheme, + builder: (context, child) { + return ScrollConfiguration( + behavior: const ClampingScrollPhysicsBehavior().copyWith(overscroll: false), + child: PackageInfoAccessor(packageInfo: widget.packageInfo, child: child!)); + }, ); } diff --git a/lib/core/app/themes/text_themes.dart b/lib/core/app/themes/text_themes.dart index fe06b84..e1d528c 100644 --- a/lib/core/app/themes/text_themes.dart +++ b/lib/core/app/themes/text_themes.dart @@ -55,3 +55,10 @@ const _labelMedium = TextStyle( color: onBackgroundPrimaryColor, fontSize: 12, overflow: TextOverflow.ellipsis); + +const _labelSmall = TextStyle( + fontFamily: 'OpenSans', + fontWeight: FontWeight.w400, + color: onBackgroundPrimaryColor, + fontSize: 10, + overflow: TextOverflow.ellipsis); diff --git a/lib/core/app/themes/theme_consts.dart b/lib/core/app/themes/theme_consts.dart index c9dca85..ea09ffc 100644 --- a/lib/core/app/themes/theme_consts.dart +++ b/lib/core/app/themes/theme_consts.dart @@ -1 +1,7 @@ -const double bottomNavigationBarHeight = 50; \ No newline at end of file +import 'package:flutter/material.dart'; + +const backIconSize = 25.0; +const horizontalPadding = 15.0; +const appBarHeight = 55.0; +const screenWithCustomAppBarPadding = EdgeInsets.only(left: horizontalPadding, right: horizontalPadding, top: 10); +const tappingAnimationDuration = Duration(milliseconds: 50); \ No newline at end of file diff --git a/lib/core/app/themes/themes.dart b/lib/core/app/themes/themes.dart index a31da12..b5a92fd 100644 --- a/lib/core/app/themes/themes.dart +++ b/lib/core/app/themes/themes.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:spotify_downloader/core/app/colors/colors.dart'; part 'text_themes.dart'; @@ -7,33 +8,35 @@ final mainTheme = ThemeData( cardTheme: const CardTheme(color: surfaceColor), scrollbarTheme: ScrollbarThemeData( interactive: true, - thumbVisibility: const MaterialStatePropertyAll(true), + thumbVisibility: const WidgetStatePropertyAll(true), radius: const Radius.circular(10), crossAxisMargin: 5, - thumbColor: MaterialStateProperty.resolveWith((states) { - if (states.contains(MaterialState.dragged)) { + mainAxisMargin: 5, + thumbColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.dragged)) { return primaryColor; } else { return onBackgroundSecondaryColor; } })), + progressIndicatorTheme: const ProgressIndicatorThemeData(color: primaryColor), switchTheme: SwitchThemeData( - trackColor: MaterialStateProperty.resolveWith((states) { - if (!states.contains(MaterialState.selected)) { + trackColor: WidgetStateProperty.resolveWith((states) { + if (!states.contains(WidgetState.selected)) { return onBackgroundSecondaryColor; } else { return null; } }), - thumbColor: MaterialStateProperty.resolveWith((states) { - if (!states.contains(MaterialState.selected)) { + thumbColor: WidgetStateProperty.resolveWith((states) { + if (!states.contains(WidgetState.selected)) { return onBackgroundThirdRateColor; } else { return null; } }), - trackOutlineColor: MaterialStateProperty.resolveWith((states) { - if (!states.contains(MaterialState.selected)) { + trackOutlineColor: WidgetStateProperty.resolveWith((states) { + if (!states.contains(WidgetState.selected)) { return onBackgroundThirdRateColor; } else { return Colors.transparent; @@ -58,9 +61,9 @@ final mainTheme = ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: primaryColor), elevatedButtonTheme: const ElevatedButtonThemeData( style: ButtonStyle( - backgroundColor: MaterialStatePropertyAll(primaryColor), - textStyle: MaterialStatePropertyAll(TextStyle()), - foregroundColor: MaterialStatePropertyAll(onPrimaryColor))), + backgroundColor: WidgetStatePropertyAll(primaryColor), + textStyle: WidgetStatePropertyAll(TextStyle()), + foregroundColor: WidgetStatePropertyAll(onPrimaryColor))), textTheme: const TextTheme( titleLarge: _titleLarge, titleMedium: _titleMedium, @@ -69,13 +72,23 @@ final mainTheme = ThemeData( bodyMedium: _bodyMedium, bodySmall: _bodySmall, labelLarge: _labelLarge, - labelMedium: _labelMedium), + labelMedium: _labelMedium, + labelSmall: _labelSmall), textSelectionTheme: const TextSelectionThemeData( cursorColor: primaryColor, selectionHandleColor: primaryColor, ), ); +void initTheme() { + SystemChrome.setSystemUIOverlayStyle( + SystemUiOverlayStyle.light.copyWith( + statusBarColor: Colors.transparent, + systemNavigationBarColor: Colors.transparent, + ), + ); +} + void showBigTextSnackBar(String message, BuildContext context, [Duration duration = const Duration(seconds: 2)]) { ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Column( @@ -106,3 +119,29 @@ void showSmallTextSnackBar(String message, BuildContext context, [Duration durat duration: duration, )); } + +class TransitionsBuildersExtension { + static const fadeInWithBackground = _fadeInWithBackground; + + static Widget _fadeInWithBackground( + BuildContext context, Animation animation, Animation secondaryAnimation, Widget child) { + if (animation.status == AnimationStatus.reverse) { + return FadeTransition( + opacity: animation, child: Container(constraints: const BoxConstraints.expand(), color: backgroundColor)); + } else { + return Container( + constraints: const BoxConstraints.expand(), + color: backgroundColor, + child: FadeTransition(opacity: animation, child: child), + ); + } + } +} + +class ClampingScrollPhysicsBehavior extends ScrollBehavior { + const ClampingScrollPhysicsBehavior(); + @override + ScrollPhysics getScrollPhysics(BuildContext context) { + return const ClampingScrollPhysics(); + } +} diff --git a/lib/core/db/local_db_impl.dart b/lib/core/db/local_db_impl.dart index ffca4c9..cbc2e39 100644 --- a/lib/core/db/local_db_impl.dart +++ b/lib/core/db/local_db_impl.dart @@ -10,7 +10,7 @@ class LocalDbImpl extends LocalDb { @override Future cleanDb() async { - final localDirectoryPath = (await getApplicationDocumentsDirectory()).path; + final localDirectoryPath = (await getApplicationSupportDirectory()).path; final absoluteDbPath = '$localDirectoryPath$dbPath'; final dbFile = File(absoluteDbPath); @@ -24,7 +24,7 @@ class LocalDbImpl extends LocalDb { @override Future initDb() async { - final localDirectoryPath = (await getApplicationDocumentsDirectory()).path; + final localDirectoryPath = (await getApplicationSupportDirectory()).path; final absoluteDbPath = '$localDirectoryPath$dbPath'; final dbFile = File(absoluteDbPath); diff --git a/lib/core/di/injector.dart b/lib/core/di/injector.dart index ed5a843..ace1fbd 100644 --- a/lib/core/di/injector.dart +++ b/lib/core/di/injector.dart @@ -1,115 +1,62 @@ +import 'package:flutter/services.dart'; import 'package:get_it/get_it.dart'; import 'package:spotify_downloader/core/db/local_db.dart'; import 'package:spotify_downloader/core/db/local_db_impl.dart'; -import 'package:spotify_downloader/core/permissions/permissions_manager.dart'; -import 'package:spotify_downloader/core/permissions/requiring_permission_services_initializer.dart'; -import 'package:spotify_downloader/features/data/auth/local_auth/data_source/local_auth_data_source.dart'; -import 'package:spotify_downloader/features/data/auth/local_auth/repository/local_auth_repository_impl.dart'; -import 'package:spotify_downloader/features/data/auth/network_auth/data_source/network_auth_data_source.dart'; -import 'package:spotify_downloader/features/data/auth/network_auth/repository/network_auth_repository_impl.dart'; -import 'package:spotify_downloader/features/data/settings/data_source/settings_data_source.dart'; -import 'package:spotify_downloader/features/data/settings/repository/settings_repository_impl.dart'; -import 'package:spotify_downloader/features/data/spotify_profile/data_source/spotify_profile_data_source.dart'; -import 'package:spotify_downloader/features/data/spotify_profile/repository/spotify_profile_repository_impl.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/data_sources/local_tracks_data_source.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/repositories/local_tracks_repository_impl.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/history_tracks_collectons/data_source/tracks_collectons_history_data_source.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/history_tracks_collectons/repositories/tracks_collections_history_repository_impl.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/data_sources/dowload_audio_from_youtube_data_source.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/data_sources/tools/audio_metadata_editor/audio_metadata_editor_impl.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/data_sources/tools/file_to_mp3_converter/ffmpeg_file_to_mp3_converter.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/repositories/dowload_tracks_repository_impl.dart'; -import 'package:spotify_downloader/features/data/tracks/network_tracks/data_sources/network_tracks_data_source.dart'; -import 'package:spotify_downloader/features/data/tracks/network_tracks/repositories/network_tracks_repository_impl.dart'; -import 'package:spotify_downloader/features/data/tracks/search_videos_by_track/data_sources/search_video_on_youtube_data_source.dart'; -import 'package:spotify_downloader/features/data/tracks/search_videos_by_track/repositories/search_videos_by_track_repository_impl.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/network_tracks_collections/data_source/network_tracks_collections_data_source.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/network_tracks_collections/repositories/tracks_collections_repository_impl.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/repositories/local_client_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/repositories/local_full_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/repositories/local_user_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/use_cases/clear_user_credentials.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/use_cases/get_client_credentials.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/use_cases/save_client_credentials.dart'; -import 'package:spotify_downloader/features/domain/auth/network_auth/repository/network_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/auth/service/service/auth_service.dart'; -import 'package:spotify_downloader/features/domain/auth/service/service/auth_service_impl.dart'; -import 'package:spotify_downloader/features/domain/auth/service/use_cases/authorize_user.dart'; -import 'package:spotify_downloader/features/domain/settings/repository/download_tracks_settings_repository.dart'; -import 'package:spotify_downloader/features/domain/settings/repository/language_settings_repository.dart'; -import 'package:spotify_downloader/features/domain/settings/use_cases/get_available_languages.dart'; -import 'package:spotify_downloader/features/domain/settings/use_cases/get_download_tracks_settings.dart'; -import 'package:spotify_downloader/features/domain/settings/use_cases/get_language.dart'; -import 'package:spotify_downloader/features/domain/settings/use_cases/save_download_tracks_setting.dart'; -import 'package:spotify_downloader/features/domain/settings/use_cases/save_language.dart'; -import 'package:spotify_downloader/features/domain/spotify_profile/repository/spotify_profile_repostitory.dart'; -import 'package:spotify_downloader/features/domain/spotify_profile/service/spotify_profile_service.dart'; -import 'package:spotify_downloader/features/domain/spotify_profile/service/spotify_profile_service_impl.dart'; -import 'package:spotify_downloader/features/domain/spotify_profile/use_cases/get_spotify_profile.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/repositories/local_tracks_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/repository/observe_tracks_loading_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/repository/observe_tracks_loading_repository_impl.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/use_cases/get_loading_tracks_collections_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/use_cases/find_10_videos_by_track.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/use_cases/get_video_by_url.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/download_tracks_service/download_tracks_service.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/download_tracks_service/download_tracks_service_impl.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/use_cases/download_tracks_from_getting_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/use_cases/download_tracks_range.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/history_tracks_collectons/entities/history_tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/history_tracks_collectons/repositories/tracks_collections_history_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/history_tracks_collectons/use_cases/add_tracks_collection_to_history.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/history_tracks_collectons/use_cases/get_ordered_history.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/repositories/dowload_tracks_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/use_cases/cancel_track_loading.dart'; -import 'package:spotify_downloader/features/domain/tracks/network_tracks/repositories/network_tracks_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/repositories/search_videos_by_track_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/entities/track_with_loading_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/get_tracks_service/get_tracks_service.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/get_tracks_service/get_tracks_service_impl.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/use_cases/download_track.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/use_cases/get_tracks_with_loading_observer_from_tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/use_cases/get_tracks_with_loading_observer_from_tracks_collection_with_offset.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/network_tracks_collections/repositories/network_tracks_collections_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/network_tracks_collections/service/network_tracks_collections_service.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/network_tracks_collections/service/network_tracks_collections_service_impl.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/network_tracks_collections/use_cases/get_tracks_collection_by_type_and_spotify_id.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/network_tracks_collections/use_cases/get_tracks_collection_by_url.dart'; +import 'package:spotify_downloader/core/permissions/permissions.dart'; + +import 'package:spotify_downloader/features/data_domain/auth/local_auth/local_auth.dart'; +import 'package:spotify_downloader/features/data_domain/auth/network_auth/network_auth.dart'; +import 'package:spotify_downloader/features/data_domain/auth/service/service.dart'; +import 'package:spotify_downloader/features/data_domain/settings/settings.dart'; +import 'package:spotify_downloader/features/data_domain/spotify_profile/spotify_profile.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/data/data_sources/tools/audio_metadata_editor/audio_metadata_editor_impl.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/data/data_sources/tools/file_to_mp3_converter/ffmpeg_file_to_mp3_converter.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/download_tracks.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/local_tracks.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/network_tracks/network_tracks.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/observe_tracks_loading/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/search_videos_by_track/search_videos_by_track.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/services.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/track.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/history_tracks_collections/history_tracks_collections.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/network_tracks_collections/network_tracks_collections.dart'; import 'package:spotify_downloader/features/presentation/change_source_video/bloc/change_source_video_bloc.dart'; -import 'package:spotify_downloader/features/presentation/download_tracks_collection/widgets/download_track_info/bloc/download_track_info_bloc.dart'; -import 'package:spotify_downloader/features/presentation/download_tracks_collection/widgets/download_track_info/widgets/download_track_info_status_tile/cubit/download_track_info_status_tile_cubit.dart'; -import 'package:spotify_downloader/features/presentation/download_tracks_collection/widgets/track_tile/bloc/track_tile_bloc.dart'; +import 'package:spotify_downloader/features/presentation/download_tracks_collection/blocs/blocs.dart'; +import 'package:spotify_downloader/features/presentation/download_tracks_collection/widgets/shared/cubits/track_loading_observing_cubit/download_track_info_status_tile_cubit.dart'; import 'package:spotify_downloader/features/presentation/history/bloc/history_bloc.dart'; -import 'package:spotify_downloader/features/presentation/download_tracks_collection/blocs/filter_tracks/filter_tracks_bloc.dart'; -import 'package:spotify_downloader/features/presentation/download_tracks_collection/blocs/get_and_download_tracks/get_and_download_tracks_bloc.dart'; -import 'package:spotify_downloader/features/presentation/download_tracks_collection/blocs/get_tracks_collection/get_tracks_collection_by_history_bloc.dart'; -import 'package:spotify_downloader/features/presentation/download_tracks_collection/blocs/get_tracks_collection/get_tracks_collection_by_url_bloc.dart'; -import 'package:spotify_downloader/features/presentation/home/widgets/loading_tracks_collections_list/bloc/loading_tracks_collections_list_bloc.dart'; +import 'package:spotify_downloader/features/presentation/home/widgets/loading_tracks_collections_list/cubit/loading_tracks_collections_list_cubit.dart'; import 'package:spotify_downloader/features/presentation/home/widgets/loading_tracks_collections_list/widgets/loading_tracks_collection_tile/cubit/loading_tracks_collection_tile_cubit.dart'; import 'package:spotify_downloader/features/presentation/settings/widgets/auth_settings/blocs/account_auth/account_auth_bloc.dart'; import 'package:spotify_downloader/features/presentation/settings/widgets/auth_settings/blocs/client_auth/client_auth_bloc.dart'; import 'package:spotify_downloader/features/presentation/settings/widgets/download_tracks_settings/bloc/download_tracks_settings_bloc.dart'; import 'package:spotify_downloader/features/presentation/settings/widgets/language_setting/bloc/language_setting_bloc.dart'; import 'package:spotify_downloader/features/presentation/tracks_collections_loading_notifications/bloc/tracks_collections_loading_notifications_bloc.dart'; +import 'package:spotify_downloader/features/presentation/tracks_collections_loading_notifications/view/tracks_collections_loading_notifications_sender.dart'; final injector = GetIt.instance; -Future initInjector() async { - await _initCore(); +Future initInjector(TargetPlatform platform) async { + await _initCore(platform); await _provideDataSources(); _provideRepositories(); _provideUseCases(); _provideBlocs(); + _providePresentation(); + await _initLateCore(); } -Future _initCore() async { +Future _initLateCore() async { + await injector.get().init(); +} + +Future _initCore(TargetPlatform platform) async { injector.registerSingleton(LocalDbImpl()); await injector.get().initDb(); - injector.registerSingleton(PermissionsManager()); - injector.registerSingleton( - RequiringPermissionServicesInitializer(permissionsManager: injector.get())); + + injector.registerSingleton(PermissionsAbstractFactory.create(platform)); + injector.registerSingleton(injector.get().getPermissionsManager()); + injector.registerSingleton( + injector.get().getPermissionServicesInitializer()); } Future _provideDataSources() async { @@ -238,8 +185,8 @@ void _provideUseCases() { } void _provideBlocs() { - injector.registerFactory( - () => LoadingTracksCollectionsListBloc(injector.get())); + injector.registerFactory( + () => LoadingTracksCollectionsListCubit(injector.get())); injector.registerFactoryParam( (loadingTracksCollection, _) => LoadingTracksCollectionTileCubit(loadingTracksCollection)); @@ -254,23 +201,18 @@ void _provideBlocs() { addTracksCollectionToHistory: injector.get(), getTracksCollection: injector.get(), historyTracksCollection: historyCollection)); - injector.registerFactory(() => GetAndDownloadTracksBloc( - downloadTracksRange: injector.get(), - downloadTracksFromGettingObserver: injector.get(), + injector.registerFactory(() => GetTracksBloc( getTracksFromTracksCollection: injector.get(), getTracksWithOffset: injector.get())); + + injector.registerFactory(() => DownloadTracksCubit( + downloadTracksRange: injector.get(), + downloadTracksFromGettingObserver: injector.get(), + downloadTrack: injector.get(), + cancelTrackLoading: injector.get())); injector.registerFactory(() => FilterTracksBloc()); - injector.registerFactoryParam((trackwithLoadingObserver, _) => - TrackTileBloc( - trackWithLoadingObserver: trackwithLoadingObserver, - downloadTrack: injector.get(), - cancelTrackLoading: injector.get())); - injector.registerFactoryParam((trackwithLoadingObserver, _) => - DownloadTrackInfoBloc( - trackWithLoadingObserver: trackwithLoadingObserver, cancelTrackLoading: injector.get())); - injector.registerFactoryParam( - (trackwithLoadingObserver, _) => DownloadTrackInfoStatusTileCubit(trackwithLoadingObserver)); + injector.registerFactory(() => TrackLoadingObservingCubit()); injector.registerFactoryParam((track, _) => ChangeSourceVideoBloc( sourceTrack: track, find10VideosByTrack: injector.get(), @@ -296,3 +238,8 @@ void _provideBlocs() { saveLanguage: injector.get(), getAvailableLanguages: injector.get())); } + +void _providePresentation() { + injector + .registerSingleton(TracksCollectionsLoadingNotificationsSender()); +} diff --git a/lib/core/notifications/notifications.dart b/lib/core/notifications/notifications.dart index 957eaed..11b547a 100644 --- a/lib/core/notifications/notifications.dart +++ b/lib/core/notifications/notifications.dart @@ -2,24 +2,21 @@ import 'package:awesome_notifications/awesome_notifications.dart'; import 'package:spotify_downloader/core/app/colors/colors.dart'; const String mainChannelKey = 'main_channel'; +const String mainChannelGroupKey = 'main_channel_group'; -Future initAwesomeNotifications() async { - await AwesomeNotifications().initialize( +Future initAwesomeNotifications() async { + return await AwesomeNotifications().initialize( 'resource://drawable/notifications_icon', [ NotificationChannel( - channelGroupKey: 'main_channel_group', - channelKey: 'main_channel', - channelName: 'Main notifications', - channelDescription: ']', + channelGroupKey: mainChannelGroupKey, + channelKey: mainChannelKey, + channelName: 'Main Notifications', + channelDescription: 'Main Notifications of Spotify Downloader', defaultColor: primaryColor) ], - channelGroups: [NotificationChannelGroup(channelGroupKey: 'main_channel_group', channelGroupName: 'Main group')], + channelGroups: [ + NotificationChannelGroup(channelGroupKey: mainChannelGroupKey, channelGroupName: 'Main Notifications Group') + ], debug: true); - - AwesomeNotifications().isNotificationAllowed().then((isAllowed) { - if (!isAllowed) { - AwesomeNotifications().requestPermissionToSendNotifications(); - } - }); } diff --git a/lib/core/package_info/package_info_accessor.dart b/lib/core/package_info/package_info_accessor.dart new file mode 100644 index 0000000..d95a1f7 --- /dev/null +++ b/lib/core/package_info/package_info_accessor.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import 'package:package_info_plus/package_info_plus.dart'; + +class PackageInfoAccessor extends InheritedWidget { + const PackageInfoAccessor({super.key, required super.child, required this.packageInfo}); + + final PackageInfo packageInfo; + + static PackageInfoAccessor? maybeOf(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType(); + } + + @override + bool updateShouldNotify(PackageInfoAccessor oldWidget) { + return oldWidget.packageInfo != packageInfo; + } +} diff --git a/lib/core/permissions/requiring_permission_services_initializer.dart b/lib/core/permissions/permission_services_initializer/android_permission_services_initializer.dart similarity index 58% rename from lib/core/permissions/requiring_permission_services_initializer.dart rename to lib/core/permissions/permission_services_initializer/android_permission_services_initializer.dart index 7c2de1f..77aa530 100644 --- a/lib/core/permissions/requiring_permission_services_initializer.dart +++ b/lib/core/permissions/permission_services_initializer/android_permission_services_initializer.dart @@ -1,23 +1,26 @@ import 'package:flutter_background/flutter_background.dart'; import 'package:spotify_downloader/core/background/background.dart'; +import 'package:spotify_downloader/core/di/injector.dart'; import 'package:spotify_downloader/core/notifications/notifications.dart'; -import 'package:spotify_downloader/core/permissions/permissions_manager.dart'; +import 'package:spotify_downloader/core/permissions/permission_services_initializer/permission_services_initializer_class.dart'; +import 'package:spotify_downloader/core/permissions/permissions_manager/android_permissions_manager.dart'; import 'package:spotify_downloader/features/presentation/tracks_collections_loading_notifications/view/tracks_collections_loading_notifications_sender.dart'; -class RequiringPermissionServicesInitializer { - RequiringPermissionServicesInitializer({required this.permissionsManager}); +class AndroidPermissionServicesInitializer extends PermissionServicesInitializer { + AndroidPermissionServicesInitializer({required this.permissionsManager}); - final PermissionsManager permissionsManager; + AndroidPermissionsManager permissionsManager; bool _isNotificationsInitialized = false; bool _isBackgroundInitialized = false; - Future initialize() async { + @override + Future init() async { if (!_isNotificationsInitialized && await permissionsManager.isNotificationsPermissionGranted()) { _isNotificationsInitialized = true; await initAwesomeNotifications(); - await TracksCollectionsLoadingNotificationsSender().startSendNotifications(); + await injector.get().startSendNotifications(); } if (!_isBackgroundInitialized && await FlutterBackground.hasPermissions) { @@ -26,5 +29,7 @@ class RequiringPermissionServicesInitializer { await initBackground(); await FlutterBackground.enableBackgroundExecution(); } + + return _isNotificationsInitialized && _isBackgroundInitialized; } } diff --git a/lib/core/permissions/permission_services_initializer/ios_permission_services_initializer.dart b/lib/core/permissions/permission_services_initializer/ios_permission_services_initializer.dart new file mode 100644 index 0000000..86b8609 --- /dev/null +++ b/lib/core/permissions/permission_services_initializer/ios_permission_services_initializer.dart @@ -0,0 +1,25 @@ +import 'package:spotify_downloader/core/di/injector.dart'; +import 'package:spotify_downloader/core/notifications/notifications.dart'; +import 'package:spotify_downloader/core/permissions/permission_services_initializer/permission_services_initializer_class.dart'; +import 'package:spotify_downloader/core/permissions/permissions_manager/ios_permissions_manager.dart'; +import 'package:spotify_downloader/features/presentation/tracks_collections_loading_notifications/view/tracks_collections_loading_notifications_sender.dart'; + +class IOSPermissionServicesInitializer extends PermissionServicesInitializer { + IOSPermissionServicesInitializer({required this.permissionsManager}); + + IOSPermissionsManager permissionsManager; + + bool _isNotificationsInitialized = false; + + @override + Future init() async { + if (!_isNotificationsInitialized && await permissionsManager.isNotificationsPermissionGranted()) { + _isNotificationsInitialized = true; + + await initAwesomeNotifications(); + await injector.get().startSendNotifications(); + } + + return _isNotificationsInitialized; + } +} diff --git a/lib/core/permissions/permission_services_initializer/mock_permission_services_initializer.dart b/lib/core/permissions/permission_services_initializer/mock_permission_services_initializer.dart new file mode 100644 index 0000000..34fe363 --- /dev/null +++ b/lib/core/permissions/permission_services_initializer/mock_permission_services_initializer.dart @@ -0,0 +1,8 @@ +import 'package:spotify_downloader/core/permissions/permission_services_initializer/permission_services_initializer_class.dart'; + +class MockPermissionServicesInitializer extends PermissionServicesInitializer { + @override + Future init() async { + return false; + } +} diff --git a/lib/core/permissions/permission_services_initializer/permission_services_initializer.dart b/lib/core/permissions/permission_services_initializer/permission_services_initializer.dart new file mode 100644 index 0000000..db22223 --- /dev/null +++ b/lib/core/permissions/permission_services_initializer/permission_services_initializer.dart @@ -0,0 +1,4 @@ +export 'android_permission_services_initializer.dart'; +export 'ios_permission_services_initializer.dart'; +export 'mock_permission_services_initializer.dart'; +export 'permission_services_initializer_class.dart'; diff --git a/lib/core/permissions/permission_services_initializer/permission_services_initializer_class.dart b/lib/core/permissions/permission_services_initializer/permission_services_initializer_class.dart new file mode 100644 index 0000000..d143d85 --- /dev/null +++ b/lib/core/permissions/permission_services_initializer/permission_services_initializer_class.dart @@ -0,0 +1,4 @@ + +abstract class PermissionServicesInitializer { + Future init(); +} diff --git a/lib/core/permissions/permissions.dart b/lib/core/permissions/permissions.dart new file mode 100644 index 0000000..0b9ea6d --- /dev/null +++ b/lib/core/permissions/permissions.dart @@ -0,0 +1,3 @@ +export 'permission_services_initializer/permission_services_initializer.dart'; +export 'permissions_factory/permissions_factory.dart'; +export 'permissions_manager/permissions_manager.dart'; diff --git a/lib/core/permissions/permissions_factory/android_permissions_factory.dart b/lib/core/permissions/permissions_factory/android_permissions_factory.dart new file mode 100644 index 0000000..60ba6bc --- /dev/null +++ b/lib/core/permissions/permissions_factory/android_permissions_factory.dart @@ -0,0 +1,14 @@ +import 'package:spotify_downloader/core/permissions/permissions.dart'; + + +class AndroidPermissionsFactory extends PermissionsAbstractFactory { + @override + AndroidPermissionServicesInitializer getPermissionServicesInitializer() { + return AndroidPermissionServicesInitializer(permissionsManager: getPermissionsManager()); + } + + @override + AndroidPermissionsManager getPermissionsManager() { + return AndroidPermissionsManager(); + } +} diff --git a/lib/core/permissions/permissions_factory/ios_permissions_factory.dart b/lib/core/permissions/permissions_factory/ios_permissions_factory.dart new file mode 100644 index 0000000..d0834ee --- /dev/null +++ b/lib/core/permissions/permissions_factory/ios_permissions_factory.dart @@ -0,0 +1,14 @@ +import 'package:spotify_downloader/core/permissions/permissions.dart'; + + +class IOSPermissionsFactory extends PermissionsAbstractFactory { + @override + IOSPermissionServicesInitializer getPermissionServicesInitializer() { + return IOSPermissionServicesInitializer(permissionsManager: getPermissionsManager()); + } + + @override + IOSPermissionsManager getPermissionsManager() { + return IOSPermissionsManager(); + } +} diff --git a/lib/core/permissions/permissions_factory/mock_permissions_factory.dart b/lib/core/permissions/permissions_factory/mock_permissions_factory.dart new file mode 100644 index 0000000..8314177 --- /dev/null +++ b/lib/core/permissions/permissions_factory/mock_permissions_factory.dart @@ -0,0 +1,15 @@ + + +import 'package:spotify_downloader/core/permissions/permissions.dart'; + +class MockPermissionsFactory extends PermissionsAbstractFactory { + @override + MockPermissionServicesInitializer getPermissionServicesInitializer() { + return MockPermissionServicesInitializer(); + } + + @override + MockPermissionsManager getPermissionsManager() { + return MockPermissionsManager(); + } +} diff --git a/lib/core/permissions/permissions_factory/permissions_abstract_factory_class.dart b/lib/core/permissions/permissions_factory/permissions_abstract_factory_class.dart new file mode 100644 index 0000000..f9c6168 --- /dev/null +++ b/lib/core/permissions/permissions_factory/permissions_abstract_factory_class.dart @@ -0,0 +1,23 @@ + + +import 'package:flutter/foundation.dart'; +import 'package:spotify_downloader/core/permissions/permissions.dart'; + +abstract class PermissionsAbstractFactory { + PermissionsAbstractFactory(); + + factory PermissionsAbstractFactory.create(TargetPlatform platform) { + switch (platform) { + case TargetPlatform.android: + return AndroidPermissionsFactory(); + case TargetPlatform.iOS: + return IOSPermissionsFactory(); + default: + return MockPermissionsFactory(); + } + } + + PermissionServicesInitializer getPermissionServicesInitializer(); + + PermissionsManager getPermissionsManager(); +} diff --git a/lib/core/permissions/permissions_factory/permissions_factory.dart b/lib/core/permissions/permissions_factory/permissions_factory.dart new file mode 100644 index 0000000..1c44a5d --- /dev/null +++ b/lib/core/permissions/permissions_factory/permissions_factory.dart @@ -0,0 +1,4 @@ +export 'android_permissions_factory.dart'; +export 'ios_permissions_factory.dart'; +export 'mock_permissions_factory.dart'; +export 'permissions_abstract_factory_class.dart'; diff --git a/lib/core/permissions/permissions_manager.dart b/lib/core/permissions/permissions_manager/android_permissions_manager.dart similarity index 90% rename from lib/core/permissions/permissions_manager.dart rename to lib/core/permissions/permissions_manager/android_permissions_manager.dart index 7ca78a7..080b0d2 100644 --- a/lib/core/permissions/permissions_manager.dart +++ b/lib/core/permissions/permissions_manager/android_permissions_manager.dart @@ -1,7 +1,9 @@ import 'package:device_info_plus/device_info_plus.dart'; import 'package:permission_handler/permission_handler.dart'; +import 'package:spotify_downloader/core/permissions/permissions_manager/permissions_manager_class.dart'; -class PermissionsManager { +class AndroidPermissionsManager extends PermissionsManager { + @override Future requestPermissions() async { final androidVersion = await _getAndroidVersion(); late final List permissions; @@ -22,6 +24,7 @@ class PermissionsManager { return Permission.notification.isGranted; } + @override Future isPermissionsGranted() async { final androidVersion = await _getAndroidVersion(); late final List permissions; diff --git a/lib/core/permissions/permissions_manager/ios_permissions_manager.dart b/lib/core/permissions/permissions_manager/ios_permissions_manager.dart new file mode 100644 index 0000000..50fdedf --- /dev/null +++ b/lib/core/permissions/permissions_manager/ios_permissions_manager.dart @@ -0,0 +1,35 @@ +import 'package:permission_handler/permission_handler.dart'; +import 'package:spotify_downloader/core/permissions/permissions_manager/permissions_manager_class.dart'; + +class IOSPermissionsManager extends PermissionsManager { + @override + Future requestPermissions() async { + final permissions = _getPermissionsForIOS(); + for (var permission in permissions) { + await permission.request(); + } + + return await isPermissionsGranted(); + } + + @override + Future isPermissionsGranted() async { + final permissions = _getPermissionsForIOS(); + + for (var permission in permissions) { + if (!(await permission.isGranted)) { + return false; + } + } + + return true; + } + + Future isNotificationsPermissionGranted() { + return Permission.notification.isGranted; + } + + List _getPermissionsForIOS() { + return [Permission.storage, Permission.notification]; + } +} diff --git a/lib/core/permissions/permissions_manager/mock_permissions_manager.dart b/lib/core/permissions/permissions_manager/mock_permissions_manager.dart new file mode 100644 index 0000000..0809f00 --- /dev/null +++ b/lib/core/permissions/permissions_manager/mock_permissions_manager.dart @@ -0,0 +1,14 @@ +import 'package:spotify_downloader/core/permissions/permissions_manager/permissions_manager_class.dart'; + +class MockPermissionsManager extends PermissionsManager { + + @override + Future isPermissionsGranted() async { + return false; + } + + @override + Future requestPermissions() async { + return false; + } +} diff --git a/lib/core/permissions/permissions_manager/permissions_manager.dart b/lib/core/permissions/permissions_manager/permissions_manager.dart new file mode 100644 index 0000000..95ea904 --- /dev/null +++ b/lib/core/permissions/permissions_manager/permissions_manager.dart @@ -0,0 +1,4 @@ +export 'android_permissions_manager.dart'; +export 'ios_permissions_manager.dart'; +export 'mock_permissions_manager.dart'; +export 'permissions_manager_class.dart'; diff --git a/lib/core/permissions/permissions_manager/permissions_manager_class.dart b/lib/core/permissions/permissions_manager/permissions_manager_class.dart new file mode 100644 index 0000000..a1369d5 --- /dev/null +++ b/lib/core/permissions/permissions_manager/permissions_manager_class.dart @@ -0,0 +1,6 @@ +abstract class PermissionsManager { + + Future requestPermissions(); + + Future isPermissionsGranted(); +} diff --git a/lib/core/util/cancellation_token/cancellation_token_source.dart b/lib/core/util/cancellation_token/cancellation_token_source.dart deleted file mode 100644 index d7a6353..0000000 --- a/lib/core/util/cancellation_token/cancellation_token_source.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'cancellation_token.dart'; - -class CancellationTokenSource { - bool _isCancelled = false; - bool get isCancelled => _isCancelled; - CancellationToken get token => CancellationToken(source: this); - - void cancel() { - _isCancelled = true; - } -} diff --git a/lib/core/util/converters/converter_with_parameter.dart b/lib/core/util/converters/converter_with_parameter.dart deleted file mode 100644 index 066aa55..0000000 --- a/lib/core/util/converters/converter_with_parameter.dart +++ /dev/null @@ -1,5 +0,0 @@ -import 'package:spotify_downloader/core/util/converters/base_value_converter.dart/base_value_converter.dart'; - -abstract class ConverterWithParameter extends BaseValueConverter { - -} \ No newline at end of file diff --git a/lib/core/util/converters/result_converters/result_value_converter.dart b/lib/core/util/converters/result_converters/result_value_converter.dart deleted file mode 100644 index a76f01b..0000000 --- a/lib/core/util/converters/result_converters/result_value_converter.dart +++ /dev/null @@ -1,6 +0,0 @@ -import 'package:spotify_downloader/core/util/converters/base_value_converter.dart/base_value_converter.dart'; -import 'package:spotify_downloader/core/util/failures/failures.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; - -abstract class ResultValueConverter - implements BaseValueConverter, T2, Result, T1> {} diff --git a/lib/core/util/converters/simple_converters/async_value_converter.dart b/lib/core/util/converters/simple_converters/async_value_converter.dart deleted file mode 100644 index 5087f5d..0000000 --- a/lib/core/util/converters/simple_converters/async_value_converter.dart +++ /dev/null @@ -1,3 +0,0 @@ -import 'package:spotify_downloader/core/util/converters/base_value_converter.dart/base_value_converter.dart'; - -abstract class AsyncValueConverter implements BaseValueConverter, T2, Future, T1> {} diff --git a/lib/core/util/converters/simple_converters/value_converter.dart b/lib/core/util/converters/simple_converters/value_converter.dart deleted file mode 100644 index 04b1d48..0000000 --- a/lib/core/util/converters/simple_converters/value_converter.dart +++ /dev/null @@ -1,3 +0,0 @@ -import 'package:spotify_downloader/core/util/converters/base_value_converter.dart/base_value_converter.dart'; - -abstract class ValueConverter implements BaseValueConverter { } \ No newline at end of file diff --git a/lib/core/utils/cancellation_token/cancellation_token.dart b/lib/core/utils/cancellation_token/cancellation_token.dart new file mode 100644 index 0000000..0c3729f --- /dev/null +++ b/lib/core/utils/cancellation_token/cancellation_token.dart @@ -0,0 +1,2 @@ +export 'cancellation_token_class.dart'; +export 'cancellation_token_source.dart'; diff --git a/lib/core/util/cancellation_token/cancellation_token.dart b/lib/core/utils/cancellation_token/cancellation_token_class.dart similarity index 66% rename from lib/core/util/cancellation_token/cancellation_token.dart rename to lib/core/utils/cancellation_token/cancellation_token_class.dart index 3c4a8f0..e892e28 100644 --- a/lib/core/util/cancellation_token/cancellation_token.dart +++ b/lib/core/utils/cancellation_token/cancellation_token_class.dart @@ -1,10 +1,11 @@ -import 'package:spotify_downloader/core/util/cancellation_token/cancellation_token_source.dart'; +import 'package:spotify_downloader/core/utils/cancellation_token/cancellation_token_source.dart'; class CancellationToken { CancellationToken({required this.source}); CancellationTokenSource source; bool get isCancelled => source.isCancelled; + Stream get cancelationStream => source.cancellationStream; @override int get hashCode => source.hashCode; diff --git a/lib/core/utils/cancellation_token/cancellation_token_source.dart b/lib/core/utils/cancellation_token/cancellation_token_source.dart new file mode 100644 index 0000000..fa7f609 --- /dev/null +++ b/lib/core/utils/cancellation_token/cancellation_token_source.dart @@ -0,0 +1,25 @@ +import 'dart:async'; + +import 'package:spotify_downloader/core/utils/cancellation_token/cancellation_token_class.dart'; + +class CancellationTokenSource { + final StreamController _cancellationStreamController = StreamController(); + late final Stream _cancellationStream; + Stream get cancellationStream => _cancellationStream; + + bool _isCancelled = false; + bool get isCancelled => _isCancelled; + + CancellationToken get token => CancellationToken(source: this); + + CancellationTokenSource() { + _cancellationStream = _cancellationStreamController.stream.asBroadcastStream(); + } + + void cancel() { + if (!_isCancelled) { + _cancellationStreamController.add(null); + } + _isCancelled = true; + } +} diff --git a/lib/core/utils/converters/abstract/abstract.dart b/lib/core/utils/converters/abstract/abstract.dart new file mode 100644 index 0000000..083c5a9 --- /dev/null +++ b/lib/core/utils/converters/abstract/abstract.dart @@ -0,0 +1 @@ +export 'converter_with_parameter.dart'; diff --git a/lib/core/util/converters/abstract/converter_with_parameter.dart b/lib/core/utils/converters/abstract/converter_with_parameter.dart similarity index 50% rename from lib/core/util/converters/abstract/converter_with_parameter.dart rename to lib/core/utils/converters/abstract/converter_with_parameter.dart index 066aa55..a48772e 100644 --- a/lib/core/util/converters/abstract/converter_with_parameter.dart +++ b/lib/core/utils/converters/abstract/converter_with_parameter.dart @@ -1,4 +1,4 @@ -import 'package:spotify_downloader/core/util/converters/base_value_converter.dart/base_value_converter.dart'; +import 'package:spotify_downloader/core/utils/converters/base_value_converter.dart/base_value_converter.dart'; abstract class ConverterWithParameter extends BaseValueConverter { diff --git a/lib/core/util/converters/base_value_converter.dart/base_value_converter.dart b/lib/core/utils/converters/base_value_converter.dart/base_value_converter.dart similarity index 100% rename from lib/core/util/converters/base_value_converter.dart/base_value_converter.dart rename to lib/core/utils/converters/base_value_converter.dart/base_value_converter.dart diff --git a/lib/core/utils/converters/base_value_converter.dart/base_value_converter.dart.dart b/lib/core/utils/converters/base_value_converter.dart/base_value_converter.dart.dart new file mode 100644 index 0000000..42769a9 --- /dev/null +++ b/lib/core/utils/converters/base_value_converter.dart/base_value_converter.dart.dart @@ -0,0 +1 @@ +export 'base_value_converter.dart'; diff --git a/lib/core/utils/converters/converters.dart b/lib/core/utils/converters/converters.dart new file mode 100644 index 0000000..8cc452d --- /dev/null +++ b/lib/core/utils/converters/converters.dart @@ -0,0 +1,4 @@ +export 'abstract/abstract.dart'; +export 'base_value_converter.dart/base_value_converter.dart.dart'; +export 'result_converters/result_converters.dart'; +export 'simple_converters/simple_converters.dart'; diff --git a/lib/core/utils/converters/result_converters/result_converters.dart b/lib/core/utils/converters/result_converters/result_converters.dart new file mode 100644 index 0000000..682dcd6 --- /dev/null +++ b/lib/core/utils/converters/result_converters/result_converters.dart @@ -0,0 +1 @@ +export 'result_value_converter.dart'; diff --git a/lib/core/utils/converters/result_converters/result_value_converter.dart b/lib/core/utils/converters/result_converters/result_value_converter.dart new file mode 100644 index 0000000..2d2ae78 --- /dev/null +++ b/lib/core/utils/converters/result_converters/result_value_converter.dart @@ -0,0 +1,6 @@ +import 'package:spotify_downloader/core/utils/converters/base_value_converter.dart/base_value_converter.dart'; +import 'package:spotify_downloader/core/utils/failures/failures.dart'; +import 'package:spotify_downloader/core/utils/result/result.dart'; + +abstract class ResultValueConverter + implements BaseValueConverter, T2, Result, T1> {} diff --git a/lib/core/utils/converters/simple_converters/async_value_converter.dart b/lib/core/utils/converters/simple_converters/async_value_converter.dart new file mode 100644 index 0000000..5d2d609 --- /dev/null +++ b/lib/core/utils/converters/simple_converters/async_value_converter.dart @@ -0,0 +1,3 @@ +import 'package:spotify_downloader/core/utils/converters/base_value_converter.dart/base_value_converter.dart'; + +abstract class AsyncValueConverter implements BaseValueConverter, T2, Future, T1> {} diff --git a/lib/core/utils/converters/simple_converters/simple_converters.dart b/lib/core/utils/converters/simple_converters/simple_converters.dart new file mode 100644 index 0000000..2933ec3 --- /dev/null +++ b/lib/core/utils/converters/simple_converters/simple_converters.dart @@ -0,0 +1,2 @@ +export 'async_value_converter.dart'; +export 'value_converter.dart'; diff --git a/lib/core/utils/converters/simple_converters/value_converter.dart b/lib/core/utils/converters/simple_converters/value_converter.dart new file mode 100644 index 0000000..ad8935a --- /dev/null +++ b/lib/core/utils/converters/simple_converters/value_converter.dart @@ -0,0 +1,3 @@ +import 'package:spotify_downloader/core/utils/converters/base_value_converter.dart/base_value_converter.dart'; + +abstract class ValueConverter implements BaseValueConverter { } \ No newline at end of file diff --git a/lib/core/util/failures/failures.dart b/lib/core/utils/failures/custom_failures.dart similarity index 82% rename from lib/core/util/failures/failures.dart rename to lib/core/utils/failures/custom_failures.dart index 4cfac49..b7edf81 100644 --- a/lib/core/util/failures/failures.dart +++ b/lib/core/utils/failures/custom_failures.dart @@ -1,4 +1,4 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; +import 'package:spotify_downloader/core/utils/failures/failure.dart'; final class NotFoundFailure extends Failure { const NotFoundFailure({super.message = 'not found failure'}); @@ -26,4 +26,8 @@ final class InvalidAccountCredentialsFailure extends Failure { final class NotAuthorizedFailure extends Failure { NotAuthorizedFailure({super.message = 'User not authorized'}); +} + +final class ForbiddenFailure extends Failure { + ForbiddenFailure({super.message = 'Access Forbidden'}); } \ No newline at end of file diff --git a/lib/core/util/failures/failure.dart b/lib/core/utils/failures/failure.dart similarity index 100% rename from lib/core/util/failures/failure.dart rename to lib/core/utils/failures/failure.dart diff --git a/lib/core/utils/failures/failures.dart b/lib/core/utils/failures/failures.dart new file mode 100644 index 0000000..62716d4 --- /dev/null +++ b/lib/core/utils/failures/failures.dart @@ -0,0 +1,2 @@ +export 'custom_failures.dart'; +export 'failure.dart'; diff --git a/lib/core/util/isolate_pool/cancellable_compute.dart b/lib/core/utils/isolate_pool/cancellable_compute.dart similarity index 100% rename from lib/core/util/isolate_pool/cancellable_compute.dart rename to lib/core/utils/isolate_pool/cancellable_compute.dart diff --git a/lib/core/util/isolate_pool/cancellable_stream.dart b/lib/core/utils/isolate_pool/cancellable_stream.dart similarity index 100% rename from lib/core/util/isolate_pool/cancellable_stream.dart rename to lib/core/utils/isolate_pool/cancellable_stream.dart diff --git a/lib/core/utils/isolate_pool/isolate_pool.dart b/lib/core/utils/isolate_pool/isolate_pool.dart new file mode 100644 index 0000000..c7cbdc0 --- /dev/null +++ b/lib/core/utils/isolate_pool/isolate_pool.dart @@ -0,0 +1,4 @@ +export 'cancellable_compute.dart'; +export 'cancellable_stream.dart'; +export 'isolate_pool_class.dart'; +export 'isolate_pool_was_closed_exception.dart'; diff --git a/lib/core/util/isolate_pool/isolate_pool.dart b/lib/core/utils/isolate_pool/isolate_pool_class.dart similarity index 88% rename from lib/core/util/isolate_pool/isolate_pool.dart rename to lib/core/utils/isolate_pool/isolate_pool_class.dart index e13ba3c..9f5f82c 100644 --- a/lib/core/util/isolate_pool/isolate_pool.dart +++ b/lib/core/utils/isolate_pool/isolate_pool_class.dart @@ -1,11 +1,5 @@ import 'dart:isolate'; - -import 'package:spotify_downloader/core/util/cancellation_token/cancellation_token.dart'; -import 'package:spotify_downloader/core/util/cancellation_token/cancellation_token_source.dart'; -import 'package:spotify_downloader/core/util/isolate_pool/cancellable_compute.dart'; -import 'package:spotify_downloader/core/util/isolate_pool/isolate_pool_was_closed_exception.dart'; - -import 'cancellable_stream.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; class IsolatePool { IsolatePool._(Isolate mainIsolate, SendPort addSendPort) diff --git a/lib/core/util/isolate_pool/isolate_pool_was_closed_exception.dart b/lib/core/utils/isolate_pool/isolate_pool_was_closed_exception.dart similarity index 100% rename from lib/core/util/isolate_pool/isolate_pool_was_closed_exception.dart rename to lib/core/utils/isolate_pool/isolate_pool_was_closed_exception.dart diff --git a/lib/core/util/result/cancellable_result.dart b/lib/core/utils/result/cancellable_result.dart similarity index 100% rename from lib/core/util/result/cancellable_result.dart rename to lib/core/utils/result/cancellable_result.dart diff --git a/lib/core/utils/result/result.dart b/lib/core/utils/result/result.dart new file mode 100644 index 0000000..6076b20 --- /dev/null +++ b/lib/core/utils/result/result.dart @@ -0,0 +1,2 @@ +export 'cancellable_result.dart'; +export 'result_class.dart'; diff --git a/lib/core/util/result/result.dart b/lib/core/utils/result/result_class.dart similarity index 99% rename from lib/core/util/result/result.dart rename to lib/core/utils/result/result_class.dart index a11b945..6212f66 100644 --- a/lib/core/util/result/result.dart +++ b/lib/core/utils/result/result_class.dart @@ -6,4 +6,4 @@ class Result { final bool isSuccessful; final Type? result; final Failure? failure; -} +} \ No newline at end of file diff --git a/lib/core/util/use_case/use_case.dart b/lib/core/utils/use_case/use_case.dart similarity index 60% rename from lib/core/util/use_case/use_case.dart rename to lib/core/utils/use_case/use_case.dart index 2c38d1f..6960b01 100644 --- a/lib/core/util/use_case/use_case.dart +++ b/lib/core/utils/use_case/use_case.dart @@ -1,4 +1,4 @@ -import 'package:spotify_downloader/core/util/result/result.dart'; +import 'package:spotify_downloader/core/utils/result/result.dart'; abstract class UseCase { Future> call(Params params); diff --git a/lib/core/util/util_methods.dart b/lib/core/utils/util_methods.dart similarity index 64% rename from lib/core/util/util_methods.dart rename to lib/core/utils/util_methods.dart index 0ff0b6b..5f52f9c 100644 --- a/lib/core/util/util_methods.dart +++ b/lib/core/utils/util_methods.dart @@ -1,12 +1,11 @@ +import 'dart:async'; import 'dart:io'; import 'dart:ui'; import 'package:http/http.dart'; import 'package:spotify/spotify.dart'; import 'package:spotify_downloader/core/app/colors/colors.dart'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/failures/failures.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; Color getIntermediateColor(Color color1, Color color2, double ratio) { return Color.fromARGB( @@ -24,11 +23,14 @@ Future> handleSpotifyClientExceptions(Future> handleSpotifyClientExceptions(Future', '|']; +String? formatStringToFileFormat(String? string) { + final forbiddenChars = ['/', '\\', ':', '*', '?', '<', '>', '|']; - String? formattedString = string; - for (var char in forbiddenChars) { - formattedString = formattedString?.replaceAll(char, ''); - } + String? formattedString = string; + for (var char in forbiddenChars) { + formattedString = formattedString?.replaceAll(char, ''); + } + + return formattedString; +} - return formattedString; +double normalize(double value, double min, double max) { + if (min >= max) { + throw ArgumentError('Min must be less than max'); } + + return (value - min) / (max - min); +} + +double closest(double value, double num1, double num2) { + double diff1 = (value - num1).abs(); + double diff2 = (value - num2).abs(); + + return (diff1 < diff2) ? num1 : num2; +} diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart new file mode 100644 index 0000000..a90e369 --- /dev/null +++ b/lib/core/utils/utils.dart @@ -0,0 +1,7 @@ +export 'cancellation_token/cancellation_token.dart'; +export 'converters/converters.dart'; +export 'failures/failures.dart'; +export 'isolate_pool/isolate_pool.dart'; +export 'result/result.dart'; +export 'util_methods.dart'; +export 'use_case/use_case.dart'; diff --git a/lib/features/data/settings/data_source/settings_data_source.dart b/lib/features/data/settings/data_source/settings_data_source.dart deleted file mode 100644 index 4ee1bf5..0000000 --- a/lib/features/data/settings/data_source/settings_data_source.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; - -import 'package:path_provider/path_provider.dart'; -import 'package:spotify_downloader/core/consts/local_paths.dart'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/settings/models/app_settings.dart'; - -class SettingsDataSource { - Future saveSettings(AppSettings appSettings) async { - final localDirectoryPath = (await getApplicationDocumentsDirectory()).path; - final absoluteAuthFilePath = '$localDirectoryPath$settingsPath'; - - final authFile = File(absoluteAuthFilePath); - await authFile.writeAsString(_appSettingsToJson(appSettings)); - } - - Future> getSettings() async { - final localDirectoryPath = (await getApplicationDocumentsDirectory()).path; - final absoluteAuthFilePath = '$localDirectoryPath$settingsPath'; - - final authFile = File(absoluteAuthFilePath); - if (await authFile.exists()) { - final json = await authFile.readAsString(); - return _appSettingsFromJson(json); - } - - return const Result.isSuccessful(null); - } - - String _appSettingsToJson(AppSettings appSettings) { - return jsonEncode( - {'saveMode': appSettings.saveMode, 'savePath': appSettings.savePath, 'language': appSettings.language}); - } - - Result _appSettingsFromJson(String jsonData) { - final decodedData = jsonDecode(jsonData); - try { - return Result.isSuccessful(AppSettings( - saveMode: decodedData['saveMode'], savePath: decodedData['savePath'], language: decodedData['language'])); - } catch (e) { - return Result.notSuccessful(Failure(message: e)); - } - } -} diff --git a/lib/features/data/tracks/dowload_tracks/data_sources/dowload_audio_from_youtube_data_source.dart b/lib/features/data/tracks/dowload_tracks/data_sources/dowload_audio_from_youtube_data_source.dart deleted file mode 100644 index f65f4dc..0000000 --- a/lib/features/data/tracks/dowload_tracks/data_sources/dowload_audio_from_youtube_data_source.dart +++ /dev/null @@ -1,245 +0,0 @@ -import 'dart:async'; -import 'dart:ffi'; -import 'dart:io'; - -import 'package:connectivity_plus/connectivity_plus.dart'; -import 'package:http/http.dart'; -import 'package:path/path.dart' as p; -import 'package:spotify_downloader/core/util/cancellation_token/cancellation_token.dart'; -import 'package:spotify_downloader/core/util/cancellation_token/cancellation_token_source.dart'; -import 'package:spotify_downloader/core/util/isolate_pool/isolate_pool.dart'; -import 'package:spotify_downloader/core/util/result/cancellable_result.dart'; -import 'package:youtube_explode_dart/youtube_explode_dart.dart'; - -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/failures/failures.dart'; - -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/data_sources/tools/audio_metadata_editor/audio_metadata_editor.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/data_sources/tools/file_to_mp3_converter/file_to_mp3_converter.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/models/dowload_audio_from_youtube_args.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/models/loading_stream/audio_loading_stream.dart'; - -class DownloadAudioFromYoutubeDataSource { - DownloadAudioFromYoutubeDataSource( - {required AudioMetadataEditor audioMetadataEditor, required FileToMp3Converter fileToMp3Converter}) - : _audioMetadataEditor = audioMetadataEditor, - _fileToMp3Converter = fileToMp3Converter; - - final AudioMetadataEditor _audioMetadataEditor; - final FileToMp3Converter _fileToMp3Converter; - - late final IsolatePool _isolatePool; - - Future init() async { - _isolatePool = await IsolatePool.create(); - } - - Future dowloadAudioFromYoutube(DownloadAudioFromYoutubeArgs args) async { - void Function() cancelFunction = () {}; - - return AudioLoadingStream(streamFunction: (setLoadingPercent) async { - try { - CancellationTokenSource cancellationTokenSource = CancellationTokenSource(); - final token = cancellationTokenSource.token; - cancelFunction = cancellationTokenSource.cancel; - - final getDownloadStreamInfoCompute = await _isolatePool.compute(_getDownloadStreamInfo, args); - if (token.isCancelled) { - getDownloadStreamInfoCompute.cancel(); - return const CancellableResult.isCancelled(); - } - - cancelFunction = getDownloadStreamInfoCompute.cancel; - final getDownloadStreamInfoResult = await Future.any([ - getDownloadStreamInfoCompute.future, - Future(() async { - await Connectivity().onConnectivityChanged.firstWhere((connectivityResult) => - connectivityResult == ConnectivityResult.none || connectivityResult == ConnectivityResult.other); - return const CancellableResult.notSuccessful(NetworkFailure()); - }) - ]); - - if (getDownloadStreamInfoResult.isCancelled) { - return const CancellableResult.isCancelled(); - } else if (!getDownloadStreamInfoResult.isSuccessful) { - return CancellableResult.notSuccessful(getDownloadStreamInfoResult.failure); - } - - final downloadStreamInfo = getDownloadStreamInfoResult.result!; - - final videoPath = - p.join(args.saveDirectoryPath, '${args.audioMetadata.name}.${downloadStreamInfo.container.name}'); - final audioPath = p.join(args.saveDirectoryPath, '${args.audioMetadata.name}.mp3'); - - cancelFunction = cancellationTokenSource.cancel; - - await Directory(args.saveDirectoryPath).create(recursive: true); - - final downloadVideoResult = - await _downloadVideoFromYoutube(downloadStreamInfo, videoPath, setLoadingPercent, token); - - if (downloadVideoResult.isCancelled) { - return const CancellableResult.isCancelled(); - } else if (!downloadVideoResult.isSuccessful) { - return CancellableResult.notSuccessful(downloadVideoResult.failure); - } - - await _convertFileToMp3(videoPath, audioPath); - - setLoadingPercent.call(95); - await File(videoPath).delete(); - - if (token.isCancelled) { - await File(audioPath).delete(); - return const CancellableResult.isCancelled(); - } - - final changeMetadataResult = - await _audioMetadataEditor.changeAudioMetadata(audioPath: audioPath, audioMetadata: args.audioMetadata); - if (!changeMetadataResult.isSuccessful) { - await File(audioPath).delete(); - return CancellableResult.notSuccessful(changeMetadataResult.failure); - } - - if (token.isCancelled) { - await File(audioPath).delete(); - return const CancellableResult.isCancelled(); - } - - setLoadingPercent.call(100); - return CancellableResult.isSuccessful(audioPath); - } catch (e) { - return CancellableResult.notSuccessful(Failure(message: e)); - } - }, cancelFunction: () { - cancelFunction(); - }); - } - - Future> _getDownloadStreamInfo( - DownloadAudioFromYoutubeArgs args, CancellationToken token) async { - final yt = YoutubeExplode(); - if (token.isCancelled) return const CancellableResult.isCancelled(); - - late final Video video; - late final AudioOnlyStreamInfo downloadStreamInfo; - - try { - video = await yt.videos.get(VideoId.parseVideoId(args.youtubeUrl)); - if (token.isCancelled) return const CancellableResult.isCancelled(); - - final manifest = await yt.videos.streamsClient.getManifest(video.id); - if (token.isCancelled) return const CancellableResult.isCancelled(); - - downloadStreamInfo = manifest.audioOnly.withHighestBitrate(); - } catch (e) { - yt.close(); - if (e is ClientException || e is SocketException) { - return const CancellableResult.notSuccessful(NetworkFailure()); - } - - if (e is ArgumentError) { - return CancellableResult.notSuccessful( - NotFoundFailure(message: 'video with this url not found: ${args.youtubeUrl}')); - } - - return CancellableResult.notSuccessful(Failure(message: e)); - } - - yt.close(); - return CancellableResult.isSuccessful(downloadStreamInfo); - } - - Future> _downloadVideoFromYoutube(AudioOnlyStreamInfo downloadStreamInfo, - String savePath, void Function(double percent) setLoadingPercent, CancellationToken token) async { - try { - final yt = YoutubeExplode(); - final downloadStream = yt.videos.streamsClient.get(downloadStreamInfo); - final videoFile = File(savePath); - - if (await videoFile.exists()) { - await videoFile.delete(); - } - - await videoFile.create(); - final videoFileStream = videoFile.openWrite(); - - late final StreamSubscription> downloadStreamListener; - - final videoFileSize = downloadStreamInfo.size.totalBytes; - int loadedBytesCount = 0; - - final cancellationTokenCompleter = Completer(); - final failureCompleter = Completer(); - - downloadStreamListener = downloadStream.listen((chunk) async { - if (token.isCancelled) { - if (!cancellationTokenCompleter.isCompleted) { - cancellationTokenCompleter.complete(null); - } - return; - } - - try { - videoFileStream.add(chunk); - } catch (e) { - if (!failureCompleter.isCompleted) { - failureCompleter.complete(Failure(message: e)); - } - } - - loadedBytesCount += chunk.length; - setLoadingPercent.call((loadedBytesCount / videoFileSize) * 90); - }) - ..onError((e) { - if (!failureCompleter.isCompleted) { - failureCompleter.complete(Failure(message: e)); - } - }); - - Failure failure = const Failure(message: ''); - - Connectivity() - .onConnectivityChanged - .firstWhere((result) => result == ConnectivityResult.none || result == ConnectivityResult.other) - .then((value) { - if (!failureCompleter.isCompleted) { - failureCompleter.complete(const NetworkFailure()); - } - }); - - await Future.any([ - downloadStreamListener.asFuture(), - cancellationTokenCompleter.future, - (() async { - failure = await failureCompleter.future; - }).call(), - ]); - - await videoFileStream.flush(); - await videoFileStream.close(); - yt.close(); - - if (failureCompleter.isCompleted) { - return CancellableResult.notSuccessful(failure); - } - - if (cancellationTokenCompleter.isCompleted) { - await videoFile.delete(); - return const CancellableResult.isCancelled(); - } - - return const CancellableResult.isSuccessful(null); - } catch (e) { - return CancellableResult.notSuccessful(Failure(message: e)); - } - } - - Future _convertFileToMp3(String rawPath, String audioPath) async { - final audioFile = File(audioPath); - if (await audioFile.exists()) { - await audioFile.delete(); - } - await _fileToMp3Converter.convertFileToMp3(rawPath, audioPath); - } -} diff --git a/lib/features/data/tracks/dowload_tracks/data_sources/tools/audio_metadata_editor/audio_metadata_editor.dart b/lib/features/data/tracks/dowload_tracks/data_sources/tools/audio_metadata_editor/audio_metadata_editor.dart deleted file mode 100644 index e70a3d8..0000000 --- a/lib/features/data/tracks/dowload_tracks/data_sources/tools/audio_metadata_editor/audio_metadata_editor.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/models/metadata/audio_metadata.dart'; - -abstract class AudioMetadataEditor { - Future> changeAudioMetadata({required String audioPath, required AudioMetadata audioMetadata}); -} \ No newline at end of file diff --git a/lib/features/data/tracks/dowload_tracks/repositories/repository_impl_classes/loading_track_info.dart b/lib/features/data/tracks/dowload_tracks/repositories/repository_impl_classes/loading_track_info.dart deleted file mode 100644 index c5a6a5f..0000000 --- a/lib/features/data/tracks/dowload_tracks/repositories/repository_impl_classes/loading_track_info.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/models/loading_stream/audio_loading_stream.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_id.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/track_loading_notifier.dart'; - -class LoadingTrackInfo { - LoadingTrackInfo( - {required this.loadingTrackId, required this.audioLoadingStream, required this.trackLoadingNotifier}); - - final LoadingTrackId loadingTrackId; - AudioLoadingStream? audioLoadingStream; - TrackLoadingNotifier trackLoadingNotifier; -} diff --git a/lib/features/data/tracks/network_tracks/models/tracks_getting_stream.dart b/lib/features/data/tracks/network_tracks/models/tracks_getting_stream.dart deleted file mode 100644 index 2d0c72c..0000000 --- a/lib/features/data/tracks/network_tracks/models/tracks_getting_stream.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:spotify/spotify.dart'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/tracks/network_tracks/models/tracks_dto_getting_ended_status.dart'; - -class TracksGettingStream { - Function(Result)? onEnded; - Function(List)? onPartGot; -} \ No newline at end of file diff --git a/lib/features/data/tracks/network_tracks/repositories/converters/track_dto_to_track_converter.dart b/lib/features/data/tracks/network_tracks/repositories/converters/track_dto_to_track_converter.dart deleted file mode 100644 index 44bdeac..0000000 --- a/lib/features/data/tracks/network_tracks/repositories/converters/track_dto_to_track_converter.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:spotify/spotify.dart' as dto; -import 'package:spotify_downloader/core/util/converters/converter_with_parameter.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/album.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart' as entity; - -class TrackDtoToTrackConverter implements ConverterWithParameter { - @override - entity.Track? convert((dto.Track, TracksCollection) parameters) { - final dtoTrack = parameters.$1; - final parentCollection = parameters.$2; - - if (dtoTrack.id == null) { - return null; - } - - String? albumImageUrl; - - try { - albumImageUrl = dtoTrack.album?.images?[1].url; - } on RangeError { - //rangeError - } - - albumImageUrl ??= dtoTrack.album?.images?.firstOrNull?.url ?? ''; - - return entity.Track( - spotifyId: dtoTrack.id!, - duration: dtoTrack.duration, - name: dtoTrack.name ?? 'no_name', - isLoaded: false, - parentCollection: parentCollection, - artists: dtoTrack.artists?.map((a) => a.name!).toList(), - album: Album(name: dtoTrack.album?.name, imageUrl: albumImageUrl)); - } - - @override - dto.Track convertBack((entity.Track?, TracksCollection) value) { - throw UnimplementedError(); - } -} diff --git a/lib/features/data_domain/auth/auth.dart b/lib/features/data_domain/auth/auth.dart new file mode 100644 index 0000000..46545f7 --- /dev/null +++ b/lib/features/data_domain/auth/auth.dart @@ -0,0 +1,4 @@ +export 'local_auth/local_auth.dart'; +export 'network_auth/network_auth.dart'; +export 'service/service.dart'; +export 'shared/shared.dart'; diff --git a/lib/features/data_domain/auth/local_auth/data/data.dart b/lib/features/data_domain/auth/local_auth/data/data.dart new file mode 100644 index 0000000..458d27b --- /dev/null +++ b/lib/features/data_domain/auth/local_auth/data/data.dart @@ -0,0 +1,3 @@ +export 'data_source/data_source.dart'; +export 'models/models.dart'; +export 'repository/repository.dart'; diff --git a/lib/features/data_domain/auth/local_auth/data/data_source/data_source.dart b/lib/features/data_domain/auth/local_auth/data/data_source/data_source.dart new file mode 100644 index 0000000..2881cf4 --- /dev/null +++ b/lib/features/data_domain/auth/local_auth/data/data_source/data_source.dart @@ -0,0 +1 @@ +export 'local_auth_data_source.dart'; diff --git a/lib/features/data/auth/local_auth/data_source/local_auth_data_source.dart b/lib/features/data_domain/auth/local_auth/data/data_source/local_auth_data_source.dart similarity index 86% rename from lib/features/data/auth/local_auth/data_source/local_auth_data_source.dart rename to lib/features/data_domain/auth/local_auth/data/data_source/local_auth_data_source.dart index fc8aaa9..286d9d5 100644 --- a/lib/features/data/auth/local_auth/data_source/local_auth_data_source.dart +++ b/lib/features/data_domain/auth/local_auth/data/data_source/local_auth_data_source.dart @@ -3,11 +3,11 @@ import 'dart:io'; import 'package:path_provider/path_provider.dart'; import 'package:spotify_downloader/core/consts/local_paths.dart'; -import 'package:spotify_downloader/features/data/auth/local_auth/models/local_auth_credentials.dart'; +import 'package:spotify_downloader/features/data_domain/auth/local_auth/data/data.dart'; class LocalAuthDataSource { Future getLocalAuthCredentials() async { - final localDirectoryPath = (await getApplicationDocumentsDirectory()).path; + final localDirectoryPath = (await getApplicationSupportDirectory()).path; final absoluteAuthFilePath = '$localDirectoryPath$authSettingPath'; final authFile = File(absoluteAuthFilePath); @@ -20,7 +20,7 @@ class LocalAuthDataSource { } Future saveLocalAuthCredentials(LocalAuthCredentials localAuthCredentials) async { - final localDirectoryPath = (await getApplicationDocumentsDirectory()).path; + final localDirectoryPath = (await getApplicationSupportDirectory()).path; final absoluteAuthFilePath = '$localDirectoryPath$authSettingPath'; final authFile = File(absoluteAuthFilePath); diff --git a/lib/features/data/auth/local_auth/models/local_auth_credentials.dart b/lib/features/data_domain/auth/local_auth/data/models/local_auth_credentials.dart similarity index 100% rename from lib/features/data/auth/local_auth/models/local_auth_credentials.dart rename to lib/features/data_domain/auth/local_auth/data/models/local_auth_credentials.dart diff --git a/lib/features/data_domain/auth/local_auth/data/models/models.dart b/lib/features/data_domain/auth/local_auth/data/models/models.dart new file mode 100644 index 0000000..801ab3b --- /dev/null +++ b/lib/features/data_domain/auth/local_auth/data/models/models.dart @@ -0,0 +1 @@ +export 'local_auth_credentials.dart'; diff --git a/lib/features/data_domain/auth/local_auth/data/repository/converter/converter.dart b/lib/features/data_domain/auth/local_auth/data/repository/converter/converter.dart new file mode 100644 index 0000000..b54722a --- /dev/null +++ b/lib/features/data_domain/auth/local_auth/data/repository/converter/converter.dart @@ -0,0 +1 @@ +export 'local_auth_credentials_to_auth_credentials_converter.dart'; diff --git a/lib/features/data/auth/local_auth/repository/converter/local_auth_credentials_to_auth_credentials_converter.dart b/lib/features/data_domain/auth/local_auth/data/repository/converter/local_auth_credentials_to_auth_credentials_converter.dart similarity index 75% rename from lib/features/data/auth/local_auth/repository/converter/local_auth_credentials_to_auth_credentials_converter.dart rename to lib/features/data_domain/auth/local_auth/data/repository/converter/local_auth_credentials_to_auth_credentials_converter.dart index 9f533c1..f207420 100644 --- a/lib/features/data/auth/local_auth/repository/converter/local_auth_credentials_to_auth_credentials_converter.dart +++ b/lib/features/data_domain/auth/local_auth/data/repository/converter/local_auth_credentials_to_auth_credentials_converter.dart @@ -1,9 +1,9 @@ -import 'package:spotify_downloader/core/util/converters/simple_converters/value_converter.dart'; -import 'package:spotify_downloader/features/data/auth/local_auth/models/local_auth_credentials.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/full_credentials.dart'; +import 'package:spotify_downloader/core/utils/converters/simple_converters/value_converter.dart'; +import 'package:spotify_downloader/features/data_domain/auth/local_auth/data/data.dart'; +import 'package:spotify_downloader/features/data_domain/auth/shared/shared.dart'; -class LocalAuthCredentialsToAuthCredentialsConverter - implements ValueConverter { + +class LocalAuthCredentialsToAuthCredentialsConverter implements ValueConverter { static const String _notSpecified = 'not specified'; @override diff --git a/lib/features/data/auth/local_auth/repository/local_auth_repository_impl.dart b/lib/features/data_domain/auth/local_auth/data/repository/local_auth_repository_impl.dart similarity index 77% rename from lib/features/data/auth/local_auth/repository/local_auth_repository_impl.dart rename to lib/features/data_domain/auth/local_auth/data/repository/local_auth_repository_impl.dart index 3b3ffaf..64899c2 100644 --- a/lib/features/data/auth/local_auth/repository/local_auth_repository_impl.dart +++ b/lib/features/data_domain/auth/local_auth/data/repository/local_auth_repository_impl.dart @@ -1,14 +1,6 @@ import 'package:spotify_downloader/core/consts/spotify_client.dart'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/auth/local_auth/data_source/local_auth_data_source.dart'; -import 'package:spotify_downloader/features/data/auth/local_auth/repository/converter/local_auth_credentials_to_auth_credentials_converter.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/repositories/local_client_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/repositories/local_full_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/repositories/local_user_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/client_credentials.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/full_credentials.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/user_credentials.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/auth/auth.dart'; class LocalAuthRepositoryImpl implements LocalFullAuthRepository, LocalClientAuthRepository, LocalUserAuthRepository { LocalAuthRepositoryImpl({required LocalAuthDataSource dataSource}) : _dataSource = dataSource; diff --git a/lib/features/data_domain/auth/local_auth/data/repository/repository.dart b/lib/features/data_domain/auth/local_auth/data/repository/repository.dart new file mode 100644 index 0000000..38b23a7 --- /dev/null +++ b/lib/features/data_domain/auth/local_auth/data/repository/repository.dart @@ -0,0 +1,2 @@ +export 'converter/converter.dart'; +export 'local_auth_repository_impl.dart'; diff --git a/lib/features/data_domain/auth/local_auth/domain/domain.dart b/lib/features/data_domain/auth/local_auth/domain/domain.dart new file mode 100644 index 0000000..d529d27 --- /dev/null +++ b/lib/features/data_domain/auth/local_auth/domain/domain.dart @@ -0,0 +1,2 @@ +export 'repositories/repositories.dart'; +export 'use_cases/use_cases.dart'; \ No newline at end of file diff --git a/lib/features/data_domain/auth/local_auth/domain/repositories/local_client_auth_repository.dart b/lib/features/data_domain/auth/local_auth/domain/repositories/local_client_auth_repository.dart new file mode 100644 index 0000000..e5bc725 --- /dev/null +++ b/lib/features/data_domain/auth/local_auth/domain/repositories/local_client_auth_repository.dart @@ -0,0 +1,8 @@ +import 'package:spotify_downloader/core/utils/failures/failure.dart'; +import 'package:spotify_downloader/core/utils/result/result.dart'; +import 'package:spotify_downloader/features/data_domain/auth/shared/client_credentials.dart'; + +abstract class LocalClientAuthRepository { + Future> getClientCredentials(); + Future> saveClientCredentials(ClientCredentials clientCredentials); +} diff --git a/lib/features/data_domain/auth/local_auth/domain/repositories/local_full_auth_repository.dart b/lib/features/data_domain/auth/local_auth/domain/repositories/local_full_auth_repository.dart new file mode 100644 index 0000000..d789b65 --- /dev/null +++ b/lib/features/data_domain/auth/local_auth/domain/repositories/local_full_auth_repository.dart @@ -0,0 +1,10 @@ +import 'package:spotify_downloader/core/utils/failures/failure.dart'; +import 'package:spotify_downloader/core/utils/result/result.dart'; +import 'package:spotify_downloader/features/data_domain/auth/shared/full_credentials.dart'; + + +abstract class LocalFullAuthRepository { + Future> getFullCredentials(); + + Future> saveFullCredentials(FullCredentials fullCredentials); +} diff --git a/lib/features/data_domain/auth/local_auth/domain/repositories/local_user_auth_repository.dart b/lib/features/data_domain/auth/local_auth/domain/repositories/local_user_auth_repository.dart new file mode 100644 index 0000000..6a95059 --- /dev/null +++ b/lib/features/data_domain/auth/local_auth/domain/repositories/local_user_auth_repository.dart @@ -0,0 +1,9 @@ +import 'package:spotify_downloader/core/utils/failures/failure.dart'; +import 'package:spotify_downloader/core/utils/result/result.dart'; +import 'package:spotify_downloader/features/data_domain/auth/shared/user_credentials.dart'; + +abstract class LocalUserAuthRepository { + Future> clearUserCredentials(); + + Future> saveUserCredentials(UserCredentials userCredentials); +} diff --git a/lib/features/data_domain/auth/local_auth/domain/repositories/repositories.dart b/lib/features/data_domain/auth/local_auth/domain/repositories/repositories.dart new file mode 100644 index 0000000..dc94462 --- /dev/null +++ b/lib/features/data_domain/auth/local_auth/domain/repositories/repositories.dart @@ -0,0 +1,3 @@ +export 'local_client_auth_repository.dart'; +export 'local_full_auth_repository.dart'; +export 'local_user_auth_repository.dart'; diff --git a/lib/features/domain/auth/local_auth/use_cases/clear_user_credentials.dart b/lib/features/data_domain/auth/local_auth/domain/use_cases/clear_user_credentials.dart similarity index 55% rename from lib/features/domain/auth/local_auth/use_cases/clear_user_credentials.dart rename to lib/features/data_domain/auth/local_auth/domain/use_cases/clear_user_credentials.dart index 75113ad..70324fd 100644 --- a/lib/features/domain/auth/local_auth/use_cases/clear_user_credentials.dart +++ b/lib/features/data_domain/auth/local_auth/domain/use_cases/clear_user_credentials.dart @@ -1,7 +1,5 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/repositories/local_user_auth_repository.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/auth/local_auth/local_auth.dart'; class ClearUserCredentials implements UseCase { ClearUserCredentials({required LocalUserAuthRepository localUserAuthRepository}) diff --git a/lib/features/domain/auth/local_auth/use_cases/get_client_credentials.dart b/lib/features/data_domain/auth/local_auth/domain/use_cases/get_client_credentials.dart similarity index 51% rename from lib/features/domain/auth/local_auth/use_cases/get_client_credentials.dart rename to lib/features/data_domain/auth/local_auth/domain/use_cases/get_client_credentials.dart index 11bf26f..d71eed5 100644 --- a/lib/features/domain/auth/local_auth/use_cases/get_client_credentials.dart +++ b/lib/features/data_domain/auth/local_auth/domain/use_cases/get_client_credentials.dart @@ -1,8 +1,6 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/repositories/local_client_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/client_credentials.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/auth/local_auth/local_auth.dart'; +import 'package:spotify_downloader/features/data_domain/auth/shared/shared.dart'; class GetClientCredentials implements UseCase { GetClientCredentials({required LocalClientAuthRepository localClientAuthRepository}) diff --git a/lib/features/domain/auth/local_auth/use_cases/save_client_credentials.dart b/lib/features/data_domain/auth/local_auth/domain/use_cases/save_client_credentials.dart similarity index 53% rename from lib/features/domain/auth/local_auth/use_cases/save_client_credentials.dart rename to lib/features/data_domain/auth/local_auth/domain/use_cases/save_client_credentials.dart index 283f8e2..feead3b 100644 --- a/lib/features/domain/auth/local_auth/use_cases/save_client_credentials.dart +++ b/lib/features/data_domain/auth/local_auth/domain/use_cases/save_client_credentials.dart @@ -1,8 +1,6 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/repositories/local_client_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/client_credentials.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/auth/local_auth/local_auth.dart'; +import 'package:spotify_downloader/features/data_domain/auth/shared/shared.dart'; class SaveClientCredentials implements UseCase { SaveClientCredentials({required LocalClientAuthRepository localClientAuthRepository}) diff --git a/lib/features/data_domain/auth/local_auth/domain/use_cases/use_cases.dart b/lib/features/data_domain/auth/local_auth/domain/use_cases/use_cases.dart new file mode 100644 index 0000000..aad2303 --- /dev/null +++ b/lib/features/data_domain/auth/local_auth/domain/use_cases/use_cases.dart @@ -0,0 +1,3 @@ +export 'clear_user_credentials.dart'; +export 'get_client_credentials.dart'; +export 'save_client_credentials.dart'; diff --git a/lib/features/data_domain/auth/local_auth/local_auth.dart b/lib/features/data_domain/auth/local_auth/local_auth.dart new file mode 100644 index 0000000..c2ecb87 --- /dev/null +++ b/lib/features/data_domain/auth/local_auth/local_auth.dart @@ -0,0 +1,2 @@ +export 'data/data.dart'; +export 'domain/domain.dart'; diff --git a/lib/features/data_domain/auth/network_auth/data/data.dart b/lib/features/data_domain/auth/network_auth/data/data.dart new file mode 100644 index 0000000..458d27b --- /dev/null +++ b/lib/features/data_domain/auth/network_auth/data/data.dart @@ -0,0 +1,3 @@ +export 'data_source/data_source.dart'; +export 'models/models.dart'; +export 'repository/repository.dart'; diff --git a/lib/features/data_domain/auth/network_auth/data/data_source/data_source.dart b/lib/features/data_domain/auth/network_auth/data/data_source/data_source.dart new file mode 100644 index 0000000..12affc7 --- /dev/null +++ b/lib/features/data_domain/auth/network_auth/data/data_source/data_source.dart @@ -0,0 +1 @@ +export 'network_auth_data_source.dart'; diff --git a/lib/features/data/auth/network_auth/data_source/network_auth_data_source.dart b/lib/features/data_domain/auth/network_auth/data/data_source/network_auth_data_source.dart similarity index 82% rename from lib/features/data/auth/network_auth/data_source/network_auth_data_source.dart rename to lib/features/data_domain/auth/network_auth/data/data_source/network_auth_data_source.dart index 7074c36..c2afab8 100644 --- a/lib/features/data/auth/network_auth/data_source/network_auth_data_source.dart +++ b/lib/features/data_domain/auth/network_auth/data/data_source/network_auth_data_source.dart @@ -2,10 +2,8 @@ import 'dart:io'; import 'package:oauth2_client/spotify_oauth2_client.dart'; import 'package:spotify_downloader/core/consts/spotify_client.dart'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/failures/failures.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/auth/network_auth/models/auth_response.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/auth/network_auth/data/data.dart'; class NetworkAuthDataSource { Future> authorizeUser(String clientId) async { diff --git a/lib/features/data/auth/network_auth/models/auth_response.dart b/lib/features/data_domain/auth/network_auth/data/models/auth_response.dart similarity index 100% rename from lib/features/data/auth/network_auth/models/auth_response.dart rename to lib/features/data_domain/auth/network_auth/data/models/auth_response.dart diff --git a/lib/features/data_domain/auth/network_auth/data/models/models.dart b/lib/features/data_domain/auth/network_auth/data/models/models.dart new file mode 100644 index 0000000..03c8201 --- /dev/null +++ b/lib/features/data_domain/auth/network_auth/data/models/models.dart @@ -0,0 +1 @@ +export 'auth_response.dart'; diff --git a/lib/features/data/auth/network_auth/repository/network_auth_repository_impl.dart b/lib/features/data_domain/auth/network_auth/data/repository/network_auth_repository_impl.dart similarity index 57% rename from lib/features/data/auth/network_auth/repository/network_auth_repository_impl.dart rename to lib/features/data_domain/auth/network_auth/data/repository/network_auth_repository_impl.dart index b376d61..9eb44b8 100644 --- a/lib/features/data/auth/network_auth/repository/network_auth_repository_impl.dart +++ b/lib/features/data_domain/auth/network_auth/data/repository/network_auth_repository_impl.dart @@ -1,9 +1,6 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/auth/network_auth/data_source/network_auth_data_source.dart'; -import 'package:spotify_downloader/features/domain/auth/network_auth/repository/network_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/client_credentials.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/user_credentials.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/auth/network_auth/network_auth.dart'; +import 'package:spotify_downloader/features/data_domain/auth/shared/shared.dart'; class NetworkAuthRepositoryImpl implements NetworkAuthRepository { NetworkAuthRepositoryImpl({required NetworkAuthDataSource dataSource}) : _dataSource = dataSource; diff --git a/lib/features/data_domain/auth/network_auth/data/repository/repository.dart b/lib/features/data_domain/auth/network_auth/data/repository/repository.dart new file mode 100644 index 0000000..d394df9 --- /dev/null +++ b/lib/features/data_domain/auth/network_auth/data/repository/repository.dart @@ -0,0 +1 @@ +export 'network_auth_repository_impl.dart'; diff --git a/lib/features/data_domain/auth/network_auth/domain/domain.dart b/lib/features/data_domain/auth/network_auth/domain/domain.dart new file mode 100644 index 0000000..0901fc3 --- /dev/null +++ b/lib/features/data_domain/auth/network_auth/domain/domain.dart @@ -0,0 +1 @@ +export 'repository/repository.dart'; diff --git a/lib/features/data_domain/auth/network_auth/domain/repository/network_auth_repository.dart b/lib/features/data_domain/auth/network_auth/domain/repository/network_auth_repository.dart new file mode 100644 index 0000000..89868a7 --- /dev/null +++ b/lib/features/data_domain/auth/network_auth/domain/repository/network_auth_repository.dart @@ -0,0 +1,8 @@ +import 'package:spotify_downloader/core/utils/failures/failure.dart'; +import 'package:spotify_downloader/core/utils/result/result.dart'; + +import 'package:spotify_downloader/features/data_domain/auth/shared/shared.dart'; + +abstract class NetworkAuthRepository { + Future> authorizeUser(ClientCredentials clientCredentials); +} \ No newline at end of file diff --git a/lib/features/data_domain/auth/network_auth/domain/repository/repository.dart b/lib/features/data_domain/auth/network_auth/domain/repository/repository.dart new file mode 100644 index 0000000..a9485d6 --- /dev/null +++ b/lib/features/data_domain/auth/network_auth/domain/repository/repository.dart @@ -0,0 +1 @@ +export 'network_auth_repository.dart'; diff --git a/lib/features/data_domain/auth/network_auth/network_auth.dart b/lib/features/data_domain/auth/network_auth/network_auth.dart new file mode 100644 index 0000000..c2ecb87 --- /dev/null +++ b/lib/features/data_domain/auth/network_auth/network_auth.dart @@ -0,0 +1,2 @@ +export 'data/data.dart'; +export 'domain/domain.dart'; diff --git a/lib/features/data_domain/auth/service/service.dart b/lib/features/data_domain/auth/service/service.dart new file mode 100644 index 0000000..bc4300a --- /dev/null +++ b/lib/features/data_domain/auth/service/service.dart @@ -0,0 +1,2 @@ +export 'service/service.dart'; +export 'use_cases/use_cases.dart'; diff --git a/lib/features/data_domain/auth/service/service/auth_service.dart b/lib/features/data_domain/auth/service/service/auth_service.dart new file mode 100644 index 0000000..53c3660 --- /dev/null +++ b/lib/features/data_domain/auth/service/service/auth_service.dart @@ -0,0 +1,6 @@ +import 'package:spotify_downloader/core/utils/failures/failure.dart'; +import 'package:spotify_downloader/core/utils/result/result.dart'; + +abstract class AuthService { + Future> authorizeUser(); +} \ No newline at end of file diff --git a/lib/features/domain/auth/service/service/auth_service_impl.dart b/lib/features/data_domain/auth/service/service/auth_service_impl.dart similarity index 68% rename from lib/features/domain/auth/service/service/auth_service_impl.dart rename to lib/features/data_domain/auth/service/service/auth_service_impl.dart index 7a23654..b594b72 100644 --- a/lib/features/domain/auth/service/service/auth_service_impl.dart +++ b/lib/features/data_domain/auth/service/service/auth_service_impl.dart @@ -1,9 +1,6 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/repositories/local_client_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/repositories/local_user_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/auth/network_auth/repository/network_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/auth/service/service/auth_service.dart'; +import 'package:spotify_downloader/core/utils/failures/failure.dart'; +import 'package:spotify_downloader/core/utils/result/result.dart'; +import 'package:spotify_downloader/features/data_domain/auth/auth.dart'; class AuthServiceImpl implements AuthService { AuthServiceImpl( diff --git a/lib/features/data_domain/auth/service/service/service.dart b/lib/features/data_domain/auth/service/service/service.dart new file mode 100644 index 0000000..48c45d0 --- /dev/null +++ b/lib/features/data_domain/auth/service/service/service.dart @@ -0,0 +1,2 @@ +export 'auth_service.dart'; +export 'auth_service_impl.dart'; diff --git a/lib/features/data_domain/auth/service/use_cases/authorize_user.dart b/lib/features/data_domain/auth/service/use_cases/authorize_user.dart new file mode 100644 index 0000000..df74047 --- /dev/null +++ b/lib/features/data_domain/auth/service/use_cases/authorize_user.dart @@ -0,0 +1,13 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/auth/service/service/auth_service.dart'; + +class AuthorizeUser implements UseCase { + AuthorizeUser({required AuthService authService}) : _authService = authService; + + final AuthService _authService; + + @override + Future> call(void params) { + return _authService.authorizeUser(); + } +} \ No newline at end of file diff --git a/lib/features/data_domain/auth/service/use_cases/use_cases.dart b/lib/features/data_domain/auth/service/use_cases/use_cases.dart new file mode 100644 index 0000000..974ede4 --- /dev/null +++ b/lib/features/data_domain/auth/service/use_cases/use_cases.dart @@ -0,0 +1 @@ +export 'authorize_user.dart'; diff --git a/lib/features/domain/auth/shared/client_credentials.dart b/lib/features/data_domain/auth/shared/client_credentials.dart similarity index 100% rename from lib/features/domain/auth/shared/client_credentials.dart rename to lib/features/data_domain/auth/shared/client_credentials.dart diff --git a/lib/features/domain/auth/shared/full_credentials.dart b/lib/features/data_domain/auth/shared/full_credentials.dart similarity index 71% rename from lib/features/domain/auth/shared/full_credentials.dart rename to lib/features/data_domain/auth/shared/full_credentials.dart index e7363c0..c707ddf 100644 --- a/lib/features/domain/auth/shared/full_credentials.dart +++ b/lib/features/data_domain/auth/shared/full_credentials.dart @@ -1,5 +1,5 @@ -import 'package:spotify_downloader/features/domain/auth/shared/client_credentials.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/user_credentials.dart'; +import 'package:spotify_downloader/features/data_domain/auth/shared/client_credentials.dart'; +import 'package:spotify_downloader/features/data_domain/auth/shared/user_credentials.dart'; class FullCredentials implements UserCredentials, ClientCredentials { FullCredentials( diff --git a/lib/features/data_domain/auth/shared/shared.dart b/lib/features/data_domain/auth/shared/shared.dart new file mode 100644 index 0000000..702dd4d --- /dev/null +++ b/lib/features/data_domain/auth/shared/shared.dart @@ -0,0 +1,3 @@ +export 'client_credentials.dart'; +export 'full_credentials.dart'; +export 'user_credentials.dart'; diff --git a/lib/features/domain/auth/shared/user_credentials.dart b/lib/features/data_domain/auth/shared/user_credentials.dart similarity index 100% rename from lib/features/domain/auth/shared/user_credentials.dart rename to lib/features/data_domain/auth/shared/user_credentials.dart diff --git a/lib/features/data_domain/settings/data/data.dart b/lib/features/data_domain/settings/data/data.dart new file mode 100644 index 0000000..458d27b --- /dev/null +++ b/lib/features/data_domain/settings/data/data.dart @@ -0,0 +1,3 @@ +export 'data_source/data_source.dart'; +export 'models/models.dart'; +export 'repository/repository.dart'; diff --git a/lib/features/data_domain/settings/data/data_source/data_source.dart b/lib/features/data_domain/settings/data/data_source/data_source.dart new file mode 100644 index 0000000..8741366 --- /dev/null +++ b/lib/features/data_domain/settings/data/data_source/data_source.dart @@ -0,0 +1 @@ +export 'settings_data_source.dart'; diff --git a/lib/features/data_domain/settings/data/data_source/settings_data_source.dart b/lib/features/data_domain/settings/data/data_source/settings_data_source.dart new file mode 100644 index 0000000..1e29ceb --- /dev/null +++ b/lib/features/data_domain/settings/data/data_source/settings_data_source.dart @@ -0,0 +1,88 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:intl/intl_standalone.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:spotify_downloader/core/consts/local_paths.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/settings/data/data.dart'; +import 'package:spotify_downloader/generated/l10n.dart'; + +class SettingsDataSource { + Future> saveSettings(AppSettings appSettings) async { + try { + final localDirectoryPath = (await getApplicationSupportDirectory()).path; + final absoluteAuthFilePath = '$localDirectoryPath$settingsPath'; + + final authFile = File(absoluteAuthFilePath); + await authFile.writeAsString(_appSettingsToJson(appSettings)); + + return const Result.isSuccessful(null); + } catch (e) { + return Result.notSuccessful(Failure(message: e)); + } + } + + Future> getSettings() async { + try { + final localDirectoryPath = (await getApplicationSupportDirectory()).path; + final absoluteAuthFilePath = '$localDirectoryPath$settingsPath'; + + final authFile = File(absoluteAuthFilePath); + if (await authFile.exists()) { + final json = await authFile.readAsString(); + return _appSettingsFromJson(json); + } + + return const Result.isSuccessful(null); + } catch (e) { + return Result.notSuccessful(Failure(message: e)); + } + } + + Future> getDefaultAppSettings() async { + try { + String? defaultSavePath; + if (defaultTargetPlatform != TargetPlatform.iOS) { + final downloadsDirectoryPath = (await getDownloadsDirectory())?.path; + if (downloadsDirectoryPath != null) { + defaultSavePath = "$downloadsDirectoryPath/SpotifyDownloader"; + } + } + + defaultSavePath ??= "${(await getApplicationDocumentsDirectory()).path}/SpotifyDownloader"; + + const defaultSaveMode = 0; + + final availableLanguages = getAvailableLanguages(); + final systemLanguage = await findSystemLocale(); + + final defaultLanguage = availableLanguages.contains(systemLanguage) ? systemLanguage : 'en'; + + return Result.isSuccessful( + AppSettings(savePath: defaultSavePath, language: defaultLanguage, saveMode: defaultSaveMode)); + } catch (e) { + return Result.notSuccessful(Failure(message: e)); + } + } + + List getAvailableLanguages() { + return S.delegate.supportedLocales.where((l) => l.countryCode != null).map((l) => l.countryCode!).toList(); + } + + String _appSettingsToJson(AppSettings appSettings) { + return jsonEncode( + {'saveMode': appSettings.saveMode, 'savePath': appSettings.savePath, 'language': appSettings.language}); + } + + Result _appSettingsFromJson(String jsonData) { + final decodedData = jsonDecode(jsonData); + try { + return Result.isSuccessful(AppSettings( + saveMode: decodedData['saveMode'], savePath: decodedData['savePath'], language: decodedData['language'])); + } catch (e) { + return Result.notSuccessful(Failure(message: e)); + } + } +} diff --git a/lib/features/data/settings/models/app_settings.dart b/lib/features/data_domain/settings/data/models/app_settings.dart similarity index 58% rename from lib/features/data/settings/models/app_settings.dart rename to lib/features/data_domain/settings/data/models/app_settings.dart index cea1851..bf638c2 100644 --- a/lib/features/data/settings/models/app_settings.dart +++ b/lib/features/data_domain/settings/data/models/app_settings.dart @@ -4,9 +4,4 @@ class AppSettings { final String savePath; final int saveMode; final String language; - - static AppSettings deffault = AppSettings( - savePath: '/storage/emulated/0/Download/', - saveMode: 0, - language: 'en'); } diff --git a/lib/features/data_domain/settings/data/models/models.dart b/lib/features/data_domain/settings/data/models/models.dart new file mode 100644 index 0000000..cb251ef --- /dev/null +++ b/lib/features/data_domain/settings/data/models/models.dart @@ -0,0 +1 @@ +export 'app_settings.dart'; diff --git a/lib/features/data_domain/settings/data/repository/repository.dart b/lib/features/data_domain/settings/data/repository/repository.dart new file mode 100644 index 0000000..fab71d3 --- /dev/null +++ b/lib/features/data_domain/settings/data/repository/repository.dart @@ -0,0 +1 @@ +export 'settings_repository_impl.dart'; diff --git a/lib/features/data/settings/repository/settings_repository_impl.dart b/lib/features/data_domain/settings/data/repository/settings_repository_impl.dart similarity index 63% rename from lib/features/data/settings/repository/settings_repository_impl.dart rename to lib/features/data_domain/settings/data/repository/settings_repository_impl.dart index e5a96f0..2c66338 100644 --- a/lib/features/data/settings/repository/settings_repository_impl.dart +++ b/lib/features/data_domain/settings/data/repository/settings_repository_impl.dart @@ -1,11 +1,5 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/settings/data_source/settings_data_source.dart'; -import 'package:spotify_downloader/features/data/settings/models/app_settings.dart'; -import 'package:spotify_downloader/features/domain/settings/enitities/download_tracks_settings.dart'; -import 'package:spotify_downloader/features/domain/settings/enitities/save_mode.dart'; -import 'package:spotify_downloader/features/domain/settings/repository/download_tracks_settings_repository.dart'; -import 'package:spotify_downloader/features/domain/settings/repository/language_settings_repository.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/settings/settings.dart'; class SettingsRepositoryImpl implements DownloadTracksSettingsRepository, LanguageSettingsRepository { SettingsRepositoryImpl({required SettingsDataSource settingsDataSource}) : _settingsDataSource = settingsDataSource; @@ -63,30 +57,36 @@ class SettingsRepositoryImpl implements DownloadTracksSettingsRepository, Langua } Future> _getSettings() async { - if (_currentSettings == null) { - final getSettingsResult = await _settingsDataSource.getSettings(); - if (getSettingsResult.isSuccessful) { - if (getSettingsResult.result != null) { - _currentSettings = getSettingsResult.result; - } else { - _currentSettings = AppSettings.deffault; - } - } else { - return Result.notSuccessful(getSettingsResult.failure); - } + if (_currentSettings != null) { + return Result.isSuccessful(_currentSettings); } - return Result.isSuccessful(_currentSettings); + final getSettingsResult = await _settingsDataSource.getSettings(); + if (!getSettingsResult.isSuccessful) { + return Result.notSuccessful(getSettingsResult.failure); + } + + if (getSettingsResult.result != null) { + _currentSettings = getSettingsResult.result; + return Result.isSuccessful(_currentSettings!); + } + + final getDefaultSettingsResult = await _settingsDataSource.getDefaultAppSettings(); + if (!getDefaultSettingsResult.isSuccessful) { + return Result.notSuccessful(getDefaultSettingsResult.failure); + } + + _currentSettings = getDefaultSettingsResult.result!; + return Result.isSuccessful(getDefaultSettingsResult.result!); } Future> _saveSettings(AppSettings newSettings) async { _currentSettings = newSettings; - await _settingsDataSource.saveSettings(newSettings); - return const Result.isSuccessful(null); + return _settingsDataSource.saveSettings(newSettings); } @override Future>> getAvailableLanguage() async { - return const Result.isSuccessful(['en', 'ru']); + return Result.isSuccessful(_settingsDataSource.getAvailableLanguages()); } } diff --git a/lib/features/data_domain/settings/domain/domain.dart b/lib/features/data_domain/settings/domain/domain.dart new file mode 100644 index 0000000..31ef55f --- /dev/null +++ b/lib/features/data_domain/settings/domain/domain.dart @@ -0,0 +1,3 @@ +export 'enitities/enitities.dart'; +export 'repository/repository.dart'; +export 'use_cases/use_cases.dart'; diff --git a/lib/features/domain/settings/enitities/download_tracks_settings.dart b/lib/features/data_domain/settings/domain/enitities/download_tracks_settings.dart similarity index 74% rename from lib/features/domain/settings/enitities/download_tracks_settings.dart rename to lib/features/data_domain/settings/domain/enitities/download_tracks_settings.dart index adb4810..ace143c 100644 --- a/lib/features/domain/settings/enitities/download_tracks_settings.dart +++ b/lib/features/data_domain/settings/domain/enitities/download_tracks_settings.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:spotify_downloader/features/domain/settings/enitities/save_mode.dart'; +import 'package:spotify_downloader/features/data_domain/settings/domain/enitities/save_mode.dart'; class DownloadTracksSettings extends Equatable { const DownloadTracksSettings({required this.savePath, required this.saveMode}); diff --git a/lib/features/data_domain/settings/domain/enitities/enitities.dart b/lib/features/data_domain/settings/domain/enitities/enitities.dart new file mode 100644 index 0000000..94aaf7a --- /dev/null +++ b/lib/features/data_domain/settings/domain/enitities/enitities.dart @@ -0,0 +1,2 @@ +export 'download_tracks_settings.dart'; +export 'save_mode.dart'; diff --git a/lib/features/domain/settings/enitities/save_mode.dart b/lib/features/data_domain/settings/domain/enitities/save_mode.dart similarity index 100% rename from lib/features/domain/settings/enitities/save_mode.dart rename to lib/features/data_domain/settings/domain/enitities/save_mode.dart diff --git a/lib/features/domain/settings/repository/download_tracks_settings_repository.dart b/lib/features/data_domain/settings/domain/repository/download_tracks_settings_repository.dart similarity index 50% rename from lib/features/domain/settings/repository/download_tracks_settings_repository.dart rename to lib/features/data_domain/settings/domain/repository/download_tracks_settings_repository.dart index 3cab120..d04ee7f 100644 --- a/lib/features/domain/settings/repository/download_tracks_settings_repository.dart +++ b/lib/features/data_domain/settings/domain/repository/download_tracks_settings_repository.dart @@ -1,6 +1,5 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/settings/enitities/download_tracks_settings.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/settings/domain/enitities/enitities.dart'; abstract class DownloadTracksSettingsRepository { Future> getDownloadTracksSettings(); diff --git a/lib/features/domain/settings/repository/language_settings_repository.dart b/lib/features/data_domain/settings/domain/repository/language_settings_repository.dart similarity index 62% rename from lib/features/domain/settings/repository/language_settings_repository.dart rename to lib/features/data_domain/settings/domain/repository/language_settings_repository.dart index d14b163..c45240f 100644 --- a/lib/features/domain/settings/repository/language_settings_repository.dart +++ b/lib/features/data_domain/settings/domain/repository/language_settings_repository.dart @@ -1,5 +1,4 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; abstract class LanguageSettingsRepository { Future> getLanguage(); diff --git a/lib/features/data_domain/settings/domain/repository/repository.dart b/lib/features/data_domain/settings/domain/repository/repository.dart new file mode 100644 index 0000000..15badc8 --- /dev/null +++ b/lib/features/data_domain/settings/domain/repository/repository.dart @@ -0,0 +1,2 @@ +export 'download_tracks_settings_repository.dart'; +export 'language_settings_repository.dart'; diff --git a/lib/features/domain/settings/use_cases/get_available_languages.dart b/lib/features/data_domain/settings/domain/use_cases/get_available_languages.dart similarity index 59% rename from lib/features/domain/settings/use_cases/get_available_languages.dart rename to lib/features/data_domain/settings/domain/use_cases/get_available_languages.dart index 8774c3b..cf40a27 100644 --- a/lib/features/domain/settings/use_cases/get_available_languages.dart +++ b/lib/features/data_domain/settings/domain/use_cases/get_available_languages.dart @@ -1,7 +1,5 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/settings/repository/language_settings_repository.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/settings/domain/repository/repository.dart'; class GetAvailableLanguages implements UseCase, void> { GetAvailableLanguages({required LanguageSettingsRepository languageSettingsRepository}) diff --git a/lib/features/domain/settings/use_cases/get_download_tracks_settings.dart b/lib/features/data_domain/settings/domain/use_cases/get_download_tracks_settings.dart similarity index 55% rename from lib/features/domain/settings/use_cases/get_download_tracks_settings.dart rename to lib/features/data_domain/settings/domain/use_cases/get_download_tracks_settings.dart index 086a1f9..51e1a0a 100644 --- a/lib/features/domain/settings/use_cases/get_download_tracks_settings.dart +++ b/lib/features/data_domain/settings/domain/use_cases/get_download_tracks_settings.dart @@ -1,8 +1,5 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/settings/enitities/download_tracks_settings.dart'; -import 'package:spotify_downloader/features/domain/settings/repository/download_tracks_settings_repository.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/settings/domain/domain.dart'; class GetDownloadTracksSettings implements UseCase { GetDownloadTracksSettings({required DownloadTracksSettingsRepository downloadTracksSettingsRepository}) diff --git a/lib/features/domain/settings/use_cases/get_language.dart b/lib/features/data_domain/settings/domain/use_cases/get_language.dart similarity index 56% rename from lib/features/domain/settings/use_cases/get_language.dart rename to lib/features/data_domain/settings/domain/use_cases/get_language.dart index df6b63e..36a5ddb 100644 --- a/lib/features/domain/settings/use_cases/get_language.dart +++ b/lib/features/data_domain/settings/domain/use_cases/get_language.dart @@ -1,7 +1,5 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/settings/repository/language_settings_repository.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/settings/domain/domain.dart'; class GetLanguage implements UseCase { GetLanguage({required LanguageSettingsRepository languageSettingsRepository}) diff --git a/lib/features/domain/settings/use_cases/save_download_tracks_setting.dart b/lib/features/data_domain/settings/domain/use_cases/save_download_tracks_setting.dart similarity index 57% rename from lib/features/domain/settings/use_cases/save_download_tracks_setting.dart rename to lib/features/data_domain/settings/domain/use_cases/save_download_tracks_setting.dart index 9da8123..ef06b67 100644 --- a/lib/features/domain/settings/use_cases/save_download_tracks_setting.dart +++ b/lib/features/data_domain/settings/domain/use_cases/save_download_tracks_setting.dart @@ -1,8 +1,5 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/settings/enitities/download_tracks_settings.dart'; -import 'package:spotify_downloader/features/domain/settings/repository/download_tracks_settings_repository.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/settings/domain/domain.dart'; class SaveDownloadTracksSettings implements UseCase { SaveDownloadTracksSettings({required DownloadTracksSettingsRepository downloadTracksSettingsRepository}) diff --git a/lib/features/domain/settings/use_cases/save_language.dart b/lib/features/data_domain/settings/domain/use_cases/save_language.dart similarity index 57% rename from lib/features/domain/settings/use_cases/save_language.dart rename to lib/features/data_domain/settings/domain/use_cases/save_language.dart index 741ed12..2dbd756 100644 --- a/lib/features/domain/settings/use_cases/save_language.dart +++ b/lib/features/data_domain/settings/domain/use_cases/save_language.dart @@ -1,7 +1,5 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/settings/repository/language_settings_repository.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/settings/domain/domain.dart'; class SaveLanguage implements UseCase { SaveLanguage({required LanguageSettingsRepository languageSettingsRepository}) diff --git a/lib/features/data_domain/settings/domain/use_cases/use_cases.dart b/lib/features/data_domain/settings/domain/use_cases/use_cases.dart new file mode 100644 index 0000000..016cac4 --- /dev/null +++ b/lib/features/data_domain/settings/domain/use_cases/use_cases.dart @@ -0,0 +1,5 @@ +export 'get_available_languages.dart'; +export 'get_download_tracks_settings.dart'; +export 'get_language.dart'; +export 'save_download_tracks_setting.dart'; +export 'save_language.dart'; diff --git a/lib/features/data_domain/settings/settings.dart b/lib/features/data_domain/settings/settings.dart new file mode 100644 index 0000000..c2ecb87 --- /dev/null +++ b/lib/features/data_domain/settings/settings.dart @@ -0,0 +1,2 @@ +export 'data/data.dart'; +export 'domain/domain.dart'; diff --git a/lib/features/data/shared/converters/spotify_credentials_converter.dart b/lib/features/data_domain/shared/data/converters/spotify_credentials_converter.dart similarity index 84% rename from lib/features/data/shared/converters/spotify_credentials_converter.dart rename to lib/features/data_domain/shared/data/converters/spotify_credentials_converter.dart index 36349ce..bdd25c0 100644 --- a/lib/features/data/shared/converters/spotify_credentials_converter.dart +++ b/lib/features/data_domain/shared/data/converters/spotify_credentials_converter.dart @@ -1,7 +1,7 @@ import 'package:spotify/spotify.dart'; import 'package:spotify_downloader/core/consts/spotify_client.dart'; -import 'package:spotify_downloader/core/util/converters/simple_converters/value_converter.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/full_credentials.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/auth/shared/shared.dart'; class SpotifyCredentialsConverter implements ValueConverter { diff --git a/lib/features/data/shared/converters/spotify_requests_converter.dart b/lib/features/data_domain/shared/data/converters/spotify_requests_converter.dart similarity index 65% rename from lib/features/data/shared/converters/spotify_requests_converter.dart rename to lib/features/data_domain/shared/data/converters/spotify_requests_converter.dart index 09a383c..0a23009 100644 --- a/lib/features/data/shared/converters/spotify_requests_converter.dart +++ b/lib/features/data_domain/shared/data/converters/spotify_requests_converter.dart @@ -1,7 +1,7 @@ -import 'package:spotify_downloader/core/util/converters/simple_converters/value_converter.dart'; -import 'package:spotify_downloader/features/data/shared/spotify_api_request.dart'; -import 'package:spotify_downloader/features/data/shared/converters/spotify_credentials_converter.dart'; -import 'package:spotify_downloader/features/domain/shared/spotify_repository_request.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/shared/data/converters/spotify_credentials_converter.dart'; +import 'package:spotify_downloader/features/data_domain/shared/data/spotify_api_request.dart'; +import 'package:spotify_downloader/features/data_domain/shared/domain/spotify_repository_request.dart'; class SpotifyRequestsConverter implements ValueConverter { final SpotifyCredentialsConverter _credentialsConverter = SpotifyCredentialsConverter(); diff --git a/lib/features/data/shared/spotify_api_request.dart b/lib/features/data_domain/shared/data/spotify_api_request.dart similarity index 100% rename from lib/features/data/shared/spotify_api_request.dart rename to lib/features/data_domain/shared/data/spotify_api_request.dart diff --git a/lib/features/domain/shared/spotify_repository_request.dart b/lib/features/data_domain/shared/domain/spotify_repository_request.dart similarity index 71% rename from lib/features/domain/shared/spotify_repository_request.dart rename to lib/features/data_domain/shared/domain/spotify_repository_request.dart index 02935c9..c36806c 100644 --- a/lib/features/domain/shared/spotify_repository_request.dart +++ b/lib/features/data_domain/shared/domain/spotify_repository_request.dart @@ -1,4 +1,4 @@ -import 'package:spotify_downloader/features/domain/auth/shared/full_credentials.dart'; +import 'package:spotify_downloader/features/data_domain/auth/shared/full_credentials.dart'; class SpotifyRepositoryRequest { SpotifyRepositoryRequest({ diff --git a/lib/features/data_domain/spotify_profile/data/data.dart b/lib/features/data_domain/spotify_profile/data/data.dart new file mode 100644 index 0000000..ca62995 --- /dev/null +++ b/lib/features/data_domain/spotify_profile/data/data.dart @@ -0,0 +1,2 @@ +export 'data_source/data_source.dart'; +export 'repository/repository.dart'; diff --git a/lib/features/data_domain/spotify_profile/data/data_source/data_source.dart b/lib/features/data_domain/spotify_profile/data/data_source/data_source.dart new file mode 100644 index 0000000..2161a41 --- /dev/null +++ b/lib/features/data_domain/spotify_profile/data/data_source/data_source.dart @@ -0,0 +1 @@ +export 'spotify_profile_data_source.dart'; diff --git a/lib/features/data/spotify_profile/data_source/spotify_profile_data_source.dart b/lib/features/data_domain/spotify_profile/data/data_source/spotify_profile_data_source.dart similarity index 66% rename from lib/features/data/spotify_profile/data_source/spotify_profile_data_source.dart rename to lib/features/data_domain/spotify_profile/data/data_source/spotify_profile_data_source.dart index 8234181..c849204 100644 --- a/lib/features/data/spotify_profile/data_source/spotify_profile_data_source.dart +++ b/lib/features/data_domain/spotify_profile/data/data_source/spotify_profile_data_source.dart @@ -1,8 +1,6 @@ import 'package:spotify/spotify.dart'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/util_methods.dart'; -import 'package:spotify_downloader/features/data/shared/spotify_api_request.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/shared/data/spotify_api_request.dart'; class SpotifyProfileDataSource { Future> getSpotifyProfile(SpotifyApiRequest spotifyApiRequest) async { diff --git a/lib/features/data_domain/spotify_profile/data/repository/repository.dart b/lib/features/data_domain/spotify_profile/data/repository/repository.dart new file mode 100644 index 0000000..b1147c1 --- /dev/null +++ b/lib/features/data_domain/spotify_profile/data/repository/repository.dart @@ -0,0 +1 @@ +export 'spotify_profile_repository_impl.dart'; diff --git a/lib/features/data/spotify_profile/repository/spotify_profile_repository_impl.dart b/lib/features/data_domain/spotify_profile/data/repository/spotify_profile_repository_impl.dart similarity index 55% rename from lib/features/data/spotify_profile/repository/spotify_profile_repository_impl.dart rename to lib/features/data_domain/spotify_profile/data/repository/spotify_profile_repository_impl.dart index b7fe0aa..bced286 100644 --- a/lib/features/data/spotify_profile/repository/spotify_profile_repository_impl.dart +++ b/lib/features/data_domain/spotify_profile/data/repository/spotify_profile_repository_impl.dart @@ -1,10 +1,7 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/shared/converters/spotify_requests_converter.dart'; -import 'package:spotify_downloader/features/data/spotify_profile/data_source/spotify_profile_data_source.dart'; -import 'package:spotify_downloader/features/domain/shared/spotify_repository_request.dart'; -import 'package:spotify_downloader/features/domain/spotify_profile/entities/spotify_profile.dart'; -import 'package:spotify_downloader/features/domain/spotify_profile/repository/spotify_profile_repostitory.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/shared/data/converters/spotify_requests_converter.dart'; +import 'package:spotify_downloader/features/data_domain/shared/domain/spotify_repository_request.dart'; +import 'package:spotify_downloader/features/data_domain/spotify_profile/spotify_profile.dart'; class SpotifyProfileRepositoryImpl implements SpotifyProfileRepository { SpotifyProfileRepositoryImpl({required SpotifyProfileDataSource dataSource}) : _dataSource = dataSource; diff --git a/lib/features/data_domain/spotify_profile/domain/domain.dart b/lib/features/data_domain/spotify_profile/domain/domain.dart new file mode 100644 index 0000000..7eb32eb --- /dev/null +++ b/lib/features/data_domain/spotify_profile/domain/domain.dart @@ -0,0 +1,4 @@ +export 'entities/entities.dart'; +export 'repository/repository.dart'; +export 'service/service.dart'; +export 'use_cases/use_cases.dart'; diff --git a/lib/features/data_domain/spotify_profile/domain/entities/entities.dart b/lib/features/data_domain/spotify_profile/domain/entities/entities.dart new file mode 100644 index 0000000..7232506 --- /dev/null +++ b/lib/features/data_domain/spotify_profile/domain/entities/entities.dart @@ -0,0 +1 @@ +export 'spotify_profile.dart'; diff --git a/lib/features/domain/spotify_profile/entities/spotify_profile.dart b/lib/features/data_domain/spotify_profile/domain/entities/spotify_profile.dart similarity index 100% rename from lib/features/domain/spotify_profile/entities/spotify_profile.dart rename to lib/features/data_domain/spotify_profile/domain/entities/spotify_profile.dart diff --git a/lib/features/data_domain/spotify_profile/domain/repository/repository.dart b/lib/features/data_domain/spotify_profile/domain/repository/repository.dart new file mode 100644 index 0000000..30ac8c9 --- /dev/null +++ b/lib/features/data_domain/spotify_profile/domain/repository/repository.dart @@ -0,0 +1 @@ +export 'spotify_profile_repostitory.dart'; diff --git a/lib/features/data_domain/spotify_profile/domain/repository/spotify_profile_repostitory.dart b/lib/features/data_domain/spotify_profile/domain/repository/spotify_profile_repostitory.dart new file mode 100644 index 0000000..8b8fd68 --- /dev/null +++ b/lib/features/data_domain/spotify_profile/domain/repository/spotify_profile_repostitory.dart @@ -0,0 +1,7 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/shared/domain/spotify_repository_request.dart'; +import 'package:spotify_downloader/features/data_domain/spotify_profile/domain/domain.dart'; + +abstract class SpotifyProfileRepository { + Future> getSpotifyProfile(SpotifyRepositoryRequest spotifyClientRequest); +} \ No newline at end of file diff --git a/lib/features/data_domain/spotify_profile/domain/service/service.dart b/lib/features/data_domain/spotify_profile/domain/service/service.dart new file mode 100644 index 0000000..533345e --- /dev/null +++ b/lib/features/data_domain/spotify_profile/domain/service/service.dart @@ -0,0 +1,2 @@ +export 'spotify_profile_service.dart'; +export 'spotify_profile_service_impl.dart'; diff --git a/lib/features/data_domain/spotify_profile/domain/service/spotify_profile_service.dart b/lib/features/data_domain/spotify_profile/domain/service/spotify_profile_service.dart new file mode 100644 index 0000000..25fbfbf --- /dev/null +++ b/lib/features/data_domain/spotify_profile/domain/service/spotify_profile_service.dart @@ -0,0 +1,6 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/spotify_profile/domain/domain.dart'; + +abstract class SpotifyProfileService { + Future> getSpotifyProfile(); +} \ No newline at end of file diff --git a/lib/features/domain/spotify_profile/service/spotify_profile_service_impl.dart b/lib/features/data_domain/spotify_profile/domain/service/spotify_profile_service_impl.dart similarity index 61% rename from lib/features/domain/spotify_profile/service/spotify_profile_service_impl.dart rename to lib/features/data_domain/spotify_profile/domain/service/spotify_profile_service_impl.dart index 7004c4f..73a09ec 100644 --- a/lib/features/domain/spotify_profile/service/spotify_profile_service_impl.dart +++ b/lib/features/data_domain/spotify_profile/domain/service/spotify_profile_service_impl.dart @@ -1,11 +1,7 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/failures/failures.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/repositories/local_full_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/shared/spotify_repository_request.dart'; -import 'package:spotify_downloader/features/domain/spotify_profile/entities/spotify_profile.dart'; -import 'package:spotify_downloader/features/domain/spotify_profile/repository/spotify_profile_repostitory.dart'; -import 'package:spotify_downloader/features/domain/spotify_profile/service/spotify_profile_service.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/auth/local_auth/domain/repositories/local_full_auth_repository.dart'; +import 'package:spotify_downloader/features/data_domain/shared/domain/spotify_repository_request.dart'; +import 'package:spotify_downloader/features/data_domain/spotify_profile/domain/domain.dart'; class SpotifyProfileServiceImpl extends SpotifyProfileService { SpotifyProfileServiceImpl( diff --git a/lib/features/data_domain/spotify_profile/domain/use_cases/get_spotify_profile.dart b/lib/features/data_domain/spotify_profile/domain/use_cases/get_spotify_profile.dart new file mode 100644 index 0000000..0820d2a --- /dev/null +++ b/lib/features/data_domain/spotify_profile/domain/use_cases/get_spotify_profile.dart @@ -0,0 +1,14 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/spotify_profile/domain/domain.dart'; + +class GetSpotifyProfile implements UseCase { + GetSpotifyProfile({required SpotifyProfileService spotifyProfileService}) + : _spotifyProfileService = spotifyProfileService; + + final SpotifyProfileService _spotifyProfileService; + + @override + Future> call(void params) async { + return _spotifyProfileService.getSpotifyProfile(); + } +} diff --git a/lib/features/data_domain/spotify_profile/domain/use_cases/use_cases.dart b/lib/features/data_domain/spotify_profile/domain/use_cases/use_cases.dart new file mode 100644 index 0000000..cc8b410 --- /dev/null +++ b/lib/features/data_domain/spotify_profile/domain/use_cases/use_cases.dart @@ -0,0 +1 @@ +export 'get_spotify_profile.dart'; diff --git a/lib/features/data_domain/spotify_profile/spotify_profile.dart b/lib/features/data_domain/spotify_profile/spotify_profile.dart new file mode 100644 index 0000000..c2ecb87 --- /dev/null +++ b/lib/features/data_domain/spotify_profile/spotify_profile.dart @@ -0,0 +1,2 @@ +export 'data/data.dart'; +export 'domain/domain.dart'; diff --git a/lib/features/data_domain/tracks/download_tracks/data/data.dart b/lib/features/data_domain/tracks/download_tracks/data/data.dart new file mode 100644 index 0000000..0b6f309 --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/data/data.dart @@ -0,0 +1,3 @@ +export 'data_sources/data_sources.dart'; +export 'models/models.dart'; +export 'repositories/repositories.dart'; diff --git a/lib/features/data_domain/tracks/download_tracks/data/data_sources/data_sources.dart b/lib/features/data_domain/tracks/download_tracks/data/data_sources/data_sources.dart new file mode 100644 index 0000000..4ab1b86 --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/data/data_sources/data_sources.dart @@ -0,0 +1 @@ +export 'dowload_audio_from_youtube_data_source.dart'; diff --git a/lib/features/data_domain/tracks/download_tracks/data/data_sources/dowload_audio_from_youtube_data_source.dart b/lib/features/data_domain/tracks/download_tracks/data/data_sources/dowload_audio_from_youtube_data_source.dart new file mode 100644 index 0000000..30e7288 --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/data/data_sources/dowload_audio_from_youtube_data_source.dart @@ -0,0 +1,305 @@ +import 'dart:async'; +import 'dart:ffi'; +import 'dart:io'; +import 'dart:isolate'; + +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:http/http.dart'; +import 'package:path/path.dart' as p; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/data/data.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/data/data_sources/tools/tools.dart'; +import 'package:youtube_explode_dart/youtube_explode_dart.dart'; + +class DownloadAudioFromYoutubeDataSource { + DownloadAudioFromYoutubeDataSource( + {required AudioMetadataEditor audioMetadataEditor, required FileToMp3Converter fileToMp3Converter}) + : _audioMetadataEditor = audioMetadataEditor, + _fileToMp3Converter = fileToMp3Converter; + + final AudioMetadataEditor _audioMetadataEditor; + final FileToMp3Converter _fileToMp3Converter; + + late final IsolatePool _isolatePool; + + Future init() async { + _isolatePool = await IsolatePool.create(); + } + + Future dowloadAudioFromYoutube(DownloadAudioFromYoutubeArgs args) async { + CancellationTokenSource cancellationTokenSource = CancellationTokenSource(); + final token = cancellationTokenSource.token; + + return AudioLoadingStream(streamFunction: (setLoadingPercent) async { + try { + final downloadVideoResult = await _getAndDownloadVideoFromYoutube(args, token, setLoadingPercent); + if (!downloadVideoResult.isSuccessful) { + return downloadVideoResult; + } + + final videoPath = downloadVideoResult.result!; + final audioPath = p.join(args.saveDirectoryPath, '${args.audioMetadata.name}.mp3'); + + await _convertFileToMp3(videoPath, audioPath); + + setLoadingPercent.call(95); + await File(videoPath).delete(); + + if (token.isCancelled) { + await File(audioPath).delete(); + return const CancellableResult.isCancelled(); + } + + final changeMetadataResult = + await _audioMetadataEditor.changeAudioMetadata(audioPath: audioPath, audioMetadata: args.audioMetadata); + if (!changeMetadataResult.isSuccessful) { + await File(audioPath).delete(); + return CancellableResult.notSuccessful(changeMetadataResult.failure); + } + + if (token.isCancelled) { + await File(audioPath).delete(); + return const CancellableResult.isCancelled(); + } + + setLoadingPercent.call(100); + return CancellableResult.isSuccessful(audioPath); + } catch (e) { + return CancellableResult.notSuccessful(Failure(message: e)); + } + }, cancelFunction: () { + cancellationTokenSource.cancel(); + }); + } + + Future> _getAndDownloadVideoFromYoutube( + DownloadAudioFromYoutubeArgs args, CancellationToken token, Function(double) setLoadingPercent) async { + Completer noNetworkCompleter = Completer(); + final noNetworkSub = Connectivity().onConnectivityChanged.listen((connection) { + if (connection == ConnectivityResult.none || connection == ConnectivityResult.other) { + noNetworkCompleter.complete(); + } + }); + + try { + final getDownloadStreamInfoCompute = await _isolatePool.compute(_getDownloadStreamInfo, args); + if (token.isCancelled) { + getDownloadStreamInfoCompute.cancel(); + return const CancellableResult.isCancelled(); + } else if (noNetworkCompleter.isCompleted) { + getDownloadStreamInfoCompute.cancel(); + return const CancellableResult.notSuccessful(NetworkFailure()); + } + + noNetworkCompleter = Completer(); + final tokenWhileGettingStreamSub = + token.cancelationStream.listen((event) => getDownloadStreamInfoCompute.cancel()); + final getDownloadStreamInfoResult = + await Future.any([getDownloadStreamInfoCompute.future, noNetworkCompleter.future]); + + try { + if (noNetworkCompleter.isCompleted) { + getDownloadStreamInfoCompute.cancel(); + return const CancellableResult.notSuccessful(NetworkFailure()); + } + + if (getDownloadStreamInfoResult.isCancelled) { + return const CancellableResult.isCancelled(); + } else if (!getDownloadStreamInfoResult.isSuccessful) { + return CancellableResult.notSuccessful(getDownloadStreamInfoResult.failure); + } + } finally { + tokenWhileGettingStreamSub.cancel(); + } + + final downloadStreamInfo = getDownloadStreamInfoResult.result! as AudioOnlyStreamInfo; + + //--------------------------------------------------------------------------------- + + final videoPath = + p.join(args.saveDirectoryPath, '${args.audioMetadata.name}.${downloadStreamInfo.container.name}'); + + await Directory(args.saveDirectoryPath).create(recursive: true); + + final downloadVideoStream = await _isolatePool + .add<(AudioOnlyStreamInfo, String)>(_downloadVideoFromYoutubeInIsolate, (downloadStreamInfo, videoPath)); + if (token.isCancelled) { + downloadVideoStream.cancel(); + return const CancellableResult.isCancelled(); + } else if (noNetworkCompleter.isCompleted) { + downloadVideoStream.cancel(); + return const CancellableResult.notSuccessful(NetworkFailure()); + } + + noNetworkCompleter = Completer(); + final tokenWhileDownloadVideoSub = token.cancelationStream.listen((event) => downloadVideoStream.cancel()); + final downloadVideoResult = + await Future.any([_handleDownloadStream(downloadVideoStream, setLoadingPercent), noNetworkCompleter.future]); + + try { + if (noNetworkCompleter.isCompleted) { + downloadVideoStream.cancel(); + return const CancellableResult.notSuccessful(NetworkFailure()); + } + + if (downloadVideoResult.isCancelled) { + return const CancellableResult.isCancelled(); + } else if (!downloadVideoResult.isSuccessful) { + return CancellableResult.notSuccessful(downloadVideoResult.failure); + } + } finally { + tokenWhileDownloadVideoSub.cancel(); + } + + return CancellableResult.isSuccessful(videoPath); + } finally { + noNetworkSub.cancel(); + } + } + + Future> _getDownloadStreamInfo( + DownloadAudioFromYoutubeArgs args, CancellationToken token) async { + final yt = YoutubeExplode(); + if (token.isCancelled) return const CancellableResult.isCancelled(); + + late final Video video; + late final AudioOnlyStreamInfo downloadStreamInfo; + + try { + video = await yt.videos.get(VideoId.parseVideoId(args.youtubeUrl)); + if (token.isCancelled) return const CancellableResult.isCancelled(); + + final manifest = await yt.videos.streamsClient.getManifest(video.id); + if (token.isCancelled) return const CancellableResult.isCancelled(); + + downloadStreamInfo = manifest.audioOnly.withHighestBitrate(); + return CancellableResult.isSuccessful(downloadStreamInfo); + } catch (e) { + if (e is ClientException || e is SocketException) { + return const CancellableResult.notSuccessful(NetworkFailure()); + } + + if (e is ArgumentError) { + return CancellableResult.notSuccessful( + NotFoundFailure(message: 'video with this url not found: ${args.youtubeUrl}')); + } + + return CancellableResult.notSuccessful(Failure(message: e)); + } finally { + yt.close(); + } + } + + Future _downloadVideoFromYoutubeInIsolate( + SendPort sendPort, (AudioOnlyStreamInfo, String) params, CancellationToken token) async { + final downloadStreamInfo = params.$1; + final savePath = params.$2; + + YoutubeExplode? yt; + StreamSubscription>? downloadStreamListener; + IOSink? videoFileStream; + + try { + yt = YoutubeExplode(); + final downloadStream = yt.videos.streamsClient.get(downloadStreamInfo); + final videoFile = File(savePath); + + if (await videoFile.exists()) { + await videoFile.delete(); + } + + await videoFile.create(); + videoFileStream = videoFile.openWrite(); + + final videoFileSize = downloadStreamInfo.size.totalBytes; + int loadedBytesCount = 0; + + double previousSendedPercent = 0; + + final cancellationTokenCompleter = Completer(); + final failureCompleter = Completer(); + + downloadStreamListener = downloadStream.listen((chunk) async { + if (token.isCancelled) { + if (!cancellationTokenCompleter.isCompleted) { + cancellationTokenCompleter.complete(null); + } + return; + } + + try { + videoFileStream!.add(chunk); + } catch (e) { + if (!failureCompleter.isCompleted) { + failureCompleter.complete(Failure(message: e)); + } + } + + loadedBytesCount += chunk.length; + + final percent = (loadedBytesCount / videoFileSize) * 90; + if (percent - previousSendedPercent >= 2 || percent > 90 - 1) { + sendPort.send(percent); + previousSendedPercent = percent; + } + }) + ..onError((e) { + if (!failureCompleter.isCompleted) { + failureCompleter.complete(Failure(message: e)); + } + }); + + Failure failure = const Failure(message: ''); + + await Future.any( + [downloadStreamListener.asFuture(), cancellationTokenCompleter.future, failureCompleter.future]); + + if (failureCompleter.isCompleted) { + sendPort.send(CancellableResult.notSuccessful(failure)); + return; + } + + if (cancellationTokenCompleter.isCompleted) { + await videoFile.delete(); + sendPort.send(const CancellableResult.isCancelled()); + return; + } + + sendPort.send(const CancellableResult.isSuccessful(null)); + } catch (e) { + sendPort.send(CancellableResult.notSuccessful(Failure(message: e))); + } finally { + yt?.close(); + downloadStreamListener?.cancel(); + await videoFileStream?.flush(); + await videoFileStream?.close(); + } + } + + Future _handleDownloadStream( + CancellableStream downloadVideoStream, Function(double) setLoadingPercent) async { + final downloadVideoCompleter = Completer(); + + final downloadVideoStreamSub = downloadVideoStream.stream.listen((event) { + if (event is double) { + setLoadingPercent(event); + } + + if (event is CancellableResult) { + downloadVideoCompleter.complete(event); + } + }); + + final result = await downloadVideoCompleter.future; + downloadVideoStreamSub.cancel(); + return result; + } + + Future _convertFileToMp3(String rawPath, String audioPath) async { + final audioFile = File(audioPath); + if (await audioFile.exists()) { + await audioFile.delete(); + } + await _fileToMp3Converter.convertFileToMp3(rawPath, audioPath); + } +} diff --git a/lib/features/data_domain/tracks/download_tracks/data/data_sources/tools/audio_metadata_editor/audio_metadata_editor.dart b/lib/features/data_domain/tracks/download_tracks/data/data_sources/tools/audio_metadata_editor/audio_metadata_editor.dart new file mode 100644 index 0000000..43754ae --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/data/data_sources/tools/audio_metadata_editor/audio_metadata_editor.dart @@ -0,0 +1,7 @@ +import 'package:spotify_downloader/core/utils/failures/failure.dart'; +import 'package:spotify_downloader/core/utils/result/result.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/data/models/metadata/audio_metadata.dart'; + +abstract class AudioMetadataEditor { + Future> changeAudioMetadata({required String audioPath, required AudioMetadata audioMetadata}); +} \ No newline at end of file diff --git a/lib/features/data/tracks/dowload_tracks/data_sources/tools/audio_metadata_editor/audio_metadata_editor_impl.dart b/lib/features/data_domain/tracks/download_tracks/data/data_sources/tools/audio_metadata_editor/audio_metadata_editor_impl.dart similarity index 75% rename from lib/features/data/tracks/dowload_tracks/data_sources/tools/audio_metadata_editor/audio_metadata_editor_impl.dart rename to lib/features/data_domain/tracks/download_tracks/data/data_sources/tools/audio_metadata_editor/audio_metadata_editor_impl.dart index b206513..dd0b27d 100644 --- a/lib/features/data/tracks/dowload_tracks/data_sources/tools/audio_metadata_editor/audio_metadata_editor_impl.dart +++ b/lib/features/data_domain/tracks/download_tracks/data/data_sources/tools/audio_metadata_editor/audio_metadata_editor_impl.dart @@ -2,11 +2,9 @@ import 'dart:io'; import 'dart:typed_data'; import 'package:metadata_god/metadata_god.dart'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/failures/failures.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/data_sources/tools/audio_metadata_editor/audio_metadata_editor.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/models/metadata/audio_metadata.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/data/data_sources/tools/audio_metadata_editor/audio_metadata_editor.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/data/models/metadata/audio_metadata.dart'; import 'package:http/http.dart' as http; class AudioMetadataEditorImpl implements AudioMetadataEditor { diff --git a/lib/features/data/tracks/dowload_tracks/data_sources/tools/file_to_mp3_converter/ffmpeg_file_to_mp3_converter.dart b/lib/features/data_domain/tracks/download_tracks/data/data_sources/tools/file_to_mp3_converter/ffmpeg_file_to_mp3_converter.dart similarity index 65% rename from lib/features/data/tracks/dowload_tracks/data_sources/tools/file_to_mp3_converter/ffmpeg_file_to_mp3_converter.dart rename to lib/features/data_domain/tracks/download_tracks/data/data_sources/tools/file_to_mp3_converter/ffmpeg_file_to_mp3_converter.dart index 9ae97d2..475349f 100644 --- a/lib/features/data/tracks/dowload_tracks/data_sources/tools/file_to_mp3_converter/ffmpeg_file_to_mp3_converter.dart +++ b/lib/features/data_domain/tracks/download_tracks/data/data_sources/tools/file_to_mp3_converter/ffmpeg_file_to_mp3_converter.dart @@ -1,5 +1,5 @@ import 'package:ffmpeg_kit_flutter_full/ffmpeg_kit.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/data_sources/tools/file_to_mp3_converter/file_to_mp3_converter.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/data/data_sources/tools/file_to_mp3_converter/file_to_mp3_converter.dart'; class FFmpegFileToMp3Converter implements FileToMp3Converter { @override diff --git a/lib/features/data/tracks/dowload_tracks/data_sources/tools/file_to_mp3_converter/file_to_mp3_converter.dart b/lib/features/data_domain/tracks/download_tracks/data/data_sources/tools/file_to_mp3_converter/file_to_mp3_converter.dart similarity index 100% rename from lib/features/data/tracks/dowload_tracks/data_sources/tools/file_to_mp3_converter/file_to_mp3_converter.dart rename to lib/features/data_domain/tracks/download_tracks/data/data_sources/tools/file_to_mp3_converter/file_to_mp3_converter.dart diff --git a/lib/features/data_domain/tracks/download_tracks/data/data_sources/tools/tools.dart b/lib/features/data_domain/tracks/download_tracks/data/data_sources/tools/tools.dart new file mode 100644 index 0000000..6cca6c1 --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/data/data_sources/tools/tools.dart @@ -0,0 +1,4 @@ +export 'audio_metadata_editor/audio_metadata_editor.dart'; +export 'audio_metadata_editor/audio_metadata_editor_impl.dart'; +export 'file_to_mp3_converter/ffmpeg_file_to_mp3_converter.dart'; +export 'file_to_mp3_converter/file_to_mp3_converter.dart'; \ No newline at end of file diff --git a/lib/features/data/tracks/dowload_tracks/models/dowload_audio_from_youtube_args.dart b/lib/features/data_domain/tracks/download_tracks/data/models/dowload_audio_from_youtube_args.dart similarity index 72% rename from lib/features/data/tracks/dowload_tracks/models/dowload_audio_from_youtube_args.dart rename to lib/features/data_domain/tracks/download_tracks/data/models/dowload_audio_from_youtube_args.dart index 1fd4070..d5743bf 100644 --- a/lib/features/data/tracks/dowload_tracks/models/dowload_audio_from_youtube_args.dart +++ b/lib/features/data_domain/tracks/download_tracks/data/models/dowload_audio_from_youtube_args.dart @@ -1,4 +1,4 @@ -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/models/metadata/audio_metadata.dart'; +import 'metadata/audio_metadata.dart'; class DownloadAudioFromYoutubeArgs { DownloadAudioFromYoutubeArgs({ diff --git a/lib/features/data/tracks/dowload_tracks/models/loading_stream/audio_loading_stream.dart b/lib/features/data_domain/tracks/download_tracks/data/models/loading_stream/audio_loading_stream.dart similarity index 86% rename from lib/features/data/tracks/dowload_tracks/models/loading_stream/audio_loading_stream.dart rename to lib/features/data_domain/tracks/download_tracks/data/models/loading_stream/audio_loading_stream.dart index 85ec37a..5253aa6 100644 --- a/lib/features/data/tracks/dowload_tracks/models/loading_stream/audio_loading_stream.dart +++ b/lib/features/data_domain/tracks/download_tracks/data/models/loading_stream/audio_loading_stream.dart @@ -1,6 +1,6 @@ import 'dart:math'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/cancellable_result.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; + class AudioLoadingStream { AudioLoadingStream( diff --git a/lib/features/data_domain/tracks/download_tracks/data/models/loading_stream/loading_stream.dart b/lib/features/data_domain/tracks/download_tracks/data/models/loading_stream/loading_stream.dart new file mode 100644 index 0000000..f3a0f6d --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/data/models/loading_stream/loading_stream.dart @@ -0,0 +1 @@ +export 'audio_loading_stream.dart'; diff --git a/lib/features/data/tracks/dowload_tracks/models/metadata/album_metadata.dart b/lib/features/data_domain/tracks/download_tracks/data/models/metadata/album_metadata.dart similarity index 100% rename from lib/features/data/tracks/dowload_tracks/models/metadata/album_metadata.dart rename to lib/features/data_domain/tracks/download_tracks/data/models/metadata/album_metadata.dart diff --git a/lib/features/data/tracks/dowload_tracks/models/metadata/audio_metadata.dart b/lib/features/data_domain/tracks/download_tracks/data/models/metadata/audio_metadata.dart similarity index 100% rename from lib/features/data/tracks/dowload_tracks/models/metadata/audio_metadata.dart rename to lib/features/data_domain/tracks/download_tracks/data/models/metadata/audio_metadata.dart diff --git a/lib/features/data_domain/tracks/download_tracks/data/models/metadata/metadata.dart b/lib/features/data_domain/tracks/download_tracks/data/models/metadata/metadata.dart new file mode 100644 index 0000000..68106a8 --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/data/models/metadata/metadata.dart @@ -0,0 +1,2 @@ +export 'album_metadata.dart'; +export 'audio_metadata.dart'; diff --git a/lib/features/data_domain/tracks/download_tracks/data/models/models.dart b/lib/features/data_domain/tracks/download_tracks/data/models/models.dart new file mode 100644 index 0000000..113f9ce --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/data/models/models.dart @@ -0,0 +1,3 @@ +export 'dowload_audio_from_youtube_args.dart'; +export 'loading_stream/loading_stream.dart'; +export 'metadata/metadata.dart'; diff --git a/lib/features/data_domain/tracks/download_tracks/data/repositories/converters/converters.dart b/lib/features/data_domain/tracks/download_tracks/data/repositories/converters/converters.dart new file mode 100644 index 0000000..a27596e --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/data/repositories/converters/converters.dart @@ -0,0 +1 @@ +export 'track_to_audio_metadata_converter.dart'; diff --git a/lib/features/data/tracks/dowload_tracks/repositories/converters/track_to_audio_metadata_converter.dart b/lib/features/data_domain/tracks/download_tracks/data/repositories/converters/track_to_audio_metadata_converter.dart similarity index 53% rename from lib/features/data/tracks/dowload_tracks/repositories/converters/track_to_audio_metadata_converter.dart rename to lib/features/data_domain/tracks/download_tracks/data/repositories/converters/track_to_audio_metadata_converter.dart index 0ae0576..467610b 100644 --- a/lib/features/data/tracks/dowload_tracks/repositories/converters/track_to_audio_metadata_converter.dart +++ b/lib/features/data_domain/tracks/download_tracks/data/repositories/converters/track_to_audio_metadata_converter.dart @@ -1,8 +1,6 @@ -import 'package:spotify_downloader/core/util/converters/simple_converters/value_converter.dart'; -import 'package:spotify_downloader/core/util/util_methods.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/models/metadata/album_metadata.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/models/metadata/audio_metadata.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/data/data.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; class TrackToAudioMetadataConverter implements ValueConverter { @override diff --git a/lib/features/data/tracks/dowload_tracks/repositories/dowload_tracks_repository_impl.dart b/lib/features/data_domain/tracks/download_tracks/data/repositories/dowload_tracks_repository_impl.dart similarity index 79% rename from lib/features/data/tracks/dowload_tracks/repositories/dowload_tracks_repository_impl.dart rename to lib/features/data_domain/tracks/download_tracks/data/repositories/dowload_tracks_repository_impl.dart index 4605c94..8963550 100644 --- a/lib/features/data/tracks/dowload_tracks/repositories/dowload_tracks_repository_impl.dart +++ b/lib/features/data_domain/tracks/download_tracks/data/repositories/dowload_tracks_repository_impl.dart @@ -1,18 +1,6 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/failures/failures.dart'; -import 'package:spotify_downloader/core/util/result/cancellable_result.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/data_sources/dowload_audio_from_youtube_data_source.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/models/dowload_audio_from_youtube_args.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/repositories/converters/track_to_audio_metadata_converter.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/repositories/repository_impl_classes/loading_track_info.dart'; -import 'package:spotify_downloader/features/data/tracks/dowload_tracks/repositories/repository_impl_classes/waiting_in_loading_queue_track_info.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/track_loading_notifier.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_id.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/track_with_lazy_youtube_url.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/repositories/dowload_tracks_repository.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/download_tracks.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/entities.dart'; class DowloadTracksRepositoryImpl implements DownloadTracksRepository { DowloadTracksRepositoryImpl({required DownloadAudioFromYoutubeDataSource dowloadAudioFromYoutubeDataSource}) diff --git a/lib/features/data_domain/tracks/download_tracks/data/repositories/repositories.dart b/lib/features/data_domain/tracks/download_tracks/data/repositories/repositories.dart new file mode 100644 index 0000000..930e7e7 --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/data/repositories/repositories.dart @@ -0,0 +1,3 @@ +export 'converters/converters.dart'; +export 'dowload_tracks_repository_impl.dart'; +export 'repository_impl_classes/repository_impl_classes.dart'; diff --git a/lib/features/data_domain/tracks/download_tracks/data/repositories/repository_impl_classes/loading_track_info.dart b/lib/features/data_domain/tracks/download_tracks/data/repositories/repository_impl_classes/loading_track_info.dart new file mode 100644 index 0000000..86e28a6 --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/data/repositories/repository_impl_classes/loading_track_info.dart @@ -0,0 +1,10 @@ +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/download_tracks.dart'; + +class LoadingTrackInfo { + LoadingTrackInfo( + {required this.loadingTrackId, required this.audioLoadingStream, required this.trackLoadingNotifier}); + + final LoadingTrackId loadingTrackId; + AudioLoadingStream? audioLoadingStream; + TrackLoadingNotifier trackLoadingNotifier; +} diff --git a/lib/features/data_domain/tracks/download_tracks/data/repositories/repository_impl_classes/repository_impl_classes.dart b/lib/features/data_domain/tracks/download_tracks/data/repositories/repository_impl_classes/repository_impl_classes.dart new file mode 100644 index 0000000..c2225a8 --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/data/repositories/repository_impl_classes/repository_impl_classes.dart @@ -0,0 +1,2 @@ +export 'loading_track_info.dart'; +export 'waiting_in_loading_queue_track_info.dart'; diff --git a/lib/features/data/tracks/dowload_tracks/repositories/repository_impl_classes/waiting_in_loading_queue_track_info.dart b/lib/features/data_domain/tracks/download_tracks/data/repositories/repository_impl_classes/waiting_in_loading_queue_track_info.dart similarity index 50% rename from lib/features/data/tracks/dowload_tracks/repositories/repository_impl_classes/waiting_in_loading_queue_track_info.dart rename to lib/features/data_domain/tracks/download_tracks/data/repositories/repository_impl_classes/waiting_in_loading_queue_track_info.dart index d93e052..d285ea5 100644 --- a/lib/features/data/tracks/dowload_tracks/repositories/repository_impl_classes/waiting_in_loading_queue_track_info.dart +++ b/lib/features/data_domain/tracks/download_tracks/data/repositories/repository_impl_classes/waiting_in_loading_queue_track_info.dart @@ -1,6 +1,4 @@ -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_id.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/track_loading_notifier.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/track_with_lazy_youtube_url.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/domain/entities/entities.dart'; class WaitingInLoadingQueueTrackInfo { WaitingInLoadingQueueTrackInfo( diff --git a/lib/features/data_domain/tracks/download_tracks/domain/domain.dart b/lib/features/data_domain/tracks/download_tracks/domain/domain.dart new file mode 100644 index 0000000..09f4318 --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/domain/domain.dart @@ -0,0 +1,2 @@ +export 'entities/entities.dart'; +export 'repositories/repositories.dart'; diff --git a/lib/features/data_domain/tracks/download_tracks/domain/entities/entities.dart b/lib/features/data_domain/tracks/download_tracks/domain/entities/entities.dart new file mode 100644 index 0000000..116cbfd --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/domain/entities/entities.dart @@ -0,0 +1,5 @@ +export 'loading_track_id.dart'; +export 'loading_track_observer.dart'; +export 'loading_track_status.dart'; +export 'track_loading_notifier.dart'; +export 'track_with_lazy_youtube_url.dart'; diff --git a/lib/features/domain/tracks/download_tracks/entities/loading_track_id.dart b/lib/features/data_domain/tracks/download_tracks/domain/entities/loading_track_id.dart similarity index 79% rename from lib/features/domain/tracks/download_tracks/entities/loading_track_id.dart rename to lib/features/data_domain/tracks/download_tracks/domain/entities/loading_track_id.dart index 1fbff13..2c79214 100644 --- a/lib/features/domain/tracks/download_tracks/entities/loading_track_id.dart +++ b/lib/features/data_domain/tracks/download_tracks/domain/entities/loading_track_id.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection_type.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/tracks_collection_type.dart'; class LoadingTrackId extends Equatable { const LoadingTrackId({required this.parentSpotifyId, required this.parentType, required this.spotifyId, required this.savePath}); diff --git a/lib/features/domain/tracks/download_tracks/entities/loading_track_observer.dart b/lib/features/data_domain/tracks/download_tracks/domain/entities/loading_track_observer.dart similarity index 81% rename from lib/features/domain/tracks/download_tracks/entities/loading_track_observer.dart rename to lib/features/data_domain/tracks/download_tracks/domain/entities/loading_track_observer.dart index 96c6521..0d35b65 100644 --- a/lib/features/domain/tracks/download_tracks/entities/loading_track_observer.dart +++ b/lib/features/data_domain/tracks/download_tracks/domain/entities/loading_track_observer.dart @@ -1,7 +1,7 @@ import 'dart:async'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_status.dart'; +import 'package:spotify_downloader/core/utils/failures/failure.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/domain/entities/loading_track_status.dart'; class LoadingTrackObserver { LoadingTrackObserver( @@ -10,9 +10,9 @@ class LoadingTrackObserver { required this.loadedStream, required this.loadingCancelledStream, required this.loadingFailureStream, + required this.loadingTrackStatusStream, required LoadingTrackStatus Function() getLoadingTrackStatus}) : _getLoadingTrackStatus = getLoadingTrackStatus { - startLoadingStream.listen((youtubeUrl) => _youtubeUrl = youtubeUrl); loadingPercentChangedStream.listen((percent) => _loadingPercent = percent); loadedStream.listen((savePath) => _resultSavePath = savePath); @@ -27,11 +27,11 @@ class LoadingTrackObserver { final LoadingTrackStatus Function() _getLoadingTrackStatus; LoadingTrackStatus get status => _getLoadingTrackStatus.call(); + final Stream loadingTrackStatusStream; String? _youtubeUrl; String? get youtubeUrl => _youtubeUrl; - double? _loadingPercent; double? get loadingPercent => _loadingPercent; diff --git a/lib/features/domain/tracks/download_tracks/entities/loading_track_status.dart b/lib/features/data_domain/tracks/download_tracks/domain/entities/loading_track_status.dart similarity index 100% rename from lib/features/domain/tracks/download_tracks/entities/loading_track_status.dart rename to lib/features/data_domain/tracks/download_tracks/domain/entities/loading_track_status.dart diff --git a/lib/features/domain/tracks/download_tracks/entities/track_loading_notifier.dart b/lib/features/data_domain/tracks/download_tracks/domain/entities/track_loading_notifier.dart similarity index 64% rename from lib/features/domain/tracks/download_tracks/entities/track_loading_notifier.dart rename to lib/features/data_domain/tracks/download_tracks/domain/entities/track_loading_notifier.dart index eb4cfdc..b18dc57 100644 --- a/lib/features/domain/tracks/download_tracks/entities/track_loading_notifier.dart +++ b/lib/features/data_domain/tracks/download_tracks/domain/entities/track_loading_notifier.dart @@ -1,8 +1,8 @@ import 'dart:async'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_status.dart'; +import 'package:spotify_downloader/core/utils/failures/failure.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/domain/entities/loading_track_observer.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/domain/entities/loading_track_status.dart'; class TrackLoadingNotifier { final StreamController _startLoadingStreamController = StreamController(); @@ -10,6 +10,8 @@ class TrackLoadingNotifier { final StreamController _loadedStreamController = StreamController(); final StreamController _loadingCancelledStreamController = StreamController(); final StreamController _loadingFailureStreamController = StreamController(); + final StreamController _loadingTrackStatusStreamController = + StreamController(); LoadingTrackObserver? _loadingTrackObserver; LoadingTrackObserver get loadingTrackObserver => _loadingTrackObserver ??= LoadingTrackObserver( @@ -18,9 +20,15 @@ class TrackLoadingNotifier { loadedStream: _loadedStreamController.stream.asBroadcastStream(), loadingCancelledStream: _loadingCancelledStreamController.stream.asBroadcastStream(), loadingFailureStream: _loadingFailureStreamController.stream.asBroadcastStream(), + loadingTrackStatusStream: _loadingTrackStatusStreamController.stream.asBroadcastStream(), getLoadingTrackStatus: () => _status); - LoadingTrackStatus _status = LoadingTrackStatus.waitInLoadingQueue; + LoadingTrackStatus _statusField = LoadingTrackStatus.waitInLoadingQueue; + LoadingTrackStatus get _status => _statusField; + set _status(LoadingTrackStatus newStatus) { + _statusField = newStatus; + _loadingTrackStatusStreamController.add(newStatus); + } void startLoading(String youtubeUrl) { if (_status == LoadingTrackStatus.waitInLoadingQueue) { @@ -37,9 +45,10 @@ class TrackLoadingNotifier { } void loaded(String savePath) { - if (_status == LoadingTrackStatus.loading || _status == LoadingTrackStatus.loadingCancelled) { + if (_status == LoadingTrackStatus.loading) { _status = LoadingTrackStatus.loaded; _loadedStreamController.add(savePath); + _closeAllStreams(); } } @@ -47,6 +56,7 @@ class TrackLoadingNotifier { if (_status == LoadingTrackStatus.loading || _status == LoadingTrackStatus.waitInLoadingQueue) { _status = LoadingTrackStatus.loadingCancelled; _loadingCancelledStreamController.add(null); + _closeAllStreams(); } } @@ -56,6 +66,15 @@ class TrackLoadingNotifier { _status == LoadingTrackStatus.loadingCancelled) { _status = LoadingTrackStatus.failure; _loadingFailureStreamController.add(failure); + _closeAllStreams(); } } + + Future _closeAllStreams() async { + await _startLoadingStreamController.close(); + await _loadingPercentChangedStreamController.close(); + await _loadedStreamController.close(); + await _loadingCancelledStreamController.close(); + await _loadingFailureStreamController.close(); + } } diff --git a/lib/features/data_domain/tracks/download_tracks/domain/entities/track_with_lazy_youtube_url.dart b/lib/features/data_domain/tracks/download_tracks/domain/entities/track_with_lazy_youtube_url.dart new file mode 100644 index 0000000..a3c7c6b --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/domain/entities/track_with_lazy_youtube_url.dart @@ -0,0 +1,9 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/track.dart'; + +class TrackWithLazyYoutubeUrl { + TrackWithLazyYoutubeUrl({required this.track, required this.getYoutubeUrl}); + + final Track track; + final Future> Function() getYoutubeUrl; +} diff --git a/lib/features/data_domain/tracks/download_tracks/domain/repositories/dowload_tracks_repository.dart b/lib/features/data_domain/tracks/download_tracks/domain/repositories/dowload_tracks_repository.dart new file mode 100644 index 0000000..02f536b --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/domain/repositories/dowload_tracks_repository.dart @@ -0,0 +1,9 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; + +abstract class DownloadTracksRepository { + Future> dowloadTrack(TrackWithLazyYoutubeUrl lazyTrack, String savePath); + Result cancelTrackLoading(Track track, String savePath); + Future> getLoadingTrackObserver(Track track, String savePath); +} diff --git a/lib/features/data_domain/tracks/download_tracks/domain/repositories/repositories.dart b/lib/features/data_domain/tracks/download_tracks/domain/repositories/repositories.dart new file mode 100644 index 0000000..3a8a56f --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/domain/repositories/repositories.dart @@ -0,0 +1 @@ +export 'dowload_tracks_repository.dart'; diff --git a/lib/features/data_domain/tracks/download_tracks/download_tracks.dart b/lib/features/data_domain/tracks/download_tracks/download_tracks.dart new file mode 100644 index 0000000..f018dc9 --- /dev/null +++ b/lib/features/data_domain/tracks/download_tracks/download_tracks.dart @@ -0,0 +1,2 @@ +export 'data/data.dart'; +export 'domain/domain.dart'; \ No newline at end of file diff --git a/lib/features/data_domain/tracks/local_tracks/data/data.dart b/lib/features/data_domain/tracks/local_tracks/data/data.dart new file mode 100644 index 0000000..0b6f309 --- /dev/null +++ b/lib/features/data_domain/tracks/local_tracks/data/data.dart @@ -0,0 +1,3 @@ +export 'data_sources/data_sources.dart'; +export 'models/models.dart'; +export 'repositories/repositories.dart'; diff --git a/lib/features/data_domain/tracks/local_tracks/data/data_sources/data_sources.dart b/lib/features/data_domain/tracks/local_tracks/data/data_sources/data_sources.dart new file mode 100644 index 0000000..a2a5f8d --- /dev/null +++ b/lib/features/data_domain/tracks/local_tracks/data/data_sources/data_sources.dart @@ -0,0 +1 @@ +export 'local_tracks_data_source.dart'; diff --git a/lib/features/data/tracks/local_tracks/data_sources/local_tracks_data_source.dart b/lib/features/data_domain/tracks/local_tracks/data/data_sources/local_tracks_data_source.dart similarity index 89% rename from lib/features/data/tracks/local_tracks/data_sources/local_tracks_data_source.dart rename to lib/features/data_domain/tracks/local_tracks/data/data_sources/local_tracks_data_source.dart index bbd3805..7b221d6 100644 --- a/lib/features/data/tracks/local_tracks/data_sources/local_tracks_data_source.dart +++ b/lib/features/data_domain/tracks/local_tracks/data/data_sources/local_tracks_data_source.dart @@ -1,8 +1,6 @@ import 'package:spotify_downloader/core/db/local_db.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/models/local_track_dto.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/models/local_tracks_collection_dto.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/models/local_tracks_collection_dto_type.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/models/local_tracks_collections_group_dto.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/data/models/models.dart'; + import 'package:sqflite/sqflite.dart'; class LocalTracksDataSource { diff --git a/lib/features/data/tracks/local_tracks/models/local_track_dto.dart b/lib/features/data_domain/tracks/local_tracks/data/models/local_track_dto.dart similarity index 69% rename from lib/features/data/tracks/local_tracks/models/local_track_dto.dart rename to lib/features/data_domain/tracks/local_tracks/data/models/local_track_dto.dart index 05a22df..4f6b540 100644 --- a/lib/features/data/tracks/local_tracks/models/local_track_dto.dart +++ b/lib/features/data_domain/tracks/local_tracks/data/models/local_track_dto.dart @@ -1,4 +1,4 @@ -import 'package:spotify_downloader/features/data/tracks/local_tracks/models/local_tracks_collection_dto.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/data/models/local_tracks_collection_dto.dart'; class LocalTrackDto { LocalTrackDto( diff --git a/lib/features/data/tracks/local_tracks/models/local_tracks_collection_dto.dart b/lib/features/data_domain/tracks/local_tracks/data/models/local_tracks_collection_dto.dart similarity index 51% rename from lib/features/data/tracks/local_tracks/models/local_tracks_collection_dto.dart rename to lib/features/data_domain/tracks/local_tracks/data/models/local_tracks_collection_dto.dart index 0b4504e..fe43463 100644 --- a/lib/features/data/tracks/local_tracks/models/local_tracks_collection_dto.dart +++ b/lib/features/data_domain/tracks/local_tracks/data/models/local_tracks_collection_dto.dart @@ -1,5 +1,4 @@ -import 'package:spotify_downloader/features/data/tracks/local_tracks/models/local_tracks_collection_dto_type.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/models/local_tracks_collections_group_dto.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/data/models/models.dart'; class LocalTracksCollectionDto { LocalTracksCollectionDto({required this.group, required this.spotifyId, required this.type}); diff --git a/lib/features/data/tracks/local_tracks/models/local_tracks_collection_dto_type.dart b/lib/features/data_domain/tracks/local_tracks/data/models/local_tracks_collection_dto_type.dart similarity index 100% rename from lib/features/data/tracks/local_tracks/models/local_tracks_collection_dto_type.dart rename to lib/features/data_domain/tracks/local_tracks/data/models/local_tracks_collection_dto_type.dart diff --git a/lib/features/data/tracks/local_tracks/models/local_tracks_collections_group_dto.dart b/lib/features/data_domain/tracks/local_tracks/data/models/local_tracks_collections_group_dto.dart similarity index 100% rename from lib/features/data/tracks/local_tracks/models/local_tracks_collections_group_dto.dart rename to lib/features/data_domain/tracks/local_tracks/data/models/local_tracks_collections_group_dto.dart diff --git a/lib/features/data_domain/tracks/local_tracks/data/models/models.dart b/lib/features/data_domain/tracks/local_tracks/data/models/models.dart new file mode 100644 index 0000000..8805898 --- /dev/null +++ b/lib/features/data_domain/tracks/local_tracks/data/models/models.dart @@ -0,0 +1,4 @@ +export 'local_track_dto.dart'; +export 'local_tracks_collection_dto.dart'; +export 'local_tracks_collection_dto_type.dart'; +export 'local_tracks_collections_group_dto.dart'; diff --git a/lib/features/data_domain/tracks/local_tracks/data/repositories/converters/converters.dart b/lib/features/data_domain/tracks/local_tracks/data/repositories/converters/converters.dart new file mode 100644 index 0000000..5a141a8 --- /dev/null +++ b/lib/features/data_domain/tracks/local_tracks/data/repositories/converters/converters.dart @@ -0,0 +1,4 @@ +export 'local_track_dto_to_local_track_converter.dart'; +export 'local_tracks_collection_dto_to_local_tracks_collection_converter.dart'; +export 'local_tracks_collection_dto_type_to_local_tracks_collection_type_converter.dart'; +export 'local_tracks_collections_group_dto_to_local_tracks_collections_group_converter.dart'; diff --git a/lib/features/data/tracks/local_tracks/repositories/converters/local_track_dto_to_local_track_converter.dart b/lib/features/data_domain/tracks/local_tracks/data/repositories/converters/local_track_dto_to_local_track_converter.dart similarity index 63% rename from lib/features/data/tracks/local_tracks/repositories/converters/local_track_dto_to_local_track_converter.dart rename to lib/features/data_domain/tracks/local_tracks/data/repositories/converters/local_track_dto_to_local_track_converter.dart index 9da2270..058f056 100644 --- a/lib/features/data/tracks/local_tracks/repositories/converters/local_track_dto_to_local_track_converter.dart +++ b/lib/features/data_domain/tracks/local_tracks/data/repositories/converters/local_track_dto_to_local_track_converter.dart @@ -1,7 +1,6 @@ -import 'package:spotify_downloader/core/util/converters/simple_converters/value_converter.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/models/local_track_dto.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/repositories/converters/local_tracks_collection_dto_to_local_tracks_collection_converter.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_track.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/local_tracks.dart'; + class LocalTrackDtoToLocalTrackConverter implements ValueConverter { final LocalTracksCollectionDtoToLocalTracksCollectionConverter _collectionsConverter = diff --git a/lib/features/data/tracks/local_tracks/repositories/converters/local_tracks_collection_dto_to_local_tracks_collection_converter.dart b/lib/features/data_domain/tracks/local_tracks/data/repositories/converters/local_tracks_collection_dto_to_local_tracks_collection_converter.dart similarity index 63% rename from lib/features/data/tracks/local_tracks/repositories/converters/local_tracks_collection_dto_to_local_tracks_collection_converter.dart rename to lib/features/data_domain/tracks/local_tracks/data/repositories/converters/local_tracks_collection_dto_to_local_tracks_collection_converter.dart index fe68a64..5f2a16b 100644 --- a/lib/features/data/tracks/local_tracks/repositories/converters/local_tracks_collection_dto_to_local_tracks_collection_converter.dart +++ b/lib/features/data_domain/tracks/local_tracks/data/repositories/converters/local_tracks_collection_dto_to_local_tracks_collection_converter.dart @@ -1,9 +1,5 @@ -import 'package:spotify_downloader/core/util/converters/simple_converters/value_converter.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/models/local_tracks_collection_dto.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/repositories/converters/local_tracks_collection_dto_type_to_local_tracks_collection_type_converter.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_tracks_collection.dart'; - -import 'local_tracks_collections_group_dto_to_local_tracks_collections_group_converter.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/local_tracks.dart'; class LocalTracksCollectionDtoToLocalTracksCollectionConverter implements ValueConverter { diff --git a/lib/features/data/tracks/local_tracks/repositories/converters/local_tracks_collection_dto_type_to_local_tracks_collection_type_converter.dart b/lib/features/data_domain/tracks/local_tracks/data/repositories/converters/local_tracks_collection_dto_type_to_local_tracks_collection_type_converter.dart similarity index 80% rename from lib/features/data/tracks/local_tracks/repositories/converters/local_tracks_collection_dto_type_to_local_tracks_collection_type_converter.dart rename to lib/features/data_domain/tracks/local_tracks/data/repositories/converters/local_tracks_collection_dto_type_to_local_tracks_collection_type_converter.dart index 8df8b6b..04a4c7e 100644 --- a/lib/features/data/tracks/local_tracks/repositories/converters/local_tracks_collection_dto_type_to_local_tracks_collection_type_converter.dart +++ b/lib/features/data_domain/tracks/local_tracks/data/repositories/converters/local_tracks_collection_dto_type_to_local_tracks_collection_type_converter.dart @@ -1,6 +1,5 @@ -import 'package:spotify_downloader/core/util/converters/simple_converters/value_converter.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/models/local_tracks_collection_dto_type.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_tracks_collection_type.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/local_tracks.dart'; class LocalTracksCollectionDtoTypeToLocalTracksCollectionTypeConverter implements ValueConverter { diff --git a/lib/features/data/tracks/local_tracks/repositories/converters/local_tracks_collections_group_dto_to_local_tracks_collections_group_converter.dart b/lib/features/data_domain/tracks/local_tracks/data/repositories/converters/local_tracks_collections_group_dto_to_local_tracks_collections_group_converter.dart similarity index 60% rename from lib/features/data/tracks/local_tracks/repositories/converters/local_tracks_collections_group_dto_to_local_tracks_collections_group_converter.dart rename to lib/features/data_domain/tracks/local_tracks/data/repositories/converters/local_tracks_collections_group_dto_to_local_tracks_collections_group_converter.dart index b73dacf..99670c3 100644 --- a/lib/features/data/tracks/local_tracks/repositories/converters/local_tracks_collections_group_dto_to_local_tracks_collections_group_converter.dart +++ b/lib/features/data_domain/tracks/local_tracks/data/repositories/converters/local_tracks_collections_group_dto_to_local_tracks_collections_group_converter.dart @@ -1,6 +1,5 @@ -import 'package:spotify_downloader/core/util/converters/simple_converters/value_converter.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/models/local_tracks_collections_group_dto.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_tracks_collection_group.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/local_tracks.dart'; class LocalTracksCollectionsGroupDtoToLocalTracksCollectionsGroupConverter implements ValueConverter { @override diff --git a/lib/features/data/tracks/local_tracks/repositories/local_tracks_repository_impl.dart b/lib/features/data_domain/tracks/local_tracks/data/repositories/local_tracks_repository_impl.dart similarity index 65% rename from lib/features/data/tracks/local_tracks/repositories/local_tracks_repository_impl.dart rename to lib/features/data_domain/tracks/local_tracks/data/repositories/local_tracks_repository_impl.dart index eb541de..874259e 100644 --- a/lib/features/data/tracks/local_tracks/repositories/local_tracks_repository_impl.dart +++ b/lib/features/data_domain/tracks/local_tracks/data/repositories/local_tracks_repository_impl.dart @@ -1,11 +1,5 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/data_sources/local_tracks_data_source.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/repositories/converters/local_track_dto_to_local_track_converter.dart'; -import 'package:spotify_downloader/features/data/tracks/local_tracks/repositories/converters/local_tracks_collection_dto_to_local_tracks_collection_converter.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_track.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/repositories/local_tracks_repository.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/local_tracks.dart'; class LocalTracksRepositoryImpl implements LocalTracksRepository { LocalTracksRepositoryImpl({required LocalTracksDataSource dataSource}) : _dataSource = dataSource; diff --git a/lib/features/data_domain/tracks/local_tracks/data/repositories/repositories.dart b/lib/features/data_domain/tracks/local_tracks/data/repositories/repositories.dart new file mode 100644 index 0000000..200b327 --- /dev/null +++ b/lib/features/data_domain/tracks/local_tracks/data/repositories/repositories.dart @@ -0,0 +1,2 @@ +export 'converters/converters.dart'; +export 'local_tracks_repository_impl.dart'; diff --git a/lib/features/data_domain/tracks/local_tracks/domain/domain.dart b/lib/features/data_domain/tracks/local_tracks/domain/domain.dart new file mode 100644 index 0000000..09f4318 --- /dev/null +++ b/lib/features/data_domain/tracks/local_tracks/domain/domain.dart @@ -0,0 +1,2 @@ +export 'entities/entities.dart'; +export 'repositories/repositories.dart'; diff --git a/lib/features/data_domain/tracks/local_tracks/domain/entities/entities.dart b/lib/features/data_domain/tracks/local_tracks/domain/entities/entities.dart new file mode 100644 index 0000000..c39b2c5 --- /dev/null +++ b/lib/features/data_domain/tracks/local_tracks/domain/entities/entities.dart @@ -0,0 +1,4 @@ +export 'local_track.dart'; +export 'local_tracks_collection.dart'; +export 'local_tracks_collection_group.dart'; +export 'local_tracks_collection_type.dart'; diff --git a/lib/features/domain/tracks/local_tracks/entities/local_track.dart b/lib/features/data_domain/tracks/local_tracks/domain/entities/local_track.dart similarity index 68% rename from lib/features/domain/tracks/local_tracks/entities/local_track.dart rename to lib/features/data_domain/tracks/local_tracks/domain/entities/local_track.dart index 0f9116e..5884d09 100644 --- a/lib/features/domain/tracks/local_tracks/entities/local_track.dart +++ b/lib/features/data_domain/tracks/local_tracks/domain/entities/local_track.dart @@ -1,4 +1,4 @@ -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_tracks_collection.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/domain/entities/local_tracks_collection.dart'; class LocalTrack { LocalTrack({ diff --git a/lib/features/domain/tracks/local_tracks/entities/local_tracks_collection.dart b/lib/features/data_domain/tracks/local_tracks/domain/entities/local_tracks_collection.dart similarity index 68% rename from lib/features/domain/tracks/local_tracks/entities/local_tracks_collection.dart rename to lib/features/data_domain/tracks/local_tracks/domain/entities/local_tracks_collection.dart index 995081b..cf1b548 100644 --- a/lib/features/domain/tracks/local_tracks/entities/local_tracks_collection.dart +++ b/lib/features/data_domain/tracks/local_tracks/domain/entities/local_tracks_collection.dart @@ -1,5 +1,4 @@ -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_tracks_collection_group.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_tracks_collection_type.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/domain/entities/entities.dart'; class LocalTracksCollection { LocalTracksCollection({required this.group, required this.spotifyId, required this.type}); diff --git a/lib/features/domain/tracks/local_tracks/entities/local_tracks_collection_group.dart b/lib/features/data_domain/tracks/local_tracks/domain/entities/local_tracks_collection_group.dart similarity index 100% rename from lib/features/domain/tracks/local_tracks/entities/local_tracks_collection_group.dart rename to lib/features/data_domain/tracks/local_tracks/domain/entities/local_tracks_collection_group.dart diff --git a/lib/features/domain/tracks/local_tracks/entities/local_tracks_collection_type.dart b/lib/features/data_domain/tracks/local_tracks/domain/entities/local_tracks_collection_type.dart similarity index 100% rename from lib/features/domain/tracks/local_tracks/entities/local_tracks_collection_type.dart rename to lib/features/data_domain/tracks/local_tracks/domain/entities/local_tracks_collection_type.dart diff --git a/lib/features/data_domain/tracks/local_tracks/domain/repositories/local_tracks_repository.dart b/lib/features/data_domain/tracks/local_tracks/domain/repositories/local_tracks_repository.dart new file mode 100644 index 0000000..43faa7e --- /dev/null +++ b/lib/features/data_domain/tracks/local_tracks/domain/repositories/local_tracks_repository.dart @@ -0,0 +1,8 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/domain/entities/entities.dart'; + +abstract class LocalTracksRepository { + Future> getLocalTrack(LocalTracksCollection localTracksCollection, String spotifyId); + Future> saveLocalTrack(LocalTrack localTrack); + Future> removeLocalTrack(LocalTrack localTrack); +} \ No newline at end of file diff --git a/lib/features/data_domain/tracks/local_tracks/domain/repositories/repositories.dart b/lib/features/data_domain/tracks/local_tracks/domain/repositories/repositories.dart new file mode 100644 index 0000000..f60ad79 --- /dev/null +++ b/lib/features/data_domain/tracks/local_tracks/domain/repositories/repositories.dart @@ -0,0 +1 @@ +export 'local_tracks_repository.dart'; diff --git a/lib/features/data_domain/tracks/local_tracks/local_tracks.dart b/lib/features/data_domain/tracks/local_tracks/local_tracks.dart new file mode 100644 index 0000000..f018dc9 --- /dev/null +++ b/lib/features/data_domain/tracks/local_tracks/local_tracks.dart @@ -0,0 +1,2 @@ +export 'data/data.dart'; +export 'domain/domain.dart'; \ No newline at end of file diff --git a/lib/features/data_domain/tracks/network_tracks/data/data.dart b/lib/features/data_domain/tracks/network_tracks/data/data.dart new file mode 100644 index 0000000..0b6f309 --- /dev/null +++ b/lib/features/data_domain/tracks/network_tracks/data/data.dart @@ -0,0 +1,3 @@ +export 'data_sources/data_sources.dart'; +export 'models/models.dart'; +export 'repositories/repositories.dart'; diff --git a/lib/features/data_domain/tracks/network_tracks/data/data_sources/data_sources.dart b/lib/features/data_domain/tracks/network_tracks/data/data_sources/data_sources.dart new file mode 100644 index 0000000..c5320c0 --- /dev/null +++ b/lib/features/data_domain/tracks/network_tracks/data/data_sources/data_sources.dart @@ -0,0 +1 @@ +export 'network_tracks_data_source.dart'; diff --git a/lib/features/data/tracks/network_tracks/data_sources/network_tracks_data_source.dart b/lib/features/data_domain/tracks/network_tracks/data/data_sources/network_tracks_data_source.dart similarity index 83% rename from lib/features/data/tracks/network_tracks/data_sources/network_tracks_data_source.dart rename to lib/features/data_domain/tracks/network_tracks/data/data_sources/network_tracks_data_source.dart index 041ae6c..12335e9 100644 --- a/lib/features/data/tracks/network_tracks/data_sources/network_tracks_data_source.dart +++ b/lib/features/data_domain/tracks/network_tracks/data/data_sources/network_tracks_data_source.dart @@ -1,11 +1,7 @@ import 'package:spotify/spotify.dart'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/isolate_pool/isolate_pool.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/util_methods.dart'; -import 'package:spotify_downloader/features/data/tracks/network_tracks/models/get_tracks_args.dart'; -import 'package:spotify_downloader/features/data/tracks/network_tracks/models/tracks_dto_getting_ended_status.dart'; -import 'package:spotify_downloader/features/data/tracks/network_tracks/models/tracks_getting_stream.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/network_tracks/data/models/liked_track_dto.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/network_tracks/data/models/models.dart'; class NetworkTracksDataSource { Future init() async { @@ -108,9 +104,9 @@ class NetworkTracksDataSource { _getTracksFromPages( getPageTracks: (limit, offset) async { final page = await tracksPagesResult.result!.getPage(limit, offset); - return page.items - ?.where((savedTrack) => savedTrack.track != null) - .map((savedTrack) => savedTrack.track!); + return page.items?.where((savedTrack) => savedTrack.track != null).map((savedTrack) { + return trackSavedToLikedTrack(savedTrack); + }); }, tracksGettingStream: tracksGettingStream, args: args); @@ -123,6 +119,31 @@ class NetworkTracksDataSource { }, args.spotifyApiRequest.onCredentialsRefreshed); } + LikedTrackDto trackSavedToLikedTrack(TrackSaved savedTrack) { + final likedTrack = LikedTrackDto(addedAt: savedTrack.addedAt); + + likedTrack.album = savedTrack.track?.album; + likedTrack.artists = savedTrack.track?.artists; + likedTrack.availableMarkets = savedTrack.track?.availableMarkets; + likedTrack.discNumber = savedTrack.track?.discNumber; + likedTrack.durationMs = savedTrack.track?.durationMs; + likedTrack.explicit = savedTrack.track?.explicit; + likedTrack.externalIds = savedTrack.track?.externalIds; + likedTrack.externalUrls = savedTrack.track?.externalUrls; + likedTrack.href = savedTrack.track?.href; + likedTrack.id = savedTrack.track?.id; + likedTrack.isPlayable = savedTrack.track?.isPlayable; + likedTrack.linkedFrom = savedTrack.track?.linkedFrom; + likedTrack.name = savedTrack.track?.name; + likedTrack.popularity = savedTrack.track?.popularity; + likedTrack.previewUrl = savedTrack.track?.previewUrl; + likedTrack.trackNumber = savedTrack.track?.trackNumber; + likedTrack.type = savedTrack.track?.type; + likedTrack.uri = savedTrack.track?.uri; + + return likedTrack; + } + TracksGettingStream getTrackBySpotifyId(GetTracksArgs args) { final tracksGettingStream = TracksGettingStream(); @@ -185,11 +206,6 @@ class NetworkTracksDataSource { Future(() async { for (var i = 0;; i++) { - if (args.cancellationToken?.isCancelled ?? false) { - tracksGettingStream.onEnded?.call(const Result.isSuccessful(TracksDtoGettingEndedStatus.cancelled)); - return; - } - final newTracksResult = await handleSpotifyClientExceptions?>(() async { final responseTracks = await getPageTracks.call(50, i * 50 + args.offset); return Result.isSuccessful(responseTracks); diff --git a/lib/features/data/tracks/network_tracks/models/get_tracks_args.dart b/lib/features/data_domain/tracks/network_tracks/data/models/get_tracks_args.dart similarity index 65% rename from lib/features/data/tracks/network_tracks/models/get_tracks_args.dart rename to lib/features/data_domain/tracks/network_tracks/data/models/get_tracks_args.dart index a0451c7..cbbff6a 100644 --- a/lib/features/data/tracks/network_tracks/models/get_tracks_args.dart +++ b/lib/features/data_domain/tracks/network_tracks/data/models/get_tracks_args.dart @@ -1,13 +1,11 @@ import 'package:spotify/spotify.dart'; -import 'package:spotify_downloader/core/util/cancellation_token/cancellation_token.dart'; -import 'package:spotify_downloader/features/data/shared/spotify_api_request.dart'; +import 'package:spotify_downloader/features/data_domain/shared/data/spotify_api_request.dart'; class GetTracksArgs { GetTracksArgs( {required this.spotifyApiRequest, required this.spotifyId, required this.responseList, - this.cancellationToken, this.firstCallbackLength = 50, this.callbackLength = 50, this.offset = 0}); @@ -17,8 +15,6 @@ class GetTracksArgs { final String spotifyId; final List responseList; - final CancellationToken? cancellationToken; - final int firstCallbackLength; final int callbackLength; final int offset; diff --git a/lib/features/data_domain/tracks/network_tracks/data/models/liked_track_dto.dart b/lib/features/data_domain/tracks/network_tracks/data/models/liked_track_dto.dart new file mode 100644 index 0000000..e4655df --- /dev/null +++ b/lib/features/data_domain/tracks/network_tracks/data/models/liked_track_dto.dart @@ -0,0 +1,7 @@ +import 'package:spotify/spotify.dart'; + +class LikedTrackDto extends Track { + final DateTime? addedAt; + + LikedTrackDto({required this.addedAt}); +} \ No newline at end of file diff --git a/lib/features/data_domain/tracks/network_tracks/data/models/models.dart b/lib/features/data_domain/tracks/network_tracks/data/models/models.dart new file mode 100644 index 0000000..680fd53 --- /dev/null +++ b/lib/features/data_domain/tracks/network_tracks/data/models/models.dart @@ -0,0 +1,3 @@ +export 'get_tracks_args.dart'; +export 'tracks_dto_getting_ended_status.dart'; +export 'tracks_getting_stream.dart'; diff --git a/lib/features/data/tracks/network_tracks/models/tracks_dto_getting_ended_status.dart b/lib/features/data_domain/tracks/network_tracks/data/models/tracks_dto_getting_ended_status.dart similarity index 100% rename from lib/features/data/tracks/network_tracks/models/tracks_dto_getting_ended_status.dart rename to lib/features/data_domain/tracks/network_tracks/data/models/tracks_dto_getting_ended_status.dart diff --git a/lib/features/data_domain/tracks/network_tracks/data/models/tracks_getting_stream.dart b/lib/features/data_domain/tracks/network_tracks/data/models/tracks_getting_stream.dart new file mode 100644 index 0000000..f13e0b3 --- /dev/null +++ b/lib/features/data_domain/tracks/network_tracks/data/models/tracks_getting_stream.dart @@ -0,0 +1,8 @@ +import 'package:spotify/spotify.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/network_tracks/data/models/tracks_dto_getting_ended_status.dart'; + +class TracksGettingStream { + Function(Result)? onEnded; + Function(List)? onPartGot; +} \ No newline at end of file diff --git a/lib/features/data_domain/tracks/network_tracks/data/repositories/converters/converters.dart b/lib/features/data_domain/tracks/network_tracks/data/repositories/converters/converters.dart new file mode 100644 index 0000000..419c9c6 --- /dev/null +++ b/lib/features/data_domain/tracks/network_tracks/data/repositories/converters/converters.dart @@ -0,0 +1 @@ +export 'track_dto_to_track_converter.dart'; diff --git a/lib/features/data_domain/tracks/network_tracks/data/repositories/converters/track_dto_to_track_converter.dart b/lib/features/data_domain/tracks/network_tracks/data/repositories/converters/track_dto_to_track_converter.dart new file mode 100644 index 0000000..cd25e90 --- /dev/null +++ b/lib/features/data_domain/tracks/network_tracks/data/repositories/converters/track_dto_to_track_converter.dart @@ -0,0 +1,52 @@ +import 'package:spotify/spotify.dart' as dto; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/network_tracks/data/models/liked_track_dto.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/entities.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/liked_track.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/track.dart' as entity; + +class TrackDtoToTrackConverter implements ConverterWithParameter { + @override + entity.Track? convert((dto.Track, TracksCollection) parameters) { + final dtoTrack = parameters.$1; + final parentCollection = parameters.$2; + + if (dtoTrack.id == null) { + return null; + } + + String? albumImageUrl; + + try { + albumImageUrl = dtoTrack.album?.images?[1].url; + } on RangeError { + //rangeError + } + + albumImageUrl ??= dtoTrack.album?.images?.firstOrNull?.url ?? ''; + + if (dtoTrack is LikedTrackDto) { + return LikedTrack( + spotifyId: dtoTrack.id!, + duration: dtoTrack.duration, + name: dtoTrack.name ?? 'no_name', + parentCollection: parentCollection, + artists: dtoTrack.artists?.map((a) => a.name!).toList(), + album: Album(name: dtoTrack.album?.name, imageUrl: albumImageUrl), + addedAt: dtoTrack.addedAt); + } + + return entity.Track( + spotifyId: dtoTrack.id!, + duration: dtoTrack.duration, + name: dtoTrack.name ?? 'no_name', + parentCollection: parentCollection, + artists: dtoTrack.artists?.map((a) => a.name!).toList(), + album: Album(name: dtoTrack.album?.name, imageUrl: albumImageUrl)); + } + + @override + dto.Track convertBack((entity.Track?, TracksCollection) value) { + throw UnimplementedError(); + } +} diff --git a/lib/features/data/tracks/network_tracks/repositories/network_tracks_repository_impl.dart b/lib/features/data_domain/tracks/network_tracks/data/repositories/network_tracks_repository_impl.dart similarity index 63% rename from lib/features/data/tracks/network_tracks/repositories/network_tracks_repository_impl.dart rename to lib/features/data_domain/tracks/network_tracks/data/repositories/network_tracks_repository_impl.dart index 7ee1112..21a8d17 100644 --- a/lib/features/data/tracks/network_tracks/repositories/network_tracks_repository_impl.dart +++ b/lib/features/data_domain/tracks/network_tracks/data/repositories/network_tracks_repository_impl.dart @@ -1,17 +1,9 @@ -import 'package:spotify_downloader/core/util/cancellation_token/cancellation_token_source.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/shared/converters/spotify_requests_converter.dart'; -import 'package:spotify_downloader/features/data/tracks/network_tracks/data_sources/network_tracks_data_source.dart'; -import 'package:spotify_downloader/features/data/tracks/network_tracks/models/get_tracks_args.dart'; -import 'package:spotify_downloader/features/data/tracks/network_tracks/models/tracks_dto_getting_ended_status.dart'; -import 'package:spotify_downloader/features/data/tracks/network_tracks/models/tracks_getting_stream.dart'; -import 'package:spotify_downloader/features/data/tracks/network_tracks/repositories/converters/track_dto_to_track_converter.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection_type.dart'; -import 'package:spotify_downloader/features/domain/tracks/network_tracks/entities/get_tracks_from_tracks_collection_args.dart'; -import 'package:spotify_downloader/features/domain/tracks/network_tracks/entities/tracks_getting_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/network_tracks/entities/tracks_getting_ended_status.dart'; import 'package:spotify/spotify.dart' as dto; -import 'package:spotify_downloader/features/domain/tracks/network_tracks/repositories/network_tracks_repository.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/shared/data/converters/spotify_requests_converter.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/network_tracks/network_tracks.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/entities.dart'; + class NetworkTracksRepositoryImpl implements NetworkTracksRepository { NetworkTracksRepositoryImpl({ @@ -25,14 +17,12 @@ class NetworkTracksRepositoryImpl implements NetworkTracksRepository { @override Future getTracksFromTracksCollection(GetTracksFromTracksCollectionArgs args) async { final responseList = List.empty(growable: true); - final cancellationTokenSource = CancellationTokenSource(); final getTracksArgs = GetTracksArgs( spotifyApiRequest: _spotifyRequestsConverter.convert(args.spotifyRepositoryRequest), spotifyId: args.tracksCollection.spotifyId, responseList: responseList, - cancellationToken: cancellationTokenSource.token, offset: args.offset, - firstCallbackLength: 200, + firstCallbackLength: 50, callbackLength: 50); final TracksGettingStream tracksGettingStream; diff --git a/lib/features/data_domain/tracks/network_tracks/data/repositories/repositories.dart b/lib/features/data_domain/tracks/network_tracks/data/repositories/repositories.dart new file mode 100644 index 0000000..2e19fc0 --- /dev/null +++ b/lib/features/data_domain/tracks/network_tracks/data/repositories/repositories.dart @@ -0,0 +1,2 @@ +export 'converters/converters.dart'; +export 'network_tracks_repository_impl.dart'; diff --git a/lib/features/data_domain/tracks/network_tracks/domain/domain.dart b/lib/features/data_domain/tracks/network_tracks/domain/domain.dart new file mode 100644 index 0000000..09f4318 --- /dev/null +++ b/lib/features/data_domain/tracks/network_tracks/domain/domain.dart @@ -0,0 +1,2 @@ +export 'entities/entities.dart'; +export 'repositories/repositories.dart'; diff --git a/lib/features/data_domain/tracks/network_tracks/domain/entities/entities.dart b/lib/features/data_domain/tracks/network_tracks/domain/entities/entities.dart new file mode 100644 index 0000000..6a253d6 --- /dev/null +++ b/lib/features/data_domain/tracks/network_tracks/domain/entities/entities.dart @@ -0,0 +1,3 @@ +export 'get_tracks_from_tracks_collection_args.dart'; +export 'tracks_getting_ended_status.dart'; +export 'tracks_getting_observer.dart'; diff --git a/lib/features/domain/tracks/network_tracks/entities/get_tracks_from_tracks_collection_args.dart b/lib/features/data_domain/tracks/network_tracks/domain/entities/get_tracks_from_tracks_collection_args.dart similarity index 58% rename from lib/features/domain/tracks/network_tracks/entities/get_tracks_from_tracks_collection_args.dart rename to lib/features/data_domain/tracks/network_tracks/domain/entities/get_tracks_from_tracks_collection_args.dart index eac2bd8..04d0c76 100644 --- a/lib/features/domain/tracks/network_tracks/entities/get_tracks_from_tracks_collection_args.dart +++ b/lib/features/data_domain/tracks/network_tracks/domain/entities/get_tracks_from_tracks_collection_args.dart @@ -1,5 +1,5 @@ -import 'package:spotify_downloader/features/domain/shared/spotify_repository_request.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; +import 'package:spotify_downloader/features/data_domain/shared/domain/spotify_repository_request.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/tracks_collection.dart'; class GetTracksFromTracksCollectionArgs { GetTracksFromTracksCollectionArgs( diff --git a/lib/features/domain/tracks/network_tracks/entities/tracks_getting_ended_status.dart b/lib/features/data_domain/tracks/network_tracks/domain/entities/tracks_getting_ended_status.dart similarity index 100% rename from lib/features/domain/tracks/network_tracks/entities/tracks_getting_ended_status.dart rename to lib/features/data_domain/tracks/network_tracks/domain/entities/tracks_getting_ended_status.dart diff --git a/lib/features/data_domain/tracks/network_tracks/domain/entities/tracks_getting_observer.dart b/lib/features/data_domain/tracks/network_tracks/domain/entities/tracks_getting_observer.dart new file mode 100644 index 0000000..e7fed93 --- /dev/null +++ b/lib/features/data_domain/tracks/network_tracks/domain/entities/tracks_getting_observer.dart @@ -0,0 +1,8 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/network_tracks/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; + +class TracksGettingObserver { + Function(Result)? onEnded; + Function(Iterable)? onPartGot; +} diff --git a/lib/features/data_domain/tracks/network_tracks/domain/repositories/network_tracks_repository.dart b/lib/features/data_domain/tracks/network_tracks/domain/repositories/network_tracks_repository.dart new file mode 100644 index 0000000..82ba10c --- /dev/null +++ b/lib/features/data_domain/tracks/network_tracks/domain/repositories/network_tracks_repository.dart @@ -0,0 +1,5 @@ +import 'package:spotify_downloader/features/data_domain/tracks/network_tracks/domain/domain.dart'; + +abstract class NetworkTracksRepository { + Future getTracksFromTracksCollection(GetTracksFromTracksCollectionArgs args); +} \ No newline at end of file diff --git a/lib/features/data_domain/tracks/network_tracks/domain/repositories/repositories.dart b/lib/features/data_domain/tracks/network_tracks/domain/repositories/repositories.dart new file mode 100644 index 0000000..0b4ee90 --- /dev/null +++ b/lib/features/data_domain/tracks/network_tracks/domain/repositories/repositories.dart @@ -0,0 +1 @@ +export 'network_tracks_repository.dart'; diff --git a/lib/features/data_domain/tracks/network_tracks/network_tracks.dart b/lib/features/data_domain/tracks/network_tracks/network_tracks.dart new file mode 100644 index 0000000..f018dc9 --- /dev/null +++ b/lib/features/data_domain/tracks/network_tracks/network_tracks.dart @@ -0,0 +1,2 @@ +export 'data/data.dart'; +export 'domain/domain.dart'; \ No newline at end of file diff --git a/lib/features/data_domain/tracks/observe_tracks_loading/domain/domain.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/domain.dart new file mode 100644 index 0000000..b5775f7 --- /dev/null +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/domain.dart @@ -0,0 +1,3 @@ +export 'entities/entities.dart'; +export 'repository/repository.dart'; +export 'use_cases/use_cases.dart'; diff --git a/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/entities.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/entities.dart new file mode 100644 index 0000000..3579de7 --- /dev/null +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/entities.dart @@ -0,0 +1,2 @@ +export 'loading_tracks_collection/loading_tracks_collection.dart'; +export 'repository/repository.dart'; diff --git a/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_track_observer_subsribe_with_id.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_track_observer_subsribe_with_id.dart new file mode 100644 index 0000000..35c418c --- /dev/null +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_track_observer_subsribe_with_id.dart @@ -0,0 +1,12 @@ +import 'dart:async'; + +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/domain/entities/loading_track_observer.dart'; + +class LoadingTrackObserverSubscriptionWithId { + LoadingTrackObserverSubscriptionWithId( + {required this.loadingTrackObserver, required this.spotifyId, required this.loadingTrackObserverSubscribtions}); + + final LoadingTrackObserver loadingTrackObserver; + final String spotifyId; + final List loadingTrackObserverSubscribtions; +} diff --git a/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection.dart new file mode 100644 index 0000000..125a3e5 --- /dev/null +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection.dart @@ -0,0 +1,5 @@ +export 'loading_track_observer_subsribe_with_id.dart'; +export 'loading_tracks_collection_controller.dart'; +export 'loading_tracks_collection_info.dart'; +export 'loading_tracks_collection_observer.dart'; +export 'loading_tracks_collection_status.dart'; diff --git a/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection_controller.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection_controller.dart new file mode 100644 index 0000000..38f8e2e --- /dev/null +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection_controller.dart @@ -0,0 +1,138 @@ +import 'dart:async'; + +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/domain/entities/entities.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/entities.dart'; + +class LoadingTracksCollectionController { + LoadingTracksCollectionController(this._sourceTracksCollection) { + _observer = LoadingTracksCollectionObserver( + changedStream: _changedStreamController.stream.asBroadcastStream(), + allLoadedStream: _allLoadedStreamController.stream.asBroadcastStream(), + loadingStatusChangedStream: _loadingStatusChangedStreamController.stream.asBroadcastStream(), + getLoadingInfo: () => _loadingInfo, + getLoadingStatus: () => _loadingStatus); + } + + final Map _loadingEndedTracks = {}; + final List _loadingTracks = List.empty(growable: true); + + late final LoadingTracksCollectionObserver _observer; + LoadingTracksCollectionObserver get observer => _observer; + + final TracksCollection _sourceTracksCollection; + LoadingTracksCollectionInfo _loadingInfo = const LoadingTracksCollectionInfo.empty(); + + LoadingTracksCollectionStatus _loadingStatusField = LoadingTracksCollectionStatus.loading; + LoadingTracksCollectionStatus get _loadingStatus => _loadingStatusField; + set _loadingStatus(LoadingTracksCollectionStatus newStatus) { + if (newStatus != _loadingStatusField) { + _loadingStatusChangedStreamController.add(null); + } + _loadingStatusField = newStatus; + } + + final StreamController _changedStreamController = StreamController(); + final StreamController _allLoadedStreamController = StreamController(); + final StreamController _loadingStatusChangedStreamController = StreamController(); + + void observeLoadingTrack(LoadingTrackObserver loadingTrackObserver, Track track) { + if (loadingTrackObserver.status == LoadingTrackStatus.loadingCancelled) { + return; + } + + final foundLoadingTrack = _loadingTracks.where((l) => l.spotifyId == track.spotifyId).firstOrNull; + if (foundLoadingTrack != null) { + return; + } + + if (_loadingEndedTracks.containsKey(track.spotifyId)) { + _loadingEndedTracks.remove(track.spotifyId); + } + + if (loadingTrackObserver.status == LoadingTrackStatus.waitInLoadingQueue || + loadingTrackObserver.status == LoadingTrackStatus.loading) { + _startLoadingTrackObserve(loadingTrackObserver, track); + } else { + _loadingEndedTracks[track.spotifyId] = loadingTrackObserver.status; + } + + _update(); + } + + void _startLoadingTrackObserve(LoadingTrackObserver loadingTrackObserver, Track track) { + var subs = List.empty(growable: true); + var loadingTrack = LoadingTrackObserverSubscriptionWithId( + loadingTrackObserver: loadingTrackObserver, + spotifyId: track.spotifyId, + loadingTrackObserverSubscribtions: subs); + + var loadedSubscription = loadingTrackObserver.loadedStream.listen((event) => _onTrackLoadingEnded(loadingTrack)); + var failureSubscription = loadingTrackObserver.loadingFailureStream.listen((event) => _onTrackLoadingEnded(loadingTrack)); + var cancelSubscription = loadingTrackObserver.loadingCancelledStream.listen((event) => _onTrackLoadingEnded(loadingTrack)); + + subs.addAll([loadedSubscription, failureSubscription, cancelSubscription]); + + _loadingTracks.add(loadingTrack); + } + + Future _onTrackLoadingEnded(LoadingTrackObserverSubscriptionWithId loadingTrack) async { + _endLoadingTrackObserve(loadingTrack); + + if(loadingTrack.loadingTrackObserver.status != LoadingTrackStatus.loadingCancelled) { + _loadingEndedTracks[loadingTrack.spotifyId] = loadingTrack.loadingTrackObserver.status; + } + + _update(); + } + + Future _endLoadingTrackObserve(LoadingTrackObserverSubscriptionWithId loadingTrack) async { + if(_loadingTracks.contains(loadingTrack)) { + _loadingTracks.remove(loadingTrack); + } + + for (var sub in loadingTrack.loadingTrackObserverSubscribtions) { + await sub.cancel(); + } + } + + void _update() { + _updateLoadingTracksCollectionInfo(); + _changedStreamController.add(null); + + if (_loadingInfo.loadingTracks == 0) { + _allLoadedStreamController.add(null); + _loadingStatus = LoadingTracksCollectionStatus.loaded; + } else { + _loadingStatus = LoadingTracksCollectionStatus.loading; + } + } + + void _updateLoadingTracksCollectionInfo() { + int totalTracks = _loadingTracks.length + _loadingEndedTracks.length; + int loadedTracks = 0; + int loadingTracks = 0; + int failuredTracks = 0; + + for (var loadingEndTrackStatus in _loadingEndedTracks.values) { + if (loadingEndTrackStatus == LoadingTrackStatus.failure) { + failuredTracks++; + continue; + } + + if (loadingEndTrackStatus == LoadingTrackStatus.loaded) { + loadedTracks++; + continue; + } + } + + loadingTracks = _loadingTracks.length; + + _loadingInfo = LoadingTracksCollectionInfo( + totalTracks: totalTracks, + loadedTracks: loadedTracks, + loadingTracks: loadingTracks, + failuredTracks: failuredTracks, + tracksCollection: _sourceTracksCollection); + } +} diff --git a/lib/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_info.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection_info.dart similarity index 87% rename from lib/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_info.dart rename to lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection_info.dart index 92c4a07..95c3fc3 100644 --- a/lib/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_info.dart +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection_info.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/tracks_collection.dart'; class LoadingTracksCollectionInfo extends Equatable { const LoadingTracksCollectionInfo( diff --git a/lib/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_observer.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection_observer.dart similarity index 81% rename from lib/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_observer.dart rename to lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection_observer.dart index 8bcbfa6..d947f20 100644 --- a/lib/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_observer.dart +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection_observer.dart @@ -1,7 +1,6 @@ import 'dart:async'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_status.dart'; -import 'loading_tracks_collection_info.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection.dart'; class LoadingTracksCollectionObserver { LoadingTracksCollectionObserver( diff --git a/lib/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_status.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection_status.dart similarity index 100% rename from lib/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_status.dart rename to lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection_status.dart diff --git a/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/repository/loading_tracks_collection.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/repository/loading_tracks_collection.dart new file mode 100644 index 0000000..099194b --- /dev/null +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/repository/loading_tracks_collection.dart @@ -0,0 +1,8 @@ +import 'package:spotify_downloader/features/data_domain/tracks/observe_tracks_loading/domain/entities/entities.dart'; + +class LoadingTracksCollection { + LoadingTracksCollection({required this.id, required this.controller}); + + final LoadingTracksCollectionId id; + final LoadingTracksCollectionController controller; +} diff --git a/lib/features/domain/tracks/observe_tracks_loading/entities/repository/loading_tracks_collection_id.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/repository/loading_tracks_collection_id.dart similarity index 75% rename from lib/features/domain/tracks/observe_tracks_loading/entities/repository/loading_tracks_collection_id.dart rename to lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/repository/loading_tracks_collection_id.dart index bd57da1..97e44c0 100644 --- a/lib/features/domain/tracks/observe_tracks_loading/entities/repository/loading_tracks_collection_id.dart +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/repository/loading_tracks_collection_id.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection_type.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/tracks_collection_type.dart'; class LoadingTracksCollectionId extends Equatable { const LoadingTracksCollectionId({required this.spotifyId, required this.tracksCollectionType}); diff --git a/lib/features/domain/tracks/observe_tracks_loading/entities/repository/loading_tracks_collections_observer.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/repository/loading_tracks_collections_observer.dart similarity index 76% rename from lib/features/domain/tracks/observe_tracks_loading/entities/repository/loading_tracks_collections_observer.dart rename to lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/repository/loading_tracks_collections_observer.dart index b7ca5f1..b4924cf 100644 --- a/lib/features/domain/tracks/observe_tracks_loading/entities/repository/loading_tracks_collections_observer.dart +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/repository/loading_tracks_collections_observer.dart @@ -1,4 +1,4 @@ -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_observer.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/observe_tracks_loading/domain/entities/loading_tracks_collection/loading_tracks_collection_observer.dart'; class LoadingTracksCollectionsObserver { LoadingTracksCollectionsObserver( diff --git a/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/repository/repository.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/repository/repository.dart new file mode 100644 index 0000000..29022de --- /dev/null +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/entities/repository/repository.dart @@ -0,0 +1,3 @@ +export 'loading_tracks_collection.dart'; +export 'loading_tracks_collection_id.dart'; +export 'loading_tracks_collections_observer.dart'; diff --git a/lib/features/data_domain/tracks/observe_tracks_loading/domain/repository/observe_tracks_loading_repository.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/repository/observe_tracks_loading_repository.dart new file mode 100644 index 0000000..2a0435b --- /dev/null +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/repository/observe_tracks_loading_repository.dart @@ -0,0 +1,8 @@ +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/domain/entities/loading_track_observer.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/observe_tracks_loading/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; + +abstract class ObserveTracksLoadingRepository { + void observeLoadingTrack(LoadingTrackObserver loadingTrack, Track track); + Future getTracksCollectionsLoadingObserver(); +} diff --git a/lib/features/domain/tracks/observe_tracks_loading/repository/observe_tracks_loading_repository_impl.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/repository/observe_tracks_loading_repository_impl.dart similarity index 55% rename from lib/features/domain/tracks/observe_tracks_loading/repository/observe_tracks_loading_repository_impl.dart rename to lib/features/data_domain/tracks/observe_tracks_loading/domain/repository/observe_tracks_loading_repository_impl.dart index bf68078..b33f2c9 100644 --- a/lib/features/domain/tracks/observe_tracks_loading/repository/observe_tracks_loading_repository_impl.dart +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/repository/observe_tracks_loading_repository_impl.dart @@ -1,14 +1,10 @@ import 'dart:async'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_track_observer_with_id.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_controller.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/entities/repository/loading_tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/entities/repository/loading_tracks_collection_id.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/repository/observe_tracks_loading_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/domain/entities/loading_track_observer.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/observe_tracks_loading/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; + -import '../entities/repository/loading_tracks_collections_observer.dart'; class ObserveTracksLoadingRepositoryImpl implements ObserveTracksLoadingRepository { ObserveTracksLoadingRepositoryImpl() { @@ -28,7 +24,7 @@ class ObserveTracksLoadingRepositoryImpl implements ObserveTracksLoadingReposito } @override - void observeLoadingTrack(LoadingTrackObserver loadingTrack, Track track) { + void observeLoadingTrack(LoadingTrackObserver loadingTrackObserver, Track track) { final loadingTracksCollectionId = LoadingTracksCollectionId( spotifyId: track.parentCollection.spotifyId, tracksCollectionType: track.parentCollection.type); @@ -41,6 +37,6 @@ class ObserveTracksLoadingRepositoryImpl implements ObserveTracksLoadingReposito } loadingCollection.controller - .addLoadingTrack(LoadingTrackObserverWithId(loadingTrackObserver: loadingTrack, spotifyId: track.spotifyId)); + .observeLoadingTrack(loadingTrackObserver, track); } } diff --git a/lib/features/data_domain/tracks/observe_tracks_loading/domain/repository/repository.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/repository/repository.dart new file mode 100644 index 0000000..ba89d0c --- /dev/null +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/repository/repository.dart @@ -0,0 +1,2 @@ +export 'observe_tracks_loading_repository.dart'; +export 'observe_tracks_loading_repository_impl.dart'; diff --git a/lib/features/domain/tracks/observe_tracks_loading/use_cases/get_loading_tracks_collections_observer.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/use_cases/get_loading_tracks_collections_observer.dart similarity index 51% rename from lib/features/domain/tracks/observe_tracks_loading/use_cases/get_loading_tracks_collections_observer.dart rename to lib/features/data_domain/tracks/observe_tracks_loading/domain/use_cases/get_loading_tracks_collections_observer.dart index cedc08d..b07c8af 100644 --- a/lib/features/domain/tracks/observe_tracks_loading/use_cases/get_loading_tracks_collections_observer.dart +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/use_cases/get_loading_tracks_collections_observer.dart @@ -1,8 +1,5 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/entities/repository/loading_tracks_collections_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/repository/observe_tracks_loading_repository.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/observe_tracks_loading/domain/domain.dart'; class GetLoadingTracksCollectionsObserver implements UseCase { final ObserveTracksLoadingRepository _observeTracksLoading; diff --git a/lib/features/data_domain/tracks/observe_tracks_loading/domain/use_cases/use_cases.dart b/lib/features/data_domain/tracks/observe_tracks_loading/domain/use_cases/use_cases.dart new file mode 100644 index 0000000..81503aa --- /dev/null +++ b/lib/features/data_domain/tracks/observe_tracks_loading/domain/use_cases/use_cases.dart @@ -0,0 +1 @@ +export 'get_loading_tracks_collections_observer.dart'; diff --git a/lib/features/data_domain/tracks/search_videos_by_track/data/data.dart b/lib/features/data_domain/tracks/search_videos_by_track/data/data.dart new file mode 100644 index 0000000..e3893d4 --- /dev/null +++ b/lib/features/data_domain/tracks/search_videos_by_track/data/data.dart @@ -0,0 +1,2 @@ +export 'data_sources/data_sources.dart'; +export 'repositories/repositories.dart'; diff --git a/lib/features/data_domain/tracks/search_videos_by_track/data/data_sources/data_sources.dart b/lib/features/data_domain/tracks/search_videos_by_track/data/data_sources/data_sources.dart new file mode 100644 index 0000000..231ea4c --- /dev/null +++ b/lib/features/data_domain/tracks/search_videos_by_track/data/data_sources/data_sources.dart @@ -0,0 +1 @@ +export 'search_video_on_youtube_data_source.dart'; diff --git a/lib/features/data/tracks/search_videos_by_track/data_sources/search_video_on_youtube_data_source.dart b/lib/features/data_domain/tracks/search_videos_by_track/data/data_sources/search_video_on_youtube_data_source.dart similarity index 88% rename from lib/features/data/tracks/search_videos_by_track/data_sources/search_video_on_youtube_data_source.dart rename to lib/features/data_domain/tracks/search_videos_by_track/data/data_sources/search_video_on_youtube_data_source.dart index 66eb76e..ab489ca 100644 --- a/lib/features/data/tracks/search_videos_by_track/data_sources/search_video_on_youtube_data_source.dart +++ b/lib/features/data_domain/tracks/search_videos_by_track/data/data_sources/search_video_on_youtube_data_source.dart @@ -2,10 +2,7 @@ import 'dart:io'; import 'dart:math'; import 'package:http/http.dart'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/failures/failures.dart'; -import 'package:spotify_downloader/core/util/isolate_pool/isolate_pool.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; import 'package:youtube_explode_dart/youtube_explode_dart.dart'; class SearchVideoOnYoutubeDataSource { diff --git a/lib/features/data_domain/tracks/search_videos_by_track/data/repositories/converters/converters.dart b/lib/features/data_domain/tracks/search_videos_by_track/data/repositories/converters/converters.dart new file mode 100644 index 0000000..f1ade3a --- /dev/null +++ b/lib/features/data_domain/tracks/search_videos_by_track/data/repositories/converters/converters.dart @@ -0,0 +1 @@ +export 'video_dto_to_video_converter.dart'; diff --git a/lib/features/data/tracks/search_videos_by_track/repositories/converters/video_dto_to_video_converter.dart b/lib/features/data_domain/tracks/search_videos_by_track/data/repositories/converters/video_dto_to_video_converter.dart similarity index 68% rename from lib/features/data/tracks/search_videos_by_track/repositories/converters/video_dto_to_video_converter.dart rename to lib/features/data_domain/tracks/search_videos_by_track/data/repositories/converters/video_dto_to_video_converter.dart index 7fef4e6..98af119 100644 --- a/lib/features/data/tracks/search_videos_by_track/repositories/converters/video_dto_to_video_converter.dart +++ b/lib/features/data_domain/tracks/search_videos_by_track/data/repositories/converters/video_dto_to_video_converter.dart @@ -1,7 +1,5 @@ -// ignore_for_file: invalid_use_of_internal_member - -import 'package:spotify_downloader/core/util/converters/simple_converters/value_converter.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/entities/video.dart' as entity; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/search_videos_by_track/domain/entities/video.dart' as entity; import 'package:youtube_explode_dart/youtube_explode_dart.dart' as model; class VideoDtoToVideoConverter implements ValueConverter { diff --git a/lib/features/data_domain/tracks/search_videos_by_track/data/repositories/repositories.dart b/lib/features/data_domain/tracks/search_videos_by_track/data/repositories/repositories.dart new file mode 100644 index 0000000..d097419 --- /dev/null +++ b/lib/features/data_domain/tracks/search_videos_by_track/data/repositories/repositories.dart @@ -0,0 +1,2 @@ +export 'converters/converters.dart'; +export 'search_videos_by_track_repository_impl.dart'; diff --git a/lib/features/data/tracks/search_videos_by_track/repositories/search_videos_by_track_repository_impl.dart b/lib/features/data_domain/tracks/search_videos_by_track/data/repositories/search_videos_by_track_repository_impl.dart similarity index 74% rename from lib/features/data/tracks/search_videos_by_track/repositories/search_videos_by_track_repository_impl.dart rename to lib/features/data_domain/tracks/search_videos_by_track/data/repositories/search_videos_by_track_repository_impl.dart index 57cc137..b203d39 100644 --- a/lib/features/data/tracks/search_videos_by_track/repositories/search_videos_by_track_repository_impl.dart +++ b/lib/features/data_domain/tracks/search_videos_by_track/data/repositories/search_videos_by_track_repository_impl.dart @@ -1,10 +1,6 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/tracks/search_videos_by_track/data_sources/search_video_on_youtube_data_source.dart'; -import 'package:spotify_downloader/features/data/tracks/search_videos_by_track/repositories/converters/video_dto_to_video_converter.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/entities/video.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/repositories/search_videos_by_track_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/search_videos_by_track/search_videos_by_track.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/track.dart'; class SearchVideosByTrackRepositoryImpl implements SearchVideosByTrackRepository { SearchVideosByTrackRepositoryImpl({required SearchVideoOnYoutubeDataSource searchVideoOnYoutubeDataSource}) @@ -86,13 +82,13 @@ class SearchVideosByTrackRepositoryImpl implements SearchVideosByTrackRepository videoRating++; } - if (track.duration != null && video.duration != null) { - const durationTolerance = 10; - if (video.duration!.inSeconds - durationTolerance <= track.duration!.inSeconds && - track.duration!.inSeconds <= video.duration!.inSeconds + durationTolerance) { - videoRating += 3; - } + if (track.duration != null && video.duration != null) { + const durationTolerance = 10; + if (video.duration!.inSeconds - durationTolerance <= track.duration!.inSeconds && + track.duration!.inSeconds <= video.duration!.inSeconds + durationTolerance) { + videoRating += 3; } + } return videoRating; } diff --git a/lib/features/data_domain/tracks/search_videos_by_track/domain/domain.dart b/lib/features/data_domain/tracks/search_videos_by_track/domain/domain.dart new file mode 100644 index 0000000..cc16ca3 --- /dev/null +++ b/lib/features/data_domain/tracks/search_videos_by_track/domain/domain.dart @@ -0,0 +1,3 @@ +export 'entities/entities.dart'; +export 'repositories/repositories.dart'; +export 'use_cases/use_cases.dart'; diff --git a/lib/features/data_domain/tracks/search_videos_by_track/domain/entities/entities.dart b/lib/features/data_domain/tracks/search_videos_by_track/domain/entities/entities.dart new file mode 100644 index 0000000..703bc9c --- /dev/null +++ b/lib/features/data_domain/tracks/search_videos_by_track/domain/entities/entities.dart @@ -0,0 +1 @@ +export 'video.dart'; diff --git a/lib/features/domain/tracks/search_videos_by_track/entities/video.dart b/lib/features/data_domain/tracks/search_videos_by_track/domain/entities/video.dart similarity index 100% rename from lib/features/domain/tracks/search_videos_by_track/entities/video.dart rename to lib/features/data_domain/tracks/search_videos_by_track/domain/entities/video.dart diff --git a/lib/features/data_domain/tracks/search_videos_by_track/domain/repositories/repositories.dart b/lib/features/data_domain/tracks/search_videos_by_track/domain/repositories/repositories.dart new file mode 100644 index 0000000..3b86fbc --- /dev/null +++ b/lib/features/data_domain/tracks/search_videos_by_track/domain/repositories/repositories.dart @@ -0,0 +1 @@ +export 'search_videos_by_track_repository.dart'; diff --git a/lib/features/data_domain/tracks/search_videos_by_track/domain/repositories/search_videos_by_track_repository.dart b/lib/features/data_domain/tracks/search_videos_by_track/domain/repositories/search_videos_by_track_repository.dart new file mode 100644 index 0000000..6020b58 --- /dev/null +++ b/lib/features/data_domain/tracks/search_videos_by_track/domain/repositories/search_videos_by_track_repository.dart @@ -0,0 +1,9 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/search_videos_by_track/domain/entities/video.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/track.dart'; + +abstract class SearchVideosByTrackRepository { + Future> findVideoByTrack(Track track); + Future>> findVideosByTrack(Track track, int count); + Future> getVideoByUrl(String url); +} \ No newline at end of file diff --git a/lib/features/data_domain/tracks/search_videos_by_track/domain/use_cases/find_10_videos_by_track.dart b/lib/features/data_domain/tracks/search_videos_by_track/domain/use_cases/find_10_videos_by_track.dart new file mode 100644 index 0000000..494b5e1 --- /dev/null +++ b/lib/features/data_domain/tracks/search_videos_by_track/domain/use_cases/find_10_videos_by_track.dart @@ -0,0 +1,15 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/search_videos_by_track/search_videos_by_track.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/track.dart'; + +class Find10VideosByTrack implements UseCase, Track> { + Find10VideosByTrack({required SearchVideosByTrackRepository searchVideosByTrackRepository}) + : _searchVideosByTrackRepository = searchVideosByTrackRepository; + + final SearchVideosByTrackRepository _searchVideosByTrackRepository; + + @override + Future>> call(Track track) { + return _searchVideosByTrackRepository.findVideosByTrack(track, 10); + } +} diff --git a/lib/features/data_domain/tracks/search_videos_by_track/domain/use_cases/get_video_by_url.dart b/lib/features/data_domain/tracks/search_videos_by_track/domain/use_cases/get_video_by_url.dart new file mode 100644 index 0000000..daca811 --- /dev/null +++ b/lib/features/data_domain/tracks/search_videos_by_track/domain/use_cases/get_video_by_url.dart @@ -0,0 +1,14 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/search_videos_by_track/search_videos_by_track.dart'; + +class GetVideoByUrl implements UseCase { + GetVideoByUrl({required SearchVideosByTrackRepository searchVideosByTrackRepository}) + : _searchVideosByTrackRepository = searchVideosByTrackRepository; + + final SearchVideosByTrackRepository _searchVideosByTrackRepository; + + @override + Future> call(String url) { + return _searchVideosByTrackRepository.getVideoByUrl(url); + } +} diff --git a/lib/features/data_domain/tracks/search_videos_by_track/domain/use_cases/use_cases.dart b/lib/features/data_domain/tracks/search_videos_by_track/domain/use_cases/use_cases.dart new file mode 100644 index 0000000..e8b51eb --- /dev/null +++ b/lib/features/data_domain/tracks/search_videos_by_track/domain/use_cases/use_cases.dart @@ -0,0 +1,2 @@ +export 'find_10_videos_by_track.dart'; +export 'get_video_by_url.dart'; diff --git a/lib/features/data_domain/tracks/search_videos_by_track/search_videos_by_track.dart b/lib/features/data_domain/tracks/search_videos_by_track/search_videos_by_track.dart new file mode 100644 index 0000000..f018dc9 --- /dev/null +++ b/lib/features/data_domain/tracks/search_videos_by_track/search_videos_by_track.dart @@ -0,0 +1,2 @@ +export 'data/data.dart'; +export 'domain/domain.dart'; \ No newline at end of file diff --git a/lib/features/data_domain/tracks/services/entities/entities.dart b/lib/features/data_domain/tracks/services/entities/entities.dart new file mode 100644 index 0000000..84730d5 --- /dev/null +++ b/lib/features/data_domain/tracks/services/entities/entities.dart @@ -0,0 +1,2 @@ +export 'track_with_loading_observer.dart'; +export 'tracks_with_loading_observer_getting_observer.dart'; diff --git a/lib/features/domain/tracks/services/entities/track_with_loading_observer.dart b/lib/features/data_domain/tracks/services/entities/track_with_loading_observer.dart similarity index 78% rename from lib/features/domain/tracks/services/entities/track_with_loading_observer.dart rename to lib/features/data_domain/tracks/services/entities/track_with_loading_observer.dart index 78b226a..eb957fa 100644 --- a/lib/features/domain/tracks/services/entities/track_with_loading_observer.dart +++ b/lib/features/data_domain/tracks/services/entities/track_with_loading_observer.dart @@ -1,7 +1,7 @@ import 'dart:async'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/domain/entities/loading_track_observer.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/track.dart'; class TrackWithLoadingObserver { TrackWithLoadingObserver({required this.track, LoadingTrackObserver? loadingObserver}) diff --git a/lib/features/data_domain/tracks/services/entities/tracks_with_loading_observer_getting_observer.dart b/lib/features/data_domain/tracks/services/entities/tracks_with_loading_observer_getting_observer.dart new file mode 100644 index 0000000..61c93d0 --- /dev/null +++ b/lib/features/data_domain/tracks/services/entities/tracks_with_loading_observer_getting_observer.dart @@ -0,0 +1,14 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/network_tracks/domain/entities/tracks_getting_ended_status.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/entities/track_with_loading_observer.dart'; + +class TracksWithLoadingObserverGettingObserver { + TracksWithLoadingObserverGettingObserver({ + required this.onEnded, + required this.onPartGot, + }); + + + Stream> onEnded; + Stream> onPartGot; +} diff --git a/lib/features/data_domain/tracks/services/services.dart b/lib/features/data_domain/tracks/services/services.dart new file mode 100644 index 0000000..a229d11 --- /dev/null +++ b/lib/features/data_domain/tracks/services/services.dart @@ -0,0 +1,3 @@ +export 'entities/entities.dart'; +export 'services/services.dart'; +export 'use_cases/use_cases.dart'; diff --git a/lib/features/data_domain/tracks/services/services/download_tracks_service/download_tracks_service.dart b/lib/features/data_domain/tracks/services/services/download_tracks_service/download_tracks_service.dart new file mode 100644 index 0000000..0e85930 --- /dev/null +++ b/lib/features/data_domain/tracks/services/services/download_tracks_service/download_tracks_service.dart @@ -0,0 +1,13 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/entities/entities.dart'; + +abstract class DownloadTracksService { + Future> downloadTrack(TrackWithLoadingObserver trackWithLoadingObserver, [String? preselectedYouTubeUrl]); + + Future> downloadTracksRange(List tracksWithLoadingObservers, [Map? preselectedYouTubeUrls]); + + Future> downloadTracksFromGettingObserver( + TracksWithLoadingObserverGettingObserver tracksWithLoadingObserverGettingObserver); + + Future> cancelTrackLoading(TrackWithLoadingObserver track); +} diff --git a/lib/features/domain/tracks/services/services/download_tracks_service/download_tracks_service_impl.dart b/lib/features/data_domain/tracks/services/services/download_tracks_service/download_tracks_service_impl.dart similarity index 50% rename from lib/features/domain/tracks/services/services/download_tracks_service/download_tracks_service_impl.dart rename to lib/features/data_domain/tracks/services/services/download_tracks_service/download_tracks_service_impl.dart index 8f4c220..51aca73 100644 --- a/lib/features/domain/tracks/services/services/download_tracks_service/download_tracks_service_impl.dart +++ b/lib/features/data_domain/tracks/services/services/download_tracks_service/download_tracks_service_impl.dart @@ -1,25 +1,13 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/failures/failures.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/settings/enitities/save_mode.dart'; -import 'package:spotify_downloader/features/domain/settings/repository/download_tracks_settings_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_status.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/track_loading_notifier.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/track_with_lazy_youtube_url.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/repositories/dowload_tracks_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_track.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_tracks_collection_group.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/repositories/local_tracks_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/repository/observe_tracks_loading_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/repositories/search_videos_by_track_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/entities/track_with_loading_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/entities/tracks_with_loading_observer_getting_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/tools/save_path_generator.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/tools/tracks_collection_type_to_local_tracks_collection_type_converter.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/download_tracks_service/download_tracks_service.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/settings/domain/enitities/enitities.dart'; +import 'package:spotify_downloader/features/data_domain/settings/domain/repository/download_tracks_settings_repository.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/download_tracks.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/local_tracks.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/observe_tracks_loading/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/search_videos_by_track/search_videos_by_track.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/services.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/services/tools/save_path_generator.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/services/tools/tracks_collection_type_to_local_tracks_collection_type_converter.dart'; class DownloadTracksServiceImpl implements DownloadTracksService { DownloadTracksServiceImpl( @@ -54,16 +42,16 @@ class DownloadTracksServiceImpl implements DownloadTracksService { } @override - Future> downloadTracksRange(List tracksWithLoadingObservers) async { + Future> downloadTracksRange(List tracksWithLoadingObservers, + [Map? preselectedYoutubeUrls]) async { for (var trackWithLoadingObserver in tracksWithLoadingObservers) { if (!trackWithLoadingObserver.track.isLoaded && (trackWithLoadingObserver.loadingObserver == null || trackWithLoadingObserver.loadingObserver!.status == LoadingTrackStatus.failure || trackWithLoadingObserver.loadingObserver!.status == LoadingTrackStatus.loadingCancelled)) { - final trackObserverResult = await downloadTrack(trackWithLoadingObserver.track); - if (trackObserverResult.isSuccessful) { - trackWithLoadingObserver.loadingObserver = trackObserverResult.result; - } else { + final trackObserverResult = + await downloadTrack(trackWithLoadingObserver, preselectedYoutubeUrls?[trackWithLoadingObserver]); + if (!trackObserverResult.isSuccessful) { final fakeLoadingNotifier = TrackLoadingNotifier(); trackWithLoadingObserver.loadingObserver = fakeLoadingNotifier.loadingTrackObserver; fakeLoadingNotifier.loadingFailure(trackObserverResult.failure); @@ -75,18 +63,25 @@ class DownloadTracksServiceImpl implements DownloadTracksService { } @override - Future> downloadTrack(Track track) async { + Future> downloadTrack(TrackWithLoadingObserver trackWithLoadingObserver, + [String? preselectedYoutubeUrl]) async { final getDownloadTracksSettings = await _downloadTracksSettingsRepository.getDownloadTracksSettings(); if (!getDownloadTracksSettings.isSuccessful) { return Result.notSuccessful(getDownloadTracksSettings.failure); } - final String trackSavePath = _savePathGenerator.generateSavePath(track, getDownloadTracksSettings.result!); - final resultTrackObsever = await _dowloadTracksRepository.dowloadTrack( + final String trackSavePath = + _savePathGenerator.generateSavePath(trackWithLoadingObserver.track, getDownloadTracksSettings.result!); + final downloadTrackResult = await _dowloadTracksRepository.dowloadTrack( TrackWithLazyYoutubeUrl( - track: track, - getYoutubeUrlFunction: () async { - final videoResult = await _searchVideosByTrackRepository.findVideoByTrack(track); + track: trackWithLoadingObserver.track, + getYoutubeUrl: () async { + if (preselectedYoutubeUrl != null) { + return Result.isSuccessful(preselectedYoutubeUrl); + } + + final videoResult = + await _searchVideosByTrackRepository.findVideoByTrack(trackWithLoadingObserver.track); if (!videoResult.isSuccessful) { return Result.notSuccessful(videoResult.failure); @@ -99,33 +94,53 @@ class DownloadTracksServiceImpl implements DownloadTracksService { }), trackSavePath); - final serviceTrackObserver = resultTrackObsever.result!; - serviceTrackObserver.loadedStream.listen((savePath) { + if (!downloadTrackResult.isSuccessful) { + return Result.notSuccessful(downloadTrackResult.failure); + } + + downloadTrackResult.result!.loadedStream.listen((savePath) { _localTracksRepository.saveLocalTrack(LocalTrack( - spotifyId: track.spotifyId, + spotifyId: trackWithLoadingObserver.track.spotifyId, savePath: savePath, tracksCollection: getDownloadTracksSettings.result!.saveMode == SaveMode.folderForTracksCollection ? LocalTracksCollection( - spotifyId: track.parentCollection.spotifyId, - type: _collectionTypeConverter.convert(track.parentCollection.type), + spotifyId: trackWithLoadingObserver.track.parentCollection.spotifyId, + type: _collectionTypeConverter.convert(trackWithLoadingObserver.track.parentCollection.type), group: LocalTracksCollectionsGroup(directoryPath: getDownloadTracksSettings.result!.savePath)) : LocalTracksCollection.getAllTracksCollection(getDownloadTracksSettings.result!.savePath), - youtubeUrl: track.youtubeUrl!)); + youtubeUrl: downloadTrackResult.result!.youtubeUrl ?? "")); }); - _observeTracksLoadingRepository.observeLoadingTrack(serviceTrackObserver, track); + _observeTracksLoadingRepository.observeLoadingTrack(downloadTrackResult.result!, trackWithLoadingObserver.track); - return resultTrackObsever; + trackWithLoadingObserver.loadingObserver = downloadTrackResult.result!; + return const Result.isSuccessful(null); } @override - Future> cancelTrackLoading(Track track) async { + Future> cancelTrackLoading(TrackWithLoadingObserver trackWithLoadingObserver) async { + if (trackWithLoadingObserver.loadingObserver == null || + (trackWithLoadingObserver.loadingObserver?.status != LoadingTrackStatus.loading && + trackWithLoadingObserver.loadingObserver?.status != LoadingTrackStatus.waitInLoadingQueue)) { + + trackWithLoadingObserver.loadingObserver = null; + return const Result.isSuccessful(null); + } + final getDownloadTracksSettings = await _downloadTracksSettingsRepository.getDownloadTracksSettings(); if (!getDownloadTracksSettings.isSuccessful) { return Result.notSuccessful(getDownloadTracksSettings.failure); } - final trackSavePath = _savePathGenerator.generateSavePath(track, getDownloadTracksSettings.result!); - return _dowloadTracksRepository.cancelTrackLoading(track, trackSavePath); + final trackSavePath = + _savePathGenerator.generateSavePath(trackWithLoadingObserver.track, getDownloadTracksSettings.result!); + final cancelTrackLoadingResult = + _dowloadTracksRepository.cancelTrackLoading(trackWithLoadingObserver.track, trackSavePath); + if (!cancelTrackLoadingResult.isSuccessful) { + return Result.notSuccessful(cancelTrackLoadingResult.failure); + } + + trackWithLoadingObserver.loadingObserver = null; + return const Result.isSuccessful(null); } } diff --git a/lib/features/data_domain/tracks/services/services/get_tracks_service/get_tracks_service.dart b/lib/features/data_domain/tracks/services/services/get_tracks_service/get_tracks_service.dart new file mode 100644 index 0000000..07bc1f2 --- /dev/null +++ b/lib/features/data_domain/tracks/services/services/get_tracks_service/get_tracks_service.dart @@ -0,0 +1,8 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/tracks_collection.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/entities/tracks_with_loading_observer_getting_observer.dart'; + +abstract class GetTracksService { + Future> getTracksWithLoadingObserversFromTracksColleciton( + {required TracksCollection tracksCollection, required int offset}); +} \ No newline at end of file diff --git a/lib/features/domain/tracks/services/services/get_tracks_service/get_tracks_service_impl.dart b/lib/features/data_domain/tracks/services/services/get_tracks_service/get_tracks_service_impl.dart similarity index 67% rename from lib/features/domain/tracks/services/services/get_tracks_service/get_tracks_service_impl.dart rename to lib/features/data_domain/tracks/services/services/get_tracks_service/get_tracks_service_impl.dart index 5fea326..4612e75 100644 --- a/lib/features/domain/tracks/services/services/get_tracks_service/get_tracks_service_impl.dart +++ b/lib/features/data_domain/tracks/services/services/get_tracks_service/get_tracks_service_impl.dart @@ -1,28 +1,19 @@ import 'dart:async'; import 'dart:io'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/repositories/local_full_auth_repository.dart'; - -import 'package:spotify_downloader/features/domain/settings/enitities/save_mode.dart'; -import 'package:spotify_downloader/features/domain/settings/repository/download_tracks_settings_repository.dart'; -import 'package:spotify_downloader/features/domain/shared/spotify_repository_request.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_track.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_tracks_collection_group.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/repositories/local_tracks_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/network_tracks/entities/tracks_getting_ended_status.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/tools/save_path_generator.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/tools/tracks_collection_type_to_local_tracks_collection_type_converter.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/get_tracks_service/get_tracks_service.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/repositories/dowload_tracks_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/network_tracks/entities/get_tracks_from_tracks_collection_args.dart'; -import 'package:spotify_downloader/features/domain/tracks/network_tracks/repositories/network_tracks_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/entities/track_with_loading_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/entities/tracks_with_loading_observer_getting_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/auth/local_auth/local_auth.dart'; +import 'package:spotify_downloader/features/data_domain/settings/domain/enitities/enitities.dart'; +import 'package:spotify_downloader/features/data_domain/settings/domain/repository/download_tracks_settings_repository.dart'; +import 'package:spotify_downloader/features/data_domain/shared/domain/spotify_repository_request.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/download_tracks/download_tracks.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/local_tracks.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/network_tracks/network_tracks.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/services.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/services/tools/save_path_generator.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/services/tools/tracks_collection_type_to_local_tracks_collection_type_converter.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/entities.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/liked_track.dart'; class GetTracksServiceImpl implements GetTracksService { GetTracksServiceImpl( @@ -120,8 +111,28 @@ class GetTracksServiceImpl implements GetTracksService { if (localTrack != null) { if (await _checkLocalTrackToExistence(localTrack)) { - track.isLoaded = true; - track.youtubeUrl = localTrack.youtubeUrl; + if (track is LikedTrack) { + track = LikedTrack( + spotifyId: track.spotifyId, + parentCollection: track.parentCollection, + name: track.name, + album: track.album, + artists: track.artists, + duration: track.duration, + isLoaded: true, + addedAt: track.addedAt, + localYoutubeUrl: localTrack.youtubeUrl); + } else { + track = Track( + spotifyId: track.spotifyId, + parentCollection: track.parentCollection, + name: track.name, + album: track.album, + artists: track.artists, + duration: track.duration, + isLoaded: true, + localYoutubeUrl: localTrack.youtubeUrl); + } } } diff --git a/lib/features/data_domain/tracks/services/services/services.dart b/lib/features/data_domain/tracks/services/services/services.dart new file mode 100644 index 0000000..a60d6ee --- /dev/null +++ b/lib/features/data_domain/tracks/services/services/services.dart @@ -0,0 +1,4 @@ +export 'download_tracks_service/download_tracks_service.dart'; +export 'get_tracks_service/get_tracks_service.dart'; +export 'download_tracks_service/download_tracks_service_impl.dart'; +export 'get_tracks_service/get_tracks_service_impl.dart'; \ No newline at end of file diff --git a/lib/features/domain/tracks/services/services/tools/save_path_generator.dart b/lib/features/data_domain/tracks/services/services/tools/save_path_generator.dart similarity index 56% rename from lib/features/domain/tracks/services/services/tools/save_path_generator.dart rename to lib/features/data_domain/tracks/services/services/tools/save_path_generator.dart index 6dcf542..cc18013 100644 --- a/lib/features/domain/tracks/services/services/tools/save_path_generator.dart +++ b/lib/features/data_domain/tracks/services/services/tools/save_path_generator.dart @@ -1,7 +1,6 @@ -import 'package:spotify_downloader/core/util/util_methods.dart'; -import 'package:spotify_downloader/features/domain/settings/enitities/download_tracks_settings.dart'; -import 'package:spotify_downloader/features/domain/settings/enitities/save_mode.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; +import 'package:spotify_downloader/core/utils/util_methods.dart'; +import 'package:spotify_downloader/features/data_domain/settings/domain/enitities/enitities.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/track.dart'; import 'package:path/path.dart' as p; class SavePathGenerator { diff --git a/lib/features/domain/tracks/services/services/tools/tracks_collection_type_to_local_tracks_collection_type_converter.dart b/lib/features/data_domain/tracks/services/services/tools/tracks_collection_type_to_local_tracks_collection_type_converter.dart similarity index 69% rename from lib/features/domain/tracks/services/services/tools/tracks_collection_type_to_local_tracks_collection_type_converter.dart rename to lib/features/data_domain/tracks/services/services/tools/tracks_collection_type_to_local_tracks_collection_type_converter.dart index b913059..57a165e 100644 --- a/lib/features/domain/tracks/services/services/tools/tracks_collection_type_to_local_tracks_collection_type_converter.dart +++ b/lib/features/data_domain/tracks/services/services/tools/tracks_collection_type_to_local_tracks_collection_type_converter.dart @@ -1,6 +1,6 @@ -import 'package:spotify_downloader/core/util/converters/simple_converters/value_converter.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_tracks_collection_type.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection_type.dart'; +import 'package:spotify_downloader/core/utils/converters/simple_converters/value_converter.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/local_tracks/domain/entities/local_tracks_collection_type.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/tracks_collection_type.dart'; class TracksCollectionTypeToLocalTracksCollectionTypeConverter implements ValueConverter { diff --git a/lib/features/data_domain/tracks/services/use_cases/cancel_track_loading.dart b/lib/features/data_domain/tracks/services/use_cases/cancel_track_loading.dart new file mode 100644 index 0000000..cedb6a9 --- /dev/null +++ b/lib/features/data_domain/tracks/services/use_cases/cancel_track_loading.dart @@ -0,0 +1,15 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/entities/entities.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/services/services.dart'; + +class CancelTrackLoading implements UseCase { + CancelTrackLoading({required DownloadTracksService dowloadTracksService}) + : _dowloadTracksService = dowloadTracksService; + + final DownloadTracksService _dowloadTracksService; + + @override + Future> call(TrackWithLoadingObserver trackWithLoadingObserver) async { + return _dowloadTracksService.cancelTrackLoading(trackWithLoadingObserver); + } +} diff --git a/lib/features/data_domain/tracks/services/use_cases/download_track.dart b/lib/features/data_domain/tracks/services/use_cases/download_track.dart new file mode 100644 index 0000000..b27f73f --- /dev/null +++ b/lib/features/data_domain/tracks/services/use_cases/download_track.dart @@ -0,0 +1,13 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/services.dart'; + +class DownloadTrack implements UseCase { + DownloadTrack({required DownloadTracksService downloadTracksService}) : _downloadTracksService = downloadTracksService; + + final DownloadTracksService _downloadTracksService; + + @override + Future> call((TrackWithLoadingObserver trackWithLoadingObserver, String? preselectedTracksYouTubeUrl) params) async { + return _downloadTracksService.downloadTrack(params.$1, params.$2); + } +} diff --git a/lib/features/domain/tracks/services/use_cases/download_tracks_from_getting_observer.dart b/lib/features/data_domain/tracks/services/use_cases/download_tracks_from_getting_observer.dart similarity index 52% rename from lib/features/domain/tracks/services/use_cases/download_tracks_from_getting_observer.dart rename to lib/features/data_domain/tracks/services/use_cases/download_tracks_from_getting_observer.dart index b2590ec..0886bfe 100644 --- a/lib/features/domain/tracks/services/use_cases/download_tracks_from_getting_observer.dart +++ b/lib/features/data_domain/tracks/services/use_cases/download_tracks_from_getting_observer.dart @@ -1,8 +1,5 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/entities/tracks_with_loading_observer_getting_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/download_tracks_service/download_tracks_service.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/services.dart'; class DownloadTracksFromGettingObserver implements UseCase { DownloadTracksFromGettingObserver({required DownloadTracksService downloadTracksService}) diff --git a/lib/features/data_domain/tracks/services/use_cases/download_tracks_range.dart b/lib/features/data_domain/tracks/services/use_cases/download_tracks_range.dart new file mode 100644 index 0000000..d671db4 --- /dev/null +++ b/lib/features/data_domain/tracks/services/use_cases/download_tracks_range.dart @@ -0,0 +1,13 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/services.dart'; + +class DownloadTracksRange implements UseCase, Map)> { + DownloadTracksRange({required DownloadTracksService downloadTracksService}) : _downloadTracksService = downloadTracksService; + + final DownloadTracksService _downloadTracksService; + + @override + Future> call((List tracks, Map preselectedYouTubeUrls) params) async { + return _downloadTracksService.downloadTracksRange(params.$1, params.$2); + } +} \ No newline at end of file diff --git a/lib/features/domain/tracks/services/use_cases/get_tracks_with_loading_observer_from_tracks_collection.dart b/lib/features/data_domain/tracks/services/use_cases/get_tracks_with_loading_observer_from_tracks_collection.dart similarity index 52% rename from lib/features/domain/tracks/services/use_cases/get_tracks_with_loading_observer_from_tracks_collection.dart rename to lib/features/data_domain/tracks/services/use_cases/get_tracks_with_loading_observer_from_tracks_collection.dart index 7226854..9603477 100644 --- a/lib/features/domain/tracks/services/use_cases/get_tracks_with_loading_observer_from_tracks_collection.dart +++ b/lib/features/data_domain/tracks/services/use_cases/get_tracks_with_loading_observer_from_tracks_collection.dart @@ -1,9 +1,6 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/get_tracks_service/get_tracks_service.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/entities/tracks_with_loading_observer_getting_observer.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/services.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; class GetTracksWithLoadingObserverFromTracksCollection implements UseCase { diff --git a/lib/features/domain/tracks/services/use_cases/get_tracks_with_loading_observer_from_tracks_collection_with_offset.dart b/lib/features/data_domain/tracks/services/use_cases/get_tracks_with_loading_observer_from_tracks_collection_with_offset.dart similarity index 54% rename from lib/features/domain/tracks/services/use_cases/get_tracks_with_loading_observer_from_tracks_collection_with_offset.dart rename to lib/features/data_domain/tracks/services/use_cases/get_tracks_with_loading_observer_from_tracks_collection_with_offset.dart index f5fd0fb..237b1dc 100644 --- a/lib/features/domain/tracks/services/use_cases/get_tracks_with_loading_observer_from_tracks_collection_with_offset.dart +++ b/lib/features/data_domain/tracks/services/use_cases/get_tracks_with_loading_observer_from_tracks_collection_with_offset.dart @@ -1,9 +1,6 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/get_tracks_service/get_tracks_service.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/entities/tracks_with_loading_observer_getting_observer.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/services/services.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; class GetTracksWithLoadingObserverFromTracksCollectionWithOffset implements diff --git a/lib/features/data_domain/tracks/services/use_cases/use_cases.dart b/lib/features/data_domain/tracks/services/use_cases/use_cases.dart new file mode 100644 index 0000000..a7cdc8c --- /dev/null +++ b/lib/features/data_domain/tracks/services/use_cases/use_cases.dart @@ -0,0 +1,6 @@ +export 'cancel_track_loading.dart'; +export 'download_track.dart'; +export 'download_tracks_from_getting_observer.dart'; +export 'download_tracks_range.dart'; +export 'get_tracks_with_loading_observer_from_tracks_collection.dart'; +export 'get_tracks_with_loading_observer_from_tracks_collection_with_offset.dart'; diff --git a/lib/features/data_domain/tracks/shared/domain/domain.dart b/lib/features/data_domain/tracks/shared/domain/domain.dart new file mode 100644 index 0000000..506ac8a --- /dev/null +++ b/lib/features/data_domain/tracks/shared/domain/domain.dart @@ -0,0 +1 @@ +export 'entities/entities.dart'; diff --git a/lib/features/domain/tracks/shared/entities/album.dart b/lib/features/data_domain/tracks/shared/domain/entities/album.dart similarity index 100% rename from lib/features/domain/tracks/shared/entities/album.dart rename to lib/features/data_domain/tracks/shared/domain/entities/album.dart diff --git a/lib/features/data_domain/tracks/shared/domain/entities/entities.dart b/lib/features/data_domain/tracks/shared/domain/entities/entities.dart new file mode 100644 index 0000000..12b6b66 --- /dev/null +++ b/lib/features/data_domain/tracks/shared/domain/entities/entities.dart @@ -0,0 +1,4 @@ +export 'album.dart'; +export 'track.dart'; +export 'tracks_collection.dart'; +export 'tracks_collection_type.dart'; diff --git a/lib/features/data_domain/tracks/shared/domain/entities/liked_track.dart b/lib/features/data_domain/tracks/shared/domain/entities/liked_track.dart new file mode 100644 index 0000000..8d140ae --- /dev/null +++ b/lib/features/data_domain/tracks/shared/domain/entities/liked_track.dart @@ -0,0 +1,16 @@ +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/track.dart'; + +class LikedTrack extends Track { + LikedTrack( + {required super.spotifyId, + required super.parentCollection, + required super.name, + super.album, + super.artists, + super.duration, + super.localYoutubeUrl, + super.isLoaded = false, + required this.addedAt}); + + final DateTime? addedAt; +} diff --git a/lib/features/data_domain/tracks/shared/domain/entities/track.dart b/lib/features/data_domain/tracks/shared/domain/entities/track.dart new file mode 100644 index 0000000..3009e07 --- /dev/null +++ b/lib/features/data_domain/tracks/shared/domain/entities/track.dart @@ -0,0 +1,26 @@ +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/tracks_collection.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/album.dart'; + +class Track { + Track({ + required this.spotifyId, + required this.parentCollection, + required this.name, + this.album, + this.artists, + this.duration, + this.localYoutubeUrl, + this.isLoaded = false, + }); + + final String spotifyId; + final String name; + final TracksCollection parentCollection; + + final Album? album; + final List? artists; + final Duration? duration; + + final String? localYoutubeUrl; + final bool isLoaded; +} diff --git a/lib/features/domain/tracks/shared/entities/tracks_collection.dart b/lib/features/data_domain/tracks/shared/domain/entities/tracks_collection.dart similarity index 86% rename from lib/features/domain/tracks/shared/entities/tracks_collection.dart rename to lib/features/data_domain/tracks/shared/domain/entities/tracks_collection.dart index 5d80fca..e4fa76d 100644 --- a/lib/features/domain/tracks/shared/entities/tracks_collection.dart +++ b/lib/features/data_domain/tracks/shared/domain/entities/tracks_collection.dart @@ -23,11 +23,12 @@ class TracksCollection extends Equatable { @override List get props => [spotifyId, type, name, artists, smallImageUrl, bigImageUrl]; - static TracksCollection get likedTracks => const TracksCollection( + static TracksCollection likedTracks(int tracksCount) => TracksCollection( + tracksCount: tracksCount, spotifyId: 'likedTracks', type: TracksCollectionType.likedTracks, name: 'Liked Tracks', - artists: ['^_^'], + artists: const ['^_^'], smallImageUrl: 'https://misc.scdn.co/liked-songs/liked-songs-300.png', bigImageUrl: 'https://misc.scdn.co/liked-songs/liked-songs-640.png'); } diff --git a/lib/features/domain/tracks/shared/entities/tracks_collection_type.dart b/lib/features/data_domain/tracks/shared/domain/entities/tracks_collection_type.dart similarity index 100% rename from lib/features/domain/tracks/shared/entities/tracks_collection_type.dart rename to lib/features/data_domain/tracks/shared/domain/entities/tracks_collection_type.dart diff --git a/lib/features/data_domain/tracks_collections/history_tracks_collections/data/data.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/data.dart new file mode 100644 index 0000000..6b0ad93 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/data.dart @@ -0,0 +1,3 @@ +export 'data_source/data_source.dart'; +export 'models/models.dart'; +export 'repositories/repositories.dart'; diff --git a/lib/features/data_domain/tracks_collections/history_tracks_collections/data/data_source/data_source.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/data_source/data_source.dart new file mode 100644 index 0000000..29f0599 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/data_source/data_source.dart @@ -0,0 +1 @@ +export 'tracks_collectons_history_data_source.dart'; diff --git a/lib/features/data/tracks_collections/history_tracks_collectons/data_source/tracks_collectons_history_data_source.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/data_source/tracks_collectons_history_data_source.dart similarity index 93% rename from lib/features/data/tracks_collections/history_tracks_collectons/data_source/tracks_collectons_history_data_source.dart rename to lib/features/data_domain/tracks_collections/history_tracks_collections/data/data_source/tracks_collectons_history_data_source.dart index a498c18..8a8c4a1 100644 --- a/lib/features/data/tracks_collections/history_tracks_collectons/data_source/tracks_collectons_history_data_source.dart +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/data_source/tracks_collectons_history_data_source.dart @@ -1,5 +1,5 @@ import 'package:spotify_downloader/core/db/local_db.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/history_tracks_collectons/models/history_tracks_collection_dto.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/history_tracks_collections/data/models/models.dart'; import 'package:sqflite/sqflite.dart'; class TracksCollectonsHistoryDataSource { diff --git a/lib/features/data/tracks_collections/history_tracks_collectons/models/history_tracks_collection_dto.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/models/history_tracks_collection_dto.dart similarity index 100% rename from lib/features/data/tracks_collections/history_tracks_collectons/models/history_tracks_collection_dto.dart rename to lib/features/data_domain/tracks_collections/history_tracks_collections/data/models/history_tracks_collection_dto.dart diff --git a/lib/features/data_domain/tracks_collections/history_tracks_collections/data/models/models.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/models/models.dart new file mode 100644 index 0000000..da8e642 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/models/models.dart @@ -0,0 +1 @@ +export 'history_tracks_collection_dto.dart'; diff --git a/lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/converters/converters.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/converters/converters.dart new file mode 100644 index 0000000..ea309eb --- /dev/null +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/converters/converters.dart @@ -0,0 +1,3 @@ +export 'history_tracks_collections_converter.dart'; +export 'tracks_collection_to_history_tracks_collection_dto_converter.dart'; +export 'tracks_collection_types_converter.dart'; diff --git a/lib/features/data/tracks_collections/history_tracks_collectons/repositories/converters/history_tracks_collections_converter.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/converters/history_tracks_collections_converter.dart similarity index 66% rename from lib/features/data/tracks_collections/history_tracks_collectons/repositories/converters/history_tracks_collections_converter.dart rename to lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/converters/history_tracks_collections_converter.dart index f68c57d..43d72ee 100644 --- a/lib/features/data/tracks_collections/history_tracks_collectons/repositories/converters/history_tracks_collections_converter.dart +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/converters/history_tracks_collections_converter.dart @@ -1,7 +1,5 @@ -import 'package:spotify_downloader/core/util/converters/simple_converters/value_converter.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/history_tracks_collectons/models/history_tracks_collection_dto.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/history_tracks_collectons/repositories/converters/tracks_collection_types_converter.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/history_tracks_collectons/entities/history_tracks_collection.dart'; +import 'package:spotify_downloader/core/utils/converters/simple_converters/value_converter.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/history_tracks_collections/history_tracks_collections.dart'; class HistoryTracksCollectionsConverter implements ValueConverter { diff --git a/lib/features/data/tracks_collections/history_tracks_collectons/repositories/converters/tracks_collection_to_history_tracks_collection_dto_converter.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/converters/tracks_collection_to_history_tracks_collection_dto_converter.dart similarity index 59% rename from lib/features/data/tracks_collections/history_tracks_collectons/repositories/converters/tracks_collection_to_history_tracks_collection_dto_converter.dart rename to lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/converters/tracks_collection_to_history_tracks_collection_dto_converter.dart index 67be58b..eaaee02 100644 --- a/lib/features/data/tracks_collections/history_tracks_collectons/repositories/converters/tracks_collection_to_history_tracks_collection_dto_converter.dart +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/converters/tracks_collection_to_history_tracks_collection_dto_converter.dart @@ -1,7 +1,6 @@ -import 'package:spotify_downloader/core/util/converters/simple_converters/value_converter.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/history_tracks_collectons/models/history_tracks_collection_dto.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/history_tracks_collectons/repositories/converters/tracks_collection_types_converter.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; +import 'package:spotify_downloader/core/utils/converters/simple_converters/value_converter.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/history_tracks_collections/history_tracks_collections.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/tracks_collection.dart'; class TracksCollectionToHistoryTracksCollectionDtoConverter implements ValueConverter { diff --git a/lib/features/data/tracks_collections/history_tracks_collectons/repositories/converters/tracks_collection_types_converter.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/converters/tracks_collection_types_converter.dart similarity index 77% rename from lib/features/data/tracks_collections/history_tracks_collectons/repositories/converters/tracks_collection_types_converter.dart rename to lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/converters/tracks_collection_types_converter.dart index 39878b3..1470b63 100644 --- a/lib/features/data/tracks_collections/history_tracks_collectons/repositories/converters/tracks_collection_types_converter.dart +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/converters/tracks_collection_types_converter.dart @@ -1,6 +1,6 @@ -import 'package:spotify_downloader/core/util/converters/simple_converters/value_converter.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/history_tracks_collectons/models/history_tracks_collection_dto.dart'; -import '../../../../../domain/tracks/shared/entities/tracks_collection_type.dart'; +import 'package:spotify_downloader/core/utils/converters/simple_converters/value_converter.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/history_tracks_collections/history_tracks_collections.dart'; class TracksCollectionTypesConverter implements ValueConverter { @override diff --git a/lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/repositories.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/repositories.dart new file mode 100644 index 0000000..b8ad391 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/repositories.dart @@ -0,0 +1,2 @@ +export 'converters/converters.dart'; +export 'tracks_collections_history_repository_impl.dart'; diff --git a/lib/features/data/tracks_collections/history_tracks_collectons/repositories/tracks_collections_history_repository_impl.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/tracks_collections_history_repository_impl.dart similarity index 69% rename from lib/features/data/tracks_collections/history_tracks_collectons/repositories/tracks_collections_history_repository_impl.dart rename to lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/tracks_collections_history_repository_impl.dart index 5d5f1ea..5999125 100644 --- a/lib/features/data/tracks_collections/history_tracks_collectons/repositories/tracks_collections_history_repository_impl.dart +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/data/repositories/tracks_collections_history_repository_impl.dart @@ -1,11 +1,6 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/history_tracks_collectons/data_source/tracks_collectons_history_data_source.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/history_tracks_collectons/repositories/converters/history_tracks_collections_converter.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/history_tracks_collectons/repositories/converters/tracks_collection_to_history_tracks_collection_dto_converter.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/history_tracks_collectons/entities/history_tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/history_tracks_collectons/repositories/tracks_collections_history_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/history_tracks_collections/history_tracks_collections.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/tracks_collection.dart'; class TracksCollectionsHistoryRepositoryImpl implements TracksCollectionsHistoryRepository { TracksCollectionsHistoryRepositoryImpl({required TracksCollectonsHistoryDataSource dataSource}) diff --git a/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/domain.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/domain.dart new file mode 100644 index 0000000..cc16ca3 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/domain.dart @@ -0,0 +1,3 @@ +export 'entities/entities.dart'; +export 'repositories/repositories.dart'; +export 'use_cases/use_cases.dart'; diff --git a/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/entities/entities.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/entities/entities.dart new file mode 100644 index 0000000..4117f92 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/entities/entities.dart @@ -0,0 +1 @@ +export 'history_tracks_collection.dart'; diff --git a/lib/features/domain/tracks_collections/history_tracks_collectons/entities/history_tracks_collection.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/entities/history_tracks_collection.dart similarity index 84% rename from lib/features/domain/tracks_collections/history_tracks_collectons/entities/history_tracks_collection.dart rename to lib/features/data_domain/tracks_collections/history_tracks_collections/domain/entities/history_tracks_collection.dart index cc5478e..e37edad 100644 --- a/lib/features/domain/tracks_collections/history_tracks_collectons/entities/history_tracks_collection.dart +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/entities/history_tracks_collection.dart @@ -1,5 +1,5 @@ import 'package:equatable/equatable.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection_type.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/tracks_collection_type.dart'; class HistoryTracksCollection extends Equatable { const HistoryTracksCollection({ diff --git a/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/repositories/repositories.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/repositories/repositories.dart new file mode 100644 index 0000000..86af883 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/repositories/repositories.dart @@ -0,0 +1 @@ +export 'tracks_collections_history_repository.dart'; diff --git a/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/repositories/tracks_collections_history_repository.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/repositories/tracks_collections_history_repository.dart new file mode 100644 index 0000000..542f8c6 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/repositories/tracks_collections_history_repository.dart @@ -0,0 +1,11 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/history_tracks_collections/domain/domain.dart'; + +abstract class TracksCollectionsHistoryRepository { + + Future?>> getTracksCollectionsHistory(); + Future> addTracksCollectionToHistory(TracksCollection tracksCollection); + Future> deleteTracksCollectionFromHistory(HistoryTracksCollection historyTracksCollection); + +} \ No newline at end of file diff --git a/lib/features/domain/tracks_collections/history_tracks_collectons/use_cases/add_tracks_collection_to_history.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/use_cases/add_tracks_collection_to_history.dart similarity index 53% rename from lib/features/domain/tracks_collections/history_tracks_collectons/use_cases/add_tracks_collection_to_history.dart rename to lib/features/data_domain/tracks_collections/history_tracks_collections/domain/use_cases/add_tracks_collection_to_history.dart index 815f3e0..65eac2b 100644 --- a/lib/features/domain/tracks_collections/history_tracks_collectons/use_cases/add_tracks_collection_to_history.dart +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/use_cases/add_tracks_collection_to_history.dart @@ -1,8 +1,6 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/history_tracks_collectons/repositories/tracks_collections_history_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/history_tracks_collections/domain/domain.dart'; class AddTracksCollectionToHistory implements UseCase { AddTracksCollectionToHistory({required TracksCollectionsHistoryRepository historyPlaylistsRepository}) diff --git a/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/use_cases/get_ordered_history.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/use_cases/get_ordered_history.dart new file mode 100644 index 0000000..66468ed --- /dev/null +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/use_cases/get_ordered_history.dart @@ -0,0 +1,18 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/history_tracks_collections/history_tracks_collections.dart'; + +class GetOrderedHistory implements UseCase?, void> { + GetOrderedHistory({required TracksCollectionsHistoryRepository historyPlaylistsRepository}) + : _historyPlaylistsRepository = historyPlaylistsRepository; + + final TracksCollectionsHistoryRepository _historyPlaylistsRepository; + + @override + Future?>> call(void params) async { + final historyPlaylistsResult = await _historyPlaylistsRepository.getTracksCollectionsHistory(); + if (historyPlaylistsResult.isSuccessful) { + historyPlaylistsResult.result?.sort((e1, e2) => e2.openDate?.compareTo(e1.openDate ?? DateTime.now()) ?? 1); + } + return historyPlaylistsResult; + } +} diff --git a/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/use_cases/use_cases.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/use_cases/use_cases.dart new file mode 100644 index 0000000..c160921 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/domain/use_cases/use_cases.dart @@ -0,0 +1,2 @@ +export 'add_tracks_collection_to_history.dart'; +export 'get_ordered_history.dart'; diff --git a/lib/features/data_domain/tracks_collections/history_tracks_collections/history_tracks_collections.dart b/lib/features/data_domain/tracks_collections/history_tracks_collections/history_tracks_collections.dart new file mode 100644 index 0000000..f018dc9 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/history_tracks_collections/history_tracks_collections.dart @@ -0,0 +1,2 @@ +export 'data/data.dart'; +export 'domain/domain.dart'; \ No newline at end of file diff --git a/lib/features/data_domain/tracks_collections/network_tracks_collections/data/data.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/data.dart new file mode 100644 index 0000000..d7086d3 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/data.dart @@ -0,0 +1,2 @@ +export 'data_source/data_source.dart'; +export 'repositories/repositories.dart'; diff --git a/lib/features/data_domain/tracks_collections/network_tracks_collections/data/data_source/data_source.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/data_source/data_source.dart new file mode 100644 index 0000000..63878f4 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/data_source/data_source.dart @@ -0,0 +1 @@ +export 'network_tracks_collections_data_source.dart'; diff --git a/lib/features/data/tracks_collections/network_tracks_collections/data_source/network_tracks_collections_data_source.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/data_source/network_tracks_collections_data_source.dart similarity index 51% rename from lib/features/data/tracks_collections/network_tracks_collections/data_source/network_tracks_collections_data_source.dart rename to lib/features/data_domain/tracks_collections/network_tracks_collections/data/data_source/network_tracks_collections_data_source.dart index 25f315a..a85d1a1 100644 --- a/lib/features/data/tracks_collections/network_tracks_collections/data_source/network_tracks_collections_data_source.dart +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/data_source/network_tracks_collections_data_source.dart @@ -1,8 +1,9 @@ +import 'dart:convert'; + import 'package:spotify/spotify.dart'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/util_methods.dart'; -import 'package:spotify_downloader/features/data/shared/spotify_api_request.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/shared/data/spotify_api_request.dart'; +import 'package:http/http.dart' as http; class NetworkTracksCollectionsDataSource { Future> getPlaylistBySpotifyId( @@ -32,4 +33,33 @@ class NetworkTracksCollectionsDataSource { return Result.isSuccessful(track); }); } + + Future> getLikedTracksCount(SpotifyApiRequest spotifyApiRequest) async { + return handleSpotifyClientExceptions(() async { + var credentials = spotifyApiRequest.spotifyApiCredentials; + + await SpotifyApi.asyncFromCredentials(spotifyApiRequest.spotifyApiCredentials, + onCredentialsRefreshed: (newCredentials) { + credentials = newCredentials; + spotifyApiRequest.onCredentialsRefreshed?.call(newCredentials); + }); + + final response = await http.get(Uri.parse("https://api.spotify.com/v1/me/tracks?limit=1&offset=0"), + headers: {"Authorization": "Bearer ${credentials.accessToken}"}); + + if (response.statusCode != 200) { + throw SpotifyException() + ..status = response.statusCode + ..message = response.body; + } + + var total = (jsonDecode(response.body) as Map)["total"]?.toString(); + if (total == null || total.isEmpty || int.tryParse(total) == null) { + return Result.notSuccessful( + Failure(message: "something went wrong, when tried to get liked tracks count| count: $total")); + } + + return Result.isSuccessful(int.tryParse(total)); + }); + } } diff --git a/lib/features/data/tracks_collections/network_tracks_collections/repositories/converters/album_dto_to_tracks_collection_converter.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/converters/album_dto_to_tracks_collection_converter.dart similarity index 65% rename from lib/features/data/tracks_collections/network_tracks_collections/repositories/converters/album_dto_to_tracks_collection_converter.dart rename to lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/converters/album_dto_to_tracks_collection_converter.dart index a7b9ab7..d3f8da7 100644 --- a/lib/features/data/tracks_collections/network_tracks_collections/repositories/converters/album_dto_to_tracks_collection_converter.dart +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/converters/album_dto_to_tracks_collection_converter.dart @@ -1,9 +1,8 @@ import 'package:spotify/spotify.dart'; -import 'package:spotify_downloader/core/util/converters/result_converters/result_value_converter.dart'; -import 'package:spotify_downloader/core/util/failures/failures.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection_type.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/tracks_collection.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/tracks_collection_type.dart'; + class AlbumDtoToTracksCollectionConverter implements ResultValueConverter { @override diff --git a/lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/converters/converters.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/converters/converters.dart new file mode 100644 index 0000000..0d05e26 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/converters/converters.dart @@ -0,0 +1,3 @@ +export 'album_dto_to_tracks_collection_converter.dart'; +export 'playlist_dto_to_tracks_collection_converter.dart'; +export 'track_dto_to_tracks_collection_converter.dart'; diff --git a/lib/features/data/tracks_collections/network_tracks_collections/repositories/converters/playlist_dto_to_tracks_collection_converter.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/converters/playlist_dto_to_tracks_collection_converter.dart similarity index 65% rename from lib/features/data/tracks_collections/network_tracks_collections/repositories/converters/playlist_dto_to_tracks_collection_converter.dart rename to lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/converters/playlist_dto_to_tracks_collection_converter.dart index 2f223b5..e8635cb 100644 --- a/lib/features/data/tracks_collections/network_tracks_collections/repositories/converters/playlist_dto_to_tracks_collection_converter.dart +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/converters/playlist_dto_to_tracks_collection_converter.dart @@ -1,9 +1,7 @@ import 'package:spotify/spotify.dart'; -import 'package:spotify_downloader/core/util/converters/result_converters/result_value_converter.dart'; -import 'package:spotify_downloader/core/util/failures/failures.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection_type.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; + class PlaylistDtoToTracksCollectionConverter implements ResultValueConverter { @override diff --git a/lib/features/data/tracks_collections/network_tracks_collections/repositories/converters/track_dto_to_tracks_collection_converter.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/converters/track_dto_to_tracks_collection_converter.dart similarity index 64% rename from lib/features/data/tracks_collections/network_tracks_collections/repositories/converters/track_dto_to_tracks_collection_converter.dart rename to lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/converters/track_dto_to_tracks_collection_converter.dart index 2e1bb8b..a084d7a 100644 --- a/lib/features/data/tracks_collections/network_tracks_collections/repositories/converters/track_dto_to_tracks_collection_converter.dart +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/converters/track_dto_to_tracks_collection_converter.dart @@ -1,9 +1,8 @@ import 'package:spotify/spotify.dart'; -import 'package:spotify_downloader/core/util/converters/result_converters/result_value_converter.dart'; -import 'package:spotify_downloader/core/util/failures/failures.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection_type.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/tracks_collection.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/entities/tracks_collection_type.dart'; + class TrackDtoToTracksCollectionConverter implements ResultValueConverter { @override diff --git a/lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/repositories.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/repositories.dart new file mode 100644 index 0000000..506198e --- /dev/null +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/repositories.dart @@ -0,0 +1,2 @@ +export 'converters/converters.dart'; +export 'tracks_collections_repository_impl.dart'; diff --git a/lib/features/data/tracks_collections/network_tracks_collections/repositories/tracks_collections_repository_impl.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/tracks_collections_repository_impl.dart similarity index 69% rename from lib/features/data/tracks_collections/network_tracks_collections/repositories/tracks_collections_repository_impl.dart rename to lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/tracks_collections_repository_impl.dart index 0be78b6..5f9ec21 100644 --- a/lib/features/data/tracks_collections/network_tracks_collections/repositories/tracks_collections_repository_impl.dart +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/data/repositories/tracks_collections_repository_impl.dart @@ -1,16 +1,8 @@ -import 'dart:async'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/failures/failures.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/data/shared/converters/spotify_requests_converter.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/network_tracks_collections/data_source/network_tracks_collections_data_source.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/network_tracks_collections/repositories/converters/album_dto_to_tracks_collection_converter.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/network_tracks_collections/repositories/converters/playlist_dto_to_tracks_collection_converter.dart'; -import 'package:spotify_downloader/features/data/tracks_collections/network_tracks_collections/repositories/converters/track_dto_to_tracks_collection_converter.dart'; -import 'package:spotify_downloader/features/domain/shared/spotify_repository_request.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection_type.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/network_tracks_collections/repositories/network_tracks_collections_repository.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/shared/data/converters/spotify_requests_converter.dart'; +import 'package:spotify_downloader/features/data_domain/shared/domain/spotify_repository_request.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/network_tracks_collections/network_tracks_collections.dart'; class NetworkTracksCollectionsRepositoryImpl implements NetworkTracksCollectionsRepository { NetworkTracksCollectionsRepositoryImpl({required NetworkTracksCollectionsDataSource dataSource}) @@ -59,7 +51,13 @@ class NetworkTracksCollectionsRepositoryImpl implements NetworkTracksCollections return Result.notSuccessful(trackResult.failure); } case TracksCollectionType.likedTracks: - return Result.isSuccessful(TracksCollection.likedTracks); + final likedTracksCountResult = + await _dataSource.getLikedTracksCount(_spotifyRequestsConverter.convert(spotifyRepositoryRequest)); + if (likedTracksCountResult.isSuccessful) { + return Result.isSuccessful(TracksCollection.likedTracks(likedTracksCountResult.result!)); + } else { + return Result.notSuccessful(likedTracksCountResult.failure); + } } } diff --git a/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/domain.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/domain.dart new file mode 100644 index 0000000..8d13a5e --- /dev/null +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/domain.dart @@ -0,0 +1,3 @@ +export 'repositories/repositories.dart'; +export 'service/service.dart'; +export 'use_cases/use_cases.dart'; diff --git a/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/repositories/network_tracks_collections_repository.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/repositories/network_tracks_collections_repository.dart new file mode 100644 index 0000000..3788d20 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/repositories/network_tracks_collections_repository.dart @@ -0,0 +1,11 @@ + + +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/shared/domain/spotify_repository_request.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; + +abstract class NetworkTracksCollectionsRepository { + Future> getTracksCollectionByTypeAndSpotifyId( + SpotifyRepositoryRequest spotifyRepositoryRequest, TracksCollectionType type, String spotifyId); + Future> getTracksCollectionByUrl(SpotifyRepositoryRequest spotifyRepositoryRequest, String url); +} diff --git a/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/repositories/repositories.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/repositories/repositories.dart new file mode 100644 index 0000000..106003b --- /dev/null +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/repositories/repositories.dart @@ -0,0 +1 @@ +export 'network_tracks_collections_repository.dart'; diff --git a/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/service/network_tracks_collections_service.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/service/network_tracks_collections_service.dart new file mode 100644 index 0000000..2f8b03d --- /dev/null +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/service/network_tracks_collections_service.dart @@ -0,0 +1,8 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; + +abstract class NetworkTracksCollectionsService { + Future> getTracksCollectionByTypeAndSpotifyId( + TracksCollectionType type, String spotifyId); + Future> getTracksCollectionByUrl(String url); +} diff --git a/lib/features/domain/tracks_collections/network_tracks_collections/service/network_tracks_collections_service_impl.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/service/network_tracks_collections_service_impl.dart similarity index 67% rename from lib/features/domain/tracks_collections/network_tracks_collections/service/network_tracks_collections_service_impl.dart rename to lib/features/data_domain/tracks_collections/network_tracks_collections/domain/service/network_tracks_collections_service_impl.dart index cc91d98..7f5484b 100644 --- a/lib/features/domain/tracks_collections/network_tracks_collections/service/network_tracks_collections_service_impl.dart +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/service/network_tracks_collections_service_impl.dart @@ -1,11 +1,8 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/auth/local_auth/repositories/local_full_auth_repository.dart'; -import 'package:spotify_downloader/features/domain/shared/spotify_repository_request.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection_type.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/network_tracks_collections/repositories/network_tracks_collections_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/network_tracks_collections/service/network_tracks_collections_service.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/auth/local_auth/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/shared/domain/spotify_repository_request.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/network_tracks_collections/network_tracks_collections.dart'; class NetworkTracksCollectionsServiceImpl implements NetworkTracksCollectionsService { NetworkTracksCollectionsServiceImpl( diff --git a/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/service/service.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/service/service.dart new file mode 100644 index 0000000..d11e1a6 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/service/service.dart @@ -0,0 +1,2 @@ +export 'network_tracks_collections_service.dart'; +export 'network_tracks_collections_service_impl.dart'; diff --git a/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/use_cases/get_tracks_collection_by_type_and_spotify_id.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/use_cases/get_tracks_collection_by_type_and_spotify_id.dart new file mode 100644 index 0000000..f1dc031 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/use_cases/get_tracks_collection_by_type_and_spotify_id.dart @@ -0,0 +1,16 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/network_tracks_collections/domain/service/service.dart'; + +class GetTracksCollectionByTypeAndSpotifyId + implements UseCase { + GetTracksCollectionByTypeAndSpotifyId({required NetworkTracksCollectionsService service}) + : _service = service; + + final NetworkTracksCollectionsService _service; + + @override + Future> call((TracksCollectionType, String) args) { + return _service.getTracksCollectionByTypeAndSpotifyId(args.$1, args.$2); + } +} diff --git a/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/use_cases/get_tracks_collection_by_url.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/use_cases/get_tracks_collection_by_url.dart new file mode 100644 index 0000000..e1008cf --- /dev/null +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/use_cases/get_tracks_collection_by_url.dart @@ -0,0 +1,14 @@ +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/tracks_collections/network_tracks_collections/domain/service/service.dart'; + +class GetTracksCollectionByUrl implements UseCase { + GetTracksCollectionByUrl({required NetworkTracksCollectionsService service}) : _service = service; + + final NetworkTracksCollectionsService _service; + + @override + Future> call(String url) async { + return _service.getTracksCollectionByUrl(url); + } +} diff --git a/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/use_cases/use_cases.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/use_cases/use_cases.dart new file mode 100644 index 0000000..139781a --- /dev/null +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/domain/use_cases/use_cases.dart @@ -0,0 +1,2 @@ +export 'get_tracks_collection_by_type_and_spotify_id.dart'; +export 'get_tracks_collection_by_url.dart'; diff --git a/lib/features/data_domain/tracks_collections/network_tracks_collections/network_tracks_collections.dart b/lib/features/data_domain/tracks_collections/network_tracks_collections/network_tracks_collections.dart new file mode 100644 index 0000000..f018dc9 --- /dev/null +++ b/lib/features/data_domain/tracks_collections/network_tracks_collections/network_tracks_collections.dart @@ -0,0 +1,2 @@ +export 'data/data.dart'; +export 'domain/domain.dart'; \ No newline at end of file diff --git a/lib/features/domain/auth/local_auth/repositories/local_client_auth_repository.dart b/lib/features/domain/auth/local_auth/repositories/local_client_auth_repository.dart deleted file mode 100644 index b4a2b89..0000000 --- a/lib/features/domain/auth/local_auth/repositories/local_client_auth_repository.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/client_credentials.dart'; - - -abstract class LocalClientAuthRepository { - Future> getClientCredentials(); - Future> saveClientCredentials(ClientCredentials clientCredentials); -} diff --git a/lib/features/domain/auth/local_auth/repositories/local_full_auth_repository.dart b/lib/features/domain/auth/local_auth/repositories/local_full_auth_repository.dart deleted file mode 100644 index 609b3a7..0000000 --- a/lib/features/domain/auth/local_auth/repositories/local_full_auth_repository.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/full_credentials.dart'; - - -abstract class LocalFullAuthRepository { - Future> getFullCredentials(); - - Future> saveFullCredentials(FullCredentials fullCredentials); -} diff --git a/lib/features/domain/auth/local_auth/repositories/local_user_auth_repository.dart b/lib/features/domain/auth/local_auth/repositories/local_user_auth_repository.dart deleted file mode 100644 index 2fefea6..0000000 --- a/lib/features/domain/auth/local_auth/repositories/local_user_auth_repository.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/user_credentials.dart'; - -abstract class LocalUserAuthRepository { - Future> clearUserCredentials(); - - Future> saveUserCredentials(UserCredentials userCredentials); -} diff --git a/lib/features/domain/auth/network_auth/repository/network_auth_repository.dart b/lib/features/domain/auth/network_auth/repository/network_auth_repository.dart deleted file mode 100644 index 2875be9..0000000 --- a/lib/features/domain/auth/network_auth/repository/network_auth_repository.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/client_credentials.dart'; -import 'package:spotify_downloader/features/domain/auth/shared/user_credentials.dart'; - -abstract class NetworkAuthRepository { - Future> authorizeUser(ClientCredentials clientCredentials); -} \ No newline at end of file diff --git a/lib/features/domain/auth/service/service/auth_service.dart b/lib/features/domain/auth/service/service/auth_service.dart deleted file mode 100644 index 3906bf2..0000000 --- a/lib/features/domain/auth/service/service/auth_service.dart +++ /dev/null @@ -1,6 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; - -abstract class AuthService { - Future> authorizeUser(); -} \ No newline at end of file diff --git a/lib/features/domain/auth/service/use_cases/authorize_user.dart b/lib/features/domain/auth/service/use_cases/authorize_user.dart deleted file mode 100644 index 873aa4f..0000000 --- a/lib/features/domain/auth/service/use_cases/authorize_user.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/auth/service/service/auth_service.dart'; - -class AuthorizeUser implements UseCase { - AuthorizeUser({required AuthService authService}) : _authService = authService; - - final AuthService _authService; - - @override - Future> call(void params) { - return _authService.authorizeUser(); - } -} \ No newline at end of file diff --git a/lib/features/domain/spotify_profile/repository/spotify_profile_repostitory.dart b/lib/features/domain/spotify_profile/repository/spotify_profile_repostitory.dart deleted file mode 100644 index 393a8b2..0000000 --- a/lib/features/domain/spotify_profile/repository/spotify_profile_repostitory.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/shared/spotify_repository_request.dart'; -import 'package:spotify_downloader/features/domain/spotify_profile/entities/spotify_profile.dart'; - -abstract class SpotifyProfileRepository { - Future> getSpotifyProfile(SpotifyRepositoryRequest spotifyClientRequest); -} \ No newline at end of file diff --git a/lib/features/domain/spotify_profile/service/spotify_profile_service.dart b/lib/features/domain/spotify_profile/service/spotify_profile_service.dart deleted file mode 100644 index 6313e1f..0000000 --- a/lib/features/domain/spotify_profile/service/spotify_profile_service.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/spotify_profile/entities/spotify_profile.dart'; - -abstract class SpotifyProfileService { - Future> getSpotifyProfile(); -} \ No newline at end of file diff --git a/lib/features/domain/spotify_profile/use_cases/get_spotify_profile.dart b/lib/features/domain/spotify_profile/use_cases/get_spotify_profile.dart deleted file mode 100644 index 55c8c24..0000000 --- a/lib/features/domain/spotify_profile/use_cases/get_spotify_profile.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; - -import 'package:spotify_downloader/features/domain/spotify_profile/entities/spotify_profile.dart'; -import 'package:spotify_downloader/features/domain/spotify_profile/service/spotify_profile_service.dart'; - -class GetSpotifyProfile implements UseCase { - GetSpotifyProfile({required SpotifyProfileService spotifyProfileService}) - : _spotifyProfileService = spotifyProfileService; - - final SpotifyProfileService _spotifyProfileService; - - @override - Future> call(void params) async { - return _spotifyProfileService.getSpotifyProfile(); - } -} diff --git a/lib/features/domain/tracks/download_tracks/entities/track_with_lazy_youtube_url.dart b/lib/features/domain/tracks/download_tracks/entities/track_with_lazy_youtube_url.dart deleted file mode 100644 index 00cdc2c..0000000 --- a/lib/features/domain/tracks/download_tracks/entities/track_with_lazy_youtube_url.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; - -class TrackWithLazyYoutubeUrl { - TrackWithLazyYoutubeUrl({required this.track, required this.getYoutubeUrlFunction}); - - final Track track; - final Future> Function() getYoutubeUrlFunction; - - Future> getYoutubeUrl() async { - if (track.youtubeUrl != null) { - return Result.isSuccessful(track.youtubeUrl!); - } else { - final youtubeUrlResult = await getYoutubeUrlFunction.call(); - if (youtubeUrlResult.isSuccessful) { - track.youtubeUrl = youtubeUrlResult.result; - } - return youtubeUrlResult; - } - } -} diff --git a/lib/features/domain/tracks/download_tracks/repositories/dowload_tracks_repository.dart b/lib/features/domain/tracks/download_tracks/repositories/dowload_tracks_repository.dart deleted file mode 100644 index e9044d1..0000000 --- a/lib/features/domain/tracks/download_tracks/repositories/dowload_tracks_repository.dart +++ /dev/null @@ -1,13 +0,0 @@ -// ignore_for_file: void_checks - -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/track_with_lazy_youtube_url.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; - -abstract class DownloadTracksRepository { - Future> dowloadTrack(TrackWithLazyYoutubeUrl lazyTrack, String savePath); - Result cancelTrackLoading(Track track, String savePat); - Future> getLoadingTrackObserver(Track track, String savePath); -} diff --git a/lib/features/domain/tracks/local_tracks/repositories/local_tracks_repository.dart b/lib/features/domain/tracks/local_tracks/repositories/local_tracks_repository.dart deleted file mode 100644 index 8a514f0..0000000 --- a/lib/features/domain/tracks/local_tracks/repositories/local_tracks_repository.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_track.dart'; -import 'package:spotify_downloader/features/domain/tracks/local_tracks/entities/local_tracks_collection.dart'; - -abstract class LocalTracksRepository { - Future> getLocalTrack(LocalTracksCollection localTracksCollection, String spotifyId); - Future> saveLocalTrack(LocalTrack localTrack); - Future> removeLocalTrack(LocalTrack localTrack); -} \ No newline at end of file diff --git a/lib/features/domain/tracks/network_tracks/entities/tracks_getting_observer.dart b/lib/features/domain/tracks/network_tracks/entities/tracks_getting_observer.dart deleted file mode 100644 index 8d201e2..0000000 --- a/lib/features/domain/tracks/network_tracks/entities/tracks_getting_observer.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/tracks/network_tracks/entities/tracks_getting_ended_status.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; - -class TracksGettingObserver { - Function(Result)? onEnded; - Function(Iterable)? onPartGot; -} diff --git a/lib/features/domain/tracks/network_tracks/repositories/network_tracks_repository.dart b/lib/features/domain/tracks/network_tracks/repositories/network_tracks_repository.dart deleted file mode 100644 index f23b490..0000000 --- a/lib/features/domain/tracks/network_tracks/repositories/network_tracks_repository.dart +++ /dev/null @@ -1,6 +0,0 @@ -import 'package:spotify_downloader/features/domain/tracks/network_tracks/entities/get_tracks_from_tracks_collection_args.dart'; -import 'package:spotify_downloader/features/domain/tracks/network_tracks/entities/tracks_getting_observer.dart'; - -abstract class NetworkTracksRepository { - Future getTracksFromTracksCollection(GetTracksFromTracksCollectionArgs args); -} \ No newline at end of file diff --git a/lib/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_track_observer_with_id.dart b/lib/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_track_observer_with_id.dart deleted file mode 100644 index 240202e..0000000 --- a/lib/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_track_observer_with_id.dart +++ /dev/null @@ -1,8 +0,0 @@ -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_observer.dart'; - -class LoadingTrackObserverWithId { - LoadingTrackObserverWithId({required this.loadingTrackObserver, required this.spotifyId}); - - final LoadingTrackObserver loadingTrackObserver; - final String spotifyId; -} diff --git a/lib/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_controller.dart b/lib/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_controller.dart deleted file mode 100644 index dd9f269..0000000 --- a/lib/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_controller.dart +++ /dev/null @@ -1,110 +0,0 @@ -import 'dart:async'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_status.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_track_observer_with_id.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_status.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; - -import 'loading_tracks_collection_info.dart'; - -class LoadingTracksCollectionController { - LoadingTracksCollectionController(this._sourceTracksCollection) { - _observer = LoadingTracksCollectionObserver( - changedStream: _changedStreamController.stream.asBroadcastStream(), - allLoadedStream: _allLoadedStreamController.stream.asBroadcastStream(), - loadingStatusChangedStream: _loadingStatusChangedStreamController.stream.asBroadcastStream(), - getLoadingInfo: () => _loadingInfo, - getLoadingStatus: () => _loadingStatus); - } - - final List _loadingTracks = List.empty(growable: true); - - late final LoadingTracksCollectionObserver _observer; - LoadingTracksCollectionObserver get observer => _observer; - - final TracksCollection _sourceTracksCollection; - LoadingTracksCollectionInfo _loadingInfo = const LoadingTracksCollectionInfo.empty(); - - LoadingTracksCollectionStatus _loadingStatusField = LoadingTracksCollectionStatus.loading; - LoadingTracksCollectionStatus get _loadingStatus => _loadingStatusField; - set _loadingStatus(LoadingTracksCollectionStatus newStatus) { - if (newStatus != _loadingStatusField) { - _loadingStatusChangedStreamController.add(null); - } - _loadingStatusField = newStatus; - } - - final StreamController _changedStreamController = StreamController(); - final StreamController _allLoadedStreamController = StreamController(); - final StreamController _loadingStatusChangedStreamController = StreamController(); - - void addLoadingTrack(LoadingTrackObserverWithId loadingTrack) { - final foundLoadingTrack = _loadingTracks.where((l) => l.spotifyId == loadingTrack.spotifyId).firstOrNull; - if (foundLoadingTrack != null) { - if (foundLoadingTrack.loadingTrackObserver.status == LoadingTrackStatus.loading || - foundLoadingTrack.loadingTrackObserver.status == LoadingTrackStatus.waitInLoadingQueue) return; - - _loadingTracks.remove(foundLoadingTrack); - } - - _subscribeToLoadingTrack(loadingTrack); - _loadingTracks.add(loadingTrack); - _update(); - } - - void _subscribeToLoadingTrack(LoadingTrackObserverWithId loadingTrack) { - loadingTrack.loadingTrackObserver.loadedStream.listen((event) => _update()); - loadingTrack.loadingTrackObserver.loadingFailureStream.listen((event) => _update()); - - loadingTrack.loadingTrackObserver.loadingCancelledStream.listen((event) { - if (_loadingTracks.contains(loadingTrack)) { - _loadingTracks.remove(loadingTrack); - } - _update(); - }); - } - - void _update() { - _updateLoadingTracksCollectionInfo(); - _changedStreamController.add(null); - - if (_loadingInfo.loadingTracks == 0) { - _allLoadedStreamController.add(null); - _loadingStatus = LoadingTracksCollectionStatus.loaded; - } else { - _loadingStatus = LoadingTracksCollectionStatus.loading; - } - } - - void _updateLoadingTracksCollectionInfo() { - int totalTracks = _loadingTracks.length; - int loadedTracks = 0; - int loadingTracks = 0; - int failuredTracks = 0; - - for (var loadingTrack in _loadingTracks) { - if (loadingTrack.loadingTrackObserver.status == LoadingTrackStatus.loading || - loadingTrack.loadingTrackObserver.status == LoadingTrackStatus.waitInLoadingQueue) { - loadingTracks++; - continue; - } - - if (loadingTrack.loadingTrackObserver.status == LoadingTrackStatus.failure) { - failuredTracks++; - continue; - } - - if (loadingTrack.loadingTrackObserver.status == LoadingTrackStatus.loaded) { - loadedTracks++; - continue; - } - } - - _loadingInfo = LoadingTracksCollectionInfo( - totalTracks: totalTracks, - loadedTracks: loadedTracks, - loadingTracks: loadingTracks, - failuredTracks: failuredTracks, - tracksCollection: _sourceTracksCollection); - } -} diff --git a/lib/features/domain/tracks/observe_tracks_loading/entities/repository/loading_tracks_collection.dart b/lib/features/domain/tracks/observe_tracks_loading/entities/repository/loading_tracks_collection.dart deleted file mode 100644 index 8ab35d5..0000000 --- a/lib/features/domain/tracks/observe_tracks_loading/entities/repository/loading_tracks_collection.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/entities/loading_tracks_collection/loading_tracks_collection_controller.dart'; -import 'package:spotify_downloader/features/domain/tracks/observe_tracks_loading/entities/repository/loading_tracks_collection_id.dart'; - -class LoadingTracksCollection { - LoadingTracksCollection({required this.id, required this.controller}); - - final LoadingTracksCollectionId id; - final LoadingTracksCollectionController controller; -} diff --git a/lib/features/domain/tracks/observe_tracks_loading/repository/observe_tracks_loading_repository.dart b/lib/features/domain/tracks/observe_tracks_loading/repository/observe_tracks_loading_repository.dart deleted file mode 100644 index 7642118..0000000 --- a/lib/features/domain/tracks/observe_tracks_loading/repository/observe_tracks_loading_repository.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; - -import '../entities/repository/loading_tracks_collections_observer.dart'; - -abstract class ObserveTracksLoadingRepository { - void observeLoadingTrack(LoadingTrackObserver loadingTrack, Track track); - Future getTracksCollectionsLoadingObserver(); -} diff --git a/lib/features/domain/tracks/search_videos_by_track/repositories/search_videos_by_track_repository.dart b/lib/features/domain/tracks/search_videos_by_track/repositories/search_videos_by_track_repository.dart deleted file mode 100644 index 75d6dec..0000000 --- a/lib/features/domain/tracks/search_videos_by_track/repositories/search_videos_by_track_repository.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/entities/video.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; - -abstract class SearchVideosByTrackRepository { - Future> findVideoByTrack(Track track); - Future>> findVideosByTrack(Track track, int count); - Future> getVideoByUrl(String url); -} \ No newline at end of file diff --git a/lib/features/domain/tracks/search_videos_by_track/use_cases/find_10_videos_by_track.dart b/lib/features/domain/tracks/search_videos_by_track/use_cases/find_10_videos_by_track.dart deleted file mode 100644 index 091c1b6..0000000 --- a/lib/features/domain/tracks/search_videos_by_track/use_cases/find_10_videos_by_track.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/entities/video.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/repositories/search_videos_by_track_repository.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; - -class Find10VideosByTrack implements UseCase, Track> { - Find10VideosByTrack({required SearchVideosByTrackRepository searchVideosByTrackRepository}) - : _searchVideosByTrackRepository = searchVideosByTrackRepository; - - final SearchVideosByTrackRepository _searchVideosByTrackRepository; - - @override - Future>> call(Track track) { - return _searchVideosByTrackRepository.findVideosByTrack(track, 10); - } -} diff --git a/lib/features/domain/tracks/search_videos_by_track/use_cases/get_video_by_url.dart b/lib/features/domain/tracks/search_videos_by_track/use_cases/get_video_by_url.dart deleted file mode 100644 index 6a58fff..0000000 --- a/lib/features/domain/tracks/search_videos_by_track/use_cases/get_video_by_url.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/entities/video.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/repositories/search_videos_by_track_repository.dart'; - -class GetVideoByUrl implements UseCase { - GetVideoByUrl({required SearchVideosByTrackRepository searchVideosByTrackRepository}) - : _searchVideosByTrackRepository = searchVideosByTrackRepository; - - final SearchVideosByTrackRepository _searchVideosByTrackRepository; - - @override - Future> call(String url) { - return _searchVideosByTrackRepository.getVideoByUrl(url); - } -} diff --git a/lib/features/domain/tracks/services/entities/tracks_with_loading_observer_getting_observer.dart b/lib/features/domain/tracks/services/entities/tracks_with_loading_observer_getting_observer.dart deleted file mode 100644 index 7598ca5..0000000 --- a/lib/features/domain/tracks/services/entities/tracks_with_loading_observer_getting_observer.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/tracks/network_tracks/entities/tracks_getting_ended_status.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/entities/track_with_loading_observer.dart'; - -class TracksWithLoadingObserverGettingObserver { - TracksWithLoadingObserverGettingObserver({ - required this.onEnded, - required this.onPartGot, - }); - - - Stream> onEnded; - Stream> onPartGot; -} diff --git a/lib/features/domain/tracks/services/services/download_tracks_service/download_tracks_service.dart b/lib/features/domain/tracks/services/services/download_tracks_service/download_tracks_service.dart deleted file mode 100644 index 055f829..0000000 --- a/lib/features/domain/tracks/services/services/download_tracks_service/download_tracks_service.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/entities/track_with_loading_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/entities/tracks_with_loading_observer_getting_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; - -abstract class DownloadTracksService { - Future> downloadTrack(Track track); - - Future> downloadTracksRange(List tracksWithLoadingObservers); - - Future> downloadTracksFromGettingObserver( - TracksWithLoadingObserverGettingObserver tracksWithLoadingObserverGettingObserver); - - Future> cancelTrackLoading(Track track); -} diff --git a/lib/features/domain/tracks/services/services/get_tracks_service/get_tracks_service.dart b/lib/features/domain/tracks/services/services/get_tracks_service/get_tracks_service.dart deleted file mode 100644 index 9648d80..0000000 --- a/lib/features/domain/tracks/services/services/get_tracks_service/get_tracks_service.dart +++ /dev/null @@ -1,9 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/entities/tracks_with_loading_observer_getting_observer.dart'; - -abstract class GetTracksService { - Future> getTracksWithLoadingObserversFromTracksColleciton( - {required TracksCollection tracksCollection, required int offset}); -} \ No newline at end of file diff --git a/lib/features/domain/tracks/services/use_cases/cancel_track_loading.dart b/lib/features/domain/tracks/services/use_cases/cancel_track_loading.dart deleted file mode 100644 index b996d9f..0000000 --- a/lib/features/domain/tracks/services/use_cases/cancel_track_loading.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/download_tracks_service/download_tracks_service.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; - -class CancelTrackLoading implements UseCase { - CancelTrackLoading({required DownloadTracksService dowloadTracksService}) - : _dowloadTracksService = dowloadTracksService; - - final DownloadTracksService _dowloadTracksService; - - @override - Future> call(Track track) async { - return _dowloadTracksService.cancelTrackLoading(track); - } -} diff --git a/lib/features/domain/tracks/services/use_cases/download_track.dart b/lib/features/domain/tracks/services/use_cases/download_track.dart deleted file mode 100644 index 7699bf2..0000000 --- a/lib/features/domain/tracks/services/use_cases/download_track.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/tracks/download_tracks/entities/loading_track_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/download_tracks_service/download_tracks_service.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; - -class DownloadTrack implements UseCase { - DownloadTrack({required DownloadTracksService downloadTracksService}) : _downloadTracksService = downloadTracksService; - - final DownloadTracksService _downloadTracksService; - - @override - Future> call(Track track) async { - return _downloadTracksService.downloadTrack(track); - } -} diff --git a/lib/features/domain/tracks/services/use_cases/download_tracks_range.dart b/lib/features/domain/tracks/services/use_cases/download_tracks_range.dart deleted file mode 100644 index 5e4188f..0000000 --- a/lib/features/domain/tracks/services/use_cases/download_tracks_range.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/entities/track_with_loading_observer.dart'; -import 'package:spotify_downloader/features/domain/tracks/services/services/download_tracks_service/download_tracks_service.dart'; - -class DownloadTracksRange implements UseCase> { - DownloadTracksRange({required DownloadTracksService downloadTracksService}) : _downloadTracksService = downloadTracksService; - - final DownloadTracksService _downloadTracksService; - - @override - Future> call(List tracks) async { - return _downloadTracksService.downloadTracksRange(tracks); - } -} \ No newline at end of file diff --git a/lib/features/domain/tracks/shared/entities/track.dart b/lib/features/domain/tracks/shared/entities/track.dart deleted file mode 100644 index efbfe0e..0000000 --- a/lib/features/domain/tracks/shared/entities/track.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/album.dart'; - -class Track { - Track( - {required this.spotifyId, - required this.parentCollection, - this.isLoaded = false, - required this.name, - this.album, - this.youtubeUrl, - this.artists, - this.duration}); - - final String spotifyId; - final String name; - final TracksCollection parentCollection; - - String? youtubeUrl; - bool isLoaded; - - final Album? album; - final List? artists; - final Duration? duration; -} diff --git a/lib/features/domain/tracks_collections/history_tracks_collectons/repositories/tracks_collections_history_repository.dart b/lib/features/domain/tracks_collections/history_tracks_collectons/repositories/tracks_collections_history_repository.dart deleted file mode 100644 index cf7013c..0000000 --- a/lib/features/domain/tracks_collections/history_tracks_collectons/repositories/tracks_collections_history_repository.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/history_tracks_collectons/entities/history_tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; - -abstract class TracksCollectionsHistoryRepository { - - Future?>> getTracksCollectionsHistory(); - Future> addTracksCollectionToHistory(TracksCollection tracksCollection); - Future> deleteTracksCollectionFromHistory(HistoryTracksCollection historyTracksCollection); - -} \ No newline at end of file diff --git a/lib/features/domain/tracks_collections/history_tracks_collectons/use_cases/get_ordered_history.dart b/lib/features/domain/tracks_collections/history_tracks_collectons/use_cases/get_ordered_history.dart deleted file mode 100644 index 3e8426b..0000000 --- a/lib/features/domain/tracks_collections/history_tracks_collectons/use_cases/get_ordered_history.dart +++ /dev/null @@ -1,23 +0,0 @@ -// ignore_for_file: prefer_void_to_null - -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/history_tracks_collectons/entities/history_tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/history_tracks_collectons/repositories/tracks_collections_history_repository.dart'; - -class GetOrderedHistory implements UseCase?, Null> { - GetOrderedHistory({required TracksCollectionsHistoryRepository historyPlaylistsRepository}) - : _historyPlaylistsRepository = historyPlaylistsRepository; - - final TracksCollectionsHistoryRepository _historyPlaylistsRepository; - - @override - Future?>> call(Null params) async { - final historyPlaylistsResult = await _historyPlaylistsRepository.getTracksCollectionsHistory(); - if (historyPlaylistsResult.isSuccessful) { - historyPlaylistsResult.result?.sort((e1, e2) => e2.openDate?.compareTo(e1.openDate ?? DateTime.now()) ?? 1); - } - return historyPlaylistsResult; - } -} diff --git a/lib/features/domain/tracks_collections/network_tracks_collections/repositories/network_tracks_collections_repository.dart b/lib/features/domain/tracks_collections/network_tracks_collections/repositories/network_tracks_collections_repository.dart deleted file mode 100644 index 433f07d..0000000 --- a/lib/features/domain/tracks_collections/network_tracks_collections/repositories/network_tracks_collections_repository.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/shared/spotify_repository_request.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection_type.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; - -abstract class NetworkTracksCollectionsRepository { - Future> getTracksCollectionByTypeAndSpotifyId( - SpotifyRepositoryRequest spotifyRepositoryRequest, TracksCollectionType type, String spotifyId); - Future> getTracksCollectionByUrl(SpotifyRepositoryRequest spotifyRepositoryRequest, String url); -} diff --git a/lib/features/domain/tracks_collections/network_tracks_collections/service/network_tracks_collections_service.dart b/lib/features/domain/tracks_collections/network_tracks_collections/service/network_tracks_collections_service.dart deleted file mode 100644 index 5425228..0000000 --- a/lib/features/domain/tracks_collections/network_tracks_collections/service/network_tracks_collections_service.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection_type.dart'; - -abstract class NetworkTracksCollectionsService { - Future> getTracksCollectionByTypeAndSpotifyId( - TracksCollectionType type, String spotifyId); - Future> getTracksCollectionByUrl(String url); -} diff --git a/lib/features/domain/tracks_collections/network_tracks_collections/use_cases/get_tracks_collection_by_type_and_spotify_id.dart b/lib/features/domain/tracks_collections/network_tracks_collections/use_cases/get_tracks_collection_by_type_and_spotify_id.dart deleted file mode 100644 index 1ed8bc7..0000000 --- a/lib/features/domain/tracks_collections/network_tracks_collections/use_cases/get_tracks_collection_by_type_and_spotify_id.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection_type.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/network_tracks_collections/service/network_tracks_collections_service.dart'; - -class GetTracksCollectionByTypeAndSpotifyId - implements UseCase { - GetTracksCollectionByTypeAndSpotifyId({required NetworkTracksCollectionsService service}) - : _service = service; - - final NetworkTracksCollectionsService _service; - - @override - Future> call((TracksCollectionType, String) args) { - return _service.getTracksCollectionByTypeAndSpotifyId(args.$1, args.$2); - } -} diff --git a/lib/features/domain/tracks_collections/network_tracks_collections/use_cases/get_tracks_collection_by_url.dart b/lib/features/domain/tracks_collections/network_tracks_collections/use_cases/get_tracks_collection_by_url.dart deleted file mode 100644 index 7bf145b..0000000 --- a/lib/features/domain/tracks_collections/network_tracks_collections/use_cases/get_tracks_collection_by_url.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/result/result.dart'; -import 'package:spotify_downloader/core/util/use_case/use_case.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/tracks_collection.dart'; -import 'package:spotify_downloader/features/domain/tracks_collections/network_tracks_collections/service/network_tracks_collections_service.dart'; -class GetTracksCollectionByUrl implements UseCase { - GetTracksCollectionByUrl({required NetworkTracksCollectionsService service}) : _service = service; - - final NetworkTracksCollectionsService _service; - - @override - Future> call(String url) async { - return _service.getTracksCollectionByUrl(url); - } -} diff --git a/lib/features/presentation/about_app/view/about_app_screen.dart b/lib/features/presentation/about_app/view/about_app_screen.dart index 90ed71a..55f5ca7 100644 --- a/lib/features/presentation/about_app/view/about_app_screen.dart +++ b/lib/features/presentation/about_app/view/about_app_screen.dart @@ -1,8 +1,14 @@ +import 'dart:math'; + import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:spotify_downloader/features/presentation/home/view/home_screen.dart'; +import 'package:spotify_downloader/core/app/colors/colors.dart'; +import 'package:spotify_downloader/core/app/themes/theme_consts.dart'; +import 'package:spotify_downloader/core/app/themes/themes.dart'; +import 'package:spotify_downloader/core/package_info/package_info_accessor.dart'; +import 'package:spotify_downloader/features/presentation/shared/widgets/widgets.dart'; import 'package:spotify_downloader/generated/l10n.dart'; +import 'package:url_launcher/url_launcher.dart'; @RoutePage() class AboutAppScreen extends StatelessWidget { @@ -11,115 +17,135 @@ class AboutAppScreen extends StatelessWidget { @override Widget build(BuildContext context) { final theme = Theme.of(context); + final avatarSize = min(MediaQuery.of(context).size.width, MediaQuery.of(context).size.height) * 0.6; + final packageInfoAccessor = PackageInfoAccessor.maybeOf(context); return Scaffold( - body: Column(children: [ - SizedBox( - height: 55 + MediaQuery.of(context).viewPadding.top, - child: Padding( - padding: EdgeInsets.only( - top: MediaQuery.of(context).viewPadding.top, - ), - child: Row( - children: [ - IconButton( - splashColor: Colors.transparent, - highlightColor: Colors.transparent, - onPressed: () { - AutoRouter.of(context).pop(); - }, - icon: SvgPicture.asset( - 'resources/images/svg/back_icon.svg', - height: 35, - width: 35, - )), - Padding( - padding: const EdgeInsets.only(left: 10), - child: Text( - S.of(context).aboutApp, - style: theme.textTheme.titleSmall, - )), - ], - ), - ), - ), - Expanded( - child: Stack( + body: SafeArea( + left: false, + right: false, + child: Column( children: [ - SingleChildScrollView( + CustomAppBar(title: S.of(context).aboutApp), + Expanded( child: Padding( - padding: - const EdgeInsets.only(left: homePageHorizontalPadding, right: homePageHorizontalPadding, top: 10), - child: Column(children: [ - Column( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Align( - alignment: Alignment.bottomLeft, - child: Text( - S.of(context).developed, - style: theme.textTheme.bodyLarge, - )), - Container( - alignment: Alignment.topLeft, - padding: const EdgeInsets.only(top: 10), - child: const Text('C0ntrolDev'), + padding: screenWithCustomAppBarPadding, + child: CustomScrollView( + slivers: [ + SliverToBoxAdapter( + child: Column( + children: [ + Padding( + padding: const EdgeInsets.only(top: 20), + child: Center( + child: TapAnimatedContainer( + tappingMaskColor: backgroundColor.withOpacity(0.3), + tappingScale: 0.95, + onTap: () => _onAvatarClicked(context), + child: Container( + height: avatarSize, + width: avatarSize, + decoration: BoxDecoration(shape: BoxShape.circle, boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + spreadRadius: 7, + blurRadius: 13, + ) + ]), + child: ClipOval(child: Image.asset("resources/images/another/bestIcon3.png", fit: BoxFit.cover,))), + )), + ), + Padding( + padding: const EdgeInsets.only(top: 20, bottom: 15), + child: Center( + child: Text(S.of(context).developedByC0ntrolDev, + style: theme.textTheme.titleMedium, maxLines: 2, textAlign: TextAlign.center), + ), + ), + ], + ), ), - ], - ), - Container( - padding: const EdgeInsets.only(top: 20), - alignment: Alignment.topLeft, - child: Column( - children: [ - Align( - alignment: Alignment.topLeft, - child: Text( - S.of(context).specialThanks, - style: theme.textTheme.bodyLarge, + SliverToBoxAdapter( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(top: 20, bottom: 20), + child: Text(S.of(context).specialThanks, style: theme.textTheme.bodyLarge), ), - ), - Container( - alignment: Alignment.topLeft, - padding: const EdgeInsets.only(top: 10), - child: Text( - 'w1mo', - style: theme.textTheme.bodyMedium?.copyWith(fontWeight: FontWeight.w700), + Padding( + padding: const EdgeInsets.only(bottom: 15), + child: Row( + children: [ + ClipOval( + child: SizedBox.fromSize( + size: const Size.fromRadius(13), + child: Image.asset("resources/images/another/thanks.png", fit: BoxFit.cover))), + const Padding( + padding: EdgeInsets.only(left: 10), + child: Text("wimo"), + ), + ], + ), ), - ), - Container( - alignment: Alignment.topLeft, - padding: const EdgeInsets.only(top: 10), - child: Text('Hexer10 - youtube_explode_dart', style: theme.textTheme.bodyMedium), - ), - Container( - alignment: Alignment.topLeft, - padding: const EdgeInsets.only(top: 10), - child: Text('rinukkusu - spotify-dart', style: theme.textTheme.bodyMedium), - ), - Container( - alignment: Alignment.topLeft, - padding: const EdgeInsets.only(top: 10), - child: Text('arthenica - ffmpeg-kit', style: theme.textTheme.bodyMedium), - ), - Container( - alignment: Alignment.topLeft, - padding: const EdgeInsets.only(top: 10), - child: Text('Flutter community', style: theme.textTheme.bodyMedium), - ), - ], - )) - ]), - ), - ), - Container( - padding: const EdgeInsets.only(bottom: 5), - alignment: Alignment.bottomCenter, - child: const Text('^_^'), + ], + ), + ), + SliverToBoxAdapter( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(top: 20, bottom: 20), + child: Text(S.of(context).appInfo, style: theme.textTheme.bodyLarge), + ), + Padding( + padding: const EdgeInsets.only(bottom: 15), + child: Text(S.of(context).appName(packageInfoAccessor?.packageInfo.appName ?? "")), + ), + Padding( + padding: const EdgeInsets.only(bottom: 15), + child: Text(S.of(context).packageName(packageInfoAccessor?.packageInfo.packageName ?? "")), + ), + Padding( + padding: const EdgeInsets.only(bottom: 15), + child: Text(S.of(context).appVersion(packageInfoAccessor?.packageInfo.version ?? "")), + ), + Padding( + padding: const EdgeInsets.only(bottom: 15), + child: Text(S.of(context).buildNumber(packageInfoAccessor?.packageInfo.buildNumber ?? "")), + ), + ], + ), + ), + const SliverFillRemaining( + hasScrollBody: false, + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Padding( + padding: EdgeInsets.only(top: 20), + child: Text("^_^"), + ), + OrientatedNavigationBarListViewExpander(), + ], + ), + ), + ], + )), ), ], - )) - ]), + ), + ), ); } + + Future _onAvatarClicked(BuildContext context) async { + final githubUrl = Uri.parse("https://github.com/C0ntrolDev"); + if (!await launchUrl(githubUrl)) { + if (context.mounted) { + showSmallTextSnackBar("", context); + } + } + } } diff --git a/lib/features/presentation/change_source_video/bloc/change_source_video_bloc.dart b/lib/features/presentation/change_source_video/bloc/change_source_video_bloc.dart index 267215f..e5557ad 100644 --- a/lib/features/presentation/change_source_video/bloc/change_source_video_bloc.dart +++ b/lib/features/presentation/change_source_video/bloc/change_source_video_bloc.dart @@ -1,11 +1,8 @@ import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:spotify_downloader/core/util/failures/failure.dart'; -import 'package:spotify_downloader/core/util/failures/failures.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/entities/video.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/use_cases/find_10_videos_by_track.dart'; -import 'package:spotify_downloader/features/domain/tracks/search_videos_by_track/use_cases/get_video_by_url.dart'; -import 'package:spotify_downloader/features/domain/tracks/shared/entities/track.dart'; +import 'package:spotify_downloader/core/utils/utils.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/search_videos_by_track/domain/domain.dart'; +import 'package:spotify_downloader/features/data_domain/tracks/shared/domain/domain.dart'; part 'change_source_video_event.dart'; part 'change_source_video_state.dart'; @@ -42,7 +39,7 @@ class ChangeSourceVideoBloc extends Bloc((event, emit) { _selectedVideo = event.selectedVideo; - emit(ChangeSourceVideoLoaded(videos: _videos, selectedVideo: _selectedVideo)); + emit(ChangeSourceVideoLoaded(videos: _videos, selectedVideo: _selectedVideo, isVideoSelectedByUser: true)); }); } diff --git a/lib/features/presentation/change_source_video/bloc/change_source_video_state.dart b/lib/features/presentation/change_source_video/bloc/change_source_video_state.dart index 636b2e2..3a115db 100644 --- a/lib/features/presentation/change_source_video/bloc/change_source_video_state.dart +++ b/lib/features/presentation/change_source_video/bloc/change_source_video_state.dart @@ -10,9 +10,10 @@ sealed class ChangeSourceVideoState extends Equatable { final class ChangeSourceVideoLoading extends ChangeSourceVideoState {} final class ChangeSourceVideoLoaded extends ChangeSourceVideoState { - const ChangeSourceVideoLoaded({required this.videos, required this.selectedVideo}); + const ChangeSourceVideoLoaded({required this.videos, required this.selectedVideo, required this.isVideoSelectedByUser}); final List