From 81797f66ca100a508240ce20bc9043a57d8a7721 Mon Sep 17 00:00:00 2001 From: Matt Burchett Date: Tue, 20 Nov 2018 12:20:20 -0600 Subject: [PATCH] splitting out the eraser model from the locator model, adding library type logic. --- cmd/main.go | 4 + pkg/eraser/eraser.go | 3 - pkg/locator/locator.go | 39 +++++++++ pkg/model/eraser_model.go | 140 ++++++++++++++++++++++++++++++++ pkg/model/locator_model.go | 159 ++++++------------------------------- 5 files changed, 207 insertions(+), 138 deletions(-) create mode 100644 pkg/model/eraser_model.go diff --git a/cmd/main.go b/cmd/main.go index bf25d95..d046b6f 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -2,6 +2,7 @@ package main import ( "flag" + "fmt" "log" "git.linuxrocker.com/mattburchett/Housekeeper/pkg/communicator" @@ -37,6 +38,9 @@ func main() { log.Fatal(err) } + libraryType := locator.GetLibraryType(cfg, sectionID) + fmt.Println(libraryType) + ids, titles := locator.GetTitles(cfg, sectionID, days) if check { diff --git a/pkg/eraser/eraser.go b/pkg/eraser/eraser.go index c9a8f15..bc3e160 100644 --- a/pkg/eraser/eraser.go +++ b/pkg/eraser/eraser.go @@ -21,9 +21,6 @@ func LookupFileLocation(config config.Config, ids []int) []string { plexURL := fmt.Sprintf("%s:%d%s%d%s%s", config.PlexHost, config.PlexPort, "/library/metadata/", i, "/?X-Plex-Token=", config.PlexToken) req, err := http.NewRequest(http.MethodGet, plexURL, nil) - if err != nil { - log.Fatal(err) - } httpClient := http.Client{} req.Header.Set("User-Agent", "Housekeeper") diff --git a/pkg/locator/locator.go b/pkg/locator/locator.go index ec17c05..be3f1f3 100644 --- a/pkg/locator/locator.go +++ b/pkg/locator/locator.go @@ -2,6 +2,7 @@ package locator import ( "encoding/json" + "encoding/xml" "fmt" "io/ioutil" "log" @@ -14,6 +15,44 @@ import ( "git.linuxrocker.com/mattburchett/Housekeeper/pkg/util" ) +// GetLibraryType checks to see what type the library is. +func GetLibraryType(config config.Config, sectionID int) string { + typeURL := fmt.Sprintf("%s:%d%s%d%s%s", config.PlexHost, config.PlexPort, "/library/sections/", sectionID, "/?X-Plex-Token=", config.PlexToken) + + req, err := http.NewRequest(http.MethodGet, typeURL, nil) + httpClient := http.Client{} + req.Header.Set("User-Agent", "Housekeeper") + + res, getErr := httpClient.Do(req) + if getErr != nil { + log.Fatal(getErr) + } + + body, readErr := ioutil.ReadAll(res.Body) + if readErr != nil { + log.Fatal(readErr) + } + + if err != nil { + log.Fatal(err) + } + + typeModel := model.XMLPlexLibraryType{} + xml.Unmarshal(body, &typeModel) + + var libraryType string + + if typeModel.Thumb == "/:/resources/movie.png" { + libraryType = "movie" + } else if typeModel.Thumb == "/:/resources/show.png" { + libraryType = "show" + } else { + log.Fatal("Unsupported library type found. This app only supports movies and shows.") + } + + return libraryType +} + // GetCount will gather a count of media in a specific library, required for GetTitles. func GetCount(config config.Config, sectionID int) int { countURL := fmt.Sprintf("%s%s%s%s%s%d", config.BaseURL, config.PlexPyContext, "/api/v2?apikey=", config.PlexPyAPIKey, "&cmd=get_library§ion_id=", sectionID) diff --git a/pkg/model/eraser_model.go b/pkg/model/eraser_model.go new file mode 100644 index 0000000..ed7e883 --- /dev/null +++ b/pkg/model/eraser_model.go @@ -0,0 +1,140 @@ +package model + +import "encoding/xml" + +// XMLPlexAPI - This is the XML version of the struct below it. +type XMLPlexAPI struct { + XMLName xml.Name `xml:"MediaContainer"` + Text string `xml:",chardata"` + Size string `xml:"size,attr"` + AllowSync string `xml:"allowSync,attr"` + Identifier string `xml:"identifier,attr"` + LibrarySectionID string `xml:"librarySectionID,attr"` + LibrarySectionTitle string `xml:"librarySectionTitle,attr"` + LibrarySectionUUID string `xml:"librarySectionUUID,attr"` + MediaTagPrefix string `xml:"mediaTagPrefix,attr"` + MediaTagVersion string `xml:"mediaTagVersion,attr"` + Video struct { + Text string `xml:",chardata"` + RatingKey string `xml:"ratingKey,attr"` + Key string `xml:"key,attr"` + GUID string `xml:"guid,attr"` + LibrarySectionTitle string `xml:"librarySectionTitle,attr"` + LibrarySectionID string `xml:"librarySectionID,attr"` + LibrarySectionKey string `xml:"librarySectionKey,attr"` + Studio string `xml:"studio,attr"` + Type string `xml:"type,attr"` + Title string `xml:"title,attr"` + ContentRating string `xml:"contentRating,attr"` + Summary string `xml:"summary,attr"` + Rating string `xml:"rating,attr"` + AudienceRating string `xml:"audienceRating,attr"` + Year string `xml:"year,attr"` + Tagline string `xml:"tagline,attr"` + Thumb string `xml:"thumb,attr"` + Art string `xml:"art,attr"` + Duration string `xml:"duration,attr"` + OriginallyAvailableAt string `xml:"originallyAvailableAt,attr"` + AddedAt string `xml:"addedAt,attr"` + UpdatedAt string `xml:"updatedAt,attr"` + AudienceRatingImage string `xml:"audienceRatingImage,attr"` + ChapterSource string `xml:"chapterSource,attr"` + PrimaryExtraKey string `xml:"primaryExtraKey,attr"` + RatingImage string `xml:"ratingImage,attr"` + Media struct { + Text string `xml:",chardata"` + VideoResolution string `xml:"videoResolution,attr"` + ID string `xml:"id,attr"` + Duration string `xml:"duration,attr"` + Bitrate string `xml:"bitrate,attr"` + Width string `xml:"width,attr"` + Height string `xml:"height,attr"` + AspectRatio string `xml:"aspectRatio,attr"` + AudioChannels string `xml:"audioChannels,attr"` + AudioCodec string `xml:"audioCodec,attr"` + VideoCodec string `xml:"videoCodec,attr"` + Container string `xml:"container,attr"` + VideoFrameRate string `xml:"videoFrameRate,attr"` + AudioProfile string `xml:"audioProfile,attr"` + VideoProfile string `xml:"videoProfile,attr"` + Part struct { + Text string `xml:",chardata"` + ID string `xml:"id,attr"` + Key string `xml:"key,attr"` + Duration string `xml:"duration,attr"` + File string `xml:"file,attr"` + Size string `xml:"size,attr"` + AudioProfile string `xml:"audioProfile,attr"` + Container string `xml:"container,attr"` + VideoProfile string `xml:"videoProfile,attr"` + Stream []struct { + Text string `xml:",chardata"` + ID string `xml:"id,attr"` + StreamType string `xml:"streamType,attr"` + Default string `xml:"default,attr"` + Codec string `xml:"codec,attr"` + Index string `xml:"index,attr"` + Bitrate string `xml:"bitrate,attr"` + Language string `xml:"language,attr"` + LanguageCode string `xml:"languageCode,attr"` + BitDepth string `xml:"bitDepth,attr"` + ChromaLocation string `xml:"chromaLocation,attr"` + ChromaSubsampling string `xml:"chromaSubsampling,attr"` + FrameRate string `xml:"frameRate,attr"` + HasScalingMatrix string `xml:"hasScalingMatrix,attr"` + Height string `xml:"height,attr"` + Level string `xml:"level,attr"` + Profile string `xml:"profile,attr"` + RefFrames string `xml:"refFrames,attr"` + ScanType string `xml:"scanType,attr"` + Title string `xml:"title,attr"` + Width string `xml:"width,attr"` + DisplayTitle string `xml:"displayTitle,attr"` + Selected string `xml:"selected,attr"` + Channels string `xml:"channels,attr"` + AudioChannelLayout string `xml:"audioChannelLayout,attr"` + SamplingRate string `xml:"samplingRate,attr"` + Key string `xml:"key,attr"` + } `xml:"Stream"` + } `xml:"Part"` + } `xml:"Media"` + Genre []struct { + Text string `xml:",chardata"` + ID string `xml:"id,attr"` + Filter string `xml:"filter,attr"` + Tag string `xml:"tag,attr"` + } `xml:"Genre"` + Director struct { + Text string `xml:",chardata"` + ID string `xml:"id,attr"` + Filter string `xml:"filter,attr"` + Tag string `xml:"tag,attr"` + } `xml:"Director"` + Writer []struct { + Text string `xml:",chardata"` + ID string `xml:"id,attr"` + Filter string `xml:"filter,attr"` + Tag string `xml:"tag,attr"` + } `xml:"Writer"` + Producer []struct { + Text string `xml:",chardata"` + ID string `xml:"id,attr"` + Filter string `xml:"filter,attr"` + Tag string `xml:"tag,attr"` + } `xml:"Producer"` + Country struct { + Text string `xml:",chardata"` + ID string `xml:"id,attr"` + Filter string `xml:"filter,attr"` + Tag string `xml:"tag,attr"` + } `xml:"Country"` + Role []struct { + Text string `xml:",chardata"` + ID string `xml:"id,attr"` + Filter string `xml:"filter,attr"` + Tag string `xml:"tag,attr"` + Role string `xml:"role,attr"` + Thumb string `xml:"thumb,attr"` + } `xml:"Role"` + } `xml:"Video"` +} diff --git a/pkg/model/locator_model.go b/pkg/model/locator_model.go index b8a0e44..b3308e7 100644 --- a/pkg/model/locator_model.go +++ b/pkg/model/locator_model.go @@ -63,139 +63,28 @@ type PlexPyMediaInfo struct { } `json:"response"` } -// XMLPlexAPI - This is the XML version of the struct below it. -type XMLPlexAPI struct { - XMLName xml.Name `xml:"MediaContainer"` - Text string `xml:",chardata"` - Size string `xml:"size,attr"` - AllowSync string `xml:"allowSync,attr"` - Identifier string `xml:"identifier,attr"` - LibrarySectionID string `xml:"librarySectionID,attr"` - LibrarySectionTitle string `xml:"librarySectionTitle,attr"` - LibrarySectionUUID string `xml:"librarySectionUUID,attr"` - MediaTagPrefix string `xml:"mediaTagPrefix,attr"` - MediaTagVersion string `xml:"mediaTagVersion,attr"` - Video struct { - Text string `xml:",chardata"` - RatingKey string `xml:"ratingKey,attr"` - Key string `xml:"key,attr"` - GUID string `xml:"guid,attr"` - LibrarySectionTitle string `xml:"librarySectionTitle,attr"` - LibrarySectionID string `xml:"librarySectionID,attr"` - LibrarySectionKey string `xml:"librarySectionKey,attr"` - Studio string `xml:"studio,attr"` - Type string `xml:"type,attr"` - Title string `xml:"title,attr"` - ContentRating string `xml:"contentRating,attr"` - Summary string `xml:"summary,attr"` - Rating string `xml:"rating,attr"` - AudienceRating string `xml:"audienceRating,attr"` - Year string `xml:"year,attr"` - Tagline string `xml:"tagline,attr"` - Thumb string `xml:"thumb,attr"` - Art string `xml:"art,attr"` - Duration string `xml:"duration,attr"` - OriginallyAvailableAt string `xml:"originallyAvailableAt,attr"` - AddedAt string `xml:"addedAt,attr"` - UpdatedAt string `xml:"updatedAt,attr"` - AudienceRatingImage string `xml:"audienceRatingImage,attr"` - ChapterSource string `xml:"chapterSource,attr"` - PrimaryExtraKey string `xml:"primaryExtraKey,attr"` - RatingImage string `xml:"ratingImage,attr"` - Media struct { - Text string `xml:",chardata"` - VideoResolution string `xml:"videoResolution,attr"` - ID string `xml:"id,attr"` - Duration string `xml:"duration,attr"` - Bitrate string `xml:"bitrate,attr"` - Width string `xml:"width,attr"` - Height string `xml:"height,attr"` - AspectRatio string `xml:"aspectRatio,attr"` - AudioChannels string `xml:"audioChannels,attr"` - AudioCodec string `xml:"audioCodec,attr"` - VideoCodec string `xml:"videoCodec,attr"` - Container string `xml:"container,attr"` - VideoFrameRate string `xml:"videoFrameRate,attr"` - AudioProfile string `xml:"audioProfile,attr"` - VideoProfile string `xml:"videoProfile,attr"` - Part struct { - Text string `xml:",chardata"` - ID string `xml:"id,attr"` - Key string `xml:"key,attr"` - Duration string `xml:"duration,attr"` - File string `xml:"file,attr"` - Size string `xml:"size,attr"` - AudioProfile string `xml:"audioProfile,attr"` - Container string `xml:"container,attr"` - VideoProfile string `xml:"videoProfile,attr"` - Stream []struct { - Text string `xml:",chardata"` - ID string `xml:"id,attr"` - StreamType string `xml:"streamType,attr"` - Default string `xml:"default,attr"` - Codec string `xml:"codec,attr"` - Index string `xml:"index,attr"` - Bitrate string `xml:"bitrate,attr"` - Language string `xml:"language,attr"` - LanguageCode string `xml:"languageCode,attr"` - BitDepth string `xml:"bitDepth,attr"` - ChromaLocation string `xml:"chromaLocation,attr"` - ChromaSubsampling string `xml:"chromaSubsampling,attr"` - FrameRate string `xml:"frameRate,attr"` - HasScalingMatrix string `xml:"hasScalingMatrix,attr"` - Height string `xml:"height,attr"` - Level string `xml:"level,attr"` - Profile string `xml:"profile,attr"` - RefFrames string `xml:"refFrames,attr"` - ScanType string `xml:"scanType,attr"` - Title string `xml:"title,attr"` - Width string `xml:"width,attr"` - DisplayTitle string `xml:"displayTitle,attr"` - Selected string `xml:"selected,attr"` - Channels string `xml:"channels,attr"` - AudioChannelLayout string `xml:"audioChannelLayout,attr"` - SamplingRate string `xml:"samplingRate,attr"` - Key string `xml:"key,attr"` - } `xml:"Stream"` - } `xml:"Part"` - } `xml:"Media"` - Genre []struct { - Text string `xml:",chardata"` - ID string `xml:"id,attr"` - Filter string `xml:"filter,attr"` - Tag string `xml:"tag,attr"` - } `xml:"Genre"` - Director struct { - Text string `xml:",chardata"` - ID string `xml:"id,attr"` - Filter string `xml:"filter,attr"` - Tag string `xml:"tag,attr"` - } `xml:"Director"` - Writer []struct { - Text string `xml:",chardata"` - ID string `xml:"id,attr"` - Filter string `xml:"filter,attr"` - Tag string `xml:"tag,attr"` - } `xml:"Writer"` - Producer []struct { - Text string `xml:",chardata"` - ID string `xml:"id,attr"` - Filter string `xml:"filter,attr"` - Tag string `xml:"tag,attr"` - } `xml:"Producer"` - Country struct { - Text string `xml:",chardata"` - ID string `xml:"id,attr"` - Filter string `xml:"filter,attr"` - Tag string `xml:"tag,attr"` - } `xml:"Country"` - Role []struct { - Text string `xml:",chardata"` - ID string `xml:"id,attr"` - Filter string `xml:"filter,attr"` - Tag string `xml:"tag,attr"` - Role string `xml:"role,attr"` - Thumb string `xml:"thumb,attr"` - } `xml:"Role"` - } `xml:"Video"` +type XMLPlexLibraryType struct { + XMLName xml.Name `xml:"MediaContainer"` + Text string `xml:",chardata"` + Size string `xml:"size,attr"` + AllowSync string `xml:"allowSync,attr"` + Art string `xml:"art,attr"` + Content string `xml:"content,attr"` + Identifier string `xml:"identifier,attr"` + LibrarySectionID string `xml:"librarySectionID,attr"` + MediaTagPrefix string `xml:"mediaTagPrefix,attr"` + MediaTagVersion string `xml:"mediaTagVersion,attr"` + Nocache string `xml:"nocache,attr"` + Thumb string `xml:"thumb,attr"` + Title1 string `xml:"title1,attr"` + ViewGroup string `xml:"viewGroup,attr"` + ViewMode string `xml:"viewMode,attr"` + Directory []struct { + Text string `xml:",chardata"` + Key string `xml:"key,attr"` + Title string `xml:"title,attr"` + Secondary string `xml:"secondary,attr"` + Prompt string `xml:"prompt,attr"` + Search string `xml:"search,attr"` + } `xml:"Directory"` }