diff --git a/lib/controller/indexer_controller.dart b/lib/controller/indexer_controller.dart index 3964c396..f5fa2d1f 100644 --- a/lib/controller/indexer_controller.dart +++ b/lib/controller/indexer_controller.dart @@ -38,7 +38,7 @@ class Indexer { final RxBool isIndexing = false.obs; - final currentTrackPathBeingExtracted = ''.obs; + final currentTracksPathsBeingExtracted = [].obs; final RxSet allAudioFiles = {}.obs; final RxInt filteredForSizeDurationTracks = 0.obs; final RxInt duplicatedTracksLength = 0.obs; @@ -543,7 +543,6 @@ class Indexer { ); await for (final item in stream) { - currentTrackPathBeingExtracted.value = item.tags.path; final trext = extractFunction(item); if (trext != null) _addTrackToLists(trext, checkForDuplicates, item.tags.artwork); } @@ -741,8 +740,7 @@ class Indexer { _currentFileNamesMap.clear(); trs.loop((e, _) => _addTrackToLists(e.$1, false, null)); } else { - currentTrackPathBeingExtracted.value = ''; - + FAudioTaggerController.inst.currentPathsBeingExtracted.clear(); final audioFilesWithoutDuplicates = []; if (prevDuplicated) { /// skip duplicated tracks according to filename @@ -782,8 +780,6 @@ class Indexer { extractFunction(part).then((value) => audioFilesCompleters[partIndex].complete()); }); await Future.wait(audioFilesCompleters.map((e) => e.future).toList()); - - currentTrackPathBeingExtracted.value = ''; } /// doing some checks to remove unqualified tracks. diff --git a/lib/controller/tagger_controller.dart b/lib/controller/tagger_controller.dart index 0544b8cf..f5fe5fe3 100644 --- a/lib/controller/tagger_controller.dart +++ b/lib/controller/tagger_controller.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:io'; import 'package:flutter/services.dart'; +import 'package:get/get_rx/src/rx_types/rx_types.dart'; import 'package:queue/queue.dart'; import 'package:namida/class/faudiomodel.dart'; @@ -87,6 +88,8 @@ class FAudioTaggerController { final _streamControllers = >{}; + final currentPathsBeingExtracted = {}.obs; + Future> extractMetadataAsStream({ required List paths, bool extractArtwork = true, @@ -116,19 +119,33 @@ class FAudioTaggerController { streamController.close(); streamSub?.cancel(); _streamControllers.remove(streamKey); + currentPathsBeingExtracted.remove(streamKey); + } + + int extractingCount = 0; + void incrementCurrentExtracting() { + if (paths.isEmpty) return; + try { + extractingCount++; + currentPathsBeingExtracted[streamKey] = paths[extractingCount]; + } catch (_) {} } void onExtract(FAudioModel info) { streamController.add(info); toExtract--; + incrementCurrentExtracting(); if (toExtract <= 0) usingStream.completeIfWasnt(); } + currentPathsBeingExtracted[streamKey] = paths[0]; + streamSub = initialStream.listen( (map) { + final path = map['path'] as String; if (map["ERROR_FAULTY"] == true) { extractMetadata( - trackPath: map['path'] as String, + trackPath: path, tagger: false, ffmpeg: fallbackToFFMPEG, saveArtworkToCache: saveArtworkToCache, @@ -140,7 +157,7 @@ class FAudioTaggerController { try { onExtract(FAudioModel.fromMap(map)); } catch (e) { - onExtract(FAudioModel.dummy(map['path'] as String)); + onExtract(FAudioModel.dummy(path)); } } }, diff --git a/lib/ui/widgets/settings/indexer_settings.dart b/lib/ui/widgets/settings/indexer_settings.dart index 50247083..a78c135a 100644 --- a/lib/ui/widgets/settings/indexer_settings.dart +++ b/lib/ui/widgets/settings/indexer_settings.dart @@ -9,6 +9,7 @@ import 'package:namida/base/setting_subpage_provider.dart'; import 'package:namida/controller/indexer_controller.dart'; import 'package:namida/controller/navigator_controller.dart'; import 'package:namida/controller/settings_controller.dart'; +import 'package:namida/controller/tagger_controller.dart'; import 'package:namida/controller/video_controller.dart'; import 'package:namida/core/constants.dart'; import 'package:namida/core/enums.dart'; @@ -346,15 +347,19 @@ class IndexerSettings extends SettingSubpageProvider { ), Obx( () { - final p = Indexer.inst.currentTrackPathBeingExtracted.value; - return p == '' + final paths = FAudioTaggerController.inst.currentPathsBeingExtracted.values; + return paths.isEmpty ? const SizedBox() - : Padding( - padding: const EdgeInsets.symmetric(horizontal: 18.0, vertical: 4.0), - child: Text( - p, - style: context.textTheme.displaySmall?.copyWith(fontSize: 11.0.multipliedFontScale), - ), + : Column( + children: paths + .map((e) => Padding( + padding: const EdgeInsets.symmetric(horizontal: 18.0, vertical: 4.0), + child: Text( + e, + style: context.textTheme.displaySmall?.copyWith(fontSize: 11.0.multipliedFontScale), + ), + )) + .toList(), ); }, ),