@@ -54,7 +54,7 @@ async def _get_base_url(self) -> str:
54
54
raise RoborockMissingParameters (
55
55
"You are missing parameters for this request, are you sure you " "entered your username?"
56
56
)
57
- raise RoborockUrlException (response .get (" error" ) )
57
+ raise RoborockUrlException (f"error code: { response_code } msg: { response .get (' error' ) } " )
58
58
response_data = response .get ("data" )
59
59
if response_data is None :
60
60
raise RoborockUrlException ("response does not have 'data'" )
@@ -276,7 +276,7 @@ async def get_products(self, user_data: UserData) -> ProductResponse:
276
276
product_request = PreparedRequest (base_url , {"header_clientid" : header_clientid })
277
277
product_response = await product_request .request (
278
278
"get" ,
279
- "/api/v3 /product" ,
279
+ "/api/v4 /product" ,
280
280
headers = {"Authorization" : user_data .token },
281
281
)
282
282
if product_response is None :
@@ -288,24 +288,44 @@ async def get_products(self, user_data: UserData) -> ProductResponse:
288
288
return ProductResponse .from_dict (result )
289
289
raise RoborockException ("product result was an unexpected type" )
290
290
291
+ async def download_code (self , user_data : UserData , product_id : int ):
292
+ base_url = await self ._get_base_url ()
293
+ header_clientid = self ._get_header_client_id ()
294
+ product_request = PreparedRequest (base_url , {"header_clientid" : header_clientid })
295
+ request = {"apilevel" : 99999 , "productids" : [product_id ], "type" : 2 }
296
+ response = await product_request .request (
297
+ "post" ,
298
+ "/api/v1/appplugin" ,
299
+ json = request ,
300
+ headers = {"Authorization" : user_data .token , "Content-Type" : "application/json" },
301
+ )
302
+ return response ["data" ][0 ]["url" ]
303
+
304
+ async def download_category_code (self , user_data : UserData ):
305
+ base_url = await self ._get_base_url ()
306
+ header_clientid = self ._get_header_client_id ()
307
+ product_request = PreparedRequest (base_url , {"header_clientid" : header_clientid })
308
+ response = await product_request .request (
309
+ "get" ,
310
+ "api/v1/plugins?apiLevel=99999&type=2" ,
311
+ headers = {
312
+ "Authorization" : user_data .token ,
313
+ },
314
+ )
315
+ return {r ["category" ]: r ["url" ] for r in response ["data" ]["categoryPluginList" ]}
316
+
291
317
292
318
class PreparedRequest :
293
319
def __init__ (self , base_url : str , base_headers : dict | None = None ) -> None :
294
320
self .base_url = base_url
295
321
self .base_headers = base_headers or {}
296
322
297
- async def request (self , method : str , url : str , params = None , data = None , headers = None ) -> dict :
323
+ async def request (self , method : str , url : str , params = None , data = None , headers = None , json = None ) -> dict :
298
324
_url = "/" .join (s .strip ("/" ) for s in [self .base_url , url ])
299
325
_headers = {** self .base_headers , ** (headers or {})}
300
326
async with aiohttp .ClientSession () as session :
301
327
try :
302
- async with session .request (
303
- method ,
304
- _url ,
305
- params = params ,
306
- data = data ,
307
- headers = _headers ,
308
- ) as resp :
328
+ async with session .request (method , _url , params = params , data = data , headers = _headers , json = json ) as resp :
309
329
return await resp .json ()
310
330
except ContentTypeError as err :
311
331
"""If we get an error, lets log everything for debugging."""
0 commit comments