public static void createArtistPlayQueue(
      Connection connection, PlexDirectory artist, final PlexPlayQueueHandler responseHandler) {
    Map qs = new HashMap<>();
    qs.put("type", "audio");
    qs.put("shuffle", "1");
    String uri =
        String.format(
            "library://%s/item/%%2flibrary%%2fmetadata%%2f%s",
            artist.server.machineIdentifier, artist.ratingKey);
    Logger.d("URI: %s", uri);
    qs.put("uri", uri);
    if (artist.server.accessToken != null)
      qs.put(PlexHeaders.XPlexToken, artist.server.accessToken);
    qs.put("continuous", "0");
    qs.put("includeRelated", "1");
    PlexHttpService service =
        getService(String.format("http://%s:%s", connection.address, connection.port));
    Call<MediaContainer> call =
        service.createPlayQueue(qs, VoiceControlForPlexApplication.getUUID());
    call.enqueue(
        new Callback<MediaContainer>() {
          @Override
          public void onResponse(Response<MediaContainer> response) {
            if (responseHandler != null) responseHandler.onSuccess(response.body());
          }

          @Override
          public void onFailure(Throwable t) {
            Logger.d("createPlayQueue failure.");
            t.printStackTrace();
          }
        });
  }
  public static void createPlayQueue(
      Connection connection,
      final PlexMedia media,
      final String key,
      String transientToken,
      final PlexPlayQueueHandler responseHandler) {
    Map qs = new HashMap<>();
    qs.put("type", media.getType());
    qs.put("next", "0");

    boolean hasOffset = media.viewOffset != null && Integer.parseInt(media.viewOffset) > 0;
    if (media.isMovie() && !hasOffset) {
      qs.put(
          "extrasPrefixCount",
          Integer.toString(
              VoiceControlForPlexApplication.getInstance()
                  .prefs
                  .get(Preferences.NUM_CINEMA_TRAILERS, 0)));
    }

    String uri =
        String.format(
            "library://%s/item/%%2flibrary%%2fmetadata%%2f%s", media.server.machineIdentifier, key);
    qs.put("uri", uri);
    qs.put("window", "50"); // no idea what this is for
    if (transientToken != null) qs.put("token", transientToken);
    if (media.server.accessToken != null) qs.put(PlexHeaders.XPlexToken, media.server.accessToken);

    Logger.d("Qs: ", qs);
    PlexHttpService service =
        getService(String.format("http://%s:%s", connection.address, connection.port));
    Call<MediaContainer> call =
        service.createPlayQueue(qs, VoiceControlForPlexApplication.getUUID());
    call.enqueue(
        new Callback<MediaContainer>() {
          @Override
          public void onResponse(Response<MediaContainer> response) {
            if (responseHandler != null) {
              MediaContainer mc = response.body();
              for (int i = 0; i < mc.tracks.size(); i++) {
                mc.tracks.get(i).server = media.server;
              }
              for (int i = 0; i < mc.videos.size(); i++) {
                mc.videos.get(i).server = media.server;
                if (mc.videos.get(i).isClip()) mc.videos.get(i).setClipDuration();
              }
              responseHandler.onSuccess(mc);
            }
          }

          @Override
          public void onFailure(Throwable t) {
            Logger.d("createPlayQueue failure.");
            t.printStackTrace();
          }
        });
  }