Documentation ¶
Overview ¶
Package plex provides the methods the Notifiarr client uses to interface with Plex. This package also provides a web handler for incoming plex webhooks, and another two handlers for requests from Notifiarr.com to list sessions and kill a session. The purpose is to keep track of Plex viewers and send meaningful alerts to their respective Disord server about user behavior. ie. user started watching something, paused it, resumed it, and finished something. This package can be disabled by not providing a Plex Media Server URL or Token.
Index ¶
- Constants
- Variables
- type Country
- type Director
- type Directory
- type GUID
- type Genre
- type LibrarySection
- type Media
- type MediaPart
- type MediaStream
- type PMSInfo
- type Player
- type Producer
- type Role
- type Server
- func (s *Server) Configured() bool
- func (s *Server) GetInfo() (*PMSInfo, error)
- func (s *Server) GetPlexSectionKey(keyPath string) (*LibrarySection, error)
- func (s *Server) GetSessions() ([]*Session, error)
- func (s *Server) GetSessionsWithContext(ctx context.Context) ([]*Session, error)
- func (s *Server) GetXMLSessions() (*Sessions, error)
- func (s *Server) HandleKillSession(r *http.Request) (int, interface{})
- func (s *Server) HandleSessions(r *http.Request) (int, interface{})
- func (s *Server) KillSession(sessionID, reason string) error
- func (s *Server) KillSessionWithContext(ctx context.Context, sessionID, reason string) error
- func (s *Server) Validate() error
- type Session
- type Sessions
- type Similar
- type Transcode
- type User
- type Writer
Constants ¶
const WaitTime = 10 * time.Second
WaitTime is the recommended wait time to pull plex sessions after a webhook.
Variables ¶
var ErrBadStatus = fmt.Errorf("status code not 200")
ErrBadStatus is returned when plex returns an invalid status code.
var ErrNoURLToken = fmt.Errorf("token or URL for Plex missing")
ErrNoURLToken is returned when there is no token or URL.
Functions ¶
This section is empty.
Types ¶
type Country ¶
type Country struct { Count string `json:"count"` Filter string `json:"filter"` ID interface{} `json:"id"` Tag string `json:"tag"` }
Country is part of a Plex Session.
type Director ¶
type Director struct { Filter string `json:"filter"` ID string `json:"id"` Tag string `json:"tag"` }
Director is part of a Plex Session.
type Directory ¶ added in v0.1.7
type Directory struct { Count int `json:"count"` Key string `json:"key"` Title string `json:"title"` }
Directory is part of the PMSInfo.
type GUID ¶
type GUID struct {
ID string `json:"id"`
}
GUID is a reusable type from the Section library.
type Genre ¶
type Genre struct { Count string `json:"count"` Filter string `json:"filter"` ID string `json:"id"` Tag string `json:"tag"` }
Genre is part of a Plex Session.
type LibrarySection ¶
type LibrarySection struct { Size int `json:"size"` AllowSync bool `json:"allowSync"` Identifier string `json:"identifier"` LibrarySectionID int `json:"librarySectionID"` LibrarySectionTitle string `json:"librarySectionTitle"` LibrarySectionUUID string `json:"librarySectionUUID"` MediaTagPrefix string `json:"mediaTagPrefix"` MediaTagVersion int `json:"mediaTagVersion"` Metadata []struct { RatingKey string `json:"ratingKey"` Key string `json:"key"` ParentRatingKey string `json:"parentRatingKey,omitempty"` GrandparentRatingKey string `json:"grandparentRatingKey,omitempty"` GUID string `json:"guid"` ParentGUID string `json:"parentGuid,omitempty"` GrandparentGUID string `json:"grandparentGuid,omitempty"` Type string `json:"type"` Title string `json:"title"` GrandparentKey string `json:"grandparentKey,omitempty"` ParentKey string `json:"parentKey,omitempty"` LibrarySectionTitle string `json:"librarySectionTitle"` LibrarySectionID int `json:"librarySectionID"` LibrarySectionKey string `json:"librarySectionKey"` GrandparentTitle string `json:"grandparentTitle,omitempty"` ParentTitle string `json:"parentTitle,omitempty"` ContentRating string `json:"contentRating"` Summary string `json:"summary"` Index int `json:"index,omitempty"` ParentIndex int `json:"parentIndex,omitempty"` Rating int `json:"rating,omitempty"` Year int `json:"year,omitempty"` Thumb string `json:"thumb"` Art string `json:"art"` ParentThumb string `json:"parentThumb,omitempty"` GrandparentThumb string `json:"grandparentThumb,omitempty"` GrandparentArt string `json:"grandparentArt,omitempty"` GrandparentTheme string `json:"grandparentTheme,omitempty"` Duration int `json:"duration"` OriginallyAvailableAt string `json:"originallyAvailableAt"` AddedAt int `json:"addedAt"` UpdatedAt int `json:"updatedAt"` Media []struct { ID int `json:"id"` Duration int `json:"duration"` Bitrate int `json:"bitrate"` Width int `json:"width"` Height int `json:"height"` AspectRatio float64 `json:"aspectRatio"` AudioChannels int `json:"audioChannels"` AudioCodec string `json:"audioCodec"` VideoCodec string `json:"videoCodec"` VideoResolution string `json:"videoResolution"` Container string `json:"container"` VideoFrameRate string `json:"videoFrameRate"` OptimizedForStreaming int `json:"optimizedForStreaming"` AudioProfile string `json:"audioProfile"` Has64BitOffsets bool `json:"has64bitOffsets"` VideoProfile string `json:"videoProfile"` Part []struct { ID int `json:"id"` Key string `json:"key"` Duration int `json:"duration"` File string `json:"file"` Size int `json:"size"` AudioProfile string `json:"audioProfile"` Container string `json:"container"` Indexes string `json:"indexes"` VideoProfile string `json:"videoProfile"` OptimizedForStreaming bool `json:"optimizedForStreaming"` Has64BitOffsets bool `json:"has64bitOffsets"` Stream []struct { ID int `json:"id"` StreamType int `json:"streamType"` Codec string `json:"codec"` Index int `json:"index"` Bitrate int `json:"bitrate"` BitDepth int `json:"bitDepth,omitempty"` ChromaLocation string `json:"chromaLocation,omitempty"` ChromaSubsampling string `json:"chromaSubsampling,omitempty"` CodedHeight int `json:"codedHeight,omitempty"` CodedWidth int `json:"codedWidth,omitempty"` ColorRange string `json:"colorRange,omitempty"` ColorSpace string `json:"colorSpace,omitempty"` FrameRate float64 `json:"frameRate,omitempty"` Height int `json:"height,omitempty"` Level int `json:"level,omitempty"` Profile string `json:"profile"` RefFrames int `json:"refFrames,omitempty"` StreamIdentifier string `json:"streamIdentifier"` Width int `json:"width,omitempty"` DisplayTitle string `json:"displayTitle"` ExtendedDisplayTitle string `json:"extendedDisplayTitle"` Channels int `json:"channels,omitempty"` Language string `json:"language,omitempty"` LanguageCode string `json:"languageCode,omitempty"` AudioChannelLayout string `json:"audioChannelLayout,omitempty"` SamplingRate int `json:"samplingRate,omitempty"` Selected bool `json:"selected,omitempty"` HasScalingMatrix bool `json:"hasScalingMatrix,omitempty"` Default bool `json:"default"` } `json:"Stream"` } `json:"Part"` } `json:"Media"` TitleSort string `json:"titleSort,omitempty"` ViewOffset int `json:"viewOffset,omitempty"` LastViewedAt int `json:"lastViewedAt,omitempty"` ParentYear int `json:"parentYear,omitempty"` Studio string `json:"studio,omitempty"` AudienceRating float64 `json:"audienceRating,omitempty"` ViewCount int `json:"viewCount,omitempty"` Tagline string `json:"tagline,omitempty"` AudienceRatingImage string `json:"audienceRatingImage,omitempty"` ChapterSource string `json:"chapterSource,omitempty"` PrimaryExtraKey string `json:"primaryExtraKey,omitempty"` RatingImage string `json:"ratingImage,omitempty"` GuID []*GUID `json:"Guid,omitempty"` } `json:"Metadata"` }
LibrarySection is a plex response struct.
type Media ¶
type Media struct { AspectRatio string `json:"aspectRatio"` AudioChannels int `json:"audioChannels,string"` AudioCodec string `json:"audioCodec"` AudioProfile string `json:"audioProfile"` Bitrate int64 `json:"bitrate,string"` Container string `json:"container"` Duration float64 `json:"duration,string"` Height int64 `json:"height,string"` ID string `json:"id"` Protocol string `json:"protocol"` StreamingOptmzd string `json:"optimizedForStreaming"` VideoCodec string `json:"videoCodec"` VideoFrameRate string `json:"videoFrameRate"` VideoProfile string `json:"videoProfile"` VideoResolution string `json:"videoResolution"` Width int64 `json:"width,string"` Selected bool `json:"selected"` Part []*MediaPart `json:"Part"` }
Media is part of a Plex Session.
type MediaPart ¶
type MediaPart struct { AudioProfile string `json:"audioProfile"` Bitrate int64 `json:"bitrate,string"` Container string `json:"container"` Decision string `json:"decision"` Duration float64 `json:"duration,string"` File string `json:"file"` Height int64 `json:"height,string"` ID string `json:"id"` Indexes string `json:"indexes"` Key string `json:"key"` Protocol string `json:"protocol"` Selected bool `json:"selected"` Size string `json:"size"` StreamingOptmzd string `json:"optimizedForStreaming"` VideoProfile string `json:"videoProfile"` Width int64 `json:"width,string"` Stream []*MediaStream `json:"Stream"` }
MediaPart is part of a Plex Session.
type MediaStream ¶
type MediaStream struct { AudioChannelLayout string `json:"audioChannelLayout,omitempty"` BitDepth string `json:"bitDepth,omitempty"` Bitrate float64 `json:"bitrate,string"` BitrateMode string `json:"bitrateMode,omitempty"` Channels string `json:"channels,omitempty"` ChromaLocation string `json:"chromaLocation,omitempty"` ChromaSubsampling string `json:"chromaSubsampling,omitempty"` Codec string `json:"codec"` CodedHeight string `json:"codedHeight,omitempty"` CodedWidth string `json:"codedWidth,omitempty"` ColorPrimaries string `json:"colorPrimaries,omitempty"` ColorTrc string `json:"colorTrc,omitempty"` Decision string `json:"decision"` Default string `json:"default,omitempty"` DisplayTitle string `json:"displayTitle"` ExtDisplayTitle string `json:"extendedDisplayTitle"` FrameRate float64 `json:"frameRate,omitempty,string"` HasScalingMatrix string `json:"hasScalingMatrix,omitempty"` Height int64 `json:"height,omitempty,string"` ID string `json:"id"` Index string `json:"index"` Language string `json:"language,omitempty"` LanguageCode string `json:"languageCode,omitempty"` Level string `json:"level,omitempty"` Location string `json:"location"` Profile string `json:"profile"` RefFrames string `json:"refFrames,omitempty"` SamplingRate string `json:"samplingRate,omitempty"` ScanType string `json:"scanType,omitempty"` Selected string `json:"selected,omitempty"` StreamType string `json:"streamType"` Width int64 `json:"width,omitempty,string"` }
MediaStream is part of a Plex Session.
type PMSInfo ¶ added in v0.1.7
type PMSInfo struct { Size int64 `json:"size"` AllowCameraUpload bool `json:"allowCameraUpload"` AllowChannelAccess bool `json:"allowChannelAccess"` AllowSharing bool `json:"allowSharing"` AllowSync bool `json:"allowSync"` AllowTuners bool `json:"allowTuners"` BackgroundProcessing bool `json:"backgroundProcessing"` Certificate bool `json:"certificate"` CompanionProxy bool `json:"companionProxy"` CountryCode string `json:"countryCode"` Diagnostics string `json:"diagnostics"` EventStream bool `json:"eventStream"` FriendlyName string `json:"friendlyName"` HubSearch bool `json:"hubSearch"` ItemClusters bool `json:"itemClusters"` LiveTV int64 `json:"livetv"` MachineIdentifier string `json:"machineIdentifier"` MaxUploadBitrate int64 `json:"maxUploadBitrate"` MaxUploadBitrateReason string `json:"maxUploadBitrateReason"` MaxUploadBitrateReasonMessage string `json:"maxUploadBitrateReasonMessage"` MediaProviders bool `json:"mediaProviders"` Multiuser bool `json:"multiuser"` MyPlex bool `json:"myPlex"` MyPlexMappingState string `json:"myPlexMappingState"` MyPlexSigninState string `json:"myPlexSigninState"` MyPlexSubscription bool `json:"myPlexSubscription"` MyPlexUsername string `json:"myPlexUsername"` OfflineTranscode int64 `json:"offlineTranscode"` OwnerFeatures string `json:"ownerFeatures"` PhotoAutoTag bool `json:"photoAutoTag"` Platform string `json:"platform"` PlatformVersion string `json:"platformVersion"` PluginHost bool `json:"pluginHost"` PushNotifications bool `json:"pushNotifications"` ReadOnlyLibraries bool `json:"readOnlyLibraries"` RequestParametersInCookie bool `json:"requestParametersInCookie"` StreamingBrainABRVersion int64 `json:"streamingBrainABRVersion"` StreamingBrainVersion int64 `json:"streamingBrainVersion"` Sync bool `json:"sync"` TranscoderActiveVideoSessions int64 `json:"transcoderActiveVideoSessions"` TranscoderAudio bool `json:"transcoderAudio"` TranscoderLyrics bool `json:"transcoderLyrics"` TranscoderPhoto bool `json:"transcoderPhoto"` TranscoderSubtitles bool `json:"transcoderSubtitles"` TranscoderVideo bool `json:"transcoderVideo"` TranscoderVideoBitrates string `json:"transcoderVideoBitrates"` TranscoderVideoQualities string `json:"transcoderVideoQualities"` TranscoderVideoResolutions string `json:"transcoderVideoResolutions"` UpdatedAt int64 `json:"updatedAt"` Updater bool `json:"updater"` Version string `json:"version"` VoiceSearch bool `json:"voiceSearch"` Directory []*Directory `json:"Directory"` } // `json:"MediaContainer"`
PMSInfo is the `/` path on Plex.
type Player ¶
type Player struct { Address string `json:"address"` Device string `json:"device"` MachineID string `json:"machineIdentifier"` Model string `json:"model"` Platform string `json:"platform"` PlatformVer string `json:"platformVersion"` Product string `json:"product"` Profile string `json:"profile"` PublicAddr string `json:"remotePublicAddress"` State string `json:"state"` Title string `json:"title"` UserID int64 `json:"userID"` Vendor string `json:"vendor"` Version string `json:"version"` Relayed bool `json:"relayed"` Local bool `json:"local"` Secure bool `json:"secure"` }
Player is part of a Plex Session.
type Producer ¶
type Producer struct { Filter string `json:"filter"` ID string `json:"id"` Tag string `json:"tag"` }
Producer is part of a Plex Session.
type Role ¶
type Role struct { Count string `json:"count,omitempty"` Filter string `json:"filter"` ID string `json:"id"` Role string `json:"role"` Tag string `json:"tag"` Thumb string `json:"thumb,omitempty"` }
Role is part of a Plex Session.
type Server ¶
type Server struct { Timeout cnfg.Duration `toml:"timeout" xml:"timeout"` Interval cnfg.Duration `toml:"interval" xml:"interval"` URL string `toml:"url" xml:"url"` Token string `toml:"token" xml:"token"` AccountMap string `toml:"account_map" xml:"account_map"` Name string `toml:"-" xml:"server"` ReturnJSON bool `toml:"return_json" xml:"return_json"` Cooldown cnfg.Duration `toml:"cooldown" xml:"cooldown"` SeriesPC uint `toml:"series_percent_complete" xml:"series_percent_complete"` MoviesPC uint `toml:"movies_percent_complete" xml:"movies_percent_complete"` // contains filtered or unexported fields }
Server is the Plex configuration from a config file. Without a URL or Token, nothing works and this package is unused.
func (*Server) Configured ¶ added in v0.1.7
Configured returns true ifthe server is configured, false otherwise.
func (*Server) GetPlexSectionKey ¶
func (s *Server) GetPlexSectionKey(keyPath string) (*LibrarySection, error)
GetPlexSectionKey gets a section key from Plex based on a key path.
func (*Server) GetSessions ¶
GetSessions returns the Plex sessions in JSON format, no timeout.
func (*Server) GetSessionsWithContext ¶ added in v0.1.5
GetSessionsWithContext returns the Plex sessions in JSON format.
func (*Server) GetXMLSessions ¶
GetXMLSessions returns the Plex sessions in XML format.
func (*Server) HandleKillSession ¶ added in v0.1.5
HandleKillSession provides a web handler to the notifiarr client allows notifiarr.com (via Discord request) to end a Plex session. The handler satisfies apps.APIHandler, sorry.
func (*Server) HandleSessions ¶ added in v0.1.5
HandleSessions provides a web handlersto the notifiarr client that returns the current Plex sessions. The handler satisfies apps.APIHandler, sorry.
func (*Server) KillSession ¶ added in v0.1.5
KillSession kills a Plex session.
func (*Server) KillSessionWithContext ¶ added in v0.1.5
KillSessionWithContext kills a Plex session.
type Session ¶
type Session struct { User User `json:"User"` Player Player `json:"Player"` TranscodeSession Transcode `json:"TranscodeSession"` Added string `json:"addedAt"` Art string `json:"art"` AudienceRating string `json:"audienceRating"` AudienceRatingImg string `json:"audienceRatingImage"` ContentRating string `json:"contentRating"` Duration float64 `json:"duration,string"` GUID string `json:"guid"` GrandparentArt string `json:"grandparentArt"` GrandparentGUID string `json:"grandparentGuid"` GrandparentKey string `json:"grandparentKey"` GrandparentRatingKey string `json:"grandparentRatingKey"` GrandparentTheme string `json:"grandparentTheme"` GrandparentThumb string `json:"grandparentThumb"` GrandparentTitle string `json:"grandparentTitle"` Index string `json:"index"` Key string `json:"key"` LastViewed int64 `json:"lastViewedAt,string"` LibrarySectionID string `json:"librarySectionID"` LibrarySectionKey string `json:"librarySectionKey"` LibrarySectionTitle string `json:"librarySectionTitle"` OriginallyAvailable string `json:"originallyAvailableAt"` ParentGUID string `json:"parentGuid"` ParentIndex string `json:"parentIndex"` ParentKey string `json:"parentKey"` ParentRatingKey string `json:"parentRatingKey"` ParentThumb string `json:"parentThumb"` ParentTitle string `json:"parentTitle"` PrimaryExtraKey string `json:"primaryExtraKey"` Rating string `json:"rating"` RatingImage string `json:"ratingImage"` RatingKey string `json:"ratingKey"` SessionKey string `json:"sessionKey"` Studio string `json:"studio"` Summary string `json:"summary"` Thumb string `json:"thumb"` Title string `json:"title"` TitleSort string `json:"titleSort"` Type string `json:"type"` Updated int64 `json:"updatedAt,string"` ViewCount string `json:"viewCount"` ViewOffset float64 `json:"viewOffset,string"` Year string `json:"year"` Session struct { Bandwidth int64 `json:"bandwidth"` ID string `json:"id"` Location string `json:"location"` } `json:"Session"` GuID []*GUID `json:"Guid,omitempty"` }
Session is a Plex json struct.
type Sessions ¶
type Sessions struct { Name string `json:"server"` AccountMap []string `json:"account_map"` Sessions []*Session `json:"sessions"` XML string `json:"sessions_xml,omitempty"` }
Sessions is the config input data.
type Similar ¶
type Similar struct { Filter string `json:"filter"` ID string `json:"id"` Tag string `json:"tag"` Count string `json:"count,omitempty"` }
Similar is part of a Plex Session.
type Transcode ¶
type Transcode struct { AudioChannels int `json:"audioChannels"` AudioCodec string `json:"audioCodec"` AudioDecision string `json:"audioDecision"` Container string `json:"container"` Context string `json:"context"` Duration int64 `json:"duration"` Key string `json:"key"` MaxOffsetAvailable string `json:"maxOffsetAvailable"` MinOffsetAvailable string `json:"minOffsetAvailable"` Progress string `json:"progress"` Protocol string `json:"protocol"` Remaining int64 `json:"remaining"` Size int64 `json:"size"` SourceAudioCodec string `json:"sourceAudioCodec"` SourceVideoCodec string `json:"sourceVideoCodec"` Speed string `json:"speed"` TimeStamp string `json:"timeStamp"` VideoCodec string `json:"videoCodec"` VideoDecision string `json:"videoDecision"` Throttled bool `json:"throttled"` Complete bool `json:"complete"` XcodeHwFullPipeline bool `json:"transcodeHwFullPipeline"` XcodeHwRequested bool `json:"transcodeHwRequested"` }
Transcode is part of a Plex Session.