text: # -*- coding: utf-8 -*-
  
  """ Shows a user's playlists (need to be authenticated via oauth) """
  
  __all__ = ["CLIENT_CREDS_ENV_VARS", "prompt_for_user_token"]
  
  import logging
  import os
  import warnings
  
  import spotipy
  
  LOGGER = logging.getLogger(__name__)
  
  CLIENT_CREDS_ENV_VARS = {
      "client_id": "SPOTIPY_CLIENT_ID",
      "client_secret": "SPOTIPY_CLIENT_SECRET",
      "client_username": "SPOTIPY_CLIENT_USERNAME",
      "redirect_uri": "SPOTIPY_REDIRECT_URI",
  }
  
  
  def prompt_for_user_token(
      username=None,
      scope=None,
      client_id=None,
      client_secret=None,
      redirect_uri=None,
      cache_path=None,
      oauth_manager=None,
      show_dialog=False
  ):
      warnings.warn(
          "'prompt_for_user_token' is deprecated."
          "Use the following instead: "
          "    auth_manager=SpotifyOAuth(scope=scope)"
          "    spotipy.Spotify(auth_manager=auth_manager)",
          DeprecationWarning
      )
      """ prompts the user to login if necessary and returns
          the user token suitable for use with the spotipy.Spotify
          constructor
  
          Parameters:
  
           - username - the Spotify username (optional)
           - scope - the desired scope of the request (optional)
           - client_id - the client id of your app (required)
           - client_secret - the client secret of your app (required)
           - redirect_uri - the redirect URI of your app (required)
           - cache_path - path to location to save tokens (optional)
           - oauth_manager - Oauth manager object (optional)
           - show_dialog - If true, a login prompt always shows (optional, defaults to False)
  
      """
      if not oauth_manager:
          if not client_id:
              client_id = os.getenv("SPOTIPY_CLIENT_ID")
  
          if not client_secret:
              client_secret = os.getenv("SPOTIPY_CLIENT_SECRET")
  
          if not redirect_uri:
              redirect_uri = os.getenv("SPOTIPY_REDIRECT_URI")
  
          if not client_id:
              LOGGER.warning(
                  """
                  You need to set your Spotify API credentials.
                  You can do this by setting environment variables like so:
  
                  export SPOTIPY_CLIENT_ID='your-spotify-client-id'
                  export SPOTIPY_CLIENT_SECRET='your-spotify-client-secret'
                  export SPOTIPY_REDIRECT_URI='your-app-redirect-url'
  
                  Get your credentials at
                      https://developer.spotify.com/my-applications
              """
              )
              raise spotipy.SpotifyException(550, -1, "no credentials set")
  
      sp_oauth = oauth_manager or spotipy.SpotifyOAuth(
          client_id,
          client_secret,
          redirect_uri,
          scope=scope,
          cache_path=cache_path,
          username=username,
          show_dialog=show_dialog
      )
  
      # try to get a valid token for this user, from the cache,
      # if not in the cache, the create a new (this will send
      # the user to a web page where they can authorize this app)
  
      token_info = sp_oauth.validate_token(sp_oauth.cache_handler.get_cached_token())
  
      if not token_info:
          code = sp_oauth.get_auth_response()
          token = sp_oauth.get_access_token(code, as_dict=False)
      else:
          return token_info["access_token"]
  
      # Auth'ed API request
      if token:
          return token
      else:
          return None
  
  
  def get_host_port(netloc):
      if ":" in netloc:
          host, port = netloc.split(":", 1)
          port = int(port)
      else:
          host = netloc
          port = None
  
      return host, port
  
  
  def normalize_scope(scope):
      if scope:
          if isinstance(scope, str):
              scopes = scope.split(',')
          elif isinstance(scope, list) or isinstance(scope, tuple):
              scopes = scope
          else:
              raise Exception(
                  "Unsupported scope value, please either provide a list of scopes, "
                  "or a string of scopes separated by commas"
              )
          return " ".join(sorted(scopes))
      else:
          return None
  