@@ -20,7 +20,11 @@ import (
2020 "github.com/google/uuid"
2121)
2222
23- const plexURL = "https://plex.tv"
23+ const (
24+ plexURL = "https://plex.tv"
25+ applicationXml = "application/xml"
26+ applicationJson = "application/json"
27+ )
2428
2529func defaultHeaders () headers {
2630 version := "0.0.1"
@@ -34,8 +38,8 @@ func defaultHeaders() headers {
3438 ClientIdentifier : "go-plex-client-v" + version ,
3539 ContainerSize : "Plex-Container-Size=50" ,
3640 ContainerStart : "X-Plex-Container-Start=0" ,
37- Accept : "application/json" ,
38- ContentType : "application/json" ,
41+ Accept : applicationJson ,
42+ ContentType : applicationJson ,
3943 }
4044}
4145
@@ -118,7 +122,7 @@ func SignIn(username, password string) (*Plex, error) {
118122 newHeaders := p .Headers
119123 // Doesn't like having a content type, even form-data
120124 newHeaders .ContentType = "application/x-www-form-urlencoded"
121- newHeaders .Accept = "application/json"
125+ newHeaders .Accept = applicationJson
122126 resp , err := p .post (query , []byte (body .Encode ()), newHeaders )
123127
124128 if err != nil {
@@ -548,7 +552,7 @@ func (p *Plex) GetFriends() ([]Friends, error) {
548552
549553 newHeaders := p .Headers
550554
551- newHeaders .Accept = "application/xml"
555+ newHeaders .Accept = applicationXml
552556
553557 resp , err := p .get (query , newHeaders )
554558
@@ -733,6 +737,70 @@ func (p *Plex) RemoveFriendAccessToLibrary(userID, machineID, serverID string) (
733737 return true , nil
734738}
735739
740+ // GetInvitedFriends get all invited friends with request still pending
741+ func (p * Plex ) GetInvitedFriends () ([]InvitedFriend , error ) {
742+
743+ query := plexURL + "/api/invites/requested"
744+ newHeaders := p .Headers
745+ newHeaders .Accept = applicationXml
746+
747+ resp , err := p .get (query , newHeaders )
748+ if err != nil {
749+ return []InvitedFriend {}, err
750+ }
751+
752+ if resp .StatusCode == http .StatusUnauthorized {
753+ return []InvitedFriend {}, errors .New (ErrorNotAuthorized )
754+ } else if resp .StatusCode != http .StatusOK {
755+ return []InvitedFriend {}, fmt .Errorf (ErrorServerReplied , resp .StatusCode )
756+ }
757+
758+ var invitedFriendsResp invitedFriendsResponse
759+ defer resp .Body .Close ()
760+ err = xml .NewDecoder (resp .Body ).Decode (& invitedFriendsResp )
761+ if err != nil {
762+ return []InvitedFriend {}, err
763+ }
764+
765+ return invitedFriendsResp .InvitedFriends , nil
766+ }
767+
768+ // RemoveInvitedFriend cancel pending friend invite
769+ func (p * Plex ) RemoveInvitedFriend (inviteID string , isFriend , isServer , isHome bool ) (bool , error ) {
770+ query := plexURL + "/api/invites/requested/" + url .QueryEscape (inviteID )
771+
772+ parsedQuery , parseErr := url .Parse (query )
773+ if parseErr != nil {
774+ return false , parseErr
775+ }
776+
777+ vals := parsedQuery .Query ()
778+ vals .Add ("friend" , boolToOneOrZero (isFriend ))
779+ vals .Add ("server" , boolToOneOrZero (isServer ))
780+ vals .Add ("home" , boolToOneOrZero (isHome ))
781+
782+ parsedQuery .RawQuery = vals .Encode ()
783+
784+ query = parsedQuery .String ()
785+
786+ resp , err := p .delete (query , p .Headers )
787+ if err != nil {
788+ return false , err
789+ }
790+
791+ defer resp .Body .Close ()
792+ if resp .StatusCode != http .StatusOK && resp .StatusCode != http .StatusBadRequest {
793+ return false , errors .New (resp .Status )
794+ }
795+
796+ result := new (resultResponse )
797+ if err := xml .NewDecoder (resp .Body ).Decode (result ); err != nil {
798+ return false , err
799+ }
800+
801+ return result .Response .Code == 0 , nil
802+ }
803+
736804// CheckUsernameOrEmail will check if the username is a Plex user or will verify an email is valid
737805func (p * Plex ) CheckUsernameOrEmail (usernameOrEmail string ) (bool , error ) {
738806
@@ -767,7 +835,7 @@ func (p *Plex) StopPlayback(machineID string) error {
767835
768836 newHeaders := p .Headers
769837
770- newHeaders .Accept = "application/xml"
838+ newHeaders .Accept = applicationXml
771839 newHeaders .TargetClientIdentifier = machineID
772840
773841 resp , err := p .get (query , newHeaders )
@@ -898,7 +966,7 @@ func (p *Plex) GetSections(machineID string) ([]ServerSections, error) {
898966
899967 newHeaders := p .Headers
900968
901- newHeaders .Accept = "application/xml"
969+ newHeaders .Accept = applicationXml
902970
903971 resp , err := p .get (query , newHeaders )
904972
@@ -1230,7 +1298,7 @@ func (p *Plex) TerminateSession(sessionID string, reason string) error {
12301298 query := fmt .Sprintf ("%s/status/sessions/terminate?sessionId=%s&reason=%s" , p .URL , sessionID , reason )
12311299
12321300 newHeaders := p .Headers
1233- newHeaders .Accept = "application/xml"
1301+ newHeaders .Accept = applicationXml
12341302
12351303 resp , err := p .get (query , newHeaders )
12361304
0 commit comments