1111import logging
1212_LOGGER = logging .getLogger (__name__ )
1313
14+ def check_headers (response ):
15+ if 'text/xml' not in response .headers .get ('Content-Type' , '' ) and 'application/xml' not in response .headers .get ('Content-Type' , '' ):
16+ raise ValueError (f"Expected XML but received different content type: { response .headers .get ('Content-Type' )} " )
17+
1418class PlexApi ():
1519 def __init__ (
1620 self ,
@@ -37,8 +41,8 @@ def __init__(
3741 self ._section_libraries = section_libraries
3842 self ._exclude_keywords = exclude_keywords
3943 self ._verify_ssl = verify_ssl
40-
41- def update (self ):
44+
45+ async def update (self ):
4246 info_url = 'http{0}://{1}:{2}' .format (
4347 self ._ssl ,
4448 self ._host ,
@@ -49,18 +53,20 @@ def update(self):
4953 if not self ._verify_ssl :
5054 requests .packages .urllib3 .disable_warnings (category = InsecureRequestWarning )
5155 try :
52- info_res = requests .get (info_url + "/" , headers = {
53- "X-Plex-Token" : self ._token ,
54- "User-agent" : USER_AGENT ,
55- "Accepts" : ACCEPTS ,
56- },
57- verify = self ._verify_ssl ,
58- timeout = 10 )
59- try :
60- root = ElementTree .fromstring (info_res .text )
61- except :
62- _LOGGER .error (info_res .text )
63- raise ElementTree .ParseError
56+ info_res = await self ._hass .async_add_executor_job (
57+ requests .get ,
58+ f'{ info_url } ?X-Plex-Token={ self ._token } ' ,
59+ {
60+ "headers" :{
61+ "User-agent" : USER_AGENT ,
62+ "Accept" : ACCEPTS ,
63+ },
64+ "verify" :self ._verify_ssl ,
65+ "timeout" :10
66+ }
67+ )
68+ check_headers (info_res )
69+ root = ElementTree .fromstring (info_res .text )
6470 identifier = root .get ("machineIdentifier" )
6571 except OSError as e :
6672 raise FailedToLogin
@@ -74,18 +80,20 @@ def update(self):
7480 sections = []
7581 libs = []
7682 try :
77- libraries = requests .get (all_libraries , headers = {
78- "X-Plex-Token" : self ._token ,
79- "User-agent" : USER_AGENT ,
80- "Accepts" : ACCEPTS ,
81- },
82- verify = self ._verify_ssl ,
83- timeout = 10 )
84- try :
85- root = ElementTree .fromstring (libraries .text )
86- except :
87- _LOGGER .error (libraries .text )
88- raise ElementTree .ParseError
83+ libraries = await self ._hass .async_add_executor_job (
84+ requests .get ,
85+ f'{ all_libraries } ?X-Plex-Token={ self ._token } ' ,
86+ {
87+ "headers" :{
88+ "User-agent" : USER_AGENT ,
89+ "Accept" : ACCEPTS ,
90+ },
91+ "verify" :self ._verify_ssl ,
92+ "timeout" :10
93+ }
94+ )
95+ check_headers (libraries )
96+ root = ElementTree .fromstring (libraries .text )
8997 for lib in root .findall ("Directory" ):
9098 libs .append (lib .get ("title" ))
9199 if lib .get ("type" ) in self ._section_types and (len (self ._section_libraries ) == 0 or lib .get ("title" ) in self ._section_libraries ):
@@ -97,18 +105,20 @@ def update(self):
97105 data = []
98106 for library in sections :
99107 recent_or_deck = on_deck if self ._on_deck else recently_added
100- sub_sec = requests .get (recent_or_deck .format (library , self ._max * 2 ), headers = {
101- "X-Plex-Token" : self ._token ,
102- "User-agent" : USER_AGENT ,
103- "Accepts" : ACCEPTS ,
104- },
105- verify = self ._verify_ssl ,
106- timeout = 10 )
107- try :
108- root = ElementTree .fromstring (sub_sec .text )
109- except :
110- _LOGGER .error (sub_sec .text )
111- raise ElementTree .ParseError
108+ sub_sec = await self ._hass .async_add_executor_job (
109+ requests .get ,
110+ f'{ recent_or_deck .format (library , self ._max * 2 )} &X-Plex-Token={ self ._token } ' ,
111+ {
112+ "headers" :{
113+ "User-agent" : USER_AGENT ,
114+ "Accept" : ACCEPTS ,
115+ },
116+ "verify" :self ._verify_ssl ,
117+ "timeout" :10
118+ }
119+ )
120+ check_headers (sub_sec )
121+ root = ElementTree .fromstring (sub_sec .text )
112122 data += parse_library (root )
113123
114124 return {
0 commit comments