carconnectivity-connector-seatcupra 0.1a2__tar.gz → 0.1a3__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/PKG-INFO +1 -1
  2. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connector_seatcupra.egg-info/PKG-INFO +1 -1
  3. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connectors/seatcupra/_version.py +1 -1
  4. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connectors/seatcupra/connector.py +57 -0
  5. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/.flake8 +0 -0
  6. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  7. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  8. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/.github/dependabot.yml +0 -0
  9. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/.github/workflows/build.yml +0 -0
  10. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/.github/workflows/build_and_publish.yml +0 -0
  11. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/.github/workflows/codeql-analysis.yml +0 -0
  12. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/.gitignore +0 -0
  13. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/CHANGELOG.md +0 -0
  14. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/LICENSE +0 -0
  15. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/Makefile +0 -0
  16. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/README.md +0 -0
  17. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/doc/Config.md +0 -0
  18. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/pyproject.toml +0 -0
  19. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/setup.cfg +0 -0
  20. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/setup_requirements.txt +0 -0
  21. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connector_seatcupra.egg-info/SOURCES.txt +0 -0
  22. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connector_seatcupra.egg-info/dependency_links.txt +0 -0
  23. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connector_seatcupra.egg-info/requires.txt +0 -0
  24. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connector_seatcupra.egg-info/top_level.txt +0 -0
  25. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connectors/seatcupra/__init__.py +0 -0
  26. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connectors/seatcupra/auth/__init__.py +0 -0
  27. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connectors/seatcupra/auth/auth_util.py +0 -0
  28. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connectors/seatcupra/auth/helpers/blacklist_retry.py +0 -0
  29. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connectors/seatcupra/auth/my_cupra_session.py +0 -0
  30. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connectors/seatcupra/auth/openid_session.py +0 -0
  31. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connectors/seatcupra/auth/session_manager.py +0 -0
  32. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connectors/seatcupra/auth/vw_web_session.py +0 -0
  33. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connectors/seatcupra/capability.py +0 -0
  34. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connectors/seatcupra/charging.py +0 -0
  35. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connectors/seatcupra/ui/connector_ui.py +0 -0
  36. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/src/carconnectivity_connectors/seatcupra/vehicle.py +0 -0
  37. {carconnectivity_connector_seatcupra-0.1a2 → carconnectivity_connector_seatcupra-0.1a3}/test/integration_test/carConnectivity.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: carconnectivity-connector-seatcupra
3
- Version: 0.1a2
3
+ Version: 0.1a3
4
4
  Summary: CarConnectivity connector for Seat and Cupra services
5
5
  Author: Till Steinbach
6
6
  License: MIT License
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: carconnectivity-connector-seatcupra
3
- Version: 0.1a2
3
+ Version: 0.1a3
4
4
  Summary: CarConnectivity connector for Seat and Cupra services
5
5
  Author: Till Steinbach
6
6
  License: MIT License
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.1a2'
20
+ __version__ = version = '0.1a3'
21
21
  __version_tuple__ = version_tuple = (0, 1)
@@ -365,6 +365,8 @@ class Connector(BaseConnector):
365
365
  vehicle.climatization.commands.add_command(climatisation_start_stop_command)
366
366
  else:
367
367
  vehicle.capabilities.clear_capabilities()
368
+ if isinstance(vehicle, SeatCupraVehicle):
369
+ vehicle = self.fetch_image(vehicle)
368
370
  else:
369
371
  raise APIError('Could not fetch vehicle data, VIN missing')
370
372
  for vin in set(garage.list_vehicle_vins()) - seen_vehicle_vins:
@@ -794,6 +796,61 @@ class Connector(BaseConnector):
794
796
  print(data)
795
797
  return vehicle
796
798
 
799
+ def fetch_image(self, vehicle: SeatCupraVehicle, no_cache: bool = False) -> SeatCupraVehicle:
800
+ if SUPPORT_IMAGES:
801
+ url: str = f'https://ola.prod.code.seat.cloud.vwgroup.com/v1/vehicles/{vehicle.vin.value}/renders'
802
+ data = self._fetch_data(url, session=self.session, allow_http_error=True)
803
+ if data is not None: # pylint: disable=too-many-nested-blocks
804
+ for image_id, image_url in data.items():
805
+ if image_id == 'isDefault':
806
+ continue
807
+ img = None
808
+ cache_date = None
809
+ if self.active_config['max_age'] is not None and self.session.cache is not None and image_url in self.session.cache:
810
+ img, cache_date_string = self.session.cache[image_url]
811
+ img = base64.b64decode(img) # pyright: ignore[reportPossiblyUnboundVariable]
812
+ img = Image.open(io.BytesIO(img)) # pyright: ignore[reportPossiblyUnboundVariable]
813
+ cache_date = datetime.fromisoformat(cache_date_string)
814
+ if img is None or self.active_config['max_age'] is None \
815
+ or (cache_date is not None and cache_date < (datetime.utcnow() - timedelta(seconds=self.active_config['max_age']))):
816
+ try:
817
+ image_download_response = requests.get(image_url, stream=True)
818
+ if image_download_response.status_code == requests.codes['ok']:
819
+ img = Image.open(image_download_response.raw) # pyright: ignore[reportPossiblyUnboundVariable]
820
+ if self.session.cache is not None:
821
+ buffered = io.BytesIO() # pyright: ignore[reportPossiblyUnboundVariable]
822
+ img.save(buffered, format="PNG")
823
+ img_str = base64.b64encode(buffered.getvalue()).decode("utf-8") # pyright: ignore[reportPossiblyUnboundVariable]
824
+ self.session.cache[image_url] = (img_str, str(datetime.utcnow()))
825
+ elif image_download_response.status_code == requests.codes['unauthorized']:
826
+ LOG.info('Server asks for new authorization')
827
+ self.session.login()
828
+ image_download_response = self.session.get(image_url, stream=True)
829
+ if image_download_response.status_code == requests.codes['ok']:
830
+ img = Image.open(image_download_response.raw) # pyright: ignore[reportPossiblyUnboundVariable]
831
+ if self.session.cache is not None:
832
+ buffered = io.BytesIO() # pyright: ignore[reportPossiblyUnboundVariable]
833
+ img.save(buffered, format="PNG")
834
+ img_str = base64.b64encode(buffered.getvalue()).decode("utf-8") # pyright: ignore[reportPossiblyUnboundVariable]
835
+ self.session.cache[image_url] = (img_str, str(datetime.utcnow()))
836
+ except requests.exceptions.ConnectionError as connection_error:
837
+ raise RetrievalError(f'Connection error: {connection_error}') from connection_error
838
+ except requests.exceptions.ChunkedEncodingError as chunked_encoding_error:
839
+ raise RetrievalError(f'Error: {chunked_encoding_error}') from chunked_encoding_error
840
+ except requests.exceptions.ReadTimeout as timeout_error:
841
+ raise RetrievalError(f'Timeout during read: {timeout_error}') from timeout_error
842
+ except requests.exceptions.RetryError as retry_error:
843
+ raise RetrievalError(f'Retrying failed: {retry_error}') from retry_error
844
+ if img is not None:
845
+ vehicle._car_images[image_id] = img # pylint: disable=protected-access
846
+ if image_id == 'side':
847
+ if 'car_picture' in vehicle.images.images:
848
+ vehicle.images.images['car_picture']._set_value(img) # pylint: disable=protected-access
849
+ else:
850
+ vehicle.images.images['car_picture'] = ImageAttribute(name="car_picture", parent=vehicle.images,
851
+ value=img, tags={'carconnectivity'})
852
+ return vehicle
853
+
797
854
  def _record_elapsed(self, elapsed: timedelta) -> None:
798
855
  """
799
856
  Records the elapsed time.