/* 
 * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
 */

package dev.plexapi.sdk.models.operations;


import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import dev.plexapi.sdk.utils.Utils;
import java.lang.Integer;
import java.lang.Override;
import java.lang.String;
import java.lang.SuppressWarnings;
import java.util.List;
import java.util.Objects;
import java.util.Optional;


public class GetSessionsMetadata {

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("addedAt")
    private Optional<Integer> addedAt;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("art")
    private Optional<String> art;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("duration")
    private Optional<Integer> duration;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("grandparentArt")
    private Optional<String> grandparentArt;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("grandparentGuid")
    private Optional<String> grandparentGuid;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("grandparentKey")
    private Optional<String> grandparentKey;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("grandparentRatingKey")
    private Optional<String> grandparentRatingKey;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("grandparentThumb")
    private Optional<String> grandparentThumb;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("grandparentTitle")
    private Optional<String> grandparentTitle;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("guid")
    private Optional<String> guid;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("index")
    private Optional<Integer> index;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("key")
    private Optional<String> key;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("librarySectionID")
    private Optional<String> librarySectionID;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("librarySectionKey")
    private Optional<String> librarySectionKey;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("librarySectionTitle")
    private Optional<String> librarySectionTitle;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("musicAnalysisVersion")
    private Optional<String> musicAnalysisVersion;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("parentGuid")
    private Optional<String> parentGuid;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("parentIndex")
    private Optional<Integer> parentIndex;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("parentKey")
    private Optional<String> parentKey;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("parentRatingKey")
    private Optional<String> parentRatingKey;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("parentStudio")
    private Optional<String> parentStudio;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("parentThumb")
    private Optional<String> parentThumb;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("parentTitle")
    private Optional<String> parentTitle;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("parentYear")
    private Optional<Integer> parentYear;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("ratingCount")
    private Optional<Integer> ratingCount;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("ratingKey")
    private Optional<String> ratingKey;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("sessionKey")
    private Optional<String> sessionKey;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("thumb")
    private Optional<String> thumb;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("title")
    private Optional<String> title;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("titleSort")
    private Optional<String> titleSort;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("type")
    private Optional<String> type;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("updatedAt")
    private Optional<Integer> updatedAt;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("viewOffset")
    private Optional<Integer> viewOffset;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("Media")
    private Optional<? extends List<GetSessionsMedia>> media;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("User")
    private Optional<? extends GetSessionsUser> user;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("Player")
    private Optional<? extends Player> player;

    @JsonInclude(Include.NON_ABSENT)
    @JsonProperty("Session")
    private Optional<? extends Session> session;

    @JsonCreator
    public GetSessionsMetadata(
            @JsonProperty("addedAt") Optional<Integer> addedAt,
            @JsonProperty("art") Optional<String> art,
            @JsonProperty("duration") Optional<Integer> duration,
            @JsonProperty("grandparentArt") Optional<String> grandparentArt,
            @JsonProperty("grandparentGuid") Optional<String> grandparentGuid,
            @JsonProperty("grandparentKey") Optional<String> grandparentKey,
            @JsonProperty("grandparentRatingKey") Optional<String> grandparentRatingKey,
            @JsonProperty("grandparentThumb") Optional<String> grandparentThumb,
            @JsonProperty("grandparentTitle") Optional<String> grandparentTitle,
            @JsonProperty("guid") Optional<String> guid,
            @JsonProperty("index") Optional<Integer> index,
            @JsonProperty("key") Optional<String> key,
            @JsonProperty("librarySectionID") Optional<String> librarySectionID,
            @JsonProperty("librarySectionKey") Optional<String> librarySectionKey,
            @JsonProperty("librarySectionTitle") Optional<String> librarySectionTitle,
            @JsonProperty("musicAnalysisVersion") Optional<String> musicAnalysisVersion,
            @JsonProperty("parentGuid") Optional<String> parentGuid,
            @JsonProperty("parentIndex") Optional<Integer> parentIndex,
            @JsonProperty("parentKey") Optional<String> parentKey,
            @JsonProperty("parentRatingKey") Optional<String> parentRatingKey,
            @JsonProperty("parentStudio") Optional<String> parentStudio,
            @JsonProperty("parentThumb") Optional<String> parentThumb,
            @JsonProperty("parentTitle") Optional<String> parentTitle,
            @JsonProperty("parentYear") Optional<Integer> parentYear,
            @JsonProperty("ratingCount") Optional<Integer> ratingCount,
            @JsonProperty("ratingKey") Optional<String> ratingKey,
            @JsonProperty("sessionKey") Optional<String> sessionKey,
            @JsonProperty("thumb") Optional<String> thumb,
            @JsonProperty("title") Optional<String> title,
            @JsonProperty("titleSort") Optional<String> titleSort,
            @JsonProperty("type") Optional<String> type,
            @JsonProperty("updatedAt") Optional<Integer> updatedAt,
            @JsonProperty("viewOffset") Optional<Integer> viewOffset,
            @JsonProperty("Media") Optional<? extends List<GetSessionsMedia>> media,
            @JsonProperty("User") Optional<? extends GetSessionsUser> user,
            @JsonProperty("Player") Optional<? extends Player> player,
            @JsonProperty("Session") Optional<? extends Session> session) {
        Utils.checkNotNull(addedAt, "addedAt");
        Utils.checkNotNull(art, "art");
        Utils.checkNotNull(duration, "duration");
        Utils.checkNotNull(grandparentArt, "grandparentArt");
        Utils.checkNotNull(grandparentGuid, "grandparentGuid");
        Utils.checkNotNull(grandparentKey, "grandparentKey");
        Utils.checkNotNull(grandparentRatingKey, "grandparentRatingKey");
        Utils.checkNotNull(grandparentThumb, "grandparentThumb");
        Utils.checkNotNull(grandparentTitle, "grandparentTitle");
        Utils.checkNotNull(guid, "guid");
        Utils.checkNotNull(index, "index");
        Utils.checkNotNull(key, "key");
        Utils.checkNotNull(librarySectionID, "librarySectionID");
        Utils.checkNotNull(librarySectionKey, "librarySectionKey");
        Utils.checkNotNull(librarySectionTitle, "librarySectionTitle");
        Utils.checkNotNull(musicAnalysisVersion, "musicAnalysisVersion");
        Utils.checkNotNull(parentGuid, "parentGuid");
        Utils.checkNotNull(parentIndex, "parentIndex");
        Utils.checkNotNull(parentKey, "parentKey");
        Utils.checkNotNull(parentRatingKey, "parentRatingKey");
        Utils.checkNotNull(parentStudio, "parentStudio");
        Utils.checkNotNull(parentThumb, "parentThumb");
        Utils.checkNotNull(parentTitle, "parentTitle");
        Utils.checkNotNull(parentYear, "parentYear");
        Utils.checkNotNull(ratingCount, "ratingCount");
        Utils.checkNotNull(ratingKey, "ratingKey");
        Utils.checkNotNull(sessionKey, "sessionKey");
        Utils.checkNotNull(thumb, "thumb");
        Utils.checkNotNull(title, "title");
        Utils.checkNotNull(titleSort, "titleSort");
        Utils.checkNotNull(type, "type");
        Utils.checkNotNull(updatedAt, "updatedAt");
        Utils.checkNotNull(viewOffset, "viewOffset");
        Utils.checkNotNull(media, "media");
        Utils.checkNotNull(user, "user");
        Utils.checkNotNull(player, "player");
        Utils.checkNotNull(session, "session");
        this.addedAt = addedAt;
        this.art = art;
        this.duration = duration;
        this.grandparentArt = grandparentArt;
        this.grandparentGuid = grandparentGuid;
        this.grandparentKey = grandparentKey;
        this.grandparentRatingKey = grandparentRatingKey;
        this.grandparentThumb = grandparentThumb;
        this.grandparentTitle = grandparentTitle;
        this.guid = guid;
        this.index = index;
        this.key = key;
        this.librarySectionID = librarySectionID;
        this.librarySectionKey = librarySectionKey;
        this.librarySectionTitle = librarySectionTitle;
        this.musicAnalysisVersion = musicAnalysisVersion;
        this.parentGuid = parentGuid;
        this.parentIndex = parentIndex;
        this.parentKey = parentKey;
        this.parentRatingKey = parentRatingKey;
        this.parentStudio = parentStudio;
        this.parentThumb = parentThumb;
        this.parentTitle = parentTitle;
        this.parentYear = parentYear;
        this.ratingCount = ratingCount;
        this.ratingKey = ratingKey;
        this.sessionKey = sessionKey;
        this.thumb = thumb;
        this.title = title;
        this.titleSort = titleSort;
        this.type = type;
        this.updatedAt = updatedAt;
        this.viewOffset = viewOffset;
        this.media = media;
        this.user = user;
        this.player = player;
        this.session = session;
    }
    
    public GetSessionsMetadata() {
        this(Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty());
    }

    @JsonIgnore
    public Optional<Integer> addedAt() {
        return addedAt;
    }

    @JsonIgnore
    public Optional<String> art() {
        return art;
    }

    @JsonIgnore
    public Optional<Integer> duration() {
        return duration;
    }

    @JsonIgnore
    public Optional<String> grandparentArt() {
        return grandparentArt;
    }

    @JsonIgnore
    public Optional<String> grandparentGuid() {
        return grandparentGuid;
    }

    @JsonIgnore
    public Optional<String> grandparentKey() {
        return grandparentKey;
    }

    @JsonIgnore
    public Optional<String> grandparentRatingKey() {
        return grandparentRatingKey;
    }

    @JsonIgnore
    public Optional<String> grandparentThumb() {
        return grandparentThumb;
    }

    @JsonIgnore
    public Optional<String> grandparentTitle() {
        return grandparentTitle;
    }

    @JsonIgnore
    public Optional<String> guid() {
        return guid;
    }

    @JsonIgnore
    public Optional<Integer> index() {
        return index;
    }

    @JsonIgnore
    public Optional<String> key() {
        return key;
    }

    @JsonIgnore
    public Optional<String> librarySectionID() {
        return librarySectionID;
    }

    @JsonIgnore
    public Optional<String> librarySectionKey() {
        return librarySectionKey;
    }

    @JsonIgnore
    public Optional<String> librarySectionTitle() {
        return librarySectionTitle;
    }

    @JsonIgnore
    public Optional<String> musicAnalysisVersion() {
        return musicAnalysisVersion;
    }

    @JsonIgnore
    public Optional<String> parentGuid() {
        return parentGuid;
    }

    @JsonIgnore
    public Optional<Integer> parentIndex() {
        return parentIndex;
    }

    @JsonIgnore
    public Optional<String> parentKey() {
        return parentKey;
    }

    @JsonIgnore
    public Optional<String> parentRatingKey() {
        return parentRatingKey;
    }

    @JsonIgnore
    public Optional<String> parentStudio() {
        return parentStudio;
    }

    @JsonIgnore
    public Optional<String> parentThumb() {
        return parentThumb;
    }

    @JsonIgnore
    public Optional<String> parentTitle() {
        return parentTitle;
    }

    @JsonIgnore
    public Optional<Integer> parentYear() {
        return parentYear;
    }

    @JsonIgnore
    public Optional<Integer> ratingCount() {
        return ratingCount;
    }

    @JsonIgnore
    public Optional<String> ratingKey() {
        return ratingKey;
    }

    @JsonIgnore
    public Optional<String> sessionKey() {
        return sessionKey;
    }

    @JsonIgnore
    public Optional<String> thumb() {
        return thumb;
    }

    @JsonIgnore
    public Optional<String> title() {
        return title;
    }

    @JsonIgnore
    public Optional<String> titleSort() {
        return titleSort;
    }

    @JsonIgnore
    public Optional<String> type() {
        return type;
    }

    @JsonIgnore
    public Optional<Integer> updatedAt() {
        return updatedAt;
    }

    @JsonIgnore
    public Optional<Integer> viewOffset() {
        return viewOffset;
    }

    @SuppressWarnings("unchecked")
    @JsonIgnore
    public Optional<List<GetSessionsMedia>> media() {
        return (Optional<List<GetSessionsMedia>>) media;
    }

    @SuppressWarnings("unchecked")
    @JsonIgnore
    public Optional<GetSessionsUser> user() {
        return (Optional<GetSessionsUser>) user;
    }

    @SuppressWarnings("unchecked")
    @JsonIgnore
    public Optional<Player> player() {
        return (Optional<Player>) player;
    }

    @SuppressWarnings("unchecked")
    @JsonIgnore
    public Optional<Session> session() {
        return (Optional<Session>) session;
    }

    public final static Builder builder() {
        return new Builder();
    }

    public GetSessionsMetadata withAddedAt(int addedAt) {
        Utils.checkNotNull(addedAt, "addedAt");
        this.addedAt = Optional.ofNullable(addedAt);
        return this;
    }

    public GetSessionsMetadata withAddedAt(Optional<Integer> addedAt) {
        Utils.checkNotNull(addedAt, "addedAt");
        this.addedAt = addedAt;
        return this;
    }

    public GetSessionsMetadata withArt(String art) {
        Utils.checkNotNull(art, "art");
        this.art = Optional.ofNullable(art);
        return this;
    }

    public GetSessionsMetadata withArt(Optional<String> art) {
        Utils.checkNotNull(art, "art");
        this.art = art;
        return this;
    }

    public GetSessionsMetadata withDuration(int duration) {
        Utils.checkNotNull(duration, "duration");
        this.duration = Optional.ofNullable(duration);
        return this;
    }

    public GetSessionsMetadata withDuration(Optional<Integer> duration) {
        Utils.checkNotNull(duration, "duration");
        this.duration = duration;
        return this;
    }

    public GetSessionsMetadata withGrandparentArt(String grandparentArt) {
        Utils.checkNotNull(grandparentArt, "grandparentArt");
        this.grandparentArt = Optional.ofNullable(grandparentArt);
        return this;
    }

    public GetSessionsMetadata withGrandparentArt(Optional<String> grandparentArt) {
        Utils.checkNotNull(grandparentArt, "grandparentArt");
        this.grandparentArt = grandparentArt;
        return this;
    }

    public GetSessionsMetadata withGrandparentGuid(String grandparentGuid) {
        Utils.checkNotNull(grandparentGuid, "grandparentGuid");
        this.grandparentGuid = Optional.ofNullable(grandparentGuid);
        return this;
    }

    public GetSessionsMetadata withGrandparentGuid(Optional<String> grandparentGuid) {
        Utils.checkNotNull(grandparentGuid, "grandparentGuid");
        this.grandparentGuid = grandparentGuid;
        return this;
    }

    public GetSessionsMetadata withGrandparentKey(String grandparentKey) {
        Utils.checkNotNull(grandparentKey, "grandparentKey");
        this.grandparentKey = Optional.ofNullable(grandparentKey);
        return this;
    }

    public GetSessionsMetadata withGrandparentKey(Optional<String> grandparentKey) {
        Utils.checkNotNull(grandparentKey, "grandparentKey");
        this.grandparentKey = grandparentKey;
        return this;
    }

    public GetSessionsMetadata withGrandparentRatingKey(String grandparentRatingKey) {
        Utils.checkNotNull(grandparentRatingKey, "grandparentRatingKey");
        this.grandparentRatingKey = Optional.ofNullable(grandparentRatingKey);
        return this;
    }

    public GetSessionsMetadata withGrandparentRatingKey(Optional<String> grandparentRatingKey) {
        Utils.checkNotNull(grandparentRatingKey, "grandparentRatingKey");
        this.grandparentRatingKey = grandparentRatingKey;
        return this;
    }

    public GetSessionsMetadata withGrandparentThumb(String grandparentThumb) {
        Utils.checkNotNull(grandparentThumb, "grandparentThumb");
        this.grandparentThumb = Optional.ofNullable(grandparentThumb);
        return this;
    }

    public GetSessionsMetadata withGrandparentThumb(Optional<String> grandparentThumb) {
        Utils.checkNotNull(grandparentThumb, "grandparentThumb");
        this.grandparentThumb = grandparentThumb;
        return this;
    }

    public GetSessionsMetadata withGrandparentTitle(String grandparentTitle) {
        Utils.checkNotNull(grandparentTitle, "grandparentTitle");
        this.grandparentTitle = Optional.ofNullable(grandparentTitle);
        return this;
    }

    public GetSessionsMetadata withGrandparentTitle(Optional<String> grandparentTitle) {
        Utils.checkNotNull(grandparentTitle, "grandparentTitle");
        this.grandparentTitle = grandparentTitle;
        return this;
    }

    public GetSessionsMetadata withGuid(String guid) {
        Utils.checkNotNull(guid, "guid");
        this.guid = Optional.ofNullable(guid);
        return this;
    }

    public GetSessionsMetadata withGuid(Optional<String> guid) {
        Utils.checkNotNull(guid, "guid");
        this.guid = guid;
        return this;
    }

    public GetSessionsMetadata withIndex(int index) {
        Utils.checkNotNull(index, "index");
        this.index = Optional.ofNullable(index);
        return this;
    }

    public GetSessionsMetadata withIndex(Optional<Integer> index) {
        Utils.checkNotNull(index, "index");
        this.index = index;
        return this;
    }

    public GetSessionsMetadata withKey(String key) {
        Utils.checkNotNull(key, "key");
        this.key = Optional.ofNullable(key);
        return this;
    }

    public GetSessionsMetadata withKey(Optional<String> key) {
        Utils.checkNotNull(key, "key");
        this.key = key;
        return this;
    }

    public GetSessionsMetadata withLibrarySectionID(String librarySectionID) {
        Utils.checkNotNull(librarySectionID, "librarySectionID");
        this.librarySectionID = Optional.ofNullable(librarySectionID);
        return this;
    }

    public GetSessionsMetadata withLibrarySectionID(Optional<String> librarySectionID) {
        Utils.checkNotNull(librarySectionID, "librarySectionID");
        this.librarySectionID = librarySectionID;
        return this;
    }

    public GetSessionsMetadata withLibrarySectionKey(String librarySectionKey) {
        Utils.checkNotNull(librarySectionKey, "librarySectionKey");
        this.librarySectionKey = Optional.ofNullable(librarySectionKey);
        return this;
    }

    public GetSessionsMetadata withLibrarySectionKey(Optional<String> librarySectionKey) {
        Utils.checkNotNull(librarySectionKey, "librarySectionKey");
        this.librarySectionKey = librarySectionKey;
        return this;
    }

    public GetSessionsMetadata withLibrarySectionTitle(String librarySectionTitle) {
        Utils.checkNotNull(librarySectionTitle, "librarySectionTitle");
        this.librarySectionTitle = Optional.ofNullable(librarySectionTitle);
        return this;
    }

    public GetSessionsMetadata withLibrarySectionTitle(Optional<String> librarySectionTitle) {
        Utils.checkNotNull(librarySectionTitle, "librarySectionTitle");
        this.librarySectionTitle = librarySectionTitle;
        return this;
    }

    public GetSessionsMetadata withMusicAnalysisVersion(String musicAnalysisVersion) {
        Utils.checkNotNull(musicAnalysisVersion, "musicAnalysisVersion");
        this.musicAnalysisVersion = Optional.ofNullable(musicAnalysisVersion);
        return this;
    }

    public GetSessionsMetadata withMusicAnalysisVersion(Optional<String> musicAnalysisVersion) {
        Utils.checkNotNull(musicAnalysisVersion, "musicAnalysisVersion");
        this.musicAnalysisVersion = musicAnalysisVersion;
        return this;
    }

    public GetSessionsMetadata withParentGuid(String parentGuid) {
        Utils.checkNotNull(parentGuid, "parentGuid");
        this.parentGuid = Optional.ofNullable(parentGuid);
        return this;
    }

    public GetSessionsMetadata withParentGuid(Optional<String> parentGuid) {
        Utils.checkNotNull(parentGuid, "parentGuid");
        this.parentGuid = parentGuid;
        return this;
    }

    public GetSessionsMetadata withParentIndex(int parentIndex) {
        Utils.checkNotNull(parentIndex, "parentIndex");
        this.parentIndex = Optional.ofNullable(parentIndex);
        return this;
    }

    public GetSessionsMetadata withParentIndex(Optional<Integer> parentIndex) {
        Utils.checkNotNull(parentIndex, "parentIndex");
        this.parentIndex = parentIndex;
        return this;
    }

    public GetSessionsMetadata withParentKey(String parentKey) {
        Utils.checkNotNull(parentKey, "parentKey");
        this.parentKey = Optional.ofNullable(parentKey);
        return this;
    }

    public GetSessionsMetadata withParentKey(Optional<String> parentKey) {
        Utils.checkNotNull(parentKey, "parentKey");
        this.parentKey = parentKey;
        return this;
    }

    public GetSessionsMetadata withParentRatingKey(String parentRatingKey) {
        Utils.checkNotNull(parentRatingKey, "parentRatingKey");
        this.parentRatingKey = Optional.ofNullable(parentRatingKey);
        return this;
    }

    public GetSessionsMetadata withParentRatingKey(Optional<String> parentRatingKey) {
        Utils.checkNotNull(parentRatingKey, "parentRatingKey");
        this.parentRatingKey = parentRatingKey;
        return this;
    }

    public GetSessionsMetadata withParentStudio(String parentStudio) {
        Utils.checkNotNull(parentStudio, "parentStudio");
        this.parentStudio = Optional.ofNullable(parentStudio);
        return this;
    }

    public GetSessionsMetadata withParentStudio(Optional<String> parentStudio) {
        Utils.checkNotNull(parentStudio, "parentStudio");
        this.parentStudio = parentStudio;
        return this;
    }

    public GetSessionsMetadata withParentThumb(String parentThumb) {
        Utils.checkNotNull(parentThumb, "parentThumb");
        this.parentThumb = Optional.ofNullable(parentThumb);
        return this;
    }

    public GetSessionsMetadata withParentThumb(Optional<String> parentThumb) {
        Utils.checkNotNull(parentThumb, "parentThumb");
        this.parentThumb = parentThumb;
        return this;
    }

    public GetSessionsMetadata withParentTitle(String parentTitle) {
        Utils.checkNotNull(parentTitle, "parentTitle");
        this.parentTitle = Optional.ofNullable(parentTitle);
        return this;
    }

    public GetSessionsMetadata withParentTitle(Optional<String> parentTitle) {
        Utils.checkNotNull(parentTitle, "parentTitle");
        this.parentTitle = parentTitle;
        return this;
    }

    public GetSessionsMetadata withParentYear(int parentYear) {
        Utils.checkNotNull(parentYear, "parentYear");
        this.parentYear = Optional.ofNullable(parentYear);
        return this;
    }

    public GetSessionsMetadata withParentYear(Optional<Integer> parentYear) {
        Utils.checkNotNull(parentYear, "parentYear");
        this.parentYear = parentYear;
        return this;
    }

    public GetSessionsMetadata withRatingCount(int ratingCount) {
        Utils.checkNotNull(ratingCount, "ratingCount");
        this.ratingCount = Optional.ofNullable(ratingCount);
        return this;
    }

    public GetSessionsMetadata withRatingCount(Optional<Integer> ratingCount) {
        Utils.checkNotNull(ratingCount, "ratingCount");
        this.ratingCount = ratingCount;
        return this;
    }

    public GetSessionsMetadata withRatingKey(String ratingKey) {
        Utils.checkNotNull(ratingKey, "ratingKey");
        this.ratingKey = Optional.ofNullable(ratingKey);
        return this;
    }

    public GetSessionsMetadata withRatingKey(Optional<String> ratingKey) {
        Utils.checkNotNull(ratingKey, "ratingKey");
        this.ratingKey = ratingKey;
        return this;
    }

    public GetSessionsMetadata withSessionKey(String sessionKey) {
        Utils.checkNotNull(sessionKey, "sessionKey");
        this.sessionKey = Optional.ofNullable(sessionKey);
        return this;
    }

    public GetSessionsMetadata withSessionKey(Optional<String> sessionKey) {
        Utils.checkNotNull(sessionKey, "sessionKey");
        this.sessionKey = sessionKey;
        return this;
    }

    public GetSessionsMetadata withThumb(String thumb) {
        Utils.checkNotNull(thumb, "thumb");
        this.thumb = Optional.ofNullable(thumb);
        return this;
    }

    public GetSessionsMetadata withThumb(Optional<String> thumb) {
        Utils.checkNotNull(thumb, "thumb");
        this.thumb = thumb;
        return this;
    }

    public GetSessionsMetadata withTitle(String title) {
        Utils.checkNotNull(title, "title");
        this.title = Optional.ofNullable(title);
        return this;
    }

    public GetSessionsMetadata withTitle(Optional<String> title) {
        Utils.checkNotNull(title, "title");
        this.title = title;
        return this;
    }

    public GetSessionsMetadata withTitleSort(String titleSort) {
        Utils.checkNotNull(titleSort, "titleSort");
        this.titleSort = Optional.ofNullable(titleSort);
        return this;
    }

    public GetSessionsMetadata withTitleSort(Optional<String> titleSort) {
        Utils.checkNotNull(titleSort, "titleSort");
        this.titleSort = titleSort;
        return this;
    }

    public GetSessionsMetadata withType(String type) {
        Utils.checkNotNull(type, "type");
        this.type = Optional.ofNullable(type);
        return this;
    }

    public GetSessionsMetadata withType(Optional<String> type) {
        Utils.checkNotNull(type, "type");
        this.type = type;
        return this;
    }

    public GetSessionsMetadata withUpdatedAt(int updatedAt) {
        Utils.checkNotNull(updatedAt, "updatedAt");
        this.updatedAt = Optional.ofNullable(updatedAt);
        return this;
    }

    public GetSessionsMetadata withUpdatedAt(Optional<Integer> updatedAt) {
        Utils.checkNotNull(updatedAt, "updatedAt");
        this.updatedAt = updatedAt;
        return this;
    }

    public GetSessionsMetadata withViewOffset(int viewOffset) {
        Utils.checkNotNull(viewOffset, "viewOffset");
        this.viewOffset = Optional.ofNullable(viewOffset);
        return this;
    }

    public GetSessionsMetadata withViewOffset(Optional<Integer> viewOffset) {
        Utils.checkNotNull(viewOffset, "viewOffset");
        this.viewOffset = viewOffset;
        return this;
    }

    public GetSessionsMetadata withMedia(List<GetSessionsMedia> media) {
        Utils.checkNotNull(media, "media");
        this.media = Optional.ofNullable(media);
        return this;
    }

    public GetSessionsMetadata withMedia(Optional<? extends List<GetSessionsMedia>> media) {
        Utils.checkNotNull(media, "media");
        this.media = media;
        return this;
    }

    public GetSessionsMetadata withUser(GetSessionsUser user) {
        Utils.checkNotNull(user, "user");
        this.user = Optional.ofNullable(user);
        return this;
    }

    public GetSessionsMetadata withUser(Optional<? extends GetSessionsUser> user) {
        Utils.checkNotNull(user, "user");
        this.user = user;
        return this;
    }

    public GetSessionsMetadata withPlayer(Player player) {
        Utils.checkNotNull(player, "player");
        this.player = Optional.ofNullable(player);
        return this;
    }

    public GetSessionsMetadata withPlayer(Optional<? extends Player> player) {
        Utils.checkNotNull(player, "player");
        this.player = player;
        return this;
    }

    public GetSessionsMetadata withSession(Session session) {
        Utils.checkNotNull(session, "session");
        this.session = Optional.ofNullable(session);
        return this;
    }

    public GetSessionsMetadata withSession(Optional<? extends Session> session) {
        Utils.checkNotNull(session, "session");
        this.session = session;
        return this;
    }
    
    @Override
    public boolean equals(java.lang.Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        GetSessionsMetadata other = (GetSessionsMetadata) o;
        return 
            Objects.deepEquals(this.addedAt, other.addedAt) &&
            Objects.deepEquals(this.art, other.art) &&
            Objects.deepEquals(this.duration, other.duration) &&
            Objects.deepEquals(this.grandparentArt, other.grandparentArt) &&
            Objects.deepEquals(this.grandparentGuid, other.grandparentGuid) &&
            Objects.deepEquals(this.grandparentKey, other.grandparentKey) &&
            Objects.deepEquals(this.grandparentRatingKey, other.grandparentRatingKey) &&
            Objects.deepEquals(this.grandparentThumb, other.grandparentThumb) &&
            Objects.deepEquals(this.grandparentTitle, other.grandparentTitle) &&
            Objects.deepEquals(this.guid, other.guid) &&
            Objects.deepEquals(this.index, other.index) &&
            Objects.deepEquals(this.key, other.key) &&
            Objects.deepEquals(this.librarySectionID, other.librarySectionID) &&
            Objects.deepEquals(this.librarySectionKey, other.librarySectionKey) &&
            Objects.deepEquals(this.librarySectionTitle, other.librarySectionTitle) &&
            Objects.deepEquals(this.musicAnalysisVersion, other.musicAnalysisVersion) &&
            Objects.deepEquals(this.parentGuid, other.parentGuid) &&
            Objects.deepEquals(this.parentIndex, other.parentIndex) &&
            Objects.deepEquals(this.parentKey, other.parentKey) &&
            Objects.deepEquals(this.parentRatingKey, other.parentRatingKey) &&
            Objects.deepEquals(this.parentStudio, other.parentStudio) &&
            Objects.deepEquals(this.parentThumb, other.parentThumb) &&
            Objects.deepEquals(this.parentTitle, other.parentTitle) &&
            Objects.deepEquals(this.parentYear, other.parentYear) &&
            Objects.deepEquals(this.ratingCount, other.ratingCount) &&
            Objects.deepEquals(this.ratingKey, other.ratingKey) &&
            Objects.deepEquals(this.sessionKey, other.sessionKey) &&
            Objects.deepEquals(this.thumb, other.thumb) &&
            Objects.deepEquals(this.title, other.title) &&
            Objects.deepEquals(this.titleSort, other.titleSort) &&
            Objects.deepEquals(this.type, other.type) &&
            Objects.deepEquals(this.updatedAt, other.updatedAt) &&
            Objects.deepEquals(this.viewOffset, other.viewOffset) &&
            Objects.deepEquals(this.media, other.media) &&
            Objects.deepEquals(this.user, other.user) &&
            Objects.deepEquals(this.player, other.player) &&
            Objects.deepEquals(this.session, other.session);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(
            addedAt,
            art,
            duration,
            grandparentArt,
            grandparentGuid,
            grandparentKey,
            grandparentRatingKey,
            grandparentThumb,
            grandparentTitle,
            guid,
            index,
            key,
            librarySectionID,
            librarySectionKey,
            librarySectionTitle,
            musicAnalysisVersion,
            parentGuid,
            parentIndex,
            parentKey,
            parentRatingKey,
            parentStudio,
            parentThumb,
            parentTitle,
            parentYear,
            ratingCount,
            ratingKey,
            sessionKey,
            thumb,
            title,
            titleSort,
            type,
            updatedAt,
            viewOffset,
            media,
            user,
            player,
            session);
    }
    
    @Override
    public String toString() {
        return Utils.toString(GetSessionsMetadata.class,
                "addedAt", addedAt,
                "art", art,
                "duration", duration,
                "grandparentArt", grandparentArt,
                "grandparentGuid", grandparentGuid,
                "grandparentKey", grandparentKey,
                "grandparentRatingKey", grandparentRatingKey,
                "grandparentThumb", grandparentThumb,
                "grandparentTitle", grandparentTitle,
                "guid", guid,
                "index", index,
                "key", key,
                "librarySectionID", librarySectionID,
                "librarySectionKey", librarySectionKey,
                "librarySectionTitle", librarySectionTitle,
                "musicAnalysisVersion", musicAnalysisVersion,
                "parentGuid", parentGuid,
                "parentIndex", parentIndex,
                "parentKey", parentKey,
                "parentRatingKey", parentRatingKey,
                "parentStudio", parentStudio,
                "parentThumb", parentThumb,
                "parentTitle", parentTitle,
                "parentYear", parentYear,
                "ratingCount", ratingCount,
                "ratingKey", ratingKey,
                "sessionKey", sessionKey,
                "thumb", thumb,
                "title", title,
                "titleSort", titleSort,
                "type", type,
                "updatedAt", updatedAt,
                "viewOffset", viewOffset,
                "media", media,
                "user", user,
                "player", player,
                "session", session);
    }
    
    public final static class Builder {
 
        private Optional<Integer> addedAt = Optional.empty();
 
        private Optional<String> art = Optional.empty();
 
        private Optional<Integer> duration = Optional.empty();
 
        private Optional<String> grandparentArt = Optional.empty();
 
        private Optional<String> grandparentGuid = Optional.empty();
 
        private Optional<String> grandparentKey = Optional.empty();
 
        private Optional<String> grandparentRatingKey = Optional.empty();
 
        private Optional<String> grandparentThumb = Optional.empty();
 
        private Optional<String> grandparentTitle = Optional.empty();
 
        private Optional<String> guid = Optional.empty();
 
        private Optional<Integer> index = Optional.empty();
 
        private Optional<String> key = Optional.empty();
 
        private Optional<String> librarySectionID = Optional.empty();
 
        private Optional<String> librarySectionKey = Optional.empty();
 
        private Optional<String> librarySectionTitle = Optional.empty();
 
        private Optional<String> musicAnalysisVersion = Optional.empty();
 
        private Optional<String> parentGuid = Optional.empty();
 
        private Optional<Integer> parentIndex = Optional.empty();
 
        private Optional<String> parentKey = Optional.empty();
 
        private Optional<String> parentRatingKey = Optional.empty();
 
        private Optional<String> parentStudio = Optional.empty();
 
        private Optional<String> parentThumb = Optional.empty();
 
        private Optional<String> parentTitle = Optional.empty();
 
        private Optional<Integer> parentYear = Optional.empty();
 
        private Optional<Integer> ratingCount = Optional.empty();
 
        private Optional<String> ratingKey = Optional.empty();
 
        private Optional<String> sessionKey = Optional.empty();
 
        private Optional<String> thumb = Optional.empty();
 
        private Optional<String> title = Optional.empty();
 
        private Optional<String> titleSort = Optional.empty();
 
        private Optional<String> type = Optional.empty();
 
        private Optional<Integer> updatedAt = Optional.empty();
 
        private Optional<Integer> viewOffset = Optional.empty();
 
        private Optional<? extends List<GetSessionsMedia>> media = Optional.empty();
 
        private Optional<? extends GetSessionsUser> user = Optional.empty();
 
        private Optional<? extends Player> player = Optional.empty();
 
        private Optional<? extends Session> session = Optional.empty();  
        
        private Builder() {
          // force use of static builder() method
        }

        public Builder addedAt(int addedAt) {
            Utils.checkNotNull(addedAt, "addedAt");
            this.addedAt = Optional.ofNullable(addedAt);
            return this;
        }

        public Builder addedAt(Optional<Integer> addedAt) {
            Utils.checkNotNull(addedAt, "addedAt");
            this.addedAt = addedAt;
            return this;
        }

        public Builder art(String art) {
            Utils.checkNotNull(art, "art");
            this.art = Optional.ofNullable(art);
            return this;
        }

        public Builder art(Optional<String> art) {
            Utils.checkNotNull(art, "art");
            this.art = art;
            return this;
        }

        public Builder duration(int duration) {
            Utils.checkNotNull(duration, "duration");
            this.duration = Optional.ofNullable(duration);
            return this;
        }

        public Builder duration(Optional<Integer> duration) {
            Utils.checkNotNull(duration, "duration");
            this.duration = duration;
            return this;
        }

        public Builder grandparentArt(String grandparentArt) {
            Utils.checkNotNull(grandparentArt, "grandparentArt");
            this.grandparentArt = Optional.ofNullable(grandparentArt);
            return this;
        }

        public Builder grandparentArt(Optional<String> grandparentArt) {
            Utils.checkNotNull(grandparentArt, "grandparentArt");
            this.grandparentArt = grandparentArt;
            return this;
        }

        public Builder grandparentGuid(String grandparentGuid) {
            Utils.checkNotNull(grandparentGuid, "grandparentGuid");
            this.grandparentGuid = Optional.ofNullable(grandparentGuid);
            return this;
        }

        public Builder grandparentGuid(Optional<String> grandparentGuid) {
            Utils.checkNotNull(grandparentGuid, "grandparentGuid");
            this.grandparentGuid = grandparentGuid;
            return this;
        }

        public Builder grandparentKey(String grandparentKey) {
            Utils.checkNotNull(grandparentKey, "grandparentKey");
            this.grandparentKey = Optional.ofNullable(grandparentKey);
            return this;
        }

        public Builder grandparentKey(Optional<String> grandparentKey) {
            Utils.checkNotNull(grandparentKey, "grandparentKey");
            this.grandparentKey = grandparentKey;
            return this;
        }

        public Builder grandparentRatingKey(String grandparentRatingKey) {
            Utils.checkNotNull(grandparentRatingKey, "grandparentRatingKey");
            this.grandparentRatingKey = Optional.ofNullable(grandparentRatingKey);
            return this;
        }

        public Builder grandparentRatingKey(Optional<String> grandparentRatingKey) {
            Utils.checkNotNull(grandparentRatingKey, "grandparentRatingKey");
            this.grandparentRatingKey = grandparentRatingKey;
            return this;
        }

        public Builder grandparentThumb(String grandparentThumb) {
            Utils.checkNotNull(grandparentThumb, "grandparentThumb");
            this.grandparentThumb = Optional.ofNullable(grandparentThumb);
            return this;
        }

        public Builder grandparentThumb(Optional<String> grandparentThumb) {
            Utils.checkNotNull(grandparentThumb, "grandparentThumb");
            this.grandparentThumb = grandparentThumb;
            return this;
        }

        public Builder grandparentTitle(String grandparentTitle) {
            Utils.checkNotNull(grandparentTitle, "grandparentTitle");
            this.grandparentTitle = Optional.ofNullable(grandparentTitle);
            return this;
        }

        public Builder grandparentTitle(Optional<String> grandparentTitle) {
            Utils.checkNotNull(grandparentTitle, "grandparentTitle");
            this.grandparentTitle = grandparentTitle;
            return this;
        }

        public Builder guid(String guid) {
            Utils.checkNotNull(guid, "guid");
            this.guid = Optional.ofNullable(guid);
            return this;
        }

        public Builder guid(Optional<String> guid) {
            Utils.checkNotNull(guid, "guid");
            this.guid = guid;
            return this;
        }

        public Builder index(int index) {
            Utils.checkNotNull(index, "index");
            this.index = Optional.ofNullable(index);
            return this;
        }

        public Builder index(Optional<Integer> index) {
            Utils.checkNotNull(index, "index");
            this.index = index;
            return this;
        }

        public Builder key(String key) {
            Utils.checkNotNull(key, "key");
            this.key = Optional.ofNullable(key);
            return this;
        }

        public Builder key(Optional<String> key) {
            Utils.checkNotNull(key, "key");
            this.key = key;
            return this;
        }

        public Builder librarySectionID(String librarySectionID) {
            Utils.checkNotNull(librarySectionID, "librarySectionID");
            this.librarySectionID = Optional.ofNullable(librarySectionID);
            return this;
        }

        public Builder librarySectionID(Optional<String> librarySectionID) {
            Utils.checkNotNull(librarySectionID, "librarySectionID");
            this.librarySectionID = librarySectionID;
            return this;
        }

        public Builder librarySectionKey(String librarySectionKey) {
            Utils.checkNotNull(librarySectionKey, "librarySectionKey");
            this.librarySectionKey = Optional.ofNullable(librarySectionKey);
            return this;
        }

        public Builder librarySectionKey(Optional<String> librarySectionKey) {
            Utils.checkNotNull(librarySectionKey, "librarySectionKey");
            this.librarySectionKey = librarySectionKey;
            return this;
        }

        public Builder librarySectionTitle(String librarySectionTitle) {
            Utils.checkNotNull(librarySectionTitle, "librarySectionTitle");
            this.librarySectionTitle = Optional.ofNullable(librarySectionTitle);
            return this;
        }

        public Builder librarySectionTitle(Optional<String> librarySectionTitle) {
            Utils.checkNotNull(librarySectionTitle, "librarySectionTitle");
            this.librarySectionTitle = librarySectionTitle;
            return this;
        }

        public Builder musicAnalysisVersion(String musicAnalysisVersion) {
            Utils.checkNotNull(musicAnalysisVersion, "musicAnalysisVersion");
            this.musicAnalysisVersion = Optional.ofNullable(musicAnalysisVersion);
            return this;
        }

        public Builder musicAnalysisVersion(Optional<String> musicAnalysisVersion) {
            Utils.checkNotNull(musicAnalysisVersion, "musicAnalysisVersion");
            this.musicAnalysisVersion = musicAnalysisVersion;
            return this;
        }

        public Builder parentGuid(String parentGuid) {
            Utils.checkNotNull(parentGuid, "parentGuid");
            this.parentGuid = Optional.ofNullable(parentGuid);
            return this;
        }

        public Builder parentGuid(Optional<String> parentGuid) {
            Utils.checkNotNull(parentGuid, "parentGuid");
            this.parentGuid = parentGuid;
            return this;
        }

        public Builder parentIndex(int parentIndex) {
            Utils.checkNotNull(parentIndex, "parentIndex");
            this.parentIndex = Optional.ofNullable(parentIndex);
            return this;
        }

        public Builder parentIndex(Optional<Integer> parentIndex) {
            Utils.checkNotNull(parentIndex, "parentIndex");
            this.parentIndex = parentIndex;
            return this;
        }

        public Builder parentKey(String parentKey) {
            Utils.checkNotNull(parentKey, "parentKey");
            this.parentKey = Optional.ofNullable(parentKey);
            return this;
        }

        public Builder parentKey(Optional<String> parentKey) {
            Utils.checkNotNull(parentKey, "parentKey");
            this.parentKey = parentKey;
            return this;
        }

        public Builder parentRatingKey(String parentRatingKey) {
            Utils.checkNotNull(parentRatingKey, "parentRatingKey");
            this.parentRatingKey = Optional.ofNullable(parentRatingKey);
            return this;
        }

        public Builder parentRatingKey(Optional<String> parentRatingKey) {
            Utils.checkNotNull(parentRatingKey, "parentRatingKey");
            this.parentRatingKey = parentRatingKey;
            return this;
        }

        public Builder parentStudio(String parentStudio) {
            Utils.checkNotNull(parentStudio, "parentStudio");
            this.parentStudio = Optional.ofNullable(parentStudio);
            return this;
        }

        public Builder parentStudio(Optional<String> parentStudio) {
            Utils.checkNotNull(parentStudio, "parentStudio");
            this.parentStudio = parentStudio;
            return this;
        }

        public Builder parentThumb(String parentThumb) {
            Utils.checkNotNull(parentThumb, "parentThumb");
            this.parentThumb = Optional.ofNullable(parentThumb);
            return this;
        }

        public Builder parentThumb(Optional<String> parentThumb) {
            Utils.checkNotNull(parentThumb, "parentThumb");
            this.parentThumb = parentThumb;
            return this;
        }

        public Builder parentTitle(String parentTitle) {
            Utils.checkNotNull(parentTitle, "parentTitle");
            this.parentTitle = Optional.ofNullable(parentTitle);
            return this;
        }

        public Builder parentTitle(Optional<String> parentTitle) {
            Utils.checkNotNull(parentTitle, "parentTitle");
            this.parentTitle = parentTitle;
            return this;
        }

        public Builder parentYear(int parentYear) {
            Utils.checkNotNull(parentYear, "parentYear");
            this.parentYear = Optional.ofNullable(parentYear);
            return this;
        }

        public Builder parentYear(Optional<Integer> parentYear) {
            Utils.checkNotNull(parentYear, "parentYear");
            this.parentYear = parentYear;
            return this;
        }

        public Builder ratingCount(int ratingCount) {
            Utils.checkNotNull(ratingCount, "ratingCount");
            this.ratingCount = Optional.ofNullable(ratingCount);
            return this;
        }

        public Builder ratingCount(Optional<Integer> ratingCount) {
            Utils.checkNotNull(ratingCount, "ratingCount");
            this.ratingCount = ratingCount;
            return this;
        }

        public Builder ratingKey(String ratingKey) {
            Utils.checkNotNull(ratingKey, "ratingKey");
            this.ratingKey = Optional.ofNullable(ratingKey);
            return this;
        }

        public Builder ratingKey(Optional<String> ratingKey) {
            Utils.checkNotNull(ratingKey, "ratingKey");
            this.ratingKey = ratingKey;
            return this;
        }

        public Builder sessionKey(String sessionKey) {
            Utils.checkNotNull(sessionKey, "sessionKey");
            this.sessionKey = Optional.ofNullable(sessionKey);
            return this;
        }

        public Builder sessionKey(Optional<String> sessionKey) {
            Utils.checkNotNull(sessionKey, "sessionKey");
            this.sessionKey = sessionKey;
            return this;
        }

        public Builder thumb(String thumb) {
            Utils.checkNotNull(thumb, "thumb");
            this.thumb = Optional.ofNullable(thumb);
            return this;
        }

        public Builder thumb(Optional<String> thumb) {
            Utils.checkNotNull(thumb, "thumb");
            this.thumb = thumb;
            return this;
        }

        public Builder title(String title) {
            Utils.checkNotNull(title, "title");
            this.title = Optional.ofNullable(title);
            return this;
        }

        public Builder title(Optional<String> title) {
            Utils.checkNotNull(title, "title");
            this.title = title;
            return this;
        }

        public Builder titleSort(String titleSort) {
            Utils.checkNotNull(titleSort, "titleSort");
            this.titleSort = Optional.ofNullable(titleSort);
            return this;
        }

        public Builder titleSort(Optional<String> titleSort) {
            Utils.checkNotNull(titleSort, "titleSort");
            this.titleSort = titleSort;
            return this;
        }

        public Builder type(String type) {
            Utils.checkNotNull(type, "type");
            this.type = Optional.ofNullable(type);
            return this;
        }

        public Builder type(Optional<String> type) {
            Utils.checkNotNull(type, "type");
            this.type = type;
            return this;
        }

        public Builder updatedAt(int updatedAt) {
            Utils.checkNotNull(updatedAt, "updatedAt");
            this.updatedAt = Optional.ofNullable(updatedAt);
            return this;
        }

        public Builder updatedAt(Optional<Integer> updatedAt) {
            Utils.checkNotNull(updatedAt, "updatedAt");
            this.updatedAt = updatedAt;
            return this;
        }

        public Builder viewOffset(int viewOffset) {
            Utils.checkNotNull(viewOffset, "viewOffset");
            this.viewOffset = Optional.ofNullable(viewOffset);
            return this;
        }

        public Builder viewOffset(Optional<Integer> viewOffset) {
            Utils.checkNotNull(viewOffset, "viewOffset");
            this.viewOffset = viewOffset;
            return this;
        }

        public Builder media(List<GetSessionsMedia> media) {
            Utils.checkNotNull(media, "media");
            this.media = Optional.ofNullable(media);
            return this;
        }

        public Builder media(Optional<? extends List<GetSessionsMedia>> media) {
            Utils.checkNotNull(media, "media");
            this.media = media;
            return this;
        }

        public Builder user(GetSessionsUser user) {
            Utils.checkNotNull(user, "user");
            this.user = Optional.ofNullable(user);
            return this;
        }

        public Builder user(Optional<? extends GetSessionsUser> user) {
            Utils.checkNotNull(user, "user");
            this.user = user;
            return this;
        }

        public Builder player(Player player) {
            Utils.checkNotNull(player, "player");
            this.player = Optional.ofNullable(player);
            return this;
        }

        public Builder player(Optional<? extends Player> player) {
            Utils.checkNotNull(player, "player");
            this.player = player;
            return this;
        }

        public Builder session(Session session) {
            Utils.checkNotNull(session, "session");
            this.session = Optional.ofNullable(session);
            return this;
        }

        public Builder session(Optional<? extends Session> session) {
            Utils.checkNotNull(session, "session");
            this.session = session;
            return this;
        }
        
        public GetSessionsMetadata build() {
            return new GetSessionsMetadata(
                addedAt,
                art,
                duration,
                grandparentArt,
                grandparentGuid,
                grandparentKey,
                grandparentRatingKey,
                grandparentThumb,
                grandparentTitle,
                guid,
                index,
                key,
                librarySectionID,
                librarySectionKey,
                librarySectionTitle,
                musicAnalysisVersion,
                parentGuid,
                parentIndex,
                parentKey,
                parentRatingKey,
                parentStudio,
                parentThumb,
                parentTitle,
                parentYear,
                ratingCount,
                ratingKey,
                sessionKey,
                thumb,
                title,
                titleSort,
                type,
                updatedAt,
                viewOffset,
                media,
                user,
                player,
                session);
        }
    }
}

