Skip to content
Snippets Groups Projects
spotify.dart 7.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • import 'dart:convert';
    
    Daniel Furaev's avatar
    Daniel Furaev committed
    import 'dart:developer';
    import 'dart:io';
    
    
    Daniel Furaev's avatar
    Daniel Furaev committed
    import 'package:flutter/services.dart';
    
    Daniel Furaev's avatar
    Daniel Furaev committed
    import 'package:http/http.dart' as http;
    
    Daniel Furaev's avatar
    Daniel Furaev committed
    import 'package:spotify_sdk/spotify_sdk.dart';
    
    Daniel Furaev's avatar
    Daniel Furaev committed
    
    
    Daniel Furaev's avatar
    Daniel Furaev committed
    class Spotify {
    
      final clientId = '60cf1944b15d4f9fb223ba32ce6336d1';
      final clientSecret = 'd2a2fd28d1c14d14babd781b8d5b52f5';
    
    Daniel Furaev's avatar
    Daniel Furaev committed
      final code = "AQCSV8ivXmfyNPrIkq-1xlmsaRmW-zgcrQDKHEQG-axgIFooNsk7tj24-StF_4y3B5ALd4d-efCQM6NkOcyCkQFV4MkuC7kAr8B64Gum8gt5yuutckAFndFDK__HhMQIOyO49OCs7sJIK2e8VHRT5h6dMdCyKUvWg7udxiQSYUHglS97leWWtfo9u_GWK1p3P5Mr_Mg7OYG0DkzY&state=34fFs29kd09";
    
    
      final scope =
          'user-library-modify playlist-modify-private playlist-read-private user-follow-read user-read-current-playing user-library-read user-read-private user-top-read user-follow-modify user-read-recent-played';
    
    
    Daniel Furaev's avatar
    Daniel Furaev committed
      var authToken =
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          'BQBIbqReZny6ctqIobozxD8dh6w7DBcWLLOYGT3NtngJntXWztPp27C4FZigb55UdjbLnyn_BRw3DlFlwPpgBwU8AeIxXOZvw3fw1liR5zpsyJkVq2ndzXBH0P49p9otYmG9w0RkQy1S_SxVeaZlHHJuImXfL3ckYw5u3Z9iMMtn3i2vnhBJjBjxDHb_WHMEeiRPf14xubjRocD7RvRrJrv0fNNDborP4mdcTS3wUkIOgh-_x--9Y_OKGMOjy9XfN4EcuTFmUVyYPLSYhDB6acRlrK1f';
    
    Daniel Furaev's avatar
    Daniel Furaev committed
      Future<String> generateAuthToken() async {
    
        String encoded = base64Url.encode('$clientId:$clientSecret'.codeUnits);
        try {
          final response = await http.post(
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            Uri.parse("https://accounts.spotify.com/api/token"),
            headers: {"Content_type": "application/x-www-form-urlencoded"},
    
    Daniel Furaev's avatar
    Daniel Furaev committed
              "grant_type": "client_credentials",
              "client_id": clientId,
              "client_secret": clientSecret
            });
    
          if (response.statusCode == 200) {
            print(200);
            Map<String, dynamic> tokenResponse = json.decode(response.body);
            authToken = tokenResponse["access_token"];
            print(authToken);
          } else if (response.statusCode == 400) {
            print(400);
            Map<String, dynamic> tokenResponse = json.decode(response.body);
            print(tokenResponse["error_description"]);
          } else {print("anderer");}
    
    
        } catch (e) {
          // TODO: Handle Error
        }
    
    Daniel Furaev's avatar
    Daniel Furaev committed
        return authToken;
    
    Daniel Furaev's avatar
    Daniel Furaev committed
    
      search(text) async {
    
    Daniel Furaev's avatar
    Daniel Furaev committed
        var token = generateAuthToken();
    
    Daniel Furaev's avatar
    Daniel Furaev committed
        try {
    
          final response = await http.get(
            Uri.parse('https://api.spotify.com/v1/search?q=$text&type=track'),
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            headers: {'Authorization': 'Bearer $authToken'},
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          );
    
          final responseJson = json.decode(response.body);
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          print(responseJson);
    
          final items = responseJson['tracks']['items'] as List;
    
          List songList = items.map((item) => Song.fromJson(item)).toList();
    
          return songList;
    
    Daniel Furaev's avatar
    Daniel Furaev committed
        } catch (e) {
          log(e.toString());
        }
      }
    
    
    Daniel Furaev's avatar
    Daniel Furaev committed
      playGenre(genre) async {
        try {
          final response = await http.get(
            Uri.parse('https://api.spotify.com/v1/search?q=genre=$genre'),
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            headers: {'Authorization': 'Bearer $authToken'},
    
            //headers: {HttpHeaders.authorizationHeader: authToken},
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          );
          final responseJson = json.decode(response.body);
          final items = responseJson['tracks']['items'] as List;
    
          List songList = items.map((item) => Song.fromJson(item)).toList();
    
          var playSong = songList.first();
    
          play(playSong['id']);
          // T
        } catch (e) {
          log(e.toString());
        }
      }
    
    
      getUser() async {
        try {
          var response = await http.get(
            Uri.parse("https://api.spotify.com/v1/me"),
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            headers: {'Authorization': 'Bearer $authToken'},
    
          );
          return response;
        } catch (e) {
          log(e.toString());
        }
      }
    
    
    Daniel Furaev's avatar
    Daniel Furaev committed
      getUserAlbums() async {
        try {
          var response = await http.get(
            Uri.parse("https://api.spotify.com/v1/me/albums"),
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            headers: {'Authorization': 'Bearer $authToken'},
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          );
          return response;
        } catch (e) {
          log(e.toString());
        }
      }
    
      getFavoritTracks() async {
        try {
          var response = await http.get(
            Uri.parse("https://api.spotify.com/v1/me/tracks"),
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            headers: {'Authorization': 'Bearer $authToken'},
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          );
          return response;
        } catch (e) {
          log(e.toString());
        }
      }
    
      saveToFavoritTracks(track) async {
        try {
          var response = await http.put(
            Uri.parse("https://api.spotify.com/v1/me/tracks?ids=$track"),
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            headers: {'Authorization': 'Bearer $authToken'},
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          );
          return response;
        } catch (e) {
          log(e.toString());
        }
      }
    
      deleteToFavoritTracks(track) async {
        try {
          var response = await http.delete(
            Uri.parse("https://api.spotify.com/v1/me/tracks?ids=$track"),
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            headers: {'Authorization': 'Bearer $authToken'},
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          );
          return response;
        } catch (e) {
          log(e.toString());
        }
      }
    
      getTrack(id) async {
        try {
          var response = await http.get(
            Uri.parse("https://api.spotify.com/v1/tracks/$id"),
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            headers: {'Authorization': 'Bearer $authToken'},
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          );
          return response;
        } catch (e) {
          log(e.toString());
        }
      }
    
      getGenres() async {
        try {
          var response = await http.get(
            Uri.parse(
                "https://api.spotify.com/v1/recommendations/available-genre-seeds"),
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            headers: {'Authorization': 'Bearer $authToken'},
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          );
          return response;
        } catch (e) {
          log(e.toString());
        }
      }
    
      getAlbum(id) async {
        try {
          var response = await http.get(
            Uri.parse("https://api.spotify.com/v1/albums/$id"),
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            headers: {'Authorization': 'Bearer $authToken'},
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          );
          return response;
        } catch (e) {
          log(e.toString());
        }
      }
    
      getAlbumTracks(id) async {
        try {
          var response = await http.get(
            Uri.parse("https://api.spotify.com/v1/albums/$id/tracks"),
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            headers: {'Authorization': 'Bearer $authToken'},
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          );
          return response;
        } catch (e) {
          log(e.toString());
        }
      }
    
      getArtist(id) async {
        try {
          var response = await http.get(
            Uri.parse("https://api.spotify.com/v1/artists/$id"),
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            headers: {'Authorization': 'Bearer $authToken'},
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          );
          return response;
        } catch (e) {
          log(e.toString());
        }
      }
    
      getArtistTopTracks(id) async {
        try {
          var response = await http.get(
            Uri.parse("https://api.spotify.com/v1/artists/$id/top-tracks"),
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            headers: {'Authorization': 'Bearer $authToken'},
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          );
          return response;
        } catch (e) {
          log(e.toString());
        }
      }
    
      getArtistAlbums(id) async {
        try {
          var response = await http.get(
            Uri.parse("https://api.spotify.com/v1/artists/$id/albums"),
    
    Daniel Furaev's avatar
    Daniel Furaev committed
            headers: {'Authorization': 'Bearer $authToken'},
    
    Daniel Furaev's avatar
    Daniel Furaev committed
          );
          return response;
        } catch (e) {
          log(e.toString());
        }
      }
    
    Daniel Furaev's avatar
    Daniel Furaev committed
    
      Future<void> play(String songId) async {
        try {
          await SpotifySdk.play(spotifyUri: 'spotify:track:$songId');
        } on PlatformException catch (e) {
          //setStatus(e.code, message: e.message);
        } on MissingPluginException {
          //setStatus('not implemented');
        }
      }
    
    
    class Song {
      final String id;
      final String name;
      final String artist;
      final String album;
    
      final String image;
    
    
      Song(
        this.id,
        this.name,
        this.artist,
        this.album,
    
      );
    
      factory Song.fromJson(Map<String, dynamic> json) {
        return Song(
          json['id'],
          json['name'],
          json['artists'][0]['name'],
          json['album']['name'],
    
          json['album']['images'][0]['url'],