// Path: plexapp-rest-library/src/main/java/us/nineworlds/plex/rest/services/PlexTextService.java
// public interface PlexTextService {
// 
//     @GET(":/scrobble?identifier=com.plexapp.plugins.library")
//     Call<String> watched(@Query("key") String key);
// 
//     @GET(":/unscrobble?identifier=com.plexapp.plugins.library")
//     Call<String> unwatched(@Query("key") String key);
// 
//     @GET(":/progress?identifier=com.plexapp.plugins.library")
//     Call<String> progress(@Query("key") String key,
//                           @Query("time") String offset);
// }
// 
// Path: serenity-common/src/main/java/us/nineworlds/serenity/common/media/model/IMediaContainer.java
// public interface IMediaContainer {
//   String getTitle2();
// 
//   void setTitle2(String title2);
// 
//   List<IDirectory> getDirectories();
// 
//   void setDirectories(List<IDirectory> directory);
// 
//   int getSize();
// 
//   void setSize(int size);
// 
//   int getAllowSync();
// 
//   void setAllowSync(int allowSync);
// 
//   String getIdentifier();
// 
//   void setIdentifier(String identifier);
// 
//   String getMediaTagPrefix();
// 
//   void setMediaTagPrefix(String mediaTagPrefix);
// 
//   long getMediaTagVersion();
// 
//   String getArt();
// 
//   void setArt(String art);
// 
//   int getSortAsc();
// 
//   void setSortAsc(int sortAsc);
// 
//   String getContent();
// 
//   void setContent(String content);
// 
//   String getViewGroup();
// 
//   void setViewGroup(String viewGroup);
// 
//   int getViewMode();
// 
//   void setViewMode(int viewMode);
// 
//   void setMediaTagVersion(long mediaTagVersion);
// 
//   void setMediaTagVersion(int mediaTagVersion);
// 
//   String getTitle1();
// 
//   void setTitle1(String title1);
// 
//   List<IVideo> getVideos();
// 
//   void setVideos(List<IVideo> videos);
// 
//   String getParentPosterURL();
// 
//   void setParentPosterURL(String parentPosterURL);
// 
//   List<ITrack> getTracks();
// 
//   void setTracks(List<ITrack> tracks);
// 
//   String getParentIndex();
// 
//   void setParentIndex(String parentIndex);
// }


import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
import retrofit2.converter.simplexml.SimpleXmlConverterFactory;
import us.nineworlds.plex.rest.config.IConfiguration;
import us.nineworlds.plex.rest.model.impl.MediaContainer;
import us.nineworlds.plex.rest.services.PlexMediaContainerService;
import us.nineworlds.plex.rest.services.PlexTextService;
import us.nineworlds.serenity.common.media.model.IMediaContainer;
import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
import retrofit2.Call;
import retrofit2.Response;
    Retrofit mediaContainerAdapter = builder.baseUrl(resourcePath.getRoot())
        .addConverterFactory(SimpleXmlConverterFactory.createNonStrict(serializer))
        .client(okClient.build())
        .build();

    mediaContainerclient = mediaContainerAdapter.create(PlexMediaContainerService.class);

    Retrofit stringAdapter = new Retrofit.Builder().baseUrl(resourcePath.getRoot())
        .addConverterFactory(ScalarsConverterFactory.create())
        .client(okClient.build())
        .build();

    textClient = stringAdapter.create(PlexTextService.class);
  }

  private void reinitIfNecessary() {
    if (mediaContainerclient != null && textClient != null) {
      return;
    }
    init();
  }

  /**
   * Retrieve the root metadata from the Plex Media Server.
   *
   * @throws Exception
   */
  public IMediaContainer retrieveRootData() throws Exception {
    reinitIfNecessary();
    Call<MediaContainer> call = mediaContainerclient.retrieveRoot();
// Path: plexapp-rest-library/src/main/java/us/nineworlds/plex/rest/services/PlexTextService.java
// public interface PlexTextService {
// 
//     @GET(":/scrobble?identifier=com.plexapp.plugins.library")
//     Call<String> watched(@Query("key") String key);
// 
//     @GET(":/unscrobble?identifier=com.plexapp.plugins.library")
//     Call<String> unwatched(@Query("key") String key);
// 
//     @GET(":/progress?identifier=com.plexapp.plugins.library")
//     Call<String> progress(@Query("key") String key,
//                           @Query("time") String offset);
// }
// 
// Path: serenity-common/src/main/java/us/nineworlds/serenity/common/media/model/IMediaContainer.java
// public interface IMediaContainer {
//   String getTitle2();
// 
//   void setTitle2(String title2);
// 
//   List<IDirectory> getDirectories();
// 
//   void setDirectories(List<IDirectory> directory);
// 
//   int getSize();
// 
//   void setSize(int size);
// 
//   int getAllowSync();
// 
//   void setAllowSync(int allowSync);
// 
//   String getIdentifier();
// 
//   void setIdentifier(String identifier);
// 
//   String getMediaTagPrefix();
// 
//   void setMediaTagPrefix(String mediaTagPrefix);
// 
//   long getMediaTagVersion();
// 
//   String getArt();
// 
//   void setArt(String art);
// 
//   int getSortAsc();
// 
//   void setSortAsc(int sortAsc);
// 
//   String getContent();
// 
//   void setContent(String content);
// 
//   String getViewGroup();
// 
//   void setViewGroup(String viewGroup);
// 
//   int getViewMode();
// 
//   void setViewMode(int viewMode);
// 
//   void setMediaTagVersion(long mediaTagVersion);
// 
//   void setMediaTagVersion(int mediaTagVersion);
// 
//   String getTitle1();
// 
//   void setTitle1(String title1);
// 
//   List<IVideo> getVideos();
// 
//   void setVideos(List<IVideo> videos);
// 
//   String getParentPosterURL();
// 
//   void setParentPosterURL(String parentPosterURL);
// 
//   List<ITrack> getTracks();
// 
//   void setTracks(List<ITrack> tracks);
// 
//   String getParentIndex();
// 
//   void setParentIndex(String parentIndex);
// }


// Path: plexapp-rest-library/src/main/java/us/nineworlds/plex/rest/PlexappClient.java
import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
import retrofit2.converter.simplexml.SimpleXmlConverterFactory;
import us.nineworlds.plex.rest.config.IConfiguration;
import us.nineworlds.plex.rest.model.impl.MediaContainer;
import us.nineworlds.plex.rest.services.PlexMediaContainerService;
import us.nineworlds.plex.rest.services.PlexTextService;
import us.nineworlds.serenity.common.media.model.IMediaContainer;
import java.io.IOException;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
import retrofit2.Call;
import retrofit2.Response;

    Retrofit mediaContainerAdapter = builder.baseUrl(resourcePath.getRoot())
        .addConverterFactory(SimpleXmlConverterFactory.createNonStrict(serializer))
        .client(okClient.build())
        .build();

    mediaContainerclient = mediaContainerAdapter.create(PlexMediaContainerService.class);

    Retrofit stringAdapter = new Retrofit.Builder().baseUrl(resourcePath.getRoot())
        .addConverterFactory(ScalarsConverterFactory.create())
        .client(okClient.build())
        .build();

    textClient = stringAdapter.create(PlexTextService.class);
  }

  private void reinitIfNecessary() {
    if (mediaContainerclient != null && textClient != null) {
      return;
    }
    init();
  }

  /**
   * Retrieve the root metadata from the Plex Media Server.
   *
   * @throws Exception
   */
  public IMediaContainer retrieveRootData() throws Exception {
    reinitIfNecessary();
    Call<MediaContainer> call = mediaContainerclient.retrieveRoot();
    MediaContainer mediaContainer = call.execute().body();