/* * Copyright (C) 2025 Valeri Gokadze * * Musify is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Musify is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * * For more information about Musify, including how to contribute, * please visit: https://github.com/gokadzev/Musify */ import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:flutter/widgets.dart'; import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; import 'package:musify/DB/albums.db.dart'; import 'package:musify/DB/playlists.db.dart'; import 'package:musify/extensions/l10n.dart'; import 'package:musify/main.dart'; import 'package:musify/services/data_manager.dart'; import 'package:musify/services/io_service.dart'; import 'package:musify/services/lyrics_manager.dart'; import 'package:musify/services/settings_manager.dart'; import 'package:musify/utilities/flutter_toast.dart'; import 'package:musify/utilities/formatter.dart'; import 'package:musify/utilities/utils.dart'; import 'package:youtube_explode_dart/youtube_explode_dart.dart'; final _yt = YoutubeExplode(); List globalSongs = []; List playlists = [...playlistsDB, ...albumsDB]; final userPlaylists = ValueNotifier( Hive.box('user').get('playlists', defaultValue: []), ); final userCustomPlaylists = ValueNotifier( Hive.box('user').get('customPlaylists', defaultValue: []), ); List userLikedSongsList = Hive.box('user').get('likedSongs', defaultValue: []); List userLikedPlaylists = Hive.box( 'user', ).get('likedPlaylists', defaultValue: []); List userRecentlyPlayed = Hive.box( 'user', ).get('recentlyPlayedSongs', defaultValue: []); List userOfflineSongs = Hive.box( 'userNoBackup', ).get('offlineSongs', defaultValue: []); List suggestedPlaylists = []; List onlinePlaylists = []; Map activePlaylist = { 'ytid': '', 'title': 'No Playlist', 'image': '', 'source': 'user-created', 'list': [], }; final clients = { 'tv': YoutubeApiClient.tv, 'androidVr': YoutubeApiClient.androidVr, 'safari': YoutubeApiClient.safari, 'ios': YoutubeApiClient.ios, 'android': YoutubeApiClient.android, 'androidMusic': YoutubeApiClient.androidMusic, 'mediaConnect': YoutubeApiClient.mediaConnect, 'web': YoutubeApiClient.mweb, }; List userChosenClients = [ YoutubeApiClient.tv, YoutubeApiClient.androidVr, YoutubeApiClient.safari, ]; dynamic nextRecommendedSong; final currentLikedSongsLength = ValueNotifier(userLikedSongsList.length); final currentLikedPlaylistsLength = ValueNotifier( userLikedPlaylists.length, ); final currentOfflineSongsLength = ValueNotifier(userOfflineSongs.length); final currentRecentlyPlayedLength = ValueNotifier( userRecentlyPlayed.length, ); final lyrics = ValueNotifier(null); String? lastFetchedLyrics; int activeSongId = 0; Future fetchSongsList(String searchQuery) async { try { // Try to get data from cache first final cacheKey = 'search_$searchQuery'; final cachedResults = await getData('cache', cacheKey); if (cachedResults != null) { return cachedResults; } // If not in cache, perform the search final List