From 56ed536130eaf4e7d72b3dc589d44298e4eca06b Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Fri, 9 Sep 2022 13:36:49 +0600 Subject: [PATCH] chore: disable reading/writing audiotags in macOS for as unsupported platform for `metadata_god` build: bump version to 2.4.0 for next release fix: playlist view, album view, local track view play another track of already playing album/playlist behavior --- lib/components/Album/AlbumView.dart | 8 +++++ lib/components/Library/UserLocalTracks.dart | 34 +++++++++++-------- lib/components/Playlist/PlaylistView.dart | 5 +++ lib/components/Settings/About.dart | 2 +- lib/provider/Downloader.dart | 4 +++ lib/utils/type_conversion_utils.dart | 34 +++++++++---------- macos/Flutter/GeneratedPluginRegistrant.swift | 2 -- pubspec.lock | 2 +- pubspec.yaml | 2 +- 9 files changed, 57 insertions(+), 36 deletions(-) diff --git a/lib/components/Album/AlbumView.dart b/lib/components/Album/AlbumView.dart index 0aec7a4a..adb6f188 100644 --- a/lib/components/Album/AlbumView.dart +++ b/lib/components/Album/AlbumView.dart @@ -75,6 +75,14 @@ class AlbumView extends HookConsumerWidget { onPlay: ([track]) { if (tracksSnapshot.asData?.value != null) { if (!isAlbumPlaying) { + playPlaylist( + playback, + tracksSnapshot.asData!.value + .map((track) => + TypeConversionUtils.simpleTrack_X_Track(track, album)) + .toList(), + ); + } else if (isAlbumPlaying && track != null) { playPlaylist( playback, tracksSnapshot.asData!.value diff --git a/lib/components/Library/UserLocalTracks.dart b/lib/components/Library/UserLocalTracks.dart index 947c70a0..02aa0a9e 100644 --- a/lib/components/Library/UserLocalTracks.dart +++ b/lib/components/Library/UserLocalTracks.dart @@ -13,6 +13,7 @@ import 'package:spotube/models/CurrentPlaylist.dart'; import 'package:spotube/models/Logger.dart'; import 'package:spotube/provider/Playback.dart'; import 'package:spotube/provider/UserPreferences.dart'; +import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/primitive_utils.dart'; import 'package:spotube/utils/type_conversion_utils.dart'; @@ -44,6 +45,17 @@ final localTracksProvider = FutureProvider>((ref) async { } final entities = downloadDir.listSync(recursive: true); + // TODO: Add MacOS audiotag reading support + if (kIsMacOS) { + return entities + .map( + (entity) => TypeConversionUtils.localTrack_X_Track( + File(entity.path), + ), + ) + .toList(); + } + final filesWithMetadata = (await Future.wait( entities.map((e) => File(e.path)).where((file) { final mimetype = lookupMimeType(file.path); @@ -81,9 +93,9 @@ final localTracksProvider = FutureProvider>((ref) async { final tracks = filesWithMetadata .map( (fileWithMetadata) => TypeConversionUtils.localTrack_X_Track( - fileWithMetadata["metadata"] as Metadata, - fileWithMetadata["file"] as File, - fileWithMetadata["art"] as String?, + fileWithMetadata["file"], + metadata: fileWithMetadata["metadata"], + art: fileWithMetadata["art"], ), ) .toList(); @@ -184,17 +196,11 @@ class UserLocalTracks extends HookConsumerWidget { : "assets/album-placeholder.png", isLocal: true, onTrackPlayButtonPressed: (currentTrack) { - if (tracks.isNotEmpty) { - if (!isPlaylistPlaying) { - playLocalTracks( - playback, - tracks, - currentTrack: track, - ); - } else { - playback.stop(); - } - } + return playLocalTracks( + playback, + tracks, + currentTrack: track, + ); }, ); }, diff --git a/lib/components/Playlist/PlaylistView.dart b/lib/components/Playlist/PlaylistView.dart index 7f8d5bf0..868c8fa3 100644 --- a/lib/components/Playlist/PlaylistView.dart +++ b/lib/components/Playlist/PlaylistView.dart @@ -84,6 +84,11 @@ class PlaylistView extends HookConsumerWidget { onPlay: ([track]) { if (tracksSnapshot.asData?.value != null) { if (!isPlaylistPlaying) { + playPlaylist( + playback, + tracksSnapshot.asData!.value, + ); + } else if (isPlaylistPlaying && track != null) { playPlaylist( playback, tracksSnapshot.asData!.value, diff --git a/lib/components/Settings/About.dart b/lib/components/Settings/About.dart index 6761fe3a..d520a3b5 100644 --- a/lib/components/Settings/About.dart +++ b/lib/components/Settings/About.dart @@ -26,7 +26,7 @@ class About extends HookWidget { final info = usePackageInfo( appName: "Spotube", packageName: "oss.krtirtho.Spotube", - version: "2.3.0"); + version: "2.4.0"); return ListTile( leading: Icon(Icons.info_outline_rounded), diff --git a/lib/provider/Downloader.dart b/lib/provider/Downloader.dart index 30596cc0..d1346b6b 100644 --- a/lib/provider/Downloader.dart +++ b/lib/provider/Downloader.dart @@ -13,6 +13,7 @@ import 'package:spotube/models/SpotubeTrack.dart'; import 'package:spotube/provider/Playback.dart'; import 'package:spotube/provider/UserPreferences.dart'; import 'package:spotube/provider/YouTube.dart'; +import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/type_conversion_utils.dart'; import 'package:youtube_explode_dart/youtube_explode_dart.dart' hide Comment; @@ -93,6 +94,9 @@ class Downloader with ChangeNotifier { "[addToQueue] Download of ${file.path} is done successfully", ); + // TODO: Add MacOS audiotag writing support + if (kIsMacOS) return; + logger.v( "[addToQueue] Writing metadata to ${file.path}", ); diff --git a/lib/utils/type_conversion_utils.dart b/lib/utils/type_conversion_utils.dart index b08f0be1..7bf55cd2 100644 --- a/lib/utils/type_conversion_utils.dart +++ b/lib/utils/type_conversion_utils.dart @@ -107,15 +107,15 @@ abstract class TypeConversionUtils { } static SpotubeTrack localTrack_X_Track( - Metadata metadata, - File file, + File file, { + Metadata? metadata, String? art, - ) { + }) { final track = SpotubeTrack( Video( VideoId("dQw4w9WgXcQ"), basenameWithoutExtension(file.path), - metadata.artist ?? "", + metadata?.artist ?? "", ChannelId( "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw", ), @@ -123,8 +123,8 @@ abstract class TypeConversionUtils { "", DateTime.now(), "", - Duration(milliseconds: metadata.durationMs?.toInt() ?? 0), - ThumbnailSet(metadata.title ?? ""), + Duration(milliseconds: metadata?.durationMs?.toInt() ?? 0), + ThumbnailSet(metadata?.title ?? ""), [], const Engagement(0, 0, 0), false, @@ -133,28 +133,28 @@ abstract class TypeConversionUtils { [], ); track.album = Album() - ..name = metadata.album ?? "Spotube" + ..name = metadata?.album ?? "Spotube" ..images = [if (art != null) Image()..url = art] - ..genres = [if (metadata.genre != null) metadata.genre!] + ..genres = [if (metadata?.genre != null) metadata!.genre!] ..artists = [ Artist() - ..name = metadata.albumArtist ?? "Spotube" - ..id = metadata.albumArtist ?? "Spotube" + ..name = metadata?.albumArtist ?? "Spotube" + ..id = metadata?.albumArtist ?? "Spotube" ..type = "artist", ] - ..id = metadata.album - ..releaseDate = metadata.year?.toString(); + ..id = metadata?.album + ..releaseDate = metadata?.year?.toString(); track.artists = [ Artist() - ..name = metadata.artist ?? "Spotube" - ..id = metadata.artist ?? "Spotube" + ..name = metadata?.artist ?? "Spotube" + ..id = metadata?.artist ?? "Spotube" ]; - track.id = metadata.title ?? basenameWithoutExtension(file.path); - track.name = metadata.title ?? basenameWithoutExtension(file.path); + track.id = metadata?.title ?? basenameWithoutExtension(file.path); + track.name = metadata?.title ?? basenameWithoutExtension(file.path); track.type = "track"; track.uri = file.path; - track.durationMs = metadata.durationMs?.toInt(); + track.durationMs = metadata?.durationMs?.toInt(); return track; } diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index eb3904ca..3e375fb3 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -9,7 +9,6 @@ import audio_service import audio_session import audioplayers_darwin import bitsdojo_window_macos -import metadata_god import package_info_plus_macos import path_provider_macos import shared_preferences_macos @@ -21,7 +20,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) BitsdojoWindowPlugin.register(with: registry.registrar(forPlugin: "BitsdojoWindowPlugin")) - MetadataGodPlugin.register(with: registry.registrar(forPlugin: "MetadataGodPlugin")) FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) diff --git a/pubspec.lock b/pubspec.lock index b598d4ce..1b707311 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -723,7 +723,7 @@ packages: description: path: "." ref: HEAD - resolved-ref: "4801fcfc690203871b9ee2d3bf1b9c32ce52a7ca" + resolved-ref: "7f7e4d8edecc194ca0c7a265f8aa273cd7a22022" url: "https://github.com/KRTirtho/metadata_god.git" source: git version: "0.0.1" diff --git a/pubspec.yaml b/pubspec.yaml index 89f5ccc6..bdef2454 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.3.0+12 +version: 2.4.0+13 environment: sdk: ">=2.17.0 <3.0.0"