diff --git a/lib/ui/dialogs/general_popup_dialog.dart b/lib/ui/dialogs/general_popup_dialog.dart index 2bc7144b..33c4222f 100644 --- a/lib/ui/dialogs/general_popup_dialog.dart +++ b/lib/ui/dialogs/general_popup_dialog.dart @@ -38,6 +38,8 @@ import 'package:namida/ui/widgets/custom_widgets.dart'; import 'package:namida/ui/widgets/library/multi_artwork_container.dart'; import 'package:namida/ui/widgets/settings/extra_settings.dart'; import 'package:namida/youtube/class/youtube_id.dart'; +import 'package:namida/youtube/controller/youtube_info_controller.dart'; +import 'package:namida/youtube/pages/yt_channel_subpage.dart'; Future showGeneralPopupDialog( List tracks, @@ -104,7 +106,9 @@ Future showGeneralPopupDialog( final List availableArtists = tracks.mappedUniquedList((e) => e.toTrackExt().artistsList); final List availableFolders = tracks.mappedUniqued((e) => e.folder); - final Iterable availableYoutubeIDs = tracks.map((e) => YoutubeID(id: e.youtubeID, playlistID: null)).where((element) => element.id != ''); + final Iterable availableYoutubeIDs = tracks.map((e) => YoutubeID(id: e.youtubeID, playlistID: null)).where((element) => element.id.isNotEmpty); + final String? firstVideolId = availableYoutubeIDs.firstOrNull?.id; + final String? firstVideoChannelId = firstVideolId == null ? null : YoutubeInfoController.utils.getVideoChannelID(firstVideolId); final numberOfRepeats = 1.obso; final isLoadingFilesToShare = false.obso; @@ -1114,6 +1118,18 @@ Future showGeneralPopupDialog( NamidaNavigator.inst.closeDialog(); Player.inst.playOrPause(0, availableYoutubeIDs, QueueSource.others); }, + trailing: isSingle && firstVideoChannelId != null + ? IconButton( + tooltip: lang.GO_TO_CHANNEL, + icon: Icon( + Broken.user, + size: 20.0, + color: iconColor, + ), + iconSize: 20.0, + onPressed: () => NamidaNavigator.inst.navigateTo(YTChannelSubpage(channelID: firstVideoChannelId)), + ) + : null, ), if (removeQueueTile != null) removeQueueTile, diff --git a/lib/youtube/controller/info_controllers/yt_various_utils.dart b/lib/youtube/controller/info_controllers/yt_various_utils.dart index dbd4f5ba..e1058698 100644 --- a/lib/youtube/controller/info_controllers/yt_various_utils.dart +++ b/lib/youtube/controller/info_controllers/yt_various_utils.dart @@ -48,26 +48,26 @@ class _YoutubeInfoUtils { } String? getVideoName(String videoId, {bool checkFromStorage = true /* am sorry every follow me */}) { - String? name = tempVideoInfosFromStreams[videoId]?.title ?? tempBackupVideoInfo[videoId]?.title; + String? name = tempVideoInfosFromStreams[videoId]?.title.nullifyEmpty() ?? tempBackupVideoInfo[videoId]?.title.nullifyEmpty(); if (name != null || checkFromStorage == false) return name; - return getStreamInfoSync(videoId)?.title ?? - _getVideoStreamResultSync(videoId)?.info?.title ?? // - _getVideoPageResultSync(videoId)?.videoInfo?.title; + return getStreamInfoSync(videoId)?.title.nullifyEmpty() ?? + _getVideoStreamResultSync(videoId)?.info?.title.nullifyEmpty() ?? // + _getVideoPageResultSync(videoId)?.videoInfo?.title.nullifyEmpty(); } String? getVideoChannelName(String videoId, {bool checkFromStorage = true}) { - String? name = tempVideoInfosFromStreams[videoId]?.channelName ?? tempBackupVideoInfo[videoId]?.channel; + String? name = tempVideoInfosFromStreams[videoId]?.channelName?.nullifyEmpty() ?? tempBackupVideoInfo[videoId]?.channel.nullifyEmpty(); if (name != null || checkFromStorage == false) return name; - return getStreamInfoSync(videoId)?.channelName ?? - _getVideoStreamResultSync(videoId)?.info?.channelName ?? // - _getVideoPageResultSync(videoId)?.channelInfo?.title; + return getStreamInfoSync(videoId)?.channelName?.nullifyEmpty() ?? + _getVideoStreamResultSync(videoId)?.info?.channelName?.nullifyEmpty() ?? // + _getVideoPageResultSync(videoId)?.channelInfo?.title.nullifyEmpty(); } String? getVideoChannelID(String videoId) { - return tempVideoInfosFromStreams[videoId]?.channelId ?? - getStreamInfoSync(videoId)?.channelId ?? - _getVideoStreamResultSync(videoId)?.info?.channelId ?? // - _getVideoPageResultSync(videoId)?.channelInfo?.id; + return tempVideoInfosFromStreams[videoId]?.channelId?.nullifyEmpty() ?? + getStreamInfoSync(videoId)?.channelId?.nullifyEmpty() ?? + _getVideoStreamResultSync(videoId)?.info?.channelId?.nullifyEmpty() ?? // + _getVideoPageResultSync(videoId)?.channelInfo?.id.nullifyEmpty(); } DateTime? getVideoReleaseDate(String videoId) { @@ -84,3 +84,10 @@ class _YoutubeInfoUtils { _getVideoStreamResultSync(videoId)?.info?.durSeconds; } } + +extension _StringChecker on String { + String? nullifyEmpty() { + if (isEmpty) return null; + return this; + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 6eea431a..049a5eab 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: namida description: A Beautiful and Feature-rich Music Player, With YouTube & Video Support Built in Flutter publish_to: "none" -version: 2.9.65-beta+240705126 +version: 2.9.7-beta+240705185 environment: sdk: ">=3.4.0 <4.0.0"